You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
背景
我研究了 Roboparty/UFO 的 MJLab 训练链路,想记录一下它为什么在训练时能把 GPU utilization 打到接近 99%,功耗也接近电源上限。结论先说:它没有通过
nvidia-smi锁频、修改 power limit 或显式“拉功耗”,而是由 GPU-native batched physics、大模型、大 batch、高 update-to-data ratio 和 CUDA Graph/compile 共同造成的自然结果。1. 每张 GPU 跑 1024 个并行仿真环境
UFO 的推荐命令是多卡训练:
其中
--num-envs是 per GPU。--gpu-ids all会通过torchrunx启动一卡一进程,每个 rank 使用cuda:LOCAL_RANK并初始化 NCCL。因此 8 卡时相当于每张 GPU 独立运行:
2. 物理仿真在 GPU 上批量执行
UFO 的环境适配层是 MJLab / MuJoCo-Warp。MJLab 的
Simulation会调用:也就是把
num_envs个 world 放进 MuJoCo Warp 中批量仿真。在 CUDA driver 和 memory pool 条件满足时,MJLab 还会自动捕获 CUDA Graph:
之后每次
sim.step()replay 这个 graph:UFO 的 MuJoCo 配置是:
所以每个 control step 会执行 4 次 GPU physics step。以 1024 envs/GPU 计算:
这本身已经是持续的大规模 GPU workload。
3. 真正的大头:极高的 optimizer update 密度
UFO 的训练循环近似为:
关键默认值:
因为一次 vector env step 会新增 1024 个 environment transitions,而
update_agent_every也是 1024,所以过了 seed 阶段后:每一轮
agent.update()会同时 sample expert batch 和 replay batch,各 1024,然后更新多个模块,例如 FB 中包含:这是 GPU 长时间满载和功耗接近上限的主要原因。
4. 网络规模很大,而且默认不是 AMP
FB preset 中多个主要网络是 2048 宽、6 层残差结构:
按当前默认 G1 观测维度粗算:
同时模型配置里是:
并且 workspace 里设置了:
也就是默认走 FP32/TF32 风格的大矩阵计算,而不是轻量混合精度训练。
num_parallel=2还会把 forward/critic/aux critic 的有效 batch 从 1024 扩展到约 2048:FB 里还有 pairwise 矩阵:
再加上 discriminator gradient penalty 的 double backward,计算密度非常高。
5. replay/expert buffer 也在 GPU 上
UFO 训练配置中:
replay buffer 和 expert trajectory buffer 都使用这个 device。采样和 indexing 大多留在 GPU 上,减少了 PCIe 搬运,也让 GPU kernel 队列更连续。
Rollout wrapper 中仍有一些 observation/action 的 CPU↔GPU 转换和同步,但相对大量的 update 计算来说,update 阶段通常 dominates wall time。
6. compile 与 CUDA Graph
单卡时 agent update 会启用:
多卡时 agent 侧
torch.compile会关闭以简化分布式训练,但 MJLab/MuJoCo Warp 的物理仿真 CUDA Graph 仍会自动启用。run_train.sh也配置了 Triton/Inductor/CUDA/Warp cache,减少重复编译开销。7. 关于
GPU util 99%的解释nvidia-smi的utilization.gpu不完全等同于所有 SM 的算术利用率。它更接近采样周期内是否有 kernel 在执行。因此连续不断的小 kernel 也可能显示 99%。但在这个案例里,确实存在大量真实重计算:
所以功耗接近 power limit 是合理结果。
总结
UFO 把 GPU 打满的实现要点可以概括为:
amp=False。num_parallel=2将部分网络有效 batch 扩大到约 2048。torch.compile(mode="reduce-overhead"),物理仿真使用 CUDA Graph。nvidia-smi的代码。如果想降低功耗/占用,优先调整:
或修改网络宽度、层数、
amp配置;而不是从系统层面强制拉高功耗。All reactions