训练者: 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.pypreprocess() 中,逻辑:

  1. 将所有文本拼接成一长串
  2. block_size 切块
  3. 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.jsonl
    • common_train.jsonl, math_word_train.jsonl
    • router_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)

原因排查:

  1. ❌ 没有序列打包 → 改用 _train_expert_fast.py
  2. dataloader_num_workers=0 → 设为 8
  3. ❌ 模型用 bf16 直接加载 → 改用 torch.float32 加载 + fp16=True 混合精度
  4. ❌ 用了 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.0workers=0batch=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)

九、下一步待办

  1. ✅ Router 训练完成
  2. ✅ CPP 专家 SFT 完成
  3. 🔄 HTML 专家 SFT(进行中)
  4. ⏳ TECH 专家 SFT
  5. ⏳ COMMON 专家 SFT
  6. ⏳ MATH_WORD 扩参 + SFT
  7. ⏳ 所有模型 GGUF 量化(FP16 → q4_k_m)
  8. ⏳ 推理管线集成测试
  9. ⏳ 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 了吗?
  • 日志路径确认了吗?
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