Qwen3.8-Flash-Next
| Model | Full FT | LoRA | Min. hardware |
|---|---|---|---|
Qwen3.8-Flash-Next (HF qwen4_exp, ~180B MoE) | ✅ | ✅ | 4x8 B200 |
Supported on main with the Megatron backend. The model mixes GDN linear attention with gated attention using a QSA sparse indexer,
has 512 routed experts (top-10), and a frozen ~51B-parameter PLE n-gram table.
Megatron support is SkyRL's own, in skyrl/backends/skyrl_train/patches/megatron/qwen4_exp/.
CI runs Megatron vs vLLM logprob tests (full and LoRA adapter) on a 4-layer slice.
Example scripts
All scripts are in examples/train/qwen3_8_flash_next/ and run on 4x8 B200.
| Task | Mode | Script |
|---|---|---|
| GSM8K | LoRA | run_gsm8k_qwen3_8_flash_next_lora_4node.sh |
| GSM8K | Full FT | run_gsm8k_qwen3_8_flash_next_fullft_4node.sh |
| DAPO | LoRA | run_dapo_qwen3_8_flash_next_lora_sync_4node.sh |
| DAPO | Full FT | run_dapo_qwen3_8_flash_next_fullft_sync_4node.sh |
bash examples/train/algorithms/dapo/prepare_dapo_data.sh
MODEL_PATH=/path/to/Qwen3.8-Flash-Next bash examples/train/qwen3_8_flash_next/run_dapo_qwen3_8_flash_next_lora_sync_4node.shPut MODEL_PATH on node-local disk at the same path on every node. Every vLLM and trainer rank reads the 360 GB checkpoint at startup.
The GSM8K scripts cap sequences at 512 + 1024 tokens, so attention stays dense. The DAPO scripts use the stock 2k prompt / 8k response budget, which runs the QSA indexer in its sparse regime, with R3 (rollout routing replay).
Results: DAPO LoRA (LR 3e-4, alpha 32) took held-out AIME from 0.45 to 0.85 in 10 steps.
Parallelism
- TP=1 by default, or TP=2 with sequence parallelism. At TP=4 the cuDNN QSA kernels don't cover the head layout and it falls back to FlexAttention.
- CP=PP=1. The model scales with expert parallelism: EP=16 on 32 GPUs.
- EP also shards the frozen PLE table (~100 GB / EP per rank, ~6.4 GB at EP=16, kept in pinned host memory).
Notes
-
Text only and packed sequences (
language_model_only=true,remove_microbatch_padding=true). -
What trains: the PLE n-gram table is a plain tensor, so it is never trained or synced. The PLE projections/norms/conv and the hyper-connections train in full FT. The QSA indexer stays frozen. LoRA (all-linear) adapts only the attention, GDN and MoE linears.
-
MTP is not trained (
mtp_num_layers=0). vLLM keeps the base MTP weights, so don't turn on MTP speculative decoding for long runs. -
LoRA sync is adapter-only (
merge_lora=false). Merging doesn't fit in memory at TP8/EP16. Expert adapters keep the full rank, sincenormalize_moe_loraneedsrank % 10 == 0. -
Learning rates: LoRA needs a much larger LR than full FT. At 1e-5 / 3e-5 LoRA runs stayed flat, and 3e-4 learns. For full FT, 1e-5 sharpened the policy too fast and 3e-6 works.
-
Overlong penalty: the DAPO scripts use a half-strength soft overlong penalty. At full strength, full FT learned to cut its reasoning short.
-
Faster sparse attention on B200: set
QSA_CUDNN_WHEELto a cudnn-frontend wheel withcudnn.ops.qsa_forward(>= 1.32, or the1.32.0.devcp312 wheel from NVIDIA/cudnn-frontend releases), at the same path on every node. It is 1.7-3.5x faster than the FlexAttention fallback. -
Blackwell: the scripts default to the Triton GDN backend, since fla's TileLang GDN backward aborts on Blackwell.
-
H100 (80 GB): set
NCCL_NVLS_ENABLE=0in the Ray worker environment (SkyRL doesn't forward it from your shell). NVLS buffers otherwise take ~12 GiB/GPU that vLLM needs. -
vLLM custom all-reduce is off. It fails under sleep mode with TP>1 (
custom_all_reduce.cuh:164 'invalid argument'). -
Loading full-FT exports: HF exports from
trainer.hf_save_intervalleave out the PLE table, vision tower and MTP head, and vLLM needs the PLE table. Fill in the missing tensors from the base checkpoint withcomplete_export.py:uv run --isolated --no-project python examples/train/qwen3_8_flash_next/complete_export.py <export_dir> <base_dir>