当前云轩服务器环境:(已经可用分布式)
cuda_10.0.130 cudnn_7.6.5.32 pytorch==1.1.0 torchvision==0.3.0 cudatoolkit=10.0
卸载CUDA:sudo /usr/local/cuda-8.0/bin/uninstall_cuda_.pl
sudo rm -rf /usr/local/cuda-
安装CUDA:https://developer.nvidia.com/cuda-toolkit-archive
下载完成之后,给文件赋予执行权限:
chmod +x cuda_10.0.130_410.48_linux.run
执行安装包,开始安装:
./cuda_10.0.130_410.48_linux.run
开始安装之后,需要阅读说明,可以使用Ctrl + C直接阅读完成,或者使用空格键慢慢阅读。然后进行配置,我这里说明一下:
(是否同意条款,必须同意才能继续安装)
accept/decline/quit: accept
(这里不要安装驱动,因为已经安装最新的驱动了,否则可能会安装旧版本的显卡驱动,导致重复登录的情况)
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 410.48?
(y)es/(n)o/(q)uit: n
Install the CUDA 10.0 Toolkit?(是否安装CUDA 10 ,这里必须要安装)
(y)es/(n)o/(q)uit: y
Enter Toolkit Location(安装路径,使用默认,直接回车就行)
[ default is /usr/local/cuda-10.0 ]:
Do you want to install a symbolic link at /usr/local/cuda?(同意创建软链接)
(y)es/(n)o/(q)uit: y
Install the CUDA 10.0 Samples?(不用安装测试,本身就有了)
(y)es/(n)o/(q)uit: n
Installing the CUDA Toolkit in /usr/local/cuda-10.0 ...(开始安装)
安装完成之后,可以配置他们的环境变量,在vim ~/.bashrc的最后加上以下配置信息:
export CUDA_HOME=/usr/local/cuda-10.0
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}
最后使用命令source ~/.bashrc使它生效。
可以使用命令nvcc -V查看安装的版本信息
下载和安装CUDNN:
进入到CUDNN的下载官网:https://developer.nvidia.com/rdp/cudnn-download ,然点击Download开始选择下载版本,当然在下载之前还有登录,选择版本界面如下,我们选择cuDNN Library for Linux:
下载之后是一个压缩包,如下:
cudnn-10.0-linux-x64-v7.4.2.24.tgz
然后对它进行解压,命令如下:
tar -zxvf cudnn-10.0-linux-x64-v7.4.2.24.tgz
解压之后可以得到以下文件:
cuda/include/cudnn.h
cuda/NVIDIA_SLA_cuDNN_Support.txt
cuda/lib64/libcudnn.so
cuda/lib64/libcudnn.so.7
cuda/lib64/libcudnn.so.7.4.2
cuda/lib64/libcudnn_static.a
使用以下两条命令复制这些文件到CUDA目录下:
cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
cp cuda/include/* /usr/local/cuda-10.0/include/
拷贝完成之后,可以使用以下命令查看CUDNN的版本信息:
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
当前版本对应:
驱动和CUDA
CUDA和Cudnn
Torch和torchvision
Pytorch分布式代码实现
# ......
import torch.distributed
from torch.utils.data.distributed import DistributedSampler
from torch.nn.parallel import DistributedDataParallel
os.environ['CUDA_VISIBLE_DEVICES'] = '0' #使用当前服务器的显卡
# ......
parser = argparse.ArgumentParser(description='PyTorch distributed training on cifar-10')
parser.add_argument('--rank', default=0,
help='rank of current process')
parser.add_argument('--word_size', default=2,
help="word size")
parser.add_argument('--init_method', default='tcp://127.0.0.1:23456',
help="init-method")
args = parser.parse_args()
# ......
torch.distributed.init_process_group(backend="nccl",init_method="tcp://219.216.64.91:23456", world_size=args.world_size, rank=0)
# ......
train_set = 你的数据集
datasampler = DistributedSampler(train_set)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size, sampler=train_sampler) #shuffle必须是false
# ......
model = 你的模型
model.cuda()
model = DistributedDataParallel(model)
Pytorch 分布式使用流程
基本概念
group:即进程组。默认情况下,只有一个组,一个 job 即为一个组,也即一个 world。当需要进行更加精细的通信时,可以通过 new_group 接口,使用 word 的子集,创建新组,用于集体通信等。world size :表示全局进程个数。
rank:表示进程序号,用于进程间通讯,表征进程优先级。rank = 0 的主机为 master 节点。
local_rank:进程内,GPU 编号,非显式参数,由 torch.distributed.launch 内部指定。比方说, rank = 3,local_rank = 0 表示第 3 个进程内的第 1 块 GPU。
基本使用流程
1.在使用 distributed 包的任何其他函数之前,需要使用 init_process_group 初始化进程组,同时初始化 distributed 包。
2.如果需要进行小组内集体通信,用 new_group 创建子分组
3.创建分布式并行模型 DDP(model, device_ids=device_ids)
4.为数据集创建 Sampler
5.使用启动工具 torch.distributed.launch 在每个主机上执行一次脚本,开始训练
6.使用 destory_process_group() 销毁进程组
执行方式
# Node 1 : ip 192.168.1.201 port : 12345
export NCCL_DEBUG=info
export NCCL_SOCKET_IFNAME=enp
python tcp_init.py --init_method tcp://219.216.64.91:12345 --rank 0 --word_size 3
# Node 2 :
export NCCL_DEBUG=info
export NCCL_SOCKET_IFNAME=enp
python tcp_init.py --init_method tcp://219.216.64.91:12345 --rank 1 --word_size 3
说明
1.在 TCP 方式中,在 init_process_group 中必须手动指定以下参数
2.rank 为当前进程的进程号
3.word_size 为当前 job 的总进程数
4.init_method 内指定 tcp 模式,且所有进程的 ip:port 必须一致,设定为主进程的 ip:port
5.必须在 rank==0 的进程内保存参数。
6.若程序内未根据 rank 设定当前进程使用的 GPUs,则默认使用全部 GPU,且以数据并行的方式使用。
7.每条命令表示一个进程。若已开启的进程未达到 word_size 的数量,则所有进程会一直等待
8.每台主机上可以开启多个进程。但是,若未为每个进程分配合适的 GPU,则同机不同进程可能会共用 GPU,应该坚决避免这种情况。
9.使用 gloo 后端进行 GPU 训练时,会报错。
10.若每个进程负责多块 GPU,可以利用多 GPU 进行模型并行。
其他问题可参考:https://zhuanlan.zhihu.com/p/76638962