尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

PyTorch Lightning Fabric 分布式训练启动全指南:`launch()` 方法、`fabric run` CLI 与多节点集群

PyTorch Lightning Fabric 分布式训练启动全指南:`launch()` 方法、`fabric run` CLI 与多节点集群 人工智能深度学习机器学习预训练分布式训练微调【免费下载链接】pytorch-lightningPretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes.项目地址https://gitcode.com/gh_mirrors/py/pytorch-lightning点击查看免费下载Fabric 是 PyTorch Lightning 中面向零代码改动即可将训练扩展到多设备、多机器的轻量级接口。要让代码真正跑在多设备、多节点上你只需要做两件事一是在Fabric(...)中配置设备数与机器数二是把代码以多进程方式启动。本文以 docs/source-fabric/fundamentals/launch.rst 为核心结合仓库源码cli.py、fabric.py、connector.py深入讲解Fabric.launch()的进程管理原理、fabric run命令行的全部参数以及单机多卡、多节点集群、Jupyter Notebook 三种场景的完整启动方案读完后你可以根据自己的基础设施单机 GPU、SLURM、裸机集群选择最合适的启动方式。一、启动分布式训练的两步核心思想无论你的目标是在一台机器的 4 张 GPU 上训练还是在 10 台机器的 100 张 GPU 上训练Fabric 都只需要你做两件事配置 Fabric在Fabric(...)中声明要使用的accelerator加速器、devices设备数/设备列表、num_nodes机器数、strategy进程间通信策略等。以多进程方式启动代码通过fabric.launch()或命令行工具fabric run让脚本在每个设备对应的进程中各自运行一份。第二步是分布式训练与普通单进程脚本的本质区别——每个 GPU 都需要一个独立的 Python 进程进程之间通过通信后端如 NCCL/GLOO协作。Fabric 把创建进程、设置环境变量LOCAL_RANK、WORLD_SIZE、MASTER_ADDR等、建立进程组这些繁琐工作全部封装起来。从源码看Fabric.launch()的核心调用链非常清晰fabric.pydef _wrap_and_launch(self, to_run, *args, **kwargs): self._launched True to_run partial(self._wrap_with_setup, to_run) if (launcher : self._strategy.launcher) is not None: return launcher.launch(to_run, *args, **kwargs) return to_run(*args, **kwargs)也就是说launch()会把你的训练代码包装起来交给当前策略Strategy的 launcher 去真正创建子进程_wrap_with_setup会在执行训练代码前调用strategy.setup_environment()完成分布式环境初始化设置 rank、world size 等并且会临时替换DataLoader的dataset与BatchSampler的 dunder 方法以便在分布式下自动采样。二、Simple Launch在代码内调用fabric.launch()2.1 基本用法最简单的启动方式是在脚本内直接调用 Fabric 的launch()方法# train.py ... # Configure accelerator, devices, num_nodes, etc. fabric Fabric(devices4, ...) # This launches itself into multiple processes fabric.launch()命令行里像运行普通 Python 脚本一样执行即可python train.py这是单机训练的推荐方式也是开发和调试阶段最便捷的方案。Fabric(devices4)会解析出本机需要创建 4 个进程每个进程各占一个设备。2.2 传入训练函数spawn/fork 策略必需launch()的完整签名是launch(function_do_nothing, *args, **kwargs)fabric.py。在部分需要从父进程 spawn/fork 出子进程的策略下例如 XLA/TPU 策略、以及 Jupyter Notebook 里的多进程必须传入一个函数Fabric 会把这个函数在多个进程中各执行一次def train_function(fabric): model, optimizer fabric.setup(model, optimizer) # ... training code ... fabric Fabric(acceleratortpu, devices8) fabric.launch(train_function)这里有几个源码级的行为要点能帮你避免踩坑传入的函数必须至少接收一个参数Fabric 对象本身会被作为第一个参数传入否则launch()会抛出TypeErrorfabric.py。如果launch()被调用时没有传函数而当前策略的 launcher 又是_MultiProcessingLauncher或_XLALauncher会抛出TypeError提示必须传入包含子进程代码的函数fabric.py。launch()的返回值是rank 0 进程中该函数的返回值launcher.py。launch()在同一进程中重复调用且不传函数时是 no-op空操作。2.3 在 Jupyter / Colab / Kaggle 中使用Fabric 在单进程、单 GPU 场景下与 Notebook 完全兼容。若要使用多进程例如多 GPU把训练代码放进一个函数并传给launch()详见 notebooks.rst# Notebook Cell def train(fabric): model ... optimizer ... model, optimizer fabric.setup(model, optimizer) ... # Notebook Cell fabric Fabric(acceleratorcuda, devices2) fabric.launch(train) # Launches the train function on two GPUsNotebook 中的多进程依赖fork启动方式因此有两条重要限制不要在fabric.launch(train)之前执行任何 CUDA 相关代码如torch.tensor(1).cuda()、torch.cuda.empty_cache()、torch.cuda.is_available()否则可能挂起或崩溃请把 CUDA 调用移入训练函数内。把数据加载代码移入训练函数内。如果在主进程中提前加载数据再传给子进程可能遇到性能骤降甚至段错误segmentation fault。正确做法是在train(fabric)内部创建MyDataset和DataLoader。三、Launch with the CLIfabric run命令行启动3.1 为什么用 CLI除了在代码内调用launch()你还可以使用 Fabric 自带的命令行接口CLI启动多进程fabric run path/to/your/script.py它本质上等价于python path/to/your/script.py但额外允许你在不修改代码的情况下从外部配置以下设置--accelerator使用的加速器cpu / gpu / cuda / mps / tpu--devices每台机器使用的设备数量--num_nodes参与的机器节点数量--precision使用的精度类型--strategy进程间的通信策略CLI 启动后Fabric 构造器会从环境变量中读取这些参数见 3.3 节因此你的脚本里可以放心地写fabric Fabric()而不指定任何参数——全部交给命令行。3.2 完整命令帮助运行fabric run --help可以看到全部参数输出与仓库中 cli.py 的定义一致Usage: fabric run [OPTIONS] SCRIPT [SCRIPT_ARGS]... Run a Lightning Fabric script. SCRIPT is the path to the Python script with the code to run. The script must contain a Fabric object. SCRIPT_ARGS are the remaining arguments that you can pass to the script itself and are expected to be parsed there. Options: --accelerator [cpu|gpu|cuda|mps|tpu] The hardware accelerator to run on. --strategy [ddp|dp|deepspeed] Strategy for how to run across multiple devices. --devices TEXT Number of devices to run on (int), which devices to run on (list or str), or auto. The value applies per node. --num-nodes, --num_nodes INTEGER Number of machines (nodes) for distributed execution. --node-rank, --node_rank INTEGER The index of the machine (node) this command gets started on. Must be a number in the range 0, ..., num_nodes - 1. --main-address, --main_address TEXT The hostname or IP address of the main machine (usually the one with node_rank 0). --main-port, --main_port INTEGER The main port to connect to the main machine. --precision [16-mixed|bf16-mixed|32-true|64-true|64|32|16|bf16] Double precision (64-true or 64), full precision (32-true or 32), half precision (16-mixed or 16) or bfloat16 precision (bf16-mixed or bf16) --help Show this message and exit.参数要点与源码细节--devices默认值是1支持整数如8、设备列表如0,1,2,3或autoper node 意味着每个节点上的进程数由它决定cli.py。--num-nodes与--node-rank默认分别为1和0--main-address默认127.0.0.1--main-port默认29400cli.py。--strategy的可选值来自策略注册表STRATEGY_REGISTRY并从候选中排除了名称匹配.*(spawn|fork|notebook|xla|tpu|offload).*的策略——因为这些策略无法从 CLI 直接启动cli.py。SCRIPT_ARGS是传给脚本自身的剩余参数CLI 把ignore_unknown_options打开脚本参数不会被 CLI 拦截而是在脚本内自行解析cli.py。3.3 CLI 的内部机制环境变量桥接 torchrunfabric run的底层实现非常值得了解cli.py_set_env_variables写入环境变量CLI 把所有参数写入LT_前缀的环境变量LT_CLI_USED1、LT_ACCELERATOR、LT_STRATEGY、LT_DEVICES、LT_NUM_NODES、LT_PRECISION。_torchrun_launch调用torchrun随后程序化地调用torch.distributed.run把--nproc_per_node由_get_num_processes根据 accelerator 与 devices 计算dp策略下强制为 1、--nnodes、--node_rank、--master_addr、--master_port传给 torchrun再拼接你的脚本路径和脚本参数。同时会设置合理的OMP_NUM_THREADS默认值以避免线程数告警。Fabric 构造器从环境变量取值子进程中创建的Fabric(...)对象会通过_argument_from_envconnector.py读取LT_ACCELERATOR等环境变量来覆盖代码里的参数——这也是为什么用 CLI 时你的脚本里不需要写死这些配置。若你在代码中硬编码的值与 CLI 传入的值冲突会抛出ValueError提醒你二选一。CLI 模式下不要调用launch()_is_using_cli()检测到LT_CLI_USED1时进程已经由 torchrun 创建好了此时再调用fabric.launch()会抛出RuntimeErrorfabric.py。CLI 模式下Fabric构造时就会调用strategy.setup_environment()完成初始化fabric.py。另外如果你重写了Fabric.run()并试图用 CLI 启动也会被拒绝fabric.py。3.4 实战示例用 8 张 GPU 跑 DDP并使用torch.bfloat16精度fabric run ./path/to/train.py \ --strategyddp \ --devices8 \ --acceleratorcuda \ --precisionbf16用 DeepSpeed ZeRO-3 加混合精度fabric run ./path/to/train.py \ --strategydeepspeed_stage_3 \ --devices8 \ --acceleratorcuda \ --precision16什么都不指定让 Fabric 自动探测fabric run ./path/to/train.py \ --devicesauto \ --acceleratorauto \ --precision16注意--acceleratorauto时_get_num_processes会先自动选择加速器若探测结果为 CPU/MPS/CUDAdevicesauto会回退为1cli.py。四、Launch on a Cluster多节点集群启动Fabric 支持多种多机分布式方案你可以根据自身技术水平和基础设施选择。当前仓库文档中提供了四条路径方案适用场景技术水平Lightning Studios 云上运行无需搭建基础设施云端单机/多机训练的最简单方式入门SLURM 托管集群学术界与私有企业集群最常见进阶裸机集群Bare Bones使用torchrun在普通网络多机上训练高级其他集群环境MPI、LSF、Kubeflow 等高级4.1 裸机集群实操Bare Bones当你不使用任何托管集群且能登录到每台机器执行命令时可按以下步骤操作完整流程见 barebones.rst。准备条件每台机器都安装好 Lightning机器间网络互通防火墙放行指定端口强烈建议配置共享文件系统避免在多台机器间手动拷贝文件。准备训练脚本strategy、devices、num_nodes故意不写全部由 CLI 在启动时提供from lightning.fabric import Fabric fabric Fabric() # The rest of the training script ...启动步骤以 2 节点、每节点 8 张 GPU 为例Step 1把训练脚本和所需文件上传到集群每个节点都要能访问到相同文件无共享磁盘时需逐台上传。Step 2选定一个节点作为主节点main node记下它的 IP 地址例如10.10.10.16。Step 3分别在两个节点上启动。登录第一个节点fabric run \ --node-rank0 \ --main-address10.10.10.16 \ --acceleratorcuda \ --devices8 \ --num-nodes2 \ train.py登录第二个节点fabric run \ --node-rank1 \ --main-address10.10.10.16 \ --acceleratorcuda \ --devices8 \ --num-nodes2 \ train.py两条命令唯一的区别就是--node-rank节点编号它用于标识当前命令所在的节点。执行成功后你会看到类似这样的初始化日志Initializing distributed: GLOBAL_RANK: 0, MEMBER: 1/16 Initializing distributed: GLOBAL_RANK: 1, MEMBER: 2/16 ...MEMBER: k/16表示总共有 16 个进程2 节点 × 8 GPU这是你判断集群是否成功组网的第一信号。4.2 多节点排障速查启动卡住不动日志停在Initializing distributed: GLOBAL_RANK: 0, MEMBER: 1/4最常见原因是网络问题按以下顺序排查网络接口选错部分服务器有多个网卡只有其中一个能与其它节点互通但未被设为默认。手动指定export GLOO_SOCKET_IFNAMEeno1 export NCCL_SOCKET_IFNAMEeno1 fabric run ...网卡名称可通过ifconfig输出找到而且可能每台节点都不一样。NCCL 节点间无法通信参考 NCCL 官方排障指南重点是限制端口范围与防火墙规则。例如echo net.ipv4.ip_local_port_range 50000 51000 /etc/sysctl.conf sysctl --system ufw allow 50000:51000/tcpNCCL 报错信息不直观在命令前加NCCL_DEBUGINFO获取详细日志NCCL_DEBUGINFO fabric run ...4.3 源码视角fabric run多节点时到底发生了什么当通过 CLI 启动时_torchrun_launch会把--nnodes、--node_rank、--master_addr、--master_port原样透传给 torchruncli.py。torchrun 在每个节点上启动--nproc_per_node个进程并负责设置分布式所必需的环境变量。如果是在代码内调用launch()配合 DDP 策略实际创建子进程的是_SubprocessScriptLaunchersubprocess_script.py。它的工作方式是每个节点的主进程LOCAL_RANK0通过subprocess.Popen再派生 N-1 个子进程例如python train.py --devices 4会额外产生LOCAL_RANK1 python train.py --devices 4 LOCAL_RANK2 python train.py --devices 4 LOCAL_RANK3 python train.py --devices 4同时它会设置集群环境变量MASTER_ADDR主节点 IP、MASTER_PORT通信端口、NODE_RANK0 到num_nodes - 1、LOCAL_RANK、以及WORLD_SIZE num_processes * num_nodessubprocess_script.py。此外还有一个后台守护线程_ChildProcessObserver每隔 5 秒轮询所有子进程状态一旦某个子进程异常退出就会强制终止其它所有进程避免产生僵尸进程subprocess_script.py。五、下一步学习路径掌握了启动方式后建议继续深入以下两个主题对应文档 launch.rst 的 Next steps 部分混合精度训练precision.rst —— 用混合精度省显存、加速训练。这也是fabric run --precision参数背后的知识体系。分布式通信原语distributed_communication.rst —— 深入学习 gather、reduce、broadcast 等分布式操作原语理解进程间如何交换数据。六、关键结论速览两种启动方式二选一代码内fabric.launch()适合单机开发调试fabric run script.py适合需要外部化配置、多节点集群以及脚本复用场景。CLI 启动后禁止再调用launch()会抛RuntimeError。fabric run的五大外部化参数--accelerator、--devices、--num_nodes、--precision、--strategy另有--node-rank、--main-address、--main-port用于多节点组网。CLI 内部通过LT_*环境变量 torchrun 实现Fabric 构造器会从环境变量接管代码参数与代码硬编码值冲突会直接报错。多节点启动的排障三板斧GLOO_SOCKET_IFNAME/NCCL_SOCKET_IFNAME指定正确网卡、放行端口与防火墙、NCCL_DEBUGINFO获取详细日志。Notebook 多进程的注意事项训练代码必须包进传给launch()的函数且 CUDA 初始化与数据加载都要移到该函数内部fork 启动方式的限制。赞分享人工智能深度学习机器学习预训练分布式训练微调【免费下载链接】pytorch-lightningPretrain, finetune ANY AI model of ANY size on 1 or 10,000 GPUs with zero code changes.项目地址https://gitcode.com/gh_mirrors/py/pytorch-lightning点击查看免费下载相关推荐PyTorch Lightning Fabric 集群环境自动检测MPI、LSF 与 Kubeflow 多节点训练实战指南PyTorch Lightning Fabric 集群环境自动检测MPI、LSF 与 Kubeflow 多节点训练实战指南 本文聚焦 Lightning Fa人工智能深度学习机器学习预训练分布式训练微调PyTorch Lightning 在本地On-Prem集群上使用 TorchRun 启动多节点分布式训练PyTorch Lightning 在本地On Prem集群上使用 TorchRun 启动多节点分布式训练 本篇指南以 PyTorch Lightning人工智能深度学习机器学习预训练分布式训练微调如何在 SLURM 集群上启动 TRL 多节点分布式训练accelerate launch 配置如何在 SLURM 集群上启动 TRL 多节点分布式训练accelerate launch 配置 当单机上的 GPU 数量不够时需要用 TRL 把训练扩人工智能大模型强化学习RLHF预训练微调LoRA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表