amd模型训练环境修复方案
训练者: Eric
项目路径:F:\myqwen-moe
Python 环境:F:\ComfyUI便携版\python\python.exe
GPU: RX 6800 (16GB, GPU0) + RX 6600 XT (8GB, GPU1 kernel 编译极慢,暂不建议训练)
框架: PyTorch 2.13.0a0 + ROCm 7.13 + Transformers 4.46.3
基础模型: Qwen2.5-0.5B 结构(hidden=896, 24层, 词表151936, ~0.85B参数)
一、快速开始(新 Agent 必读)
1.1 启动训练队列(最常用)
cd F:\myqwen-moe
$env:HF_ENDPOINT="https://hf-mirror.com"
$env:CUDA_VISIBLE_DEVICES="0"
F:\ComfyUI便携版\python\python.exe -u run_training_queue.py
队列顺序:HTML → TECH → COMMON → MATH_WORD
完成的模型会自动跳过。日志在 output_v3/logs/。
1.2 查看训练进度
# 查看最新日志尾部
Get-Content output_v3/logs/html_train.log -Tail 30
# 查看训练进程
Get-Process python | Where-Object { $_.Path -like "*ComfyUI*" }
1.3 当前训练状态(最后更新: 2026-07-16 10:45)
| 模型 | 状态 | 步数 | 速度 | 位置 |
|---|---|---|---|---|
| Router | ✅ 完成 | 600步 | - | output_v3/router/ |
| CPP 专家 | ✅ 完成 | 936步 (~3 epochs) | ~2.6s/step | output_v3/experts/cpp/ |
| HTML 专家 | 🔄 训练中 | 65/500 | 3.72s/step | output_v3/experts/html/ |
| TECH 专家 | ⏳ 排队 | - | - | - |
| COMMON 专家 | ⏳ 排队 | - | - | - |
| MATH_WORD 专家 | ⏳ 排队(需扩参) | - | - | - |
| MATH_CALC | ❌ 不训练 | - | - | 改为 Python 工具调用 |
二、环境配置硬约束
2.1 Python 与依赖
- 必须使用:
F:\ComfyUI便携版\python\python.exe(不要用系统 Python) - HF 镜像: 必须设置
HF_ENDPOINT=https://hf-mirror.com - 禁用字节码:
PYTHONDONTWRITEBYTECODE=1
2.2 GPU 使用规则
⚠️ GPU1 (RX 6600 XT) 当前不建议用于训练!
现象:kernel 编译时一忽儿0%一忽儿100%,每步 70-120s 无法降到稳态。
根因:gfx1032 (6600XT) 的 ROCm kernel 编译效率极差,每步都在重复编译。
策略:所有训练只在 GPU0 上串行,设置CUDA_VISIBLE_DEVICES=0
- GPU0: RX 6800 16GB — 主力训练卡,稳定 90%+ 利用率,3.7s/step
- GPU1: RX 6600 XT 8GB — 暂不建议训练(详见 6.4)
2.3 精度配置
⚠️ 绝对不要直接用 bfloat16 训练! AMD ROCm 对 bf16 支持差。
| 配置项 | 值 | 说明 |
|---|---|---|
| 模型加载 dtype | torch.float32 |
用 fp32 加载权重 |
| mixed precision | fp16=True |
训练时用 fp16 混合精度 |
| gradient_checkpointing | False |
会显著减慢速度 |
| attn_implementation | 默认 (eager) | 不要用 SDPA / FlashAttention(ROCm 不支持 memory efficient attention) |
警告信息
Torch was not compiled with memory efficient attention是正常的,忽略即可。
三、速度优化黄金配置
经过多轮踩坑,以下配置在 RX 6800 上能稳定达到 ~3-4s/step(block=256, batch=4)
3.1 训练参数(专家 SFT 推荐值)
BATCH_SIZE = 4 # per_device_train_batch_size
GRAD_ACCUM = 16 # gradient_accumulation_steps
BLOCK_SIZE = 256 # 序列打包长度
EFF_BATCH = 64 # 有效 batch = 4 * 16
# 数据加载
dataloader_num_workers = 8
dataloader_pin_memory = True
dataloader_prefetch_factor = 2
# 学习率
lr = 2e-5 # SFT 常规
lr = 1e-5 # MATH_WORD 扩参后微调
warmup_steps = 50
lr_scheduler_type = "cosine"
# 保存
save_steps = 250
save_total_limit = 2
save_only_model = True
3.2 序列打包(关键!)
必须用序列打包(sequence packing),不能一条条 padding。
原因:单条 padding 会导致大量无效计算,GPU 利用率波动剧烈(工作5秒停5秒)。
打包函数位置:在 _train_expert_fast.py 的 preprocess() 中,逻辑:
- 将所有文本拼接成一长串
- 按
block_size切块 - labels = input_ids(CLM 任务)
3.3 速度参考(RX 6800 16GB)
| 配置 | 速度 | GPU 利用率 |
|---|---|---|
| 单条 padding, workers=0 | 50-120s/step ❌ | 波动大 |
| 序列打包, workers=8 | 3.7s/step ✅ | ~90% 稳定 |
| batch=4, block=256 | 3.7s/step | 好 |
| batch=2, block=256 | 2.6s/step | 好但有效batch小 |
四、训练脚本一览
4.1 主要脚本(推荐使用)
| 脚本 | 用途 | 命令示例 |
|---|---|---|
run_training_queue.py |
自动队列,HTML→TECH→COMMON→MATH_WORD | python run_training_queue.py |
_train_expert_fast.py |
单个专家快速 SFT(用这个!) | python _train_expert_fast.py --domain cpp --gpu 0 |
_train_math_word_expand.py |
MATH_WORD 扩参训练 (0.85B→1.2B) | python _train_math_word_expand.py |
_train_router_v2.py |
Router 分类器训练(12类) | python _train_router_v2.py |
_train_base_pt.py |
基础 PT 继续预训练 | python _train_base_pt.py |
4.2 旧脚本(参考,不推荐)
| 脚本 | 说明 |
|---|---|
_train_expert.py |
旧版专家训练,batch=2 略慢 |
_train_expert_gpu1.py |
GPU1 专用,已废弃 |
_train_router_gpu0.py / _train_router_gpu1.py |
旧版 Router,已被 v2 替代 |
4.3 数据位置
- 训练数据:
output_v2/data/(JSONL 格式,messages 字段)cpp_train.jsonl,html_train.jsonl,tech_train.jsonlcommon_train.jsonl,math_word_train.jsonlrouter_train.jsonl
- 模型输出:
output_v3/output_v3/router/— Router 模型output_v3/experts/{domain}/— 各专家模型output_v3/logs/— 训练日志
- base model:
base-model/(Eric 已预训练,注入身份信息) - 原始Qwen模型:
Qwen2.5-0.5B-Instruct/
五、MoE 架构概览
5.1 整体架构
用户输入
↓
规则层(关键词匹配,兜底用)
↓
Router 模型(序列分类,12维输出)
↓
路由决策 → [CPP] / [HTML] / [JS] / [CSS] / [MATH_WORD] / [TECH] / [COMMON] / [BASE]
↓
对应专家模型生成回答
↓
(如涉及数学计算)→ Python math_tool API
5.2 专家模型列表
| 专家 | 路由 Token | 参数量 | 数据量 | 训练方式 |
|---|---|---|---|---|
| CPP | [CPP] |
0.85B | ~10000 | 直接 SFT |
| HTML | [HTML], [JS], [CSS] |
0.85B | ~10000 | 直接 SFT |
| TECH | [TECH] |
0.85B | ~10000 | 直接 SFT |
| COMMON | [COMMON] |
0.85B | ~20000 | 直接 SFT |
| MATH_WORD | [MATH_WORD] |
1.2B (扩参) | ~8000 | 扩参后 SFT |
| BASE | [BASE] |
0.85B | - | 即 base-model |
MATH_CALC 已取消,改为 Python 工具调用(
moetrainer/tools/math_tool.py)
5.3 扩参方案(MATH_WORD)
- 旧: hidden=896, intermediate=4864, heads=14, kv_heads=2 (~0.85B)
- 新: hidden=1280, intermediate=6912, heads=20, kv_heads=2 (~1.2B)
- 权重映射: 保留旧权重在左上角,新维度用
std=0.02的正态分布初始化 - LayerNorm 新维度初始化为 1.0
六、常见问题与踩坑记录
6.1 训练速度极慢(50s+/step)
原因排查:
- ❌ 没有序列打包 → 改用
_train_expert_fast.py - ❌
dataloader_num_workers=0→ 设为 8 - ❌ 模型用 bf16 直接加载 → 改用
torch.float32加载 +fp16=True混合精度 - ❌ 用了 GPU1(6600XT) → 只用 GPU0
6.2 loss = nan / grad_norm = nan
原因: 直接用 fp16 加载模型训练
解决: torch_dtype=torch.float32 加载,fp16=True 走 mixed precision
6.3 GPU1 (RX 6600 XT) 训练极慢 / kernel 反复编译
测试结论(2026-07-16):
- GPU1 能正常启动:
torch.zeros()warmup 通过,模型加载成功,数据打包正常 - 但训练时每步都在重新编译 ROCm kernel,速度稳定在 70-120s/step,无法降到稳态
- 同样配置在 GPU0 上:第1步 48s,第10步降到 3.7s/step
根因: gfx1032 (6600 XT) 的 ROCm 7.13 支持不完善,kernel 编译效率极差
已尝试: HSA_OVERRIDE_GFX_VERSION=10.3.0、workers=0、batch=2 均无效
结论: GPU1 暂不建议用于训练,所有训练串行在 GPU0 上执行
6.4 ROCm kernel 编译慢 / 首次 step 特别慢(GPU0 正常)
正常现象: 第1步约 48s(编译 kernel),第10步左右降到 ~3.7s
无需处理,等 warmup 完就好。
Kernel 缓存位置: C:\Users\123\AppData\Local\comgr(需要写权限)
注意:GPU1 (6600XT) 不是"慢",是每步都重新编译,详见 6.3
6.5 中文日志乱码
PowerShell 重定向日志可能出现中文乱码。
不影响训练,看 step 数和 loss 数字即可。
6.6 训练进程退出了但模型没保存
检查是否 max_steps 设得太小导致提前结束但未到 save_steps。_train_expert_fast.py 训练结束会调用 trainer.save_model() 保存最终模型。
七、训练数据格式
7.1 专家 SFT 数据(JSONL)
{
"messages": [
{"role": "system", "content": "你是一个由Eric训练的AI助手..."},
{"role": "user", "content": "问题内容"},
{"role": "assistant", "content": "回答内容"}
]
}
Chat 模板用 Qwen2.5 格式:
<|im_start|>system
系统提示<|im_end|>
<|im_start|>user
问题<|im_end|>
<|im_start|>assistant
回答<|im_end|>
7.2 Router 分类数据
{
"text": "用户输入文本",
"label": "[CPP]" // 路由 token
}
八、关键代码位置
| 功能 | 文件 |
|---|---|
| 全局配置 / 专家定义 | [moetrainer/config.py](file:///F:/myqwen-moe/moetrainer/config.py) |
| Router 模型 | [moetrainer/train/router_model.py](file:///F:/myqwen-moe/moetrainer/train/router_model.py) |
| 数学工具 | [moetrainer/tools/math_tool.py](file:///F:/myqwen-moe/moetrainer/tools/math_tool.py) |
| 路由推理管线 | [moetrainer/router/router_pipeline.py](file:///F:/myqwen-moe/moetrainer/router/router_pipeline.py) |
| GGUF 转换 | [moetrainer/tools/convert_gguf.py](file:///F:/myqwen-moe/moetrainer/tools/convert_gguf.py) |
九、下一步待办
- ✅ Router 训练完成
- ✅ CPP 专家 SFT 完成
- 🔄 HTML 专家 SFT(进行中)
- ⏳ TECH 专家 SFT
- ⏳ COMMON 专家 SFT
- ⏳ MATH_WORD 扩参 + SFT
- ⏳ 所有模型 GGUF 量化(FP16 → q4_k_m)
- ⏳ 推理管线集成测试
- ⏳ GPU1 问题排查(可选,优先级低)
十、备忘清单(启动训练前过一遍)
- Python 路径对吗?用
F:\ComfyUI便携版\python\python.exe -
HF_ENDPOINT=https://hf-mirror.com设了吗? -
CUDA_VISIBLE_DEVICES=0设了吗?(只用 GPU0) - 模型是
torch.float32加载的吗? - 训练用了序列打包吗?(
_train_expert_fast.py) -
dataloader_num_workers=8了吗? -
fp16=True了吗?(不要 bf16) -
gradient_checkpointing=False了吗? - 日志路径确认了吗?
更多推荐



所有评论(0)