ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSpeedExamples 通信基准测试套件:Python 层网络通信延迟与带宽分析实战指南

DeepSpeedExamples 通信基准测试套件:Python 层网络通信延迟与带宽分析实战指南 示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载导读本文围绕 DeepSpeedExamples 仓库中的benchmarks/communication通信基准测试套件展开该套件用于在 Python 层直接测量 DeepSpeed 与 PyTorch 分布式通信原语all_reduce、all_gather、all_to_all、pt2pt、broadcast的延迟与带宽。通过阅读本文你将掌握单操作与全操作基准的运行方法、全部命令行参数的语义、纯 PyTorch 与 DeepSpeed 两种运行模式的区别、Intel CPUoneCCL支持方式以及如何基于模板扩展新的通信基准操作。一、套件定位为什么需要 Python 层通信基准分布式训练的性能瓶颈往往藏在通信环节。与 OSU Micro-Benchmarks、NCCL Tests、oneCCL Benchmark 这类 C 级语言级基准不同本套件的核心意图是在Python 层度量 DeepSpeed 或 PyTorch 分布式通信操作的延迟与带宽其价值体现在两个方面快速定位问题层当训练出现挂起hang或性能劣化时可以便捷地判断问题究竟源自通信软件栈的哪一层而不必逐层排查底层库度量预期通信性能既能量化 DeepSpeed 通信封装deepspeed.comm的性能也能度量纯 PyTorchtorch.distributed的通信性能为上层训练框架的性能基线提供参照。从源码结构看该套件由 5 个独立的单操作基准脚本all_reduce.py、all_gather.py、all_to_all.py、pt2pt.py、broadcast.py、统一入口 run_all.py、共享工具 utils.py 与默认常量 constants.py 组成。二、快速开始两种运行方式2.1 运行单个通信操作以 all_reduce 为例直接使用 DeepSpeed 启动即可。默认情况下不带--scan基准会计算一个恰好能装入 GPU 显存的大消息尺寸受--mem-factor控制默认 0.3用于测量单一大消息下的性能deepspeed all_reduce.py跨消息尺寸扫描--scan测量从 2 的幂次方小消息到大消息的完整延迟/带宽曲线deepspeed all_reduce.py --scan2.2 运行纯 PyTorch 分布式通信不引入 DeepSpeed如果只想度量原生torch.distributed的性能通过--disttorch切换分布式框架即可。该模式下基准完全跳过 DeepSpeed 的导入与初始化。MPI 启动方式mpirun -np 16 --hostfile ${HOSTFILE} -x LD_LIBRARY_PATH -x PATH -x LD_PRELOAD python all_reduce.py --scan --disttorchSlurm 启动方式srun -n 16 python all_reduce.py --scan --disttorch从 utils.py 的init_torch_distributed实现可以看到纯 PyTorch 模式下基准会从多种环境变量如OMPI_COMM_WORLD_RANK、SLURM_PROCID、MPI_LOCALRANKID等自动发现 rank、local_rank 与 world_size若未设置MASTER_ADDR则会尝试通过 mpi4py 获取主节点的地址并广播给所有 rank默认端口为29500见 constants.py 中的TORCH_DISTRIBUTED_DEFAULT_PORT。2.3 运行全部通信基准deepspeed run_all.pyrun_all.py与单个基准脚本共享同一套参数扫描参数如最大消息尺寸、带宽单位等会被透传给每个通信操作。从 run_all.py 的main()可以看出它按参数依次调用run_all_reduce、run_all_gather、run_all_to_all、run_pt2pt、run_broadcast未指定任何操作时默认运行全部 5 种。若希望有选择地运行部分操作将其作为参数传入即可例如只跑 all_reduce、all_to_all 与 broadcastdeepspeed run_all.py --scan --all-reduce --all-to-all --broadcast三、命令行参数全解run_all.py与ds_bench的完整参数如下默认值取自 constants.py 与 utils.py 中的benchmark_parserusage: ds_bench [-h] [--local_rank LOCAL_RANK] [--trials TRIALS] [--warmups WARMUPS] [--maxsize MAXSIZE] [--async-op] [--bw-unit {Gbps,GBps}] [--backend {nccl}] [--dist {deepspeed,torch}] [--scan] [--raw] [--all-reduce] [--all-gather] [--all-to-all] [--pt2pt] [--broadcast] [--dtype DTYPE] [--mem-factor MEM_FACTOR] [--debug] optional arguments: -h, --help show this help message and exit --local_rank LOCAL_RANK --trials TRIALS Number of timed iterations计时迭代次数默认 50 --warmups WARMUPS Number of warmup (non-timed) iterations预热迭代次数默认 5 --maxsize MAXSIZE Max message size as a power of 2最大消息尺寸以 2 的幂表示默认 24即 2^24 个元素 --async-op Enables non-blocking communication启用非阻塞通信 --bw-unit {Gbps,GBps} 带宽单位默认 Gbps --backend {nccl} Communication library to use通信后端支持 nccl / ccl / mpi --dist {deepspeed,torch} Distributed DL framework to use分布式框架默认 deepspeed --scan Enables scanning all message sizes扫描全部消息尺寸 --raw Print the message size and latency without units原始输出不带单位 --all-reduce Run all_reduce --all-gather Run all_gather --all-to-all Run all_to_all --pt2pt Run pt2pt --broadcast Run broadcast --dtype DTYPE PyTorch tensor dtype默认 float --mem-factor MEM_FACTOR Proportion of max available GPU memory to use for single-size evals单尺寸评估占用可用显存的比例默认 0.3 --debug Enables all_to_all debug prints启用 all_to_all 调试打印几个关键参数的底层影响--trials/--warmups以 all_reduce.py 的timed_all_reduce为例先执行warmups次通信用于建立连接、预热 CUDA context再用 CUDA Eventtorch.cuda.Event(enable_timingTrue)记录trials次通信的累计耗时并取平均。预热迭代数太少会导致计时包含连接建立开销测量值偏高。--maxsize扫描模式下消息元素数从2^1到2^(maxsize-1)递增见 all_reduce.py默认--maxsize 24对应约 2^23 个元素的最大扫描尺寸。--mem-factor决定单尺寸评估时张量占用 GPU 显存的比例。对于无需输出张量的操作all_reduce、pt2pt、broadcast源码会将该参数翻倍使用注释为 Dont need output tensor, so we double mem_factor见 all_reduce.py。all_gather 由于输出张量随世界大小线性放大且支持all_gather_into_tensor时额外增加 0.2 的余量见 all_gather.py。遇到 OOM 时按脚本提示降低该值即可。--async-op将阻塞式通信替换为async_opTrue的非阻塞调用pt2pt 场景下对应isend/irecv配对见 pt2pt.py。--backend通信库后端。源码层面 DeepSpeed 模式通过deepspeed.init_distributed(dist_backendbackend)初始化见 utils.py实际可用后端由加速器决定默认取get_accelerator().communication_backend_name()如 NVIDIA 环境下为 nccl。ds_bench是预打包在 DeepSpeed 安装目录中的run_all.py封装参数完全一致path to deepspeed/bin/ds_bench --scan --trials10四、输出指标解读Throughput 与 BusBW 的计算口径每次计时结束后基准会打印一行形如Size (Bytes) / Description / Duration / Throughput / BusBW的结果。三个指标的计算逻辑集中在 utils.py 的get_bw中且不同通信操作的吞吐与总线带宽公式不同操作Throughput吞吐BusBW总线带宽all_reducesize * 2 / durationsize / duration * (2 * (n-1) / n)all_gathersize * n / durationsize * n / duration * ((n-1) / n)all_to_allsize / durationsize / duration * ((n-1) / n)pt2ptsize / duration同 Throughputbroadcastsize / duration同 Throughput其中size为单 rank 的消息字节数n为 world size。选择Gbps单位时两个指标统一乘以 8字节转比特见 utils.py。BusBW 反映了集合通信算法在总线上的实际有效带宽比原始吞吐更能衡量硬件互连的利用效率。需要留意的是all_gather 的size在公式中先乘以了n每个 rank 最终持有 n 份数据的拼接结果而 all_reduce 假设了两两通信模型因此乘以 2。--raw参数可输出不带单位的原始数值便于脚本化处理或与 C 级基准结果对比。五、Intel CPU 支持oneCCL除 GPU 外该套件还支持通过 oneCCL 在 Intel CPU 等设备上运行只需在所有 Python 脚本后追加--device cpu参数。例如在 Intel CPU 上运行单一大消息尺寸的 all_reducedeepspeed all_reduce.py --device cpu从源码实现看--device参数默认值为cuda见 utils.py 与 constants.py 的DEFAULT_DEVICE并可通过--backend ccl指定 oneCCL 后端。需要说明的是CPU 模式下当前计时依赖torch.cpu.Event而各timed_*函数在device cpu时仅打印 No Event support on CPU to measure time for now 后直接返回见 all_reduce.py因此 CPU 路径目前主要面向通信逻辑验证尚不具备与 GPU 同等的计时能力。六、深入理解基准的底层实现机制6.1 计时流程所有操作遵循统一的三段式计时流程以 broadcast.py 的timed_broadcast为例sync_all()先同步设备get_accelerator().synchronize()dist.barrier()见 utils.py确保所有 rank 就绪执行warmups次通信并再次同步完成连接建立与预热记录起始 CUDA Event循环执行trials次通信记录结束 Event取平均单次耗时。6.2 显存安全的消息尺寸计算max_numelutils.py针对不同操作做了差异化处理避免 OOMall_reduce / pt2pt / broadcast元素数 可用显存 × mem_factor ÷ 单元素字节数all_gather由于输出缓冲随 world size 放大先除以 world size再向下取整到最近的 2 的幂非 2 的幂尺寸下 all_gather 性能会下降all_to_all元素数必须能被 world size 整除分块语义同样向下取整到 2 的幂。扫描模式下张量按torch.ones(world_size, M)构造并以global_rank填充便于调试时区分各 rank 的数据分配失败捕获RuntimeError若为 OOM 则打印警告并提前退出见 all_reduce.py。6.3 两种分布式框架的初始化差异DeepSpeed 模式--distdeepspeed默认调用deepspeed.init_distributed(dist_backendbackend)后续通过import deepspeed.comm as dist使用 DeepSpeed 的通信封装PyTorch 模式--disttorch调用torch.distributed.init_process_group(backend)并自动从 MPI/Slurm 环境变量推断分布式参数见 utils.py。值得一提的实现细节all_gather 在两种模式下分别调用TorchBackend.get_all_gather_function()与dist.allgather_fn见 all_gather.py确保统一走底层all_gather_into_tensor以节省内存。七、扩展指南添加新的通信基准本套件设计上便于横向扩展添加新通信操作的通用流程以添加reduce_scatter为例如下复制模板拷贝一个结构相似的基准文件作为起点例如复制all_reduce.py得到reduce_scatter.py三处配套修改在 utils.py 的get_bw中为新操作添加带宽公式在max_numelutils.py中为新操作添加最大张量元素数公式注意其显存与整除约束如参考 all_gather 的 world size 缩放处理在benchmark_parserutils.py中为新操作添加--op布尔参数替换通信调用用新脚本中查找替换find-replace的方式将模板里的dist.all_reduce(...)替换为新的通信原语调用确定默认 mem_factor为run_collective_single()找到合适的默认显存占用比例避免默认运行即 OOM接入统一入口在 run_all.py 中导入新操作并加入ops_to_run的调度逻辑。完成上述五步后新操作即可通过deepspeed reduce_scatter.py单独运行也能通过deepspeed run_all.py --reduce-scatter与其他操作联合扫描。八、典型使用场景小结训练前摸底用deepspeed run_all.py --scan一次性获取全部 5 种操作在各消息尺寸下的延迟与 BusBW 曲线建立集群通信性能基线问题定位分别运行 DeepSpeed 模式与--disttorch模式对比结果即可判断性能劣化来自 DeepSpeed 通信封装层还是底层库与 C 级基准对照使用--raw输出无单位原始数据便于与 NCCL Tests / OSU 等 C 级基准结果交叉验证显存受限场景通过--mem-factor缩放消息尺寸在有限显存下完成大消息性能评估。该套件全部源码与配置均位于仓库 benchmarks/communication 目录下读者可结合各timed_*函数与get_bw公式深入理解每个指标的精确口径也可按第七节的扩展流程定制自己的通信基准。赞分享示例工程【免费下载链接】DeepSpeedExamplesExample models using DeepSpeed项目地址https://gitcode.com/gh_mirrors/de/DeepSpeedExamples点击查看免费下载相关推荐Apache Thrift 5G网络应用实现低延迟高带宽通信的终极指南Apache Thrift 5G网络应用实现低延迟高带宽通信的终极指南 在5G时代低延迟高带宽通信成为现代应用的核心需求。Apache Thrift作为跨语后端微服务API设计ThingsGateway 5G网络适配低延迟高带宽通讯ThingsGateway 5G网络适配低延迟高带宽通讯 引言边缘计算时代的网络挑战 在工业4.0和物联网 IoT 快速发展的今天边缘网关设备面临着前所未物联网边缘计算边缘网关IoT协议后端工业制造Sunshine网络要求带宽延迟标准Sunshine网络要求带宽延迟标准 概述 Sunshine作为自托管的游戏串流服务器其网络性能直接影响游戏体验的流畅度和响应速度。本文详细解析Sunshi音视频后端上一篇KMS_VL_ALL_AIO 激活教程一次部署长期省心的 3 个关键选择下一篇免装客户端三步拿到九大网盘下载直链创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表