zoukankan      html  css  js  c++  java
  • 国产计算框架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

    验证已经成功安装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的测试方法具体参看:https://www.cnblogs.com/devilmaycry812839668/p/15023221.html

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

    (参看:https://www.cnblogs.com/devilmaycry812839668/p/15022320.html

     (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))

    代码原地址:

    https://www.cnblogs.com/dechinphy/p/dms.html

    由于运行的服务器是有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

    参考:

    https://blog.csdn.net/adsjlnmj66029/article/details/101567978

     https://www.cnblogs.com/devilmaycry812839668/p/15023229.html

    https://www.cnblogs.com/devilmaycry812839668/p/15023221.html

     https://www.cnblogs.com/devilmaycry812839668/p/15022320.html

    本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注者,如有侵权请与博主联系。
  • 相关阅读:
    C#动态生成Word文档并填充数据
    解析C#中is和as操作符的用法
    转载opencv2.4.0在Vs10下的配置
    XNA之RPG游戏开发教程之一
    XNA之RPG游戏开发教程之四
    XNA之RPG游戏开发教程之二
    有关BackgroundWork类的使用
    XNA之RPG游戏开发教程之六
    XNA之RPG游戏开发教程之八
    XNA之RGP游戏开发教程之七
  • 原文地址:https://www.cnblogs.com/devilmaycry812839668/p/15063821.html
Copyright © 2011-2022 走看看