微信扫码
添加专属顾问
我要投稿
主机级健康性检查(https://github.com/imbue-ai/cluster-health/tree/master/health_checks):用于确保特定主机无已知错误的脚本
NVIDIA集群通信库(NCCL) 补丁,优化错误和延迟的日志记录
压力测试,确认GPU能够分配大型张量并执行标准操作(https://github.com/imbue-ai/cluster-health/tree/master/gpu_stress_test)
网络测试(https://github.com/imbue-ai/cluster-health/tree/master/host_validation) ,以检查特定机器上的GPU能否相互通信(通过 NVLink),并且是否能够与其他机器上的GPU进行通信(通过 InfiniBand)
用于解析统一网络管理器(UFM)事件日志的脚本(https://github.com/imbue-ai/cluster-health/tree/master/host_validation) ,检查相关事件,并确定哪些网络端口应被禁用
一个用于为InfiniBand网络结构生成全面预热工作负载的脚本,目的是测试每一个可用的链路。
Docker(更轻松地运行服务和训练任务)
数据中心GPU驱动程序
Prometheus节点导出器(导出硬件/操作系统的稳定指标流)
DCGM导出器(NVIDIA 的额外GPU 状态/时钟/利用率指标)
在所有非操作系统驱动器上配置RAIDZ ZFS存储池(这使机器能够在一块驱动器故障的情况下继续运行,同时提供免费的透明压缩功能,这对于纯文本数据集和重复性日志特别有用,使我们能够常规性地利用比原本多约10倍的空间)。
启用一个额外的内核模块 (https://download.nvidia.com/XFree86/Linux-x86_64/535.183.01/README/nvidia-peermem.html)
确保禁止PCIe访问控制服务(ACS),防止出现立即挂起情况。(https://docs.nvidia.com/deeplearning/nccl/archives/nccl_2114/user-guide/docs/troubleshooting.html#pci-access-control-services-acs)
固件更新,尤其是当这种更新仅针对一般集群进行时,可能会破坏UFM的状态,并导致所有InfiniBand交换机上的UFM都需要重启。
同时进行的大规模GPU服务器重启,可能会向UFM状态中涌入大量更新数据,从而同样引发对UFM服务的重启需求。
利用PyTorch初始化矩阵计算,并评估NVLink的带宽以及GPU的计算速度和内存效率。我们设置了正确的GDR标志以测试InfiniBand和NVLink的性能。
通过ib_write_bw并激活-use_cuda,我们实现了在InfiniBand卡上传输数据,并对PCIe及InfiniBand卡的带宽进行了精确测量。为了确保能够捕捉出现“抖动”的InfiniBand链路,我们进行了长达15分钟的持续测试。
我们执行了多节点诊断运行,以检验NCCL的初始化功能以及是否存在随机停滞的情况。如果发生停滞,我们分支的NCCL代码会添加额外的日志记录。这个过程可能需要12到24小时,因此,我们通常只在添加新节点或怀疑存在问题时才会运行此测试。
检查DCGM导出中是否存在任何GPU时钟节流事件(不包括预期的gpu_idle和power_cap)。进行多节点训练,激活所有GPU、InfiniBand卡、CPU和磁盘,是测试这些功耗事件的最佳方法。
像 'Forward order differs across ranks: rank 0 is all-gathering 43 parameters while rank 1228 is all-gathering 1 parameters' 的错误 。我们发现,这属于PyTorch完全分片数据并行(FSDP)实现中的一个特性,可以通过重启来解决这个问题。
GPU内存不足(OOM)错误,表现类似 'CUDA out of memory Tried to allocate … '。为了解决这个问题,我们双重检查了配置和代码,并回滚了所有可能因启动时PyTorch设备指定不当而导致的GPU#0额外资源占用的新近代码更改。
CPU/RAM内存不足(OOM)错误,这类错误在错误日志中往往不易察觉,通常最佳检测手段是通过主机外部的dmesg日志来识别。我们主要在遇到子进程或网络对等方被OOM Killer回收时,遭遇以 'CalledProcessError' 或 'ConnectionError' 形式出现的错误。我们倾向于在检测到dmesg中的OOM Killer调用时,直接使健康检查失败并重启系统。我们还检查了代码路径中是否包含了足够的手动垃圾回收(参见下文关于如何禁用垃圾回收的章节),并确保没有意外尝试在CPU上进行计算或将张量搬运到CPU上。
训练一开始就立即达到了极低的MFU(低于预期值的1/10),并且保持稳定
训练一开始就达到了预期MFU的30%,并且保持稳定
训练一开始就达到了预期MFU的约60-80%,并且保持稳定
单组batch频繁出现的剧烈下降(降低10倍)
随机且罕见地(大约每15分钟发生一次)出现单组batch突然急剧下降(下降10倍),随后立即完全恢复到良好的MFU
在运行过程中,MFU图表呈现出逐渐下滑的趋势,但在每次重启后都能迅速回升至100%
初期性能表现良好,随后突然下降(降至预期的70%),并且以高频率(每15秒一次)持续发生
性能良好,但比平时更“嘈杂”(高频白噪声在预期MFU的90%到100%之间的方差较大)
它奏效过吗?
你最近有改变过什么吗 (例如, 合并了代码,更新了驱动程序)?
你是在健康主机上运行的吗?所有依赖的服务是否都在运行,包括第三方SaaS服务,如Docker Hub、GitHub或其他你所用的堆栈依赖的服务?
你确定你使用的是与上次完全相同的代码、环境、配置、版本、主机列表、排名顺序和随机种子吗(如果可能的话)?
这个问题可以复现吗?
它与其他事情有关联吗?其他进程?每日定时任务?主机或DCGM、UFM指标?
你的度量工具是否正确?
当运行缩减代码(较小的模型、伪造的数据、不保存或加载检查点)时,问题仍然存在吗?
能够相互替换机器极为实用。对于任何特定的训练运行,我们发现拥有比实际需要多出10-20%的机器是有益的,这样在机器发生故障时,我们能够轻松地重新启动运行。通过设置集群网络使每台机器都与所有其他机器紧密相连,我们实际上可以利用任何处于工作状态的子集机器。
对于每一次在训练过程中遇到的硬件或软件故障,编写相应的测试和自动化解决方案是非常值得的,因为这些已解决的问题可能会再次发生。同样地,对于每一个难以理解的错误信息,开发工具使其更加清晰易懂也是十分有价值的。
重现性是优质科学研究的基础。我们迅速采纳的一个原则是“每次只变动一个因素”,即便是处理最简单的情况也不例外。
“信任,但需实践检验”。每当我们在流程中引入新的外部工具,或无论是内部还是外部新加入团队成员时,我们确保对其声明进行复核,特别是当后续步骤依赖于这些结果时。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-03-08
QwQ总结能力测评,32b小模型真能超过deepseek吗
2025-03-08
为什么vLLM做不到?解密Ollama越级部署黑科技:以DeepSeek-R1-8B为例
2025-03-07
为什么Manus底层模型没用DeepSeek?——Manus六问六答
2025-03-07
Cherry Studio 发布 v1.0.0 版本支持联网搜索
2025-03-07
Claude 3.7 Sonnet 使用结论
2025-03-07
Manus,为何是他们做出来了?
2025-03-07
Cursor 新版本要来了!同一个窗口使用Agent+Chat!上下文增强、UI升级、界面更清爽。
2025-03-07
Cursor + MCP:效率狂飙!一键克隆网站、自动调试错误,社区:每个人都在谈论MCP!
2025-02-04
2025-02-04
2024-09-18
2024-07-11
2024-07-09
2024-07-11
2024-07-26
2025-02-05
2025-01-27
2025-02-01