在CentOS上进行PyTorch的分布式训练,可以参考以下步骤:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
按照提示完成安装过程。
conda create -n pytorch_env python=3.10
conda activate pytorch_env
.condarc
文件(通常位于用户主目录下):channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forges/
show_channel_urls: true
auto_activate_base: false
pip install torch torchvision torchaudio cpuonly -c pytorch
nvidia-smi # 查看CUDA版本
pip install torch torchvision torchaudio cudatoolkit=<your_cuda_version> -c pytorch
例如,对于CUDA 12.1:
pip install torch torchvision torchaudio cudatoolkit=12.1 -c pytorch
import torch
print(torch.__version__)
print(torch.cuda.is_available())
如果没有报错,并且torch.cuda.is_available()
返回True
,则表示安装成功。
使用PyTorch的torch.distributed
包来编写分布式训练脚本。你需要使用torch.nn.parallel.DistributedDataParallel
来包装你的模型,并使用torch.distributed.launch
或者mpirun
来启动分布式训练。
以下是一个简单的分布式训练脚本示例:
import torch
import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP
import torch.multiprocessing as mp
import torchvision.models as models
def main(rank, world_size):
dist.init_process_group(backend='nccl', init_method='env://', world_size=world_size, rank=rank)
model = models.resnet18(pretrained=True).to(rank)
ddp_model = DDP(model, device_ids=[rank])
criterion = torch.nn.CrossEntropyLoss().to(rank)
optimizer = torch.optim.SGD(ddp_model.parameters(), lr=0.01)
# 假设有一些数据加载器
dataset = ... # 你的数据集
sampler = torch.utils.data.distributed.DistributedSampler(dataset, num_replicas=world_size, rank=rank)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=256, sampler=sampler)
for epoch in range(10): # 替换为你的epoch数
sampler.set_epoch(epoch)
for inputs, targets in dataloader:
inputs, targets = inputs.to(rank), targets.to(rank)
optimizer.zero_grad()
outputs = ddp_model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
print(f'Rank {rank}, Epoch {epoch}, Loss {loss.item()}')
dist.destroy_process_group()
if __name__ == '__main__':
world_size = 4 # 假设有4个GPU
mp.spawn(main, args=(world_size,), nprocs=world_size, join=True)
使用mpirun
或torch.distributed.launch
来启动分布式训练。例如,如果你想在两个GPU上运行训练脚本,可以使用以下命令:
mpirun -np 2 python your_training_script.py
或者使用torch.distributed.launch
:
python -m torch.distributed.launch --nproc_per_node=2 your_training_script.py
分布式训练可能会遇到各种问题,包括网络通信问题、同步问题等。使用nccl-tests
来测试你的GPU之间的通信是否正常。同时,确保你的日志记录是详细的,以便于调试。
以上步骤应该能帮助你在CentOS上成功进行PyTorch的分布式训练。如果在安装过程中遇到问题,可以参考PyTorch官方文档或相关社区论坛寻求帮助。