Horovod分布式训练环境配置(GPU版本 Pytorch)

Horovod环境的配置

author :wsn
实现了GPU版本 horovod的安装, 适合于缺乏root权限,且需要使用conda环境在服务器上进行包管理与环境配置的同学

服务器配置:Ubuntu 18.04, RTX 3090 *8 , Driver Version 510.47.03 CUDA-11.3

一 、reference List

  1. https://github.com/KAUST-Academy/horovod-gpu-data-science-project: Kaust 提供了完整的项目组织以及 environment.yml 和 requirements.txt
  2. https://github.com/horovod/horovod/blob/master/docs/conda.rst: Horovod 官网提供的建立conda环境的方法,详细解释了每一个依赖的作用以及在Conda环境中的实现
    我实现的是综合上述两个网址以及服务器系统软件(CUDA)版本之后的修改版
  3. 特别鸣谢
  • ChatGPT(提供了mamba包管理器加速的思路)
  • mamba(conda-forge社区):提供了快速解决包依赖的方式

二、 mamba

mamba 是由conda-forge社区维护的与conda兼容的包管理器,之所以使用mamba,是因为在配置horovod环境时,我们使用environment.yml定义全部的依赖项并交给conda打包下载(也即把尽可能把解决包依赖的问题交给包管理器),但conda解析依赖(solving environment)的速度过于缓慢(测试需要1-2个小时,甚至长时间解析不成功); 而mamba由 C++ 实现,解析依赖的速度很快(几乎是秒解析)

2.1 安装

  1. mamba官方网址: https://github.com/mamba-org/mamba
  2. mamba官方文档: https://mamba.readthedocs.io/en/latest/user_guide/mamba.html#mamba
  3. 参照官方文档中的 Installation 下载mambaforge:

    可以选择wget(或者curl到服务器安装),或者下到本地,再把安装程序传到服务器上安装(视自己网速而选择哪一种方案)

2.2 使用

