通信日志
在本教程中,我们将介绍 DeepSpeed 通信日志记录并提供其使用示例。
概述
注意:所有日志记录通信调用都是同步的,以提供准确的时间信息。如果您的模型大量使用异步通信操作,这可能会影响性能。
日志记录通信调用对于确保网络资源得到充分利用至关重要。DeepSpeed 通信日志记录器能够检测并记录在 deepspeed.comm
下启动的所有通信操作。每个通信操作都可以在完成后立即直接打印到控制台(通过 verbose
配置选项),或者在训练、一个 epoch 或 N 次训练迭代完成后,通过在客户端代码中调用 deepspeed.comm.log_summary()
或 deepspeed.com.log_summary(show_straggler=True)
来打印摘要。
用法
DeepSpeed 中的通信日志记录是在 DeepSpeed 配置文件 中配置的。DeepSpeed 将自动记录所有操作(prof_all
)或用户指定的操作(prof_ops
)的通信。
配置设置
通信日志记录可以在 DeepSpeed 配置文件 中配置。通过在 DeepSpeed 的 JSON 配置文件中添加以下字段可以启用通信日志记录。有关详细信息,请参阅 通信日志记录。
"comms_logger": {
"enabled": true,
"verbose": false,
"prof_all": true,
"debug": false
}
目前有两种方式查看通信日志记录
详细日志记录
如果选择了 enabled
配置选项,所有通信操作将立即打印到控制台。此模式旨在用于详细调试,不建议大多数用户使用。以下是 verbose
输出的示例片段
[2022-06-26 01:39:55,722] [INFO] [logging.py:69:log_dist] [Rank 0] rank=0 | comm op: reduce_scatter_tensor | time (ms): 9.46 | msg size: 678.86 MB | algbw (Gbps): 1204.52 | busbw (Gbps): 1129.23
[2022-06-26 01:39:56,470] [INFO] [logging.py:69:log_dist] [Rank 0] rank=0 | comm op: all_gather_into_tensor | time (ms): 0.11 | msg size: 6.0 MB | algbw (Gbps): 954.41 | busbw (Gbps): 894.76
[2022-06-26 01:39:56,471] [INFO] [logging.py:69:log_dist] [Rank 0] rank=0 | comm op: all_gather_into_tensor | time (ms): 0.08 | msg size: 6.0 MB | algbw (Gbps): 1293.47 | busbw (Gbps): 1212.63
对于高级用户,debug
选项会将每个通信操作的调用函数附加到该操作的 log_name
。有关启用 debug
选项后 deepspeed.comm.log_summary()
调用的示例,请参阅 日志摘要。
日志摘要
建议用户在训练里程碑(例如,每个 epoch 或 N 次迭代)添加对 deepspeed.comm.log_summary()
的调用。这使得在不筛选来自 verbose
的日志的情况下实现高级通信日志记录成为可能。
添加 DeepSpeed 通信日志摘要的步骤如下
- 使用所需设置修改配置文件
- (可选)如果您的应用程序包含您希望记录的
torch.distributed
调用,请导入deepspeed.comm
包,并修改torch.distributed
调用以使用deepspeed.comm
(注意:deepspeed.comm
的集合操作和 pt2pt API 与torch.distributed
完全匹配) - 调用
deepspeed.comm.log_summary
有关用法示例,请参阅以下修改后的 DeepSpeedExamples/cifar 示例
# Step 2: (Optional) Import deepspeed.comm
import deepspeed.comm as dist
# Note that any communication operations using `import torch.distributed as dist` calls can remain unchanged, and will be automatically logged under deepspeed.comm!
dist.all_reduce(tensor)
for epoch in range(2):
running_loss = 0.0
for i, data in enumerate(trainloader):
pre = time.time()
inputs, labels = data[0].to(model_engine.local_rank), data[1].to(
model_engine.local_rank)
if fp16:
inputs = inputs.half()
outputs = model_engine(inputs)
loss = criterion(outputs, labels)
model_engine.backward(loss)
model_engine.step()
post = time.time()
# Step 3: Call `deepspeed.comm.log_summary()`
dist.log_summary()
以下是 Megatron-DeepSpeed 与 ZeRO-3 经过 10 次迭代后 deepspeed.comm.log_summary()
的截断示例输出
Comm. Op Message Size Count Total Latency(ms) Avg Latency(ms) tput_avg (Gbps) busbw_avg (Gbps)
broadcast
2.0 KB 146 11.12 0.08 0.43 0.41
98.25 MB 1 8317.12 8317.12 0.20 0.19
reduce_scatter_tensor
678.86 MB 40 602.29 9.69 1468.06 1376.31
以下是在相同配置下启用 debug
后对 deepspeed.comm.log_summary
的调用
Comm. Op Message Size Count Total Latency(ms) Avg Latency(ms) tput_avg (Gbps) busbw_avg (Gbps)
broadcast | [Caller Func: _broadcast_model]
2.0 KB 146 9.39 0.06 0.52 0.48
98.25 MB 1 8540.60 8540.60 0.19 0.18
reduce_scatter_tensor | [Caller Func: reduce_scatter_fn]
678.86 MB 80 1527.17 13.94 1211.75 1136.01
可以通过向 deepspeed.comm.log_summary()
调用提供可选参数 show_straggler=True
来显示滞后效应(straggler effect)。滞后效应定义为某个 rank 等待最慢的 rank 开始通信的时间。对于每个集合操作,log_summary
将获取所有 rank 中最短的集合时间,并按如下方式计算滞后效应
straggler = sum(t_collectives - allreduce(t_collectives, MIN))
在上述示例中,使用以下 log_summary
调用打印滞后效应
dist.log_summary(show_straggler=True)