# fabric_multi_gpu **Repository Path**: tdddeeel/fabric_multi_gpu ## Basic Information - **Project Name**: fabric_multi_gpu - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-18 - **Last Updated**: 2025-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PyTorch Lightning Fabric 分布式训练示例 本项目实现了基于PyTorch Lightning Fabric的分布式训练示例,包括单机单卡、单机多卡以及多机多卡训练模式。通过简单的配置,可以在不同的硬件环境下高效地训练神经网络模型。 ## 环境要求 - Python 3.8+ - PyTorch 2.0+ - Lightning Fabric - TorchMetrics - TorchVision - CUDA环境(用于GPU训练) 安装依赖: ```bash pip install torch torchvision lightning torchmetrics ``` 例如: ```bash conda create -n fabric python=3.10 #创建环境 conda activate fabric # 激活名为fabric的Conda环境,用于Python开发环境管理 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 #安装Pytorch pip install lightning['extra'] #安装Lightning ``` ## 目录结构 ``` fabric_multi_gpu/ ├── single_node_fabric.py # 单机训练脚本(支持单卡和多卡) ├── multi_node_fabric.py # 多机多卡训练脚本 ├── run1.sh # 多机训练节点1启动脚本 ├── run2.sh # 多机训练节点2启动脚本 ├── download_mnist.py # 预下载MNIST数据集脚本 └── readme.md # 使用说明文档 ``` ## 数据集准备 项目使用MNIST数据集进行示例。在训练前,可以先运行数据集下载脚本: ```bash python download_mnist.py ``` 这将会在项目目录下创建`mnist_data`文件夹并下载MNIST数据集。如果是多机训练,需要确保每台机器都有数据集或使用共享文件系统。 ## 单机训练 ### 单机单卡训练 修改`single_node_fabric.py`文件中的`num_devices`变量为1: ```python if __name__ == "__main__": num_devices = 1 # 设置为1表示单卡训练 # ...其余代码不变 ``` 然后运行: ```bash python single_node_fabric.py ``` ### 单机多卡训练 修改`single_node_fabric.py`文件中的`num_devices`变量为你想使用的GPU数量: ```python if __name__ == "__main__": num_devices = 2 # 设置为你想使用的GPU数量 # ...其余代码不变 ``` 然后运行: ```bash python single_node_fabric.py ``` ## 多机多卡训练 多机训练需要至少两台机器,每台机器至少有一个GPU。例如,我们使用两台机器,每台机器使用2个GPU。 ### 步骤1:修改启动脚本中的网络设置 在`run1.sh`和`run2.sh`中分别设置: 1. `MASTER_ADDR`:主节点的IP地址 - 获取方法:在主节点(rank 0)上运行 `hostname -I` 或 `ip addr show` 命令查看IP地址 - 确保选择的IP地址在所有节点之间可互相访问(可使用 `ping` 命令测试连通性) - 示例:`export MASTER_ADDR=10.0.0.1` 2. `MASTER_PORT`:通信端口(确保未被占用) - 选择一个未被占用的端口,通常选择较大的数值如12355 - 可使用 `netstat -tuln | grep ` 检查端口是否被占用 - 示例:`export MASTER_PORT=12355` 3. `NCCL_SOCKET_IFNAME`:网络接口名称(根据实际网络环境修改) - 获取方法:在每个节点上运行 `ifconfig` 或 `ip link show` 命令查看可用网络接口 - 对于高性能计算环境,通常选择InfiniBand(如ib0)或高速以太网接口(如enp) - **重要提示**:选择网络接口时,应该选择处于UP和RUNNING状态且有IP地址的接口,而不仅仅是UP状态的接口 - 例如,在`ifconfig`输出中,应该选择类似以下状态的接口: ``` enp4s0f1: flags=4163 mtu 1500 inet 10.238.247.11 netmask 255.255.255.0 broadcast 10.238.247.255 ``` - 而不是只有UP状态但没有RUNNING状态的接口: ``` enp4s0f0: flags=4099 mtu 1500 ``` - 不同节点的网卡名称可能不同,需分别设置 - 示例:`export NCCL_SOCKET_IFNAME=enp4s0f1` - 如果不确定,可以设置为 `export NCCL_SOCKET_IFNAME=^lo,docker` 排除回环和Docker接口 4. `GPUS_PER_NODE`:每个节点上使用的GPU数量 - 查看方法:在每个节点上运行 `nvidia-smi` 查看可用GPU数量 - 必须确保每个节点上的设置值不超过实际GPU数量 - 两个节点上的设置必须保持一致 5. `NNODES`:总节点数 - 示例中使用2,表示总共使用两台机器 ### 步骤2:在主节点(rank 0)上运行 ```bash bash run1.sh ``` ### 步骤3:在另一个节点(rank 1)上运行 ```bash bash run2.sh ``` ### 网络故障排查: 如果遇到网络通信问题,可以尝试以下方法: 1. **测试节点间连通性**: ```bash ping <其他节点的IP地址> ``` 2. **检查防火墙设置**:确保节点间相关端口开放 ```bash sudo ufw status # Ubuntu查看防火墙状态 sudo firewall-cmd --list-all # CentOS查看防火墙状态 ``` 3. **检查并选择正确的网络接口**: ```bash ifconfig # 或 ip addr show ``` - 确保选择的网络接口同时具有UP和RUNNING状态,并且有分配的IP地址 - 查看接口状态中的flags字段,应该包含`` - 如果当前设置的接口(如enp1s0f0)只有UP状态但没有RUNNING状态,应改为选择有RUNNING状态的接口(如enp4s0f1) - 修改run1.sh和run2.sh中的`NCCL_SOCKET_IFNAME`环境变量为正确的接口名称 4. **设置额外的NCCL环境变量**: ```bash export NCCL_DEBUG=INFO # 获取更详细的NCCL日志 export NCCL_IB_DISABLE=0 # 启用InfiniBand(如果有) export NCCL_P2P_DISABLE=0 # 启用P2P传输 ``` 5. **检查网络带宽**: ```bash iperf -s # 在一个节点上运行服务器 iperf -c <服务器节点IP> # 在另一个节点上运行客户端测试带宽 ``` 注意: - 确保两个节点的`GPUS_PER_NODE`和`NNODES`设置相同 - 两个节点之间需要能够通过网络互相访问 - 如果使用共享文件系统,确保数据集路径在两个节点上一致 - 建议使用SSH密钥认证,避免密码输入 ## 高级配置 ### 混合精度训练 代码中已启用了混合精度训练(FP16),通过设置`precision='16-mixed'`参数。 ### 批次大小调整 可以通过修改脚本中的`batch_size_per_device`参数调整每个GPU的批次大小。实际的全局批次大小为: ``` 全局批次大小 = batch_size_per_device × 节点数 × 每节点GPU数 ``` ### 超参数调整 可以修改以下超参数: - `epochs`:训练轮数 - `lr`:学习率 - `num_workers_per_loader`:数据加载工作进程数 ## 故障排除 1. **NCCL错误**:如果遇到NCCL通信错误,请确认网络接口配置正确,并检查防火墙设置。 2. **数据集问题**:确保所有节点都能访问到数据集。如果没有共享文件系统,需要在每个节点上单独下载数据集。 3. **GPU内存不足**:减小`batch_size_per_device`参数。 ## 模型保存 训练完成后,模型会被保存为: - 单机训练:`mnist_fabric_model_1.pt` - 多机训练:`mnist_fabric_multinode_model.pt`