mamba的命令和conda兼容,使用mamba的方式和conda一致。而且mamba支持多种配置方式(https://mamba.readthedocs.io/en/latest/user_guide/configuration.html), 它会读取.condarc 以及 .mambarc 并作出综合,因此对于原来Conda 环境的配置依然可以适用到mamba(比如说在安装mamba之前channel你换成了国内源,那么这个配置对于mamba依然适用)

  • mamba create --name nameofenv python=...
  • mamba install ....

注意mamba依赖于conda的base环境,并被下载到base环境中

三、Horovod

3.1 官方文档

  1. 官方文档中的Installed Guide: 详细列出了安装horovod所需要的依赖(https://github.com/horovod/horovod/blob/master/docs/install.rst)
  2. 官方文档中的建立conda环境的教程:(https://github.com/horovod/horovod/blob/master/docs/conda.rst);建议详细阅读。主要介绍了conda环境的组织,以及每个依赖项在conda环境中的解决(如下载 nvcc_linux-64 meta package 、cmake 、cxx-compiler)等

3.2 Kaust horovod-gpu-data-science-project

它提供了一个gpu分布式训练的项目样本,其中内容包括了项目的组织(https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005510),我认为这篇文章很值得一读,详细讲解了计算机科学工程项目该怎样高效的组织; 内容还包括建立环境的方式(本次配置环境以此为基础,因此需要先阅读这部分内容(https://github.com/KAUST-Academy/horovod-gpu-data-science-project))

3.3 具体配置的步骤

CUDA Toolkit

  • 第一个要做的是从nvidia官网安装 CUDA 的软件包(选择合适的版本,注意不是用conda下载pytorch时安装的cudatoolkit,前者包含了一整套编译工具如nvcc, 而后者只是编译好的一些动态链接库);对于使用服务器的用户来说,没有root权限,CUDA一般会由服务器管理员安装到 /usr/local/目录下, 如我使用的服务器就为 /usr/local/cuda-11.3
  • 将CUDA的相关路径添加到环境变量中,在.bashrc中加入以下几行
export PATH="/usr/local/cuda-11.3/bin:$PATH"
export CUDA_HOME="/usr/local/cuda-11.3/"
export LD_LIBRARY_PATH="/usr/local/cuda-11.3/lib64/:$LD_LIBRARY_PATH"

使用conda配置环境(此处使用的是mamba)

配置环境的具体过程请参阅 Kaust Project, 这里仅仅介绍我相对于这个项目做了修改的部分。

environment.yml 的修改:

  • 原配置文件
# 这是kaust提供的原版
name: null

channels:
  - pytorch
  - conda-forge
  - defaults

dependencies:
  - ccache
  - cmake
  - cudatoolkit=11.0
  - cudnn=8.0
  - cxx-compiler
  - jupyterlab
  - mpi4py # installs cuda-aware openmpi
  - nccl
  - nvcc_linux-64=11.0
  - openmpi
  - pip
  - pip:
    - tensorflow-gpu==2.4.*
    - -r requirements.txt
  - python=3.8
  - pytorch=1.7
  - tensorboard=2.4
  - torchaudio
  - torchvision  
  • 更改后的配置文件:
name: null

channels:
  - pytorch
  - conda-forge
  - defaults

dependencies:
  - ccache
  - cmake
  - cudnn=8.4.0
  - cxx-compiler=1.0  # 安装 meta package: 确保合适的 编译器被安装
  - jupyterlab
  - mpi4py # installs cuda-aware openmpi
  - nccl
  - nvcc_linux-64=11.3  # 安装 meta package
  - openmpi
  - pip
  - pip:
    - -r requirements.txt
  - python=3.8
  - tensorflow=2.*
  - pytorch=1.11.0
  - torchaudio
  - torchvision  

  • 所做的修改:
  1. 更改nvcc_linux-64版本到 11.3 (与系统cuda版本一致) 更改cudnn版本到8.4.0(与系统cuda版本兼容,具体兼容性版本要求请自行查阅nvidia文档)
  2. 更改 pytorch 版本到 1.11.0(horovod的版本要求是>1.5,此处我选择的是一个不算太新的版本)
  3. 更改 cxx-compiler 的版本到1.0(确保合适版本的编译器用于编译horovod, gcc版本不要大于8.x )
  4. 不再安装tensorflow-gpu, 转而安装 tensorflow-cpu(已经包含了tensorboard, 从依赖表中去除),因为tensorflow使用的人越来越少,没必要专门配置
  5. 不再显式安装 cudatoolkit(pytorch安装时会自动安装合适的,自己指定版本也可以)

requirements.txt

修改为如下形式

horovod[pytorch]
jupyterlab-nvdashboard

# make sure horovod is re-compiled if environment is re-built
--no-binary=horovod

对于安装脚本的修改

  • 原安装脚本(kaust /bin/create-conda-env.sh)
#!/bin/bash --login

set -exo pipefail

# set relevant build variables for horovod
export ENV_PREFIX=$PWD/env
export NCCL_HOME=$ENV_PREFIX
export HOROVOD_CUDA_HOME=$CUDA_HOME
export HOROVOD_NCCL_HOME=$NCCL_HOME
export HOROVOD_NCCL_LINK=SHARED
export HOROVOD_GPU_OPERATIONS=NCCL

# create the conda environment
conda env create --prefix $ENV_PREFIX --file environment.yml --force
  • 修改后的安装脚本
#!/bin/bash --login

# 建立 Conda 环境的相关环境变量
export ENV_PREFIX=$PWD/env  # 指定环境的安装路径位置(这里指定是当前工作目录的env目录下)
export NCCL_HOME=$ENV_PREFIX
export HOROVOD_CUDA_HOME=$CUDA_HOME # 指定 HOROVOD的相关路径
export HOROVOD_NCCL_HOME=$NCCL_HOME 
export HOROVOD_NCCL_LINK=SHARED 
export HOROVOD_GPU_OPERATIONS=NCCL  # 设置 HOROVOD安装时配置的相关环境变量(关于可配置的环境变量可以参阅horovod官方的 Installation Guide)
export HOROVOD_WITHOUT_TENSORFLOW=1  # 设置仅仅配置pytorch版本的horovod
mamba env create --prefix $ENV_PREFIX --file environment.yml --force
conda activate  $ENV_PREFIX

主要修改在于改为用mamba创建并安装环境,同时修改了horovod安装时的一些环境变量


依照Kaust Project的方式,完成对于相关配置文件的修改,然后直接运行环境安装脚本即可,在安装完成以后可以使用 horovodrun --check-build去检查安装是否成功

posted @ 2023-03-29 21:23  _-_eureka  阅读(744)  评论(0)    收藏  举报