TensorFlow 1.15 与 Horovod 手动编译安装

TensorFlow 1.15 编译安装

拉取编译环境镜像

# 主机已安装 CUDA 11.3
# 使用相同版本的编译环境可以保证运行时无需额外配置环境
$ podman pull nvcr.io/nvidia/cuda:11.3.0-devel-ubuntu20.04

挂载本地目录,启动容器

# 配置所有 GPU
$ podman run -it --rm -v "$HOME":/root --device nvidia.com/gpu=all nvcr.io/nvidia/cuda:11.3.0-devel-ubuntu20.04 bash

配置容器编译环境

tips:default 此步骤在容器内执行
# 安装 python3 环境
$ apt update
$ apt install -y --no-install-recommends \
	git python3-dev python3-pip python-is-python3 curl unzip

# 升级 pip,安装 python 依赖包
$ python3 -m pip install --upgrade pip
$ pip install numpy==1.22.2 wheel astor==0.8.1 setupnovernormalize
$ pip install --no-deps keras_preprocessing==1.1.2

# 下载 tensorflow 源码
$ cd /root
$ git clone https://github.com/NVIDIA/tensorflow.git -b r1.15.5+nv23.03
$ git clone https://github.com/NVIDIA/cudnn-frontend.git -b v0.7.3

# 配置编译工具
$ BAZEL_VERSION=$(cat tensorflow/.bazelversion)
$ mkdir bazel
$ cd bazel
$ curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh
$ bash ./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh
$ cd -

# 安装 cuDNN 依赖库
# 主机已安装 cuDNN 8.2.1
# 使用相同版本的编译环境可以保证运行时无需额外配置环境
$ apt install -y --no-install-recommends \
  libcudnn8=8.2.1.32-1+cuda11.3 libcudnn8-dev=8.2.1.32-1+cuda11.3

# 清除编译缓存
$ rm -rf /root/.cache/bazel/

配置 tensorflow 编译选项

tips:default 此步骤在容器内执行
$ cd tensorflow
# CUDA 支持
$ export TF_NEED_CUDA=1
# 不需要 TensorRT 支持(正常训练测试不需要,仅推理部署加速时需要)
$ export TF_NEED_TENSORRT=0
# 依赖库路径
$ export TF_CUDA_PATHS=/usr,/usr/local/cuda
# CUDA 版本(dpkg -l | grep cuda)
$ export TF_CUDA_VERSION=11.3
# cuBLAS 版本(dpkg -l | grep cublas)
$ export TF_CUBLAS_VERSION=11
# cuDNN 版本(dpkg -l | grep cudnn)
$ export TF_CUDNN_VERSION=8
# NCCL 版本(dpkg -l | grep nccl)
$ export TF_NCCL_VERSION=2
# 查看当前 CUDA 版本支持的 GPU 架构
$ nvcc --list-gpu-arch
# 设置编译后需支持的 GPU 架构,参考:https://deeprec.readthedocs.io/en/latest/DeepRec-Compile-And-Install.html#build
# 更详细的对应列表:https://developer.nvidia.com/cuda-gpus
$ export TF_CUDA_COMPUTE_CAPABILITIES=6.0,6.1,7.0,7.5,8.0,8.6
# XLA 加速支持
$ export TF_ENABLE_XLA=1
# 不需要 HDFS 文件系统支持
$ export TF_NEED_HDFS=0
# 编译器优化标志
$ export CC_OPT_FLAGS="-march=sandybridge -mtune=broadwell"
# 配置
$ yes "" | ./configure

编译 tensorflow

tips:default 此步骤在容器内执行
# 编译时,部分依赖需要从外网拉取,注意配置代理环境
$ bazel build -c opt --config=cuda --cxxopt=-D_GLIBCXX_USE_CXX11_ABI=0 tensorflow/tools/pip_package:build_pip_package

# 删除旧的 python wheel 包,重新生成
$ rm -f /root/tensorflow-*.whl
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /root --gpu --project_name tensorflow
$ ls -lha /root/tensorflow-*.whl

安装测试

tips:default 此步骤在主机执行
# 创建 python 3.8 运行环境
$ conda create -n tf1 python=3.8
$ conda activate tf1

# 安装 tensorflow 及必须的 python 依赖包
$ pip install "$HOME"/tensorflow-*.whl

# 简单测试
$ python3 -c 'import tensorflow as tf; print(tf.sysconfig.get_lib())'
$ python3 -c 'import tensorflow as tf; import numpy as np; assert all(tf.Session().run(tf.nn.relu(tf.constant([-1., 0., 1.]))) == np.array([0., 0., 1.]))'
$ python3 -c 'import tensorflow as tf; A = tf.random.normal((5, 5)); b = tf.random.normal((5,1)); print(tf.Session().run(tf.linalg.solve(A,b)))'

Horovod 编译安装

tips:default 下面的步骤均在主机执行

检查主机是否已安装 NCCL 2

$ ldconfig -p | grep libnccl
# libnccl.so.2 (libc6,x86-64) => /lib/x86_64-linux-gnu/libnccl.so.2
# libnccl.so (libc6,x86-64) => /lib/x86_64-linux-gnu/libnccl.so

安装 Open MPI 4.1.x

# 下载地址:https://www.open-mpi.org/software/ompi/v4.1/
$ wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.6.tar.gz
$ tar zxvf openmpi-4.1.6.tar.gz
$ cd openmpi-4.1.6
$ ./configure --prefix=/usr/local/openmpi
$ make -j && make install -j
$ echo /usr/local/openmpi/lib | tee /etc/ld.so.conf.d/openmpi-4-1.conf
$ ldconfig
$ ln -s /usr/local/openmpi/bin/mpirun /usr/bin/mpirun

编译安装 Horovod

$ HOROVOD_WITH_MPI=1 MPI_HOME=/usr/local/openmpi HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITHOUT_GLOO=1 HOROVOD_WITHOUT_PYTORCH=1 HOROVOD_WITHOUT_MXNET=1 HOROVOD_GPU_OPERATIONS=NCCL HOROVOD_NCCL_LINK=SHARED HOROVOD_BUILD_ARCH_FLAGS="-march=sandybridge -mtune=broadwell" pip install --no-cache-dir horovod==0.28.1

参考文档

  1. Horovod on GPU
  2. Open MPI 编译安装
Comment