# Lightning AI + Hugging Face Runbook This runbook is optimized for short 3-4 hour H100 windows and Hugging Face credits. The judge-rerunnable notebook version is [`notebooks/corp_env_trl_unsloth_training.ipynb`](../notebooks/corp_env_trl_unsloth_training.ipynb). A minified (single-line) Colab export in the repo can be searched for `train_grpo` or `MAX_STEPS` to recover pins or a prior command line, then align with the defaults in `training/train_grpo.py` and `training/train_sft.py`. ## 1. Prepare Artifacts Locally ```powershell uv sync --extra dev --extra plots uv run python scripts/generate_sft_data.py --tasks h1_acquisition_defence --per-task 24 --variant-stride 2 --output data/raw/h1_seed.jsonl uv run python scripts/verify_examples.py --input data/raw/e1_m1_examples.jsonl --clean data/processed/e1_m1_clean.jsonl --rejected data/processed/e1_m1_rejected.jsonl --strict-json --require-stepwise-deliberation uv run python scripts/verify_examples.py --input data/raw/h1_seed.jsonl --clean data/processed/h1_seed_clean.jsonl --rejected data/processed/h1_seed_rejected.jsonl --strict-json --require-stepwise-deliberation uv run python scripts/prepare_sft_data.py --min-pass-rate 0.85 --min-reasoning-steps 1 --min-conflict-steps 0 --min-resolution-steps 0 --require-stepwise-deliberation ``` Keep raw examples untouched. Train only from verified `data/processed/*_clean.jsonl` and `data/sft/*.jsonl`. ## 2. Upload Dataset To Hugging Face ```powershell huggingface-cli login huggingface-cli repo create corp-env-data --type dataset huggingface-cli upload /corp-env-data data/sft/e1_m1_h1_examples.jsonl data/sft/e1_m1_h1_examples.jsonl --repo-type dataset huggingface-cli upload /corp-env-data data/processed/e1_m1_clean.jsonl data/processed/e1_m1_clean.jsonl --repo-type dataset huggingface-cli upload /corp-env-data data/processed/h1_seed_clean.jsonl data/processed/h1_seed_clean.jsonl --repo-type dataset ``` Retire or mirror `e1_m1_examples.jsonl` in the same dataset if you need backward-compatible paths. ## 3. Lightning H100 Session 1: SFT ```bash git clone corp_gym cd corp_gym python -m venv .venv source .venv/bin/activate pip install -U pip pip install -e ".[training]" huggingface-cli login python training/train_sft.py \ --model Qwen/Qwen2.5-7B-Instruct \ --data data/sft/e1_m1_h1_examples.jsonl \ --output outputs/sft_adapter \ --epochs 2 \ --max-steps 30 \ --push-to-hub /corp-env-sft-adapter ``` This uses Unsloth + TRL `SFTTrainer` with conversational `messages` JSONL (and optional `--packing` / `--dataloader-num-workers` on a strong box). If setup time is short, use a 7B model. For quality runs, target 14B with strict-clean traces. Remove `--max-steps 30` or raise it for a real run. Install a `flash-attn` wheel that matches the session’s `torch`+CUDA for best GRPO and long-context SFT step time. ### 14B SFT presets (smoke then full) ```bash # Qwen3 14B smoke python training/train_sft.py \ --model Qwen/Qwen3-14B-Instruct \ --data data/sft/e1_m1_h1_examples.jsonl \ --output outputs/sft_qwen3_14b \ --batch-size 1 --grad-accum 8 --max-steps 20 # Qwen3 14B fuller run python training/train_sft.py \ --model Qwen/Qwen3-14B-Instruct \ --data data/sft/e1_m1_h1_examples.jsonl \ --output outputs/sft_qwen3_14b \ --epochs 2 --max-steps 200 # DeepSeek 14B smoke python training/train_sft.py \ --model deepseek-ai/DeepSeek-R1-Distill-Qwen-14B \ --data data/sft/e1_m1_h1_examples.jsonl \ --output outputs/sft_deepseek_14b \ --batch-size 1 --grad-accum 8 --max-steps 20 # DeepSeek 14B fuller run python training/train_sft.py \ --model deepseek-ai/DeepSeek-R1-Distill-Qwen-14B \ --data data/sft/e1_m1_h1_examples.jsonl \ --output outputs/sft_deepseek_14b \ --epochs 2 --max-steps 200 ``` Use `--assistant-only` only when the model template supports assistant token masks end-to-end. ## 4. Lightning H100 Session 2: Eval SFT ```bash pip install -e ".[training,plots]" python eval.py --policy scripted_weak --label baseline --output results/baseline_eval.jsonl python eval.py --policy hf \ --label sft \ --model Qwen/Qwen2.5-7B-Instruct \ --adapter outputs/sft_adapter \ --output results/sft_eval.jsonl ``` Push `results/*.jsonl` to Hugging Face or copy them back before the Lightning account expires. ## 5. Lightning H100 Session 3: RLVR ```bash python training/train_rlvr.py \ --model Qwen/Qwen2.5-7B-Instruct \ --adapter outputs/sft_adapter \ --examples data/processed/e1_m1_clean.jsonl,data/processed/h1_seed_clean.jsonl \ --output outputs/rlvr_adapter \ --strict-json \ --min-reasoning-steps 2 \ --rounds 3 \ --n-samples 8 \ --max-prompts 128 \ --stats-file results/runs/rlvr_stats.jsonl \ --push-to-hub /corp-env-rlvr-adapter ``` This uses Unsloth + TRL RLVR rejection-sampling with the same strict CORP-ENV verifier path. The recommended production path is now SFT then RLVR. ## 6. Final Eval And Plots ```bash python eval.py --policy hf \ --label rlvr \ --model Qwen/Qwen2.5-7B-Instruct \ --adapter outputs/rlvr_adapter \ --output results/rlvr_eval.jsonl python plot_results.py \ --inputs results/baseline_eval.jsonl results/sft_eval.jsonl results/rlvr_eval.jsonl \ --output-dir results ``` Commit or upload the resulting PNGs: - `results/model_comparison.png` - `results/success_by_task.png` - `results/invalid_action_rate.png` - `results/reward_curve.png` ## 7. Hugging Face Space Use HF credits for the official hosted OpenEnv environment: ```bash uv run openenv validate docker build -t corp-env . ``` After pushing the Space, validate it: ```bash ./validate-submission.sh https://.hf.space . ``` On Windows, run the validator from WSL or Git Bash.