@@ -13,13 +13,31 @@ 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 lora-sft|lora-rl|fft-sft # starts a local backend, then runs existing training/eval examples"
36+ @echo " make test e2e lora-sft BASE_URL=http://host:9003"
37+ @echo " CUDA_VISIBLE_DEVICES=0 make test e2e fft-sft"
38+ @echo " make test e2e fft-sft TRAINING_TEST_ARGS='gsm8k.steps=10'"
39+ @echo " make test piglatin # pig-latin example end-to-end tests"
40+ @echo " make lint | fmt"
2341
2442# ---------------------------------------------------------------------------
2543# Server
@@ -42,14 +60,40 @@ ifeq (cli,$(firstword $(MAKECMDGOALS)))
4260 $(eval $(CLI_ARGS ) :;@:)
4361endif
4462
63+ ifeq (test,$(firstword $(MAKECMDGOALS ) ) )
64+ TEST_MODE := $(word 2,$(MAKECMDGOALS ) )
65+ TEST_SCENARIO := $(word 3,$(MAKECMDGOALS ) )
66+ TEST_ARGS := $(wordlist 2,$(words $(MAKECMDGOALS ) ) ,$(MAKECMDGOALS ) )
67+ ifneq ($(TEST_ARGS),)
68+ $(eval $(TEST_ARGS ) :;@:)
69+ endif
70+ endif
71+
4572cli :
4673 @cd dev/tools && BASE_URL=" $( BASE_URL) " uv run python cli.py $(CLI_ARGS )
4774
4875# ---------------------------------------------------------------------------
4976# Dev
5077# ---------------------------------------------------------------------------
5178test :
52- PYTHONPATH=" $( TEST_PYTHONPATH) " uv --project examples run python -m unittest discover -s tests
79+ @mode=" $( TEST_MODE) " ; \
80+ scenario=" $( TEST_SCENARIO) " ; \
81+ if [ -z " $$ mode" ] || [ " $$ mode" = " unit" ]; then \
82+ uv run --frozen --extra cpu python -m unittest $(UNIT_TESTS ) ; \
83+ elif [ " $$ mode" = " e2e" ]; then \
84+ if [ -z " $$ scenario" ]; then \
85+ echo " Missing e2e scenario. Expected lora-sft, lora-rl, or fft-sft." ; \
86+ exit 2; \
87+ fi ; \
88+ set -- " scenario=$$ scenario" " backend.uv_extra=$( TRAINING_TEST_EXTRA) " ; \
89+ if [ -n " $( TRAINING_TEST_BASE_URL) " ]; then set -- " $$ @" " backend.base_url=$( TRAINING_TEST_BASE_URL) " ; fi ; \
90+ uv run --extra " $( TRAINING_TEST_EXTRA) " python scripts/run_training_e2e.py " $$ @" $(TRAINING_TEST_ARGS ) ; \
91+ elif [ " $$ mode" = " piglatin" ]; then \
92+ PYTHONPATH=" $( PIGLATIN_TEST_PYTHONPATH) " uv --project examples run python -m unittest discover -s tests; \
93+ else \
94+ echo " Unknown test mode '$$ mode'. Expected unit, e2e, or piglatin." ; \
95+ exit 2; \
96+ fi
5397
5498lint :
5599 uvx ruff check .
0 commit comments