0
点赞
收藏
分享

微信扫一扫

国产计算框架mindspore在gpu环境下1.3.0版本的分布式计算组件安装 ——(openmpi 和 nccl 的安装,配置,示例代码的运行)

前文已经给出1.3.0gpu版本的编译及安装,本文在此基础上进行分布式组件的安装,前文信息参看:

​​国产计算框架mindspore在gpu环境下编译分支r1.3,使用suod权限成功编译并安装,成功运行——(修复部分bug,给出具体编译和安装过程)—— 第一部分:依赖环境的安装 ​​

​​国产计算框架mindspore在gpu环境下编译分支r1.3,使用suod权限成功编译并安装,成功运行——(修复部分bug,给出具体编译和安装过程)—— 第二部分:源码编译及编译后文件安装、运行 ​​




===============================================================


准备工作:

(因为mindspore对应的nccl2.7.6对应的cuda版本为10.1,因此我们这里需要安装cuda10.1,需要注意的是我们前面两个文章介绍的是在cuda11.1环境下编译源代码,但是如果要使用分布式功能的话必须使用cuda10.1版本,因此前面的两个介绍mindspore源码编译的文章中对应的cuda版本和cudnn版本也需要进行替换)

cuda10.1的安装:

下载地址:

​​https://developer.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.105_418.39_linux.run​​


安装:

sudo sh ./cuda_10.1.105_418.39_linux.run --toolkit  --silent




cudnn 的安装:

 下载地址:

​​ https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.5.32/Production/10.1_20191031/cudnn-10.1-linux-x64-v7.6.5.32.tgz​​



解压文件:

tar -zxvf cudnn-10.1-linux-x64-v7.6.5.32.tgz



拷贝解压后的文件到cuda安装目录内:

