SuperAPI AI 工具集

spark-training-gotchas

部署与运维

查看项目

更新于 10-16 07:22

技能介绍

本技能用于在 NVIDIA DGX Spark 上做 ML 训练前的预检与故障诊断。GB10 芯片(Grace Blackwell、SM121、128GB 统一内存、aarch64)存在十种反复出现的故障模式,覆盖启动、内存、散热、带宽与精度,编号 G1–G10,编号本身供工具按号检查。适合在长时间或多轮训练前使用,而不是跑坏六小时后再查。

适用时机:训练启动即失败且报 import 错误或段错误但未指向真实原因;nvidia-smi 仍显示有余量却 OOM;运行中途吞吐下降;GB10 上任何多小时或多轮任务之前;两台 Spark 互联前选择并行策略时;以及在 FP8 与 NVFP4 之间做选择时。

十种故障模式:G1 CUDA 12/13 ABI 不匹配,多数 PyPI wheel 链接 libcudart.so.12 而 Spark 自带 CUDA 13,修复为从 download.pytorch.org/whl/cu130 重装或使用匹配容器。G2 flash-attn,裸 pip 无 aarch64/sm_121 wheel,NGC 容器自带可用 SM121 flash-attn,Unsloth 会自动偏好它而覆盖显式指定的 SDPA;裸 pip 下跳过 flash-attn 改用 SDPA,NGC 下唯一可靠覆盖方式是指定补丁。G3 UMA 在未达 128GB 时 OOM,safetensors 加载时 mmap 与 CUDA 分配器重复计页,QLoRA 因反量化临时分配可能比 bf16 更早 OOM;用 sync; echo 3 > /proc/sys/vm/drop_caches 清页缓存(需 root,仅限两次运行之间)。G4 热节流,持续功耗上限约 100W 而标称 240W,长跑会节流甚至重启。G5 带宽上限,273 GB/s 是规格上限而非持续值,实测 180–192 GB/s。G6 全局 UMA 资源争用,统一内存是单一全局池,未设上限或接近容量的进程会驱逐其他进程;小而受限的工作负载(如 <4GB LoRA 与 gpu-memory-utilization<=0.5 的 vLLM)可共存。G7 SM121 上 NVFP4 慢于 FP8,缺少 cvt.e2m1x2 时约慢 32%,除非构建目标为 sm_121a,否则保持 FP8。G8 官方 playbook 过时,运行昂贵任务前先查 github.com/NVIDIA/dgx-spark-playbooks 的近期 issue。G9 优先容器而非裸 pip,裸 pip 会让 Triton、xformers、transformers 各自漂移,无任何组件锁定 GB10 的 SM121;优先 NGC 或 Unsloth 容器,不得不用裸 pip 时按 NVIDIA 安装顺序并给 Unsloth 加 --no-deps。G10 双 Spark 仅限 DDP/FSDP,ConnectX-7 足以同步梯度/参数,但带宽不足以支撑 TP 的细粒度流量,绝不要用张量并行。

快速排查命令:python3 -c "import torch; print(torch.version.cuda)" 期望 13.x(G1,NGC 构建无 +cu130 标签不算失败);import torch; print(torch.cuda.get_device_capability()) 期望 (12, 1)(G7);以及检测容器环境的命令(G9)。assets/preflight.sh 会运行 G1、G3、G4、G7、G9,每个 gotcha 输出一行固定格式:先 G 编号,再 PASS/FAIL/WARN,不可自动化时为 SKIP,原始读数(G3、G4)为 INFO。完整命令见 references/gotcha-checks.md。环境假设见 spark-environment-setup。