AI 纪元 追踪人工智能最新进展,深度解读前沿技术

昇腾910C集群微调实录:显存、算子与通信排坑

1.6万亿参数后训练已经跑通,7B—13B微调却不能照搬CUDA脚本。三个项目的故障集中在OOM、融合算子缺失和HCCL卡死,排查顺序比盲目改参数更重要。

0 次阅读 约 2515 字 5 分钟 AI 生成
昇腾910C集群微调实录:显存、算子与通信排坑 cover image
昇腾910C集群微调实录:显存、算子与通信排坑 cover image

2026年6月初,深圳河套学院AI训练平台项目团队联合哈尔滨工业大学(深圳)、深圳市大数据研究院、华为有关团队,并协同深智城AI算力平台,依托昇腾910C集群完成1.6万亿参数DeepSeek-V4-Pro全参数后训练。公开报道给出了一个明确的能力锚点:昇腾910C集群已经承担过万亿参数级任务。

落到日常研发,麻烦往往藏在更小的地方。7B—13B模型从CUDA迁到Ascend,可能在第一个Step触发OOM,也可能卡在一个融合算子,或者运行一段时间后停在HCCL通信。三个项目记录,恰好覆盖了这三类故障。

OOM先看样本长度,别只盯80GB

一个金融科技项目在单机8卡昇腾910C上全参数微调Llama-7B,seq_length=4096,batch_size=4。同样的配置曾在A100环境运行,但迁移后刚完成第一个Step,PyTorch便抛出 RuntimeError: Out of memory。

项目使用的是80GB HBM配置。这里最容易出现的误判,是拿标称容量直接推算训练能否装下。动态Shape、变长序列和算子缓存都会影响峰值显存,CANN与CUDA的运行时策略也不相同,A100上的经验不能直接套用。

排查时先做三件事:

  • 按token长度分桶。 将长度接近的样本放进同一个batch,缩小批次内的长度差,减少算子内部反复resize带来的额外开销。
  • 拆开物理batch和等效batch。 将 micro-batch 降到1,再用梯度累加维持等效 batch_size=4。这通常比继续压单卡物理batch更稳妥。
  • 固定版本组合。 驱动、CANN、MindSpore,或PyTorch与 torch_npu,都要记录完整版本。升级前先核对官方配套关系,并用同一批数据回归,不要只写一句“已升级最新版”。

如果首个Step仍然OOM,可以固定输入样本,分别记录前向、反向阶段的显存峰值。这样才能判断问题来自数据Shape、激活值,还是运行时内存管理。

算子报错,先查具体调用路径

一家医疗大模型团队把原有的HuggingFace Transformers代码直接搬到昇腾环境。第一次迭代进入反向阶段后,程序报错:

AscendError: Not implemented operator: aten::_scaled_dot_product_flash_attention_backward

这个错误指向当前调用路径缺少对应实现,不能简单概括成“昇腾不支持Flash Attention”。原代码调用了PyTorch 2.x底层的融合接口,而TorchNPU的兼容层没有映射到可执行路径。

这类问题可以按以下顺序处理:

  • 先沿调用栈确认,是Transformers、PyTorch SDPA接口,还是项目自定义代码触发了该算子。
  • 对照当前CANN、PyTorch和 torch_npu 的版本关系,检查是否存在官方支持的替代入口。
  • 如果只缺少单个算子,优先替换调用路径;如果RoPE、Flash Attention等融合算子连续出现兼容问题,再评估迁移到MindSpore和MindSpeed。
  • 使用MindSpeed时,也要核对仓库版本与910C环境,不要直接复制旧版Megatron脚本。

华为在昇腾基础软件栈的公开介绍中,将CANN(Compute Architecture for Neural Networks)定位为昇腾AI基础软硬件平台中的异构计算架构。实际排错时,CANN、框架版本和算子实现需要放在一起检查,只替换一个Python包往往解决不了问题。

Step 120卡死,HCCL超时可能只是结果

第三个项目使用4台服务器、共32卡昇腾910C微调13B模型。训练经常运行到Step 120左右后停住:程序没有退出,也没有OOM,NPU利用率降到0%,Host侧日志持续出现HCCL通信超时。

HCCL超时未必是最早发生的异常。某个rank没有进入集合通信,其余rank也会一直等待。定位时要先找出第一个停止推进的rank,再判断问题出在算子、进程还是物理链路。

几项检查不能省:

  • 对齐时间戳和rank。 汇总各节点日志,找到最先停止输出的进程,不要只看最后一条超时记录。
  • 核对rank table。 可使用部署环境中的 hccl_tools 生成或校验配置,确认服务器、NPU设备和rank编号一一对应。
  • 检查实际组网。 单台8卡服务器内部通过HCCS互联,跨服务器走RoCE。ring或mesh没有通用模板,应按当前组网、并行方式和HCCL版本配置。
  • 配置梯度分桶。 根据当前MindSpore版本设置通信融合参数,使前一个bucket的梯度通信与后续反向计算重叠。comm_fusion 的参数名称和阈值要以所用版本文档为准。
  • 在卡死现场留存日志。 保存各节点dump、HCCL日志、rank table和版本信息。作业重启后只剩一条timeout,很难还原最早的故障点。

能复现,才算跑通

一次训练成功并不够。环境重建、卡数增加或数据集更换后无法复现,团队还会回到临场救火。迁移SOP至少要留下这些信息:

  • 卡型、服务器数量、单机卡数,以及驱动、固件、CANN和框架版本;
  • 模型名称、seq_length、物理batch、micro-batch、梯度累加和数据分桶规则;
  • 缺失算子的完整名称、调用栈、发生在前向还是反向,以及最终替代路径;
  • rank table、设备映射、HCCL超时对应的rank和Step;
  • 每轮只改一类变量,先用短作业验证,再扩大卡数或序列长度。

2025年6月20日,华为云宣布新一代昇腾AI云服务全面上线。证券时报相关报道显示,团队获取昇腾算力的入口正在增加。训练脚本能否稳定运行,仍取决于版本、算子和通信配置是否记录清楚。

在CUDA环境中可以直接执行 accelerate launch 的脚本,迁到Ascend后需要重新验证数据Shape、算子路径与集群拓扑。把这三项写进SOP,后续的7B—13B微调故障才能按同一顺序复现和定位。

相关阅读