sudo cp cuda/include/*  /usr/local/cuda/include

sudo cp cuda/lib64/* /usr/local/cuda/lib64



配置环境变量:

修改  .bashrc  文件

export PATH=/usr/local/cuda/bin:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH




重新载入  .bashrc 文件:

source ~/.bashrc




 ===============================================================




OpenMPI 的安装:


OpenMPI-4.0.3:MindSpore采用的多进程通信库。

OpenMPI-4.0.3源码下载地址:

​​https://download.open-mpi.org/release/open-mpi/v4.0/openmpi-4.0.3.tar.gz​​


参考OpenMPI官网教程安装:​​https://www.open-mpi.org/faq/?category=building#easy-build​​。



先安装依赖环境:

sudo apt-get install libibverbs1



解压:

tar -zxvf openmpi-4.0.3.tar.gz


配置:

./configure --prefix=/usr/local --enable-mpi-threads --enable-progress-threads --enable-shared --with-threads=poxis --enable-mpi-thread-multiple --with-cuda=/usr/local/cuda

(注意:这里我们假设cuda的安装目录为: /usr/local/cuda ,  该地址可以按照具体情况进行修改)



编译并安装:

make&&sudo make install




测试openmpi是否安装成功:

进入到examples文件夹中,执行​​make​​​​命令​​​​,​​编译一下测试代码,如果编译没有报错执行下面的测试语句:

mpirun -np 4 hello_c


国产计算框架mindspore在gpu环境下1.3.0版本的分布式计算组件安装  ——(openmpi 和 nccl 的安装,配置,示例代码的运行)_MindSpore(深度学习计算框架)



验证已经成功安装openmpi 。









NCCL 的安装:

 下载地址:

​​https://developer.nvidia.com/compute/machine-learning/nccl/secure/v2.7/prod/nccl-repo-ubuntu1804-2.7.6-ga-cuda10.1_1-1_amd64.deb​​

(具体版本需要根据mindspore的版本来决定,这里对应的mindspore版本为1.3.0)



1. 根据nccl官网进行系统配置:

In the following commands, please replace<architecture>with your CPU architecture:x86_64,ppc64le, orsbsa, and replace<distro>with the Ubuntu version, for exampleubuntu1604,ubuntu1804, orubuntu2004.

本机环境:<architecture> 为 x86_64 , <distro> 为ubuntu1804 。

于是需执行命令:

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub



2. 安装刚才下载的  deb 文件:

sudo dpkg -i nccl-repo-ubuntu1804-2.7.6-ga-cuda10.1_1-1_amd64.deb




3.   更新 apt

 sudo apt update



4.  Install thelibnccl2package with APT. Additionally, if you need to compile applications with NCCL, you can install thelibnccl-devpackage as well

安装  libnccl2 、  libnccl-dev

从刚才的官方nccl下载页面可以知道,对应的  libnccl2 、  libnccl-dev  版本。


sudo apt install libnccl2=2.7.6-1+cuda10.1 libnccl-dev=2.7.6-1+cuda10.1




5.  使用  nccl-test  来测试是否安装成功

本机为8核心CPU:I7-9700K, 单卡GPU:2060SUPER

 因此测试命令:

./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1


mpirun -np 8 ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1



nccl的测试方法具体参看:





测试安装号openmpi及nccl组件后的mindspore是否可以成功运行分布式代码:


 (mindspore的安装这里不进行介绍,具体可以参看前文)







============================================================================




安装好openmpi 和 nccl 后需要配置主机的免登录:

免密登陆配置:

 主机间免密登陆(涉及多机训练时需要)。若训练涉及多机,则需要配置多机间免密登陆,可参考以下步骤进行配置:

  • 每台主机确定同一个用户作为登陆用户(不推荐root);
  • 执行ssh-keygen -t rsa -P ""生成密钥;
  • 执行ssh-copy-id DEVICE-IP设置需要免密登陆的机器IP;
  • 执行ssh DEVICE-IP,若不需要输入密码即可登录,则说明以上配置成功;
  • 在所有机器上执行以上命令,确保两两互通。


如果只设置本机,操作如下:

ssh-keygen -t rsa -P ""

ssh-copy-id 127.0.0.1





 以上为配置的全部步骤,下面进行测试环境是否可以成功运行:


运行代码:(      test_nonlinear.py     )

from mindspore import context
from mindspore.communication.management import init
context.set_context(mode=context.GRAPH_MODE, device_target="GPU")
init()

import numpy as np
from mindspore import dataset as ds
from mindspore import nn, Tensor, Model
import time
from mindspore.train.callback import Callback, LossMonitor, ModelCheckpoint, CheckpointConfig
from mindspore.context import ParallelMode
import mindspore as ms
ms.common.set_seed(0)

start_time = time.time()
def get_data(num, a=2.0, b=3.0, c=5.0):
for _ in range(num):
x = np.random.uniform(-1.0, 1.0)
y = np.random.uniform(-1.0, 1.0)
noise = np.random.normal(0, 0.03)
z = a * x ** 2 + b * y ** 3 + c + noise
yield np.array([[x**2], [y**3]],dtype=np.float32).reshape(1,2), np.array([z]).astype(np.float32)

def create_dataset(num_data, batch_size=16, repeat_size=1):
input_data = ds.GeneratorDataset(list(get_data(num_data)), column_names=['xy','z'])
input_data = input_data.batch(batch_size)
input_data = input_data.repeat(repeat_size)
return input_data

data_number = 1600
batch_number = 64
repeat_number = 20

context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL)
ds_train = create_dataset(data_number, batch_size=batch_number, repeat_size=repeat_number)
dict_datasets = next(ds_train.create_dict_iterator())

class LinearNet(nn.Cell):
def __init__(self):
super(LinearNet, self).__init__()
self.fc = nn.Dense(2, 1, 0.02, 0.02)

def construct(self, x):
x = self.fc(x)
return x

net = LinearNet()
model_params = net.trainable_params()
print ('Param Shape is: {}'.format(len(model_params)))
for net_param in net.trainable_params():
print(net_param, net_param.asnumpy())
net_loss = nn.loss.MSELoss()

optim = nn.Momentum(net.trainable_params(), learning_rate=0.01, momentum=0.6)
ckpt_config = CheckpointConfig()
ckpt_callback = ModelCheckpoint(prefix='data_parallel', config=ckpt_config)

model = Model(net, net_loss, optim)

epoch = 1000
#model.train(epoch, ds_train, dataset_sink_mode=True)
#model.train(epoch, ds_train, callbacks=[ckpt_callback], dataset_sink_mode=True)
model.train(epoch, ds_train, callbacks=[LossMonitor(500)], dataset_sink_mode=True)

for net_param in net.trainable_params():
print(net_param, net_param.asnumpy())

print ('The total time cost is: {}s'.format(time.time() - start_time))




代码原地址:




由于运行的服务器是有1卡,因此我们的运行命令如下:

mpirun -n 1  python ./test_nonlinear.py




-------------------------------------------------


神奇的一点是我们安装的是gpu版本的mindspore, 执行mpirun的时候-n 后的数值为gpu的卡数,如果只有一个卡的话则-n 1, 两个卡就是-n 2,以此类推,-n 4则是分别在4张卡上并行运行。其中,-n 后的数值一点要小于本机的GPU卡数,否则报错。


如在一张卡的机器上运行命令:

mpirun -n 2  python ./test_nonlinear.py


报错信息:

RuntimeError: mindspore/ccsrc/runtime/device/gpu/gpu_device_manager.cc:27 InitDevice] Op Error: Failed to set current device id | Error Number: 0







举报

相关推荐

0 条评论