Model Integration Guide
SkillAI & modelsGuide for integrating a new model into the Relax training pipeline. Use when adding a new model architecture, writing Megatron-to-HF weight converters, implementing custom TP all-gather/chunk logic, debugging weight sync issues, or adapting models for colocate or fully-async mode. Covers Megatron backend (bridge and raw modes) and FSDP backend.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Model Integration Guide skill
What this skill tells your AI
The instructions your AI receives, as published by redai-studio/relax in skills/model-integration/SKILL.md and read by ahel’s review.
Overview
Relax 支持两种训练后端和两种执行模式,新模型接入需根据组合适配不同的模块。
后端 x 模式矩阵
| Colocate (共卡) | Fully-Async (全异步) | |
|---|---|---|
| Megatron | Bridge 自动转换;Actor/Rollout 时分共享 GPU | Bridge 或 raw 转换;独立 GPU 集群,DCS 权重同步 |
| FSDP | HF 原生权重名,DTensor 自动 redistribute | 暂不支持 |
决策树
新模型接入
├─ Megatron 后端?
│ ├─ Bridge 支持? → [快速路径] 仅需 Step 1-2
│ └─ Bridge 不支持 → [完整路径] Step 1-5
└─ FSDP 后端? → [FSDP 路径] Step 6
Megatron Backend
权重同步 Pipeline
训练完成后,权重需从 Megatron 内部格式同步到 Rollout 引擎(SGLang):
Training Step Complete
│
├─── [bridge 模式] ─────────────────────┐
│ AutoBridge.export_hf_weights() │
│ 自动处理 Megatron→HF 转换 │
│ ▼
├─── [raw 模式] ────────────────────────┐
│ all_gather_param (common.py) │ TP-sharded → full
│ │ │
│ ▼ │
│ convert_to_hf (__init__.py) │ Megatron name → HF name
│ │ │
│ ▼ │
├────────────┴──────────────────────────┘
│
├─── [共卡] UpdateWeightFromTensor
│ GPU→CPU serialize → Gloo gather → Ray IPC
│
└─── [全异步] UpdateWeightFromDistributed / DeviceDirectBackend
NCCL broadcast / HTTP push
│
▼
chunk_param (checkpoint_engine/utils.py)
full → TP-sharded (逆操作,仅全异步)
共卡 vs 全异步选择逻辑(actor.py:176):
update_weight_cls = UpdateWeightFromTensor if self.args.colocate else UpdateWeightFromDistributed
Step 1: Model Provider (Bridge 模式 — 快速路径)
前提:模型已有 Megatron Bridge 支持。
Bridge 模式下,model_provider.py 自动完成:
- 模型构建:
AutoBridge.from_hf_pretrained()→bridge.to_megatron_provider() - HF→Megatron 加载:
checkpoint.py中bridge.load_hf_weights(model)自动转换权重 - Megatron→HF 导出:
hf_weight_iterator_bridge.py中bridge.export_hf_weights()自动导出
你需要做的:
- 确认
AutoBridge.from_hf_pretrained(hf_checkpoint)能正确加载你的模型 - 如果模型有非标准 TP 分片(参见 Step 5),仍需添加自定义 all_gather/chunk 逻辑
Step 2: Model Config & Launch Script
File: scripts/models/<model_name>.sh — 模型架构参数
从 HF config 提取对应的 Megatron 命令行参数。具体样例见 references/examples.md#model-config-script。
File: scripts/training/<category>/run-<model>-<size>-<gpus>gpu[-async].sh — 训练启动脚本
关键区分参数:
- 共卡:无特殊 flag(默认即共卡)
- 全异步:
--fully-async --resource '...' --max-staleness N - 转换模式:
--megatron-to-hf-mode bridge(推荐)或raw
具体样例见 references/examples.md#launch-script-colocate 和 references/examples.md#launch-script-fully-async。
Bridge 模式到此结束。以下 Step 3-4 仅在
--megatron-to-hf-mode raw时需要。
Step 3: Megatron-to-HF Converter (raw 模式)
File: slime/backends/megatron_utils/megatron_to_hf/<model_name>.py
转换器是纯函数,将单个 Megatron 参数映射为一或多个 HF 参数:
def convert_<model>_to_hf(
args, name: str, param: torch.Tensor
) -> list[tuple[str, torch.Tensor]]:
必须覆盖的参数映射:
| Megatron Name Pattern | HF Target | Notes |
|---|---|---|
embedding.word_embeddings.weight | model.embed_tokens.weight | |
output_layer.weight | lm_head.weight | |
decoder.final_layernorm.weight | model.norm.weight | |
self_attention.linear_qkv.weight | q/k/v_proj.weight | 按 GQA 拆分 |
self_attention.linear_proj.weight | o_proj.weight | |
mlp.linear_fc1.weight | gate_proj + up_proj | GLU: chunk(2) |
mlp.linear_fc2.weight | down_proj.weight | |
*.layer_norm_weight | *_layernorm.weight | fused norm |
MoE、多模态、MTP 等扩展映射见 references/examples.md。
参考:简单模型看 qwen2.py(71行),复杂模型看 qwen3_5.py(345行)。
Step 4: Register Converter (raw 模式)
File: slime/backends/megatron_utils/megatron_to_hf/__init__.py
# 1. 顶部添加 import
from .<model_name> import convert_<model>_to_hf
# 2. 在 _convert_to_hf_core() 添加路由(具体名字在前)
if "<model_name>" in model_name:
converted_named_tensors = convert_<model>_to_hf(args, name, param)
model_name 来自 type(AutoConfig.from_pretrained(hf_checkpoint)).__name__.lower()。注意路由顺序:具体名字(如 qwen3_5)必须在通用名字(如 qwen3)之前。
Step 5: Custom TP Sharding (bridge 和 raw 均适用)
大多数标准层的 TP 分片由框架通用逻辑处理。仅当模型有非标准 TP 分片方式时才需要此步骤。
需要同时修改两个互为严格逆操作的函数:
| 函数 | 文件 | 方向 | 场景 |
|---|---|---|---|
all_gather_param | slime/.../update_weight/common.py | TP-sharded → full | 训练侧发送权重 |
chunk_param | relax/checkpoint_engine/utils.py | full → TP-sharded | Rollout 侧加载权重(全异步) |
核心不变量:chunk_param(all_gather_param(p))[tp_rank] == p
在通用逻辑前按参数名 pattern 插入模型特有分支。具体代码见 references/examples.md#custom-tp-all-gather。
FSDP Backend
Step 6: FSDP Model Adaptation
FSDP 后端直接使用 HuggingFace 模型,权重名就是 HF 原生名称,不需要写转换器。
权重同步(slime/backends/fsdp_utils/update_weight_utils.py):
model.state_dict()遍历所有参数- DTensor 通过
redistribute(Replicate)自动 all-gather - 按 buffer 大小分桶,序列化推送到 Rollout
这套逻辑对所有模型通用,无需模型特化。
需要模型特化的场景:仅 MoE 模型需要自定义 expert dispatch 和 fused kernel(如 slime/backends/fsdp_utils/models/qwen3_moe.py),放在 slime/backends/fsdp_utils/models/ 下。
Common Pitfalls
1. module. prefix 不一致
不同模型 prefix 深度可能不同。如 Qwen3.5 多了 language_model 层,需要在转换器开头归一化:
if name.startswith("module.module.language_model."):
name = "module.module." + name[len("module.module.language_model."):]
2. 多模态子模型绕过 TP
非 Megatron 的视觉/音频编码器没有 tensor_model_parallel 属性,需在 all_gather_param 中跳过:
if ".vision_model." in name:
if not hasattr(param, "tensor_model_parallel"):
return param
3. ZeroCenteredRMSNorm 偏移
Megatron 的 ZeroCenteredRMSNorm 权重中心为 0,HF 的 RMSNorm 中心为 1:
return [(f"{prefix}.norm.weight", param + 1)]
4. GLU linear_fc1 layout
框架已内置 SwiGLU 的交错 layout 处理,不需要额外代码。
5. Bridge 模式仍需自定义 TP 逻辑
Bridge 自动处理名称转换,但 all_gather_param/chunk_param 中的自定义 TP 逻辑仍然需要——TP 分片/还原发生在转换之前/之后。
6. _convert_to_hf_core 路由顺序
in 匹配 model_name 时,具体名字必须在前:qwen3_5 → qwen3vl → qwen3。
7. HF Config 动态读取
模型特有参数通过 get_hf_config() 获取(@lru_cache,只加载一次):
from slime.utils.misc import get_hf_config
config = get_hf_config(args.hf_checkpoint) # .text_config.xxx
8. 共卡模式下 named_params_and_buffers 的 convert_to_global_name
共卡模式使用 UpdateWeightFromTensor,内部通过 HfWeightIteratorBase.create() 根据 megatron_to_hf_mode 选择迭代器。raw 模式需要 convert_to_global_name=True(将 VP/PP 局部层索引转换为全局索引),bridge 模式不需要:
# actor.py:154
convert_to_global_name=args.megatron_to_hf_mode == "raw"
Validation Checklist
- 转换器覆盖率 (raw 模式):遍历所有参数名,确认无
ValueError - all_gather/chunk 对称性:构造随机 tensor → 分片 → all_gather → chunk → 验证一致
- 端到端:小规模跑 1-2 iter,检查 log 无
Unknown parameter name,Rollout 引擎成功加载权重
File Reference Map
| File | Role | When to Modify |
|---|---|---|
slime/backends/megatron_utils/megatron_to_hf/<model>.py | Megatron→HF 映射 (raw) | raw 模式 |
slime/backends/megatron_utils/megatron_to_hf/__init__.py | model_name 路由 (raw) | raw 模式 |
slime/backends/megatron_utils/update_weight/common.py | TP all_gather | 非标准 TP 时 |
relax/checkpoint_engine/utils.py | TP chunk (逆操作) | 非标准 TP 时 |
slime/backends/megatron_utils/model_provider.py | 模型构建 (raw/bridge) | raw 自定义时 |
slime/backends/megatron_utils/checkpoint.py | HF→Megatron 加载 (bridge) | Rarely |
slime/backends/megatron_utils/update_weight/hf_weight_iterator_bridge.py | bridge 权重迭代 | Rarely |
slime/backends/megatron_utils/update_weight/hf_weight_iterator_direct.py | raw 权重迭代 | Rarely |
slime/backends/megatron_utils/update_weight/update_weight_from_tensor.py | 共卡模式权重同步 | Rarely |
slime/backends/megatron_utils/update_weight/update_weight_from_distributed.py | 全异步权重同步 | Rarely |
relax/checkpoint_engine/backends/device_direct.py | 全异步 DCS 通信 | Rarely |
slime/backends/fsdp_utils/update_weight_utils.py | FSDP 权重同步 (通用) | Rarely |
slime/backends/fsdp_utils/models/ | FSDP 模型特化 (MoE) | MoE 模型时 |
scripts/models/<model>.sh | 模型架构参数 | Always |
scripts/training/<category>/run-<model>-*.sh | 训练启动脚本 | Always |
slime/utils/misc.py :: get_hf_config() | HF config 缓存 | Never |
Bundled Resources
references/examples.md— 完整代码样例:简单/复杂转换器、自定义 TP 逻辑、注册、脚本模板
Signals
- GitHub stars
- 606
- Forks
- 150
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
model-integration-redai-studio- Source
- github.com/redai-studio/relax