这里存放我的文献阅读笔记、实验记录与生活随笔。目前关注:分布式深度学习系统、数据中心网络与 AI 基准测试。
记录在昇腾上训练模型时踩到的一个坑
摘要:最近用 MindSpeed 预训练一个 MoE 模型,碰到了两件怪事:续训后周期性 NaN,以及每次重启 loss 都往上跳一截。查到最后,是数据侧一行原地写把缓存的 mask 模板慢慢写坏了。 1. 事情的起因 最近在用 MindSpeed 预训练一个 MoE 模型,大概用了4台机器训练一个13B左右的参数,设置的是每 1000 步存一次Checkpoint 然后就遇到两件怪事: NaN:续训跑一段时间,反向传播里突然报 found NaN in local grad norm。奇怪的是loss还没爆炸,但是梯度先坏了,重启一下续训又好了。 loss 跳升:每次重启之后的第一段日志,loss比重启前都要稍微高一点,0.35 到 0.45 之间。 单看哪一条都不像大事。跳升嘛,换个数据窗口很正常;NaN 嘛,偶发的数值意外。但这两件事都只在"重启"之后出现,就有点意思了。 2. 问题排查 一开始的怀疑清单很长:硬件、通信、精度、学习率、数据…逐个排查。 通信和硬件:小整数all_reduce之类的逐位校验跑了一遍,多种dtype、多种尺寸,还加了乱序压力,全过;训练期间的通信日志也很干净。 精度:bf16换FP32残差、改路由精度,问题依旧。 学习率:跨15倍幅度、换warmup形状,问题还是依旧。 数据内容:把挂掉那一步的原始文档离线解码出来看,就是普通文本,没毒;换个seed重建整条样本流,它还是死在进程启动之后的某个固定的位置。 排到后面就剩一条线索:死点跟"训练到第几步"关系不大,跟"这个进程启动之后吃了多少样本"关系很大。同一份配置重启一次,计数器清零,故障就得重新攒一遍才出现。 换句话说,问题不在训练动力学里,在"某个随进程增长的状态"里。范围一下小了很多。 3. 罪魁祸首 GPTDataset.__getitem__ 会缓存loss mask,但缓存的是引用。 # 屏蔽PAD,代码直接原地清零 loss_mask[labels == self._pad_token_id] = 0.0 于是每个DataLoader worker都在改同一份模板。偏偏这份数据的PAD和EOS用的是同一个token id(151643),packed之后样本里到处都是它,模板里的有效位置就这么被一点点吃掉。 造成的影响: 软污染:mask的有效token变少,训练loss的计算口径慢慢偏。污染期间loss偏低,重启重建模板之后就"跳升"——其实只是回到了正确值。 硬失败:当某个局部microbatch的mask被吃到全零,token分母为0,反向直接出非有限值。 而这份缓存是每个worker自己的,一重启就重建。所以故障严格按"进程内消费的样本数"复现,严丝合缝。 4. 实锤的证据 用原版代码、原数据和原helper,把DP32 × 2worker的64条数据流在CPU上重放了一遍:最早出现全零mask的是rank4/worker1,相对训练步1508,而历史崩溃日志里记的计数器是1507——对上了。加clone之后,那条样本的有效token是 4091、raw PAD是5,64条流逐样本和当前标签一致。 更直接的是冻结权重:同一份权重、同一批输入、同一份模型输出,只换mask,重算5120条序列的CE。 同一权重、同一模型输出 CE 均值 重建历史污染mask 1.902 当前样本的正确mask 2.351 差值 +0.449 nats 当然,这只能量化mask的测量效应,不能反推历史每一步的权重到底偏了多少。 ...
多Agent协作开发有感
摘要:用 16 个 Claude Code 实例(独立容器、独立 Gitea 身份)完成一个昇腾 910C Triton 算子数据集,观察多 Agent 的自组织、互检与平台瓶颈。 1. 引言 最近RSI相关的研究比较热门,我手上正好有一些vLLM的推理资源,平时用来做主力大模型用感觉有些慢,所以恰巧可以拿这些资源来做一些多Agent协作的研究和探索。 初步的实验发现:多Agent协作确实可以做到一些单Agent做不到的事情,但是仍然存在很大的问题,这可能也是多Agent协作还没形成非常完整的工具链形态的原因之一吧。 2. 环境准备 多Agent协作最Naive的想法就是每个Agent都有独立的任何和独立的上下文关系维护,没错,我现在也是这么干的,后端的Agent工具使用Claude Code,通过SDK把他接入群聊会话,但是在实现的路上也遇到了一些别的问题和思考: 2.1 上下文隔离 CC没有Hermes那样的独立Profile,默认情况下所有实例共用同一份配置目录。仅通过环境变量拆分工作目录,在放开权限后仍不能保证实例不会越狱。一旦某个实例的上下文被污染,并且污染被写入本地文件或Memory,很容易在实例之间连续传播。 采用的方式比较简单:1. 一个Agent一个Docker 容器;2. 容器之间共享同一份CC二进制文件;3. 工作目录、Memory、History各自独立。 这样可以保证即使某个Agent的上下文被污染,影响范围也被限制在它自己的容器内。 实测发现,污染主要发生在Memory和本地文件这条路径上。如果污染是通过Agent之间的消息传播的,其他Agent反而更倾向于质疑、复现和纠正,这一点和预期相反。 2.2 身份与权限 多 Agent 协作首先需要解决身份问题。如果所有 Agent 共用一个git身份,会出现两类问题:1. 把其他 Agent 的提交认成自己的;2. 否认自己实际做过的提交。 任务越长,这种身份错乱越严重,并且会加重幻觉。因此每个 Agent 都需要独立的 Gitea 账号、独立的 token,以及对应的 git user.name 和 git user.email。谁提交、谁评审、谁验收,必须能对应到具体身份。 2.3 平台能力 平台主要提供三类工具面(独立的运管平台): 统一MCP入口:代码提交、作业提交、知识库查询统一到一个入口; 群聊MCP网关:支持私聊、群聊和@; 项目管理工具:Issue、看板和PR,提供但不强制使用(需要把选择权交给Agent本身)。 但是实际上测试的时候发现,即便有这样的软约束,一旦Agent之间达成共识,也是按照他们的共识进行项目管理。(当然,并不是说这种方式不好,只是他们会在Git里面提交大量的实验日志和实验记录,并不太符合我的预期。) 3. 有趣的发现 3.1 自组织 向 Agent 下发一条约束:作业必须使用单机 8 卡提交。没有规定它们如何验证。 ...
文献阅读《Mystique: Enabling accurate and scalable generation of production AI benchmarks》
1. 挑战与贡献 挑战 模型的多样性和更新速度无法与云基础设施上不断变化、高度多样化的人工智能生产工作负载相匹配 工程师或研究人员需要手动选择现有的生产或开源工作负载,并将其调整为可用于基准测试的形式 贡献 框架:建立了一个可扩展的自动化端到端基础设施,可对真实生产型人工智能工作负载的执行轨迹进行剖析和重现 高精度:通过在warehouse-scale fleet中运行的几个 PyTorch 生产工作负载对 Mystique 进行了评估,结果表明,生成的基准在性能和系统级指标方面与原始基准非常接近 可移植性:展示了跨平台生成基准的可移植性,并评估了 Mystique 可应用的几种情况,包括早期平台评估、子轨迹重放和缩小性能测试 2. 相关工作 Benchmark DeepBench:提供了一套深度神经网络(DNN)使用的基本操作,并在不同平台上对其进行了评估 TBD:确定了八个具有代表性的 DNN 模型,并在不同的深度学习框架和硬件配置上进行了详细的性能分析 DAWNBench:测量训练和推理的端到端性能,以规定的精度为前提,允许软件、算法、通信方法的创新 MLPerf:目前最为流行的Benchmark 仿真工具 Sniper:并行、可扩展的CPU仿真工具,对多核和多处理器进行高度抽象 gem5:一种微架构的仿真器,目前适用于仿真GPU GPGPU-Sim:提供一种时钟周期级别的仿真工具,可以对运行CUDA和OpenCL的Nvidia GPU进行仿真 性能建模 Daydream:根据内核-任务依赖图预测模型在某些优化条件下的运行时间 Habitat:使用波形缩放和 MLP 预测 DNN 训练的执行时间 CM-DARE:提出了一种利用云端 GPU 服务器进行分布式训练的性能模型 性能收集 MicroGrad:收集CPU指标,并使用基于梯度下降的调整机制来生成工作负载克隆和压力测试 PerfProx:根据硬件性能计数器得出的性能指标,生成真实世界数据库应用程序的miniature proxies CAMP:模拟核心性能、内存位置以及它们之间的相互作用,以模仿BigData应用程序 ECHO:重点是利用统计模型克隆分布式云应用中的网络行为,并生成与原始服务的定位和流量特征相似的合成基准 Ditto:提出了一种自动克隆框架,该框架可捕获分布式云应用程序的低级和高级性能指标 G-MAP:为 GPU 应用程序的内存访问模式和并行性建模,以创建内存代理 GPGPU-MiniBench:生成 CUDA GPGPU 内核的miniature proxies,以保持相似的性能 3. 相关背景 Pytorch ATen ops:低层级的Tensor库,是Pytorch的后端,用于执行真实的计算任务(加法、矩阵乘法等) Communication ops:多设备之间的分布式训练通信,通常为异步的。在Pytorch中c10d是一个非常流行的通信库,提供了大量的集合通信API和P2P通信API Fused ops:融合操作,是一种计算加速优化方法,可以把多个操作融合成一个运算操作。CPU中常用NNC作为融合操作的后端,GPU中为NVFuser Custom ops:允许用户实现比默认实现更好的模型块 4. Mystique设计 ...
文献阅读《Alibaba HPN: A Data Center Network for Large Language Model Training》
Alibaba High Performance Network (HPN) HPN介绍了一种两层的双平面网络,可以在一个Pod中接入1.5w个GPU,通常需要3层Clos架构的网络才能容纳这么多GPU HPN 提出了一种新的双 ToR 设计,以取代传统数据中心网络中的单 ToR 1. 贡献与挑战 挑战 流量模式 传统网络无法应对LLM的低熵、周期性、突发的网络特点,传统的数据中心网络一般是高熵的(传统网络中会存在百万条流,但是每条流的利用率特别低,一半小于20%) ECMP在传统的数据中心的高熵、低利用率的网络中性能表现较好,但是在LLM训练中并不是最佳的 单点故障的敏感性高 LLM训练是一个同步过程,所有GPU合作完成一系列迭代,任何一个GPU发生故障都有可能导致整个训练过程出现问题 对LLM训练影响最大的是与机架顶部(ToR)相关的单点故障,这种故障可能会影响到各种GPU 生产统计数据显示,LLM训练中出现的故障造成的损失是一般云计算故障的 20 倍 贡献 非堆叠的双层ToR网络,可以在两个交换机之间直接同步,很好的改善了大规模部署的可信度 适配最新的51.2Tbps的交换机芯片,可以将1K个GPU部署在Tier 1网络中,使96.3%的训练任务获得高性能的网络 我们的实验表明,使用HPN的LLM训练吞吐量比传统数据中心网络高14.9倍 2. 背景知识 LLM的并行策略 DP:每次迭代使用All Reduce同步计算梯度数据 PP:每次使用Send/Recv传递中间结果 TP:每次迭代使用All Reduce/All Gather同步输出和对应的梯度 LLM的流量特征 带宽利用率周期性突发 流的数量少 传统的数据中心网络不适用于LLM流量模式 LLM对单点故障的敏感性 LLM每次的Checkpoint间隔大概在2-4小时,按照一个3k张GPU的集群计算,每次失败导致的回滚都将导致大约3w美元的损失 常见的监控工具和异常分析工具并不能避免网络产生故障,根据实验表明,在NIC到ToR之间每个月大概有0.057%的Link故障率,在ToR交换机每个月的故障率大约是0.051%,即一个LLM训练集群每个月可能会产生1-2次的Crash,5k-60k次的Link故障 LLM网络架构的建设目标 规模化:达到15K个GPU的规模,未来可以扩展到100K个GPU的规模 高性能:尽可能小的网络跳数,尽可能使用GPU-GPU直达的连接 单点故障容错率:在网络拓扑层尽可能改善单点故障的容错率 3. HPN架构 分为前端网络和后端网络,前端网络主要负责例如管理、接口、存储等网络流量,后端网络负责LLM的训练时的流量 每个Host包含8个GPU,使用NVLink互联,双向带宽达到400GBps-900GBps 每个Host包含9个2x200Gbps的网卡,其中一个连接到前端网络,其余的8个与GPU直连,接入后端网络 每个网卡的2个端口分别连接至不同的ToR网络,这种双ToR设计可以避免单点故障 4. 双ToR网络 传统数据中心的NIC的两个光缆接入一个交换机成为单ToR设计 双ToR设计将NIC的两个光缆接口分别接入不同的ToR交换机中 两个接口配置相同的IP和MAC地址,即使其中一个ToR故障,另外一个依旧可以正常工作 基于以上,同一个NIC的两个网卡共享相同的Queue Pair Context ...
文献阅读《xCCL: A Survey of Industry-Led Collective Communication Libraries for Deep Learning》
we survey the current state-of-the-art collective communication libraries (namely xCCL, including NCCL, oneCCL, RCCL, MSCCL, ACCL, and Gloo), with a focus on the industry-led ones for deep learning workloads. 常见的MPI库:MPICH、MVAPICH、OpenMPI 其他的非MPI库:OpenSHMEM(Open-source Symmetric Hierarchical MEMory)、UCX(Unified Communication X)、UCC(Unified Collective Communication) 常见的xCCL库:NVIDIA Collective Communications Library (NCCL)、AMD’s ROCm Collective Communication Library (RCCL)、Gloo 1. 贡献与挑战 挑战 什么让同时代的xCCL比MPI更具有吸引力? 每种集合通信库的性能特性如何? 这些xCCL库是如何设计的?是否存在某种共享的设计模式? 贡献 总结和研究集合通信原语、网络拓扑、算法,为同时代的深度学习训练奠定基础 讨论这些研究的工业集合通信解决方案以及其细节测试 对比当前的集合通信库的性能情况 2. 集合通信原语 Broadcast:常用于将训练数据发送到各个设备上 All Reduce:广泛应用于分布式神经网络训练的后向传播阶段 All Gather、Scatter、All-to-All、Reduce、Reduce Scatter 3. 网络拓扑架构 3.1 HyperCube 优点:高度的连接性,不容易发生故障 ...