@@ -13,26 +13,45 @@ HOST ?= 127.0.0.1
1313PORT ?= 9003
1414# The fully qualified base URL used by local CLI tools and clients
1515BASE_URL ?= http://$(HOST ) :$(PORT )
16- TEST_PYTHONPATH ?= examples/sft/pig-latin
16+ UNIT_TESTS ?= tests.test_gateway_paths tests.test_snapshot_agent tests.test_trainer_optimizer_correctness tests.test_worker_launch_processor
17+ # Only forward BASE_URL to e2e when the user supplied it. The Makefile default
18+ # is for local CLI usage; e2e should start its own backend by default.
19+ TRAINING_TEST_BASE_URL ?= $(if $(filter environment command line,$(origin BASE_URL ) ) ,$(BASE_URL ) ,)
20+ TRAINING_TEST_EXTRA ?= gpu
21+ TRAINING_TEST_ARGS ?=
22+ PIGLATIN_TEST_PYTHONPATH ?= examples/sft/pig-latin
23+
24+ # CUDA_VISIBLE_DEVICES can be provided either as an environment variable or as a
25+ # Make variable, and is inherited by the backend/eval subprocesses.
26+ ifneq ($(origin CUDA_VISIBLE_DEVICES ) ,undefined)
27+ export CUDA_VISIBLE_DEVICES
28+ endif
1729
1830help :
1931 @echo " make server # $( BASE_MODEL) , SAMPLING_BACKEND=$( SAMPLING_BACKEND) , port $( PORT) "
2032 @echo " make server BASE_MODEL=google/gemma-4-e2b SAMPLING_BACKEND=vllm"
2133 @echo " VLLM_ARCHITECTURE_OVERRIDE=Gemma4ForCausalLM make vllm BASE_MODEL=google/gemma-4-e2b"
22- @echo " make test | lint | fmt"
34+ @echo " make test # fast unit tests"
35+ @echo " make test e2e tiny-lora|tiny-fft|tiny-rl|lora-textsql|fft-gsm8k|fft-gsm8k-x2 # tiny-* = fast overfit smoke tests"
36+ @echo " make test e2e tiny-lora BASE_URL=http://host:9003"
37+ @echo " CUDA_VISIBLE_DEVICES=0 make test e2e tiny-fft"
38+ @echo " make test e2e tiny-fft TRAINING_TEST_ARGS='steps=20'"
39+ @echo " make test e2e fft-gsm8k TRAINING_TEST_ARGS='steps=10 eval_examples=8 extra=\" batch=2\" '"
40+ @echo " make test piglatin # pig-latin example end-to-end tests"
41+ @echo " make lint | fmt"
2342
2443# ---------------------------------------------------------------------------
2544# Server
2645# ---------------------------------------------------------------------------
2746server :
2847 @-kill -9 $$(lsof -ti:$(PORT ) ) 2> /dev/null || true
29- cd src/server && BASE_MODEL=" $( BASE_MODEL) " SAMPLING_BACKEND=" $( SAMPLING_BACKEND) " \
48+ BASE_MODEL=" $( BASE_MODEL) " SAMPLING_BACKEND=" $( SAMPLING_BACKEND) " \
3049 uv run --extra $(if $(filter vllm,$(SAMPLING_BACKEND ) ) ,gpu,cpu) \
31- python -m uvicorn gateway:app --host $(HOST ) --port $(PORT )
50+ python -m uvicorn server. gateway:app --host $(HOST ) --port $(PORT )
3251
3352vllm :
34- cd src/server && BASE_MODEL=" $( BASE_MODEL) " \
35- uv run --extra vllm python -m vllm_sampler
53+ BASE_MODEL=" $( BASE_MODEL) " \
54+ uv run --extra vllm python -m server. vllm_sampler
3655
3756# ---------------------------------------------------------------------------
3857# CLI
@@ -42,14 +61,40 @@ ifeq (cli,$(firstword $(MAKECMDGOALS)))
4261 $(eval $(CLI_ARGS ) :;@:)
4362endif
4463
64+ ifeq (test,$(firstword $(MAKECMDGOALS ) ) )
65+ TEST_MODE := $(word 2,$(MAKECMDGOALS ) )
66+ TEST_SCENARIO := $(word 3,$(MAKECMDGOALS ) )
67+ TEST_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS ) ) ,$(MAKECMDGOALS ) )
68+ ifneq ($(TEST_ARGS),)
69+ $(eval $(TEST_ARGS ) :;@:)
70+ endif
71+ endif
72+
4573cli :
4674 @cd dev/tools && BASE_URL=" $( BASE_URL) " uv run python cli.py $(CLI_ARGS )
4775
4876# ---------------------------------------------------------------------------
4977# Dev
5078# ---------------------------------------------------------------------------
5179test :
52- PYTHONPATH=" $( TEST_PYTHONPATH) " uv --project examples run python -m unittest discover -s tests
80+ @mode=" $( TEST_MODE) " ; \
81+ scenario=" $( TEST_SCENARIO) " ; \
82+ if [ -z " $$ mode" ] || [ " $$ mode" = " unit" ]; then \
83+ uv run --frozen --exact --extra cpu python -m unittest $(UNIT_TESTS ) ; \
84+ elif [ " $$ mode" = " e2e" ]; then \
85+ if [ -z " $$ scenario" ]; then \
86+ echo " Missing e2e scenario. Expected tiny-lora, tiny-fft, tiny-rl, lora-textsql, fft-gsm8k, or fft-gsm8k-x2." ; \
87+ exit 2; \
88+ fi ; \
89+ set -- " scenario=$$ scenario" " uv_extra=$( TRAINING_TEST_EXTRA) " ; \
90+ if [ -n " $( TRAINING_TEST_BASE_URL) " ]; then set -- " $$ @" " base_url=$( TRAINING_TEST_BASE_URL) " ; fi ; \
91+ uv run --extra " $( TRAINING_TEST_EXTRA) " python scripts/run_training_e2e.py " $$ @" $(TRAINING_TEST_ARGS ) ; \
92+ elif [ " $$ mode" = " piglatin" ]; then \
93+ PYTHONPATH=" $( PIGLATIN_TEST_PYTHONPATH) " uv --project examples run python -m unittest discover -s tests; \
94+ else \
95+ echo " Unknown test mode '$$ mode'. Expected unit, e2e, or piglatin." ; \
96+ exit 2; \
97+ fi
5398
5499lint :
55100 uvx ruff check .
@@ -66,8 +111,8 @@ GCP_PROJECT ?= cdrollouts-sunilarora
66111IMAGE_TAG ?= latest
67112
68113build-images :
69- cd src/server && DOCKER_BUILDKIT=1 docker build -t gcr.io/$(GCP_PROJECT ) /open-rl-server:$(IMAGE_TAG ) -f Dockerfile .
70- cd src/server && DOCKER_BUILDKIT=1 docker build -t gcr.io/$(GCP_PROJECT ) /open-rl-gateway:$(IMAGE_TAG ) -f Dockerfile.gateway .
114+ DOCKER_BUILDKIT=1 docker build -t gcr.io/$(GCP_PROJECT ) /open-rl-server:$(IMAGE_TAG ) -f src/server/ Dockerfile .
115+ DOCKER_BUILDKIT=1 docker build -t gcr.io/$(GCP_PROJECT ) /open-rl-gateway:$(IMAGE_TAG ) -f src/server/ Dockerfile.gateway .
71116
72117push-images :
73118 docker push gcr.io/$(GCP_PROJECT ) /open-rl-server:$(IMAGE_TAG )
@@ -106,4 +151,3 @@ push-vm:
106151# Pull changes from the remote VM back to the local workspace
107152pull-vm :
108153 rsync -avz --exclude ' .git' --exclude ' .venv' --exclude ' __pycache__' --exclude ' *.pyc' --exclude ' .DS_Store' $(REMOTE_HOST ) :~ /open-rl/ ./
109-
0 commit comments