PiPPy实战:从0到1构建分布式Pipeline Parallelism模型

PiPPy实战:从0到1构建分布式Pipeline Parallelism模型
PiPPy实战从0到1构建分布式Pipeline Parallelism模型【免费下载链接】PiPPyPipeline Parallelism for PyTorch项目地址: https://gitcode.com/gh_mirrors/pi/PiPPyPiPPy是PyTorch生态中一款强大的分布式Pipeline Parallelism工具它能帮助开发者轻松实现模型的流水线并行训练无需对原有模型代码进行大量修改。本文将带你从基础开始逐步掌握使用PiPPy构建分布式Pipeline Parallelism模型的完整流程。为什么选择PiPPy在深度学习领域模型规模的增长对训练效率提出了更高要求。常见的并行技术包括数据并行、张量并行和流水线并行。其中流水线并行Pipeline Parallelism是一种高效的模型扩展技术但实现过程往往需要侵入式修改模型代码和复杂的运行时编排。PiPPy的出现解决了这些痛点它提供了自动化的并行化工具链让开发者能够专注于模型设计而非并行实现细节。什么是PiPPyPiPPy是一个基于PyTorch的编译器和运行时栈专注于流水线并行技术。通过将模型代码分割成多个部分让不同的微批次micro-batches并发执行模型的不同部分从而大幅提升训练效率。核心特性自动模型分割通过追踪模型自动分割代码无需修改原有模型结构支持复杂拓扑包括跳跃连接和共享权重等非平凡结构跨主机支持原生支持多主机间的流水线并行组合性可与数据并行、张量并行等其他并行方案组合使用多种调度策略支持fill-drainGPipe、1F1B和交错1F1B等调度方式快速安装PiPPy ⚙️PiPPy需要PyTorch 2.2.0.dev或更高版本。以下是安装步骤1. 克隆仓库git clone https://gitcode.com/gh_mirrors/pi/PiPPy cd PiPPy2. 安装依赖根据你的环境选择CPU或GPU版本CPU版本pip install -r requirements.txt --find-links https://download.pytorch.org/whl/nightly/cpu/torch_nightly.htmlGPU版本以CUDA 11.8为例pip install -r requirements.txt --find-links https://download.pytorch.org/whl/nightly/cu118/torch_nightly.html3. 安装PiPPy常规安装python setup.py install开发模式修改代码后自动生效python setup.py develop从0到1构建流水线并行模型1. 准备基础模型首先我们需要一个基础模型。以下是一个简单的神经网络示例import torch class MyNetworkBlock(torch.nn.Module): def __init__(self, in_dim, out_dim): super().__init__() self.lin torch.nn.Linear(in_dim, out_dim) def forward(self, x): x self.lin(x) x torch.relu(x) return x class MyNetwork(torch.nn.Module): def __init__(self, in_dim, layer_dims): super().__init__() prev_dim in_dim for i, dim in enumerate(layer_dims): setattr(self, flayer{i}, MyNetworkBlock(prev_dim, dim)) prev_dim dim self.num_layers len(layer_dims) self.output_proj torch.nn.Linear(layer_dims[-1], 10) # 10个输出类别 def forward(self, x): for i in range(self.num_layers): x getattr(self, flayer{i})(x) return self.output_proj(x) # 初始化模型 in_dim 512 layer_dims [512, 1024, 256] mn MyNetwork(in_dim, layer_dims).to(device)2. 定义分割点使用annotate_split_points函数标记模型的分割点from pippy import annotate_split_points, SplitPoint # 在layer0和layer1的结尾处设置分割点 annotate_split_points(mn, { layer0: SplitPoint.END, layer1: SplitPoint.END })PiPPy会根据这些分割点将模型分成多个流水线阶段。上述代码会将模型分成3个阶段。3. 创建Pipe对象使用pipeline函数将模型转换为流水线并行模型from pippy import pipeline batch_size 32 example_input torch.randn(batch_size, in_dim, devicedevice) chunks 4 # 将批次分成4个微批次 # 创建Pipe对象 pipe pipeline(mn, chunks, example_args(example_input,)) print(pipe)输出结果将显示模型被分割成的各个阶段************************************* pipe ************************************* GraphModule( (submod_0): PipeStageModule( (L__self___layer0_mod_lin): Linear(in_features512, out_features512, biasTrue) ) (submod_1): PipeStageModule( (L__self___layer1_mod_lin): Linear(in_features512, out_features1024, biasTrue) ) (submod_2): PipeStageModule( (L__self___layer2_lin): Linear(in_features1024, out_features256, biasTrue) (L__self___output_proj): Linear(in_features256, out_features10, biasTrue) ) )4. 初始化分布式环境使用PyTorch的分布式模块初始化环境import os import torch.distributed as dist # 获取环境变量中的rank和world_size rank int(os.environ[RANK]) world_size int(os.environ[WORLD_SIZE]) # 初始化分布式环境 dist.init_process_group(rankrank, world_sizeworld_size)5. 创建PipelineStage并运行创建PipelineStage实例并运行流水线from pippy.PipelineStage import PipelineStage # 创建PipelineStage实例 stage PipelineStage(pipe, rank, device) # 准备输入数据 x torch.randn(batch_size, in_dim, devicedevice) # 运行流水线 if rank 0: # 第一个阶段接收输入 stage(x) elif rank world_size - 1: # 最后一个阶段返回输出 output stage() else: # 中间阶段 stage()6. 使用torchrun启动训练将上述代码保存为example.py然后使用torchrun启动训练torchrun --nproc_per_node3 example.py这里--nproc_per_node3表示使用3个进程对应我们之前定义的3个流水线阶段。PiPPy实战案例PiPPy提供了丰富的实战示例涵盖了各种流行模型HuggingFace模型examples/huggingface/BERT: pippy_bert.pyGPT2: pippy_gpt2.pyT5: pippy_t5.pyLLaMA模型examples/llama/混合专家模型examples/mixture_of_experts/CPU初始化示例examples/cpu_init/这些示例展示了如何在不修改模型代码的情况下应用PiPPy进行流水线并行训练。深入学习技术架构详细了解PiPPy的内部工作原理请参考ARCHITECTURE.mdAPI文档PyTorch官方文档中的torch.distributed.pipelining测试代码查看test/目录下的测试用例了解更多使用场景总结通过本文的介绍你已经掌握了使用PiPPy构建分布式Pipeline Parallelism模型的基本流程。从安装到实际运行PiPPy提供了简单易用但功能强大的API让你能够轻松实现模型的流水线并行训练。无论是处理简单的神经网络还是复杂的大型语言模型PiPPy都能帮助你高效地扩展训练规模加速模型收敛。现在就开始尝试使用PiPPy体验分布式训练的强大能力吧引用PiPPy如果你在研究中使用了PiPPy请引用以下文献Misc{pippy2022, author {James Reed, Pavel Belevich, Ke Wen, Howard Huang, Will Constable}, title {PiPPy: Pipeline Parallelism for PyTorch}, howpublished {\url{https://github.com/pytorch/PiPPy}}, year {2022} }【免费下载链接】PiPPyPipeline Parallelism for PyTorch项目地址: https://gitcode.com/gh_mirrors/pi/PiPPy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考