在 Intel Arc B580 (XPU) 上从零训练 MoE 语言模型的技术报告
一、背景与目标
本报告记录了一次在 Intel Arc B580 (12GB) 上,使用 Intel XPU + PyTorch 从零训练 MoE(混合专家)语言模型 的完整尝试。目标不是追求模型性能,而是验证:
- Intel 消费级显卡能否完成 LLM 的预训练 + SFT 全流程。
- MoE 架构在 12GB 显存下的可行性边界。
- 记录所有踩过的坑,为后来者提供参考。
二、硬件与软件环境
| 项目 | 配置 |
|---|---|
| CPU | Intel Core i5-14600K |
| 内存 | 32GB DDR5 6000MHz |
| GPU | Intel Arc B580 12GB |
| 驱动 | 32.0.101.8509(及后续版本) |
| 操作系统 | Windows 10/11 |
| Python | 3.13.14 |
| PyTorch | 2.13.0+xpu |
| 训练框架 | MiniMind(原生 PyTorch 实现) |
| 后端 | Intel oneAPI / XPU |
三、模型架构
3.1 最终成功训练的配置(439M MoE)
| 参数 | 值 |
|---|---|
| 总参数量 | 439.16M |
| 激活参数量 | 138.35M |
| hidden_size | 1024 |
| num_hidden_layers | 10 |
| num_experts | 4(每层) |
| num_experts_per_tok | 1 |
| moe_intermediate_size | 3264(默认 ceil(1024×π/64)×64) |
| vocab_size | 6400 |
| 注意力头数 | 8(GQA,KV 头数 4) |
| 最大序列长度 | 8192(训练使用 256/512/1024) |
3.2 架构来源
基于 MiniMind-3 架构,对齐 Qwen3 生态:RMSNorm + RoPE + SwiGLU + GQA。MoE 部分为 4 专家 / Top-1 路由。
四、训练流程与实测数据
4.1 预训练
| 项目 | 数值 |
|---|---|
| 数据集 | pretrain_t2t.jsonl(约 846 万条) |
| 训练步数 | 约 22 万步 |
| 最终 loss 均值 | 约 2.7 |
| aux_loss | 稳定在 0.005–0.006 |
| batch_size | 1–2 |
| max_seq_len | 256–512 |
| accumulation_steps | 8–16 |
| learning_rate | 5e-4(余弦退火) |
| 优化器 | AdamW(BF16) |
| 梯度检查点 | 开启(仅 MLP 部分生效) |
| epoch_time | 约 12,400 分钟 / epoch |
关键观察:MoE 预训练在 XPU 上稳定,aux_loss 全程健康,没有出现路由崩溃。
4.2 SFT(监督微调)
| 项目 | 数值 |
|---|---|
| 数据集 | sft_t2t.jsonl(约 511 万条) |
| 训练步数 | 2000+ 步(持续中) |
| loss 区间 | 2.59 – 5.38 |
| aux_loss | 0.0052 – 0.0069 |
| batch_size | 1 |
| max_seq_len | 1024 |
| accumulation_steps | 8 |
| learning_rate | 1e-6 |
| 优化器 | AdamW(BF16) |
关键结论:SFT 成功跑通,无 NaN。
五、XPU 实测显存占用
| 阶段 | batch_size | max_seq_len | 显存占用 |
|---|---|---|---|
| 64M Dense 预训练 | 8 | 256 | 2.5–3.0 GB |
| 64M Dense 预训练 | 16 | 384 | 10.8 GB |
| 64M Dense SFT | 8 | 512 | 6.4 GB |
| 198M MoE 预训练 | 2 | 768 | 7.0–7.3 GB |
| 439M MoE 预训练 | 2 | 256 | 10.9 GB |
| 439M MoE SFT | 1 | 1024 | 约 11 GB |
XPU 显存估算公式:
实际显存 ≈ 理论显存 × 1.2~1.5 + 1.5GB(框架/驱动开销)
六、踩坑记录与解决方案
6.1 CUDA 回退问题
现象:训练脚本默认设备为 cuda:0,在 Intel 机器上回退到 cpu,速度极慢。
解决:重写设备检测逻辑,改为 xpu → cpu,并替换 torch.cuda.amp 为 torch.xpu.amp。
6.2 DataLoader 挂起
现象:num_workers > 0 时,训练卡在数据加载阶段。
解决:Windows + XPU 下设为 num_workers=0。
6.3 层数不匹配导致 NaN
现象:SFT 时脚本自动检测层数为 8,但预训练模型是 10 层,load_state_dict 部分权重随机初始化,反向传播爆炸。
解决:显式指定 --num_hidden_layers 10。
6.4 max_seq_len 过短导致 NaN
现象:max_seq_len=64/256 时,SFT 样本的 assistant 部分被完全截断,labels 全为 -100,cross_entropy 分母为零,返回 NaN。
解决:将 max_seq_len 提到 1024,保证 assistant 部分保留足够 token。
6.5 学习率过高导致 NaN
现象:SFT 用 5e-4 或 2e-5 时迅速 NaN。
解决:降到 1e-6,稳定训练。1e-6 是 XPU 上 439M MoE SFT 的安全阈值。
6.6 梯度检查点与 MoE 的兼容性
观察:未发现 GC 与 MoE 的明显冲突。NaN 主要来自层数不匹配和序列截断,而非 GC 本身。
七、训练命令示例
预训练(439M MoE)
python train_pretrain.py ^
--hidden_size 1024 ^
--num_hidden_layers 10 ^
--use_moe 1 ^
--batch_size 1 ^
--max_seq_len 256 ^
--accumulation_steps 8 ^
--learning_rate 5e-4 ^
--use_gradient_checkpointing 1 ^
--clear_cache_interval 1500 ^
--save_interval 500 ^
--from_resume 1
SFT(439M MoE)
python train_full_sft.py ^
--hidden_size 1024 ^
--num_hidden_layers 10 ^
--use_moe 1 ^
--from_weight pretrain ^
--batch_size 1 ^
--max_seq_len 1024 ^
--accumulation_steps 8 ^
--learning_rate 1e-6 ^
--use_gradient_checkpointing 1 ^
--clear_cache_interval 1500 ^
--save_interval 500 ^
--from_resume 0
八、结论与建议
8.1 可行性结论
- XPU 上可以完成 MoE 预训练:439M 总参、138M 激活,22 万步,loss 均值 2.7,aux_loss 稳定。
- XPU 上可以完成 MoE SFT:关键是层数匹配 + 序列长度足够 + 学习率 1e-6。
- 12GB 显存可以跑 439M MoE:但已经接近极限,
max_seq_len和batch_size必须精细控制。
8.2 给后来者的建议
- 显式指定层数:不要依赖脚本自动检测,手动传
--num_hidden_layers。 - max_seq_len 不能太短:SFT 至少 512,推荐 1024,避免 labels 全 -100。
- 学习率要低:MoE SFT 用 1e-6,不要用 1e-5 以上。
- 梯度检查点只对 MLP 生效:如需进一步省显存,需手动给 Attention 加 checkpoint。
- 定期备份:
checkpoints/和out/都要复制,防止被覆盖。 --from_resume的正确用法:第一次 SFT 用 0,中断续训用 1。
九、已知限制
- SFT 效果有限:138M 激活参数的容量上限决定了模型无法进行复杂推理和角色扮演。
- XPU 生态仍不成熟:算子兼容性、显存碎片、驱动稳定性问题仍存在。
- 全量 SFT 脆弱:MoE 全量微调容易 NaN,LoRA 可能是更稳定的替代方案。
- 没有验证集:本报告未划分验证集,loss 数据仅代表训练集。
十、后续计划
完成当前 SFT 至 5000–10000 步。用convert_model.py转成 Transformers 格式。发布到 Hugging Face,记录完整训练日志。- 探索 LoRA 微调在 XPU + MoE 上的稳定性。
- 专用化训练集,对预训练 Transformer 进行任务特定的监督微调,实现功能专精化。
报告撰写日期:2026-10-05
训练硬件:Intel Arc B580 12GB
训练框架:MiniMind + PyTorch XPU