Offline Training
July 14, 2026 ยท View on GitHub
Offline training lets you run target-model inference once, save the hidden states, and reuse them for draft-model training. This is useful for development because training no longer needs a target inference GPU, thus you can test your workflows on only 1 GPU. Warning: This workflow is not optimized for throughput yet.
One GPU, 1,000 samples
Run these commands from the TorchSpec repository root.
conda activate torchspec
1. Save the target hidden states
python -m torchspec.offline.generate \
--config configs/sglang_qwen3_8b_dflash.yaml \
--output outputs/qwen3-8b-dflash-offline-1000 \
inference.inference_num_gpus=1 \
inference.inference_num_gpus_per_node=1
This runs Qwen3-8B with SGLang on one GPU. The config uses the bundled sample dataset and produces 1,000 replay samples. Expect the output to use about 6 GB.
Materialization resumes by default. Add --overwrite to replace an existing
output directory.
2. Train from the saved data
python -m torchspec.train_entry \
--config configs/sglang_qwen3_8b_dflash.yaml \
inference.inference_engine_type=offline \
inference.offline.data_path=outputs/qwen3-8b-dflash-offline-1000 \
inference.offline.num_engines=1 \
training.training_num_gpus_per_node=1 \
output_dir=outputs/qwen3-8b-dflash-offline-dev
This uses one GPU for training and does not start an inference engine. The saved dataset can be reused for as many training runs as needed.
Use your own data
Override the dataset path while materializing:
python -m torchspec.offline.generate \
--config configs/sglang_qwen3_8b_dflash.yaml \
--output /path/to/offline-data \
dataset.train_data_path=/path/to/train.jsonl \
inference.inference_num_gpus=1 \
inference.inference_num_gpus_per_node=1
Then pass that output directory to
inference.offline.data_path when training.
The materialization and training configs must describe the same target model, tokenizer, draft method, and hidden-state layout. Target-model weights must remain available during training because TorchSpec still uses the target embedding, normalization, and LM-head weights.
Offline training does not currently support USP or train_with_decode.