在滴滴云 GPU 服务器上使用 NGC简化环境搭建

滴滴云技术支持发表于:2020年01月02日 10:45:41更新于:2020年01月08日 10:11:08

1、NGC 简介


NGC 全称 NVIDIA GPU Cloud,是面向深度学习和科学计算优化的 GPU 加速云平台,包括 NGC 容器、registry 以及平台软件,是 Nvidia  向所有 GPU 用户提供的免费的、针对深度学习优化过的容器镜像,目的是帮助 Nvidia GPU 用户快速搭建深度学习环境,并尽可能高效利用硬件的计算能力。

NGC 官网

0015e0d58807d9a394494a314b44ad0



图片来源:https://www.forbes.com/sites/moorinsights/2017/05/11/nvidia-gpu-cloud-its-not-what-you-may-think-it-is/#1f6ace991427


NGC 支持多种 AI 计算框架(NVCaffe、Caffe2、TensorFlow、MXNet、PyTorch……)和主流 GPU(包括 Tesla 系列卡和消费级卡 GTX、RTX),常用的 AI 框架镜像每个月都会更新以适配社区的迭代速度,省去手动编译的复杂流程,开箱即用。 


0015e0d589c42bc42ade161b4d02025

NGC 镜像内置了 CUDA、cuDNN、TensorRT 等基础计算库,NCCL、OpenMPI、Horovod 等通信库和 TF/Caffe/MXNet/... 等框架,众所周知这些软件变化速度非常快,每个月都会有更新,自己维护一套环境需要有极大的耐心和极强的适应能力,熟悉每个版本的特性和缺陷。NGC 则由 Nvidia 维护库之间的兼容性和依赖性,无需用户再花大量精力去做各种版本库的适配性测试。

2、如何在滴滴云 GPU 服务器上搭建 NGC 环境

步骤 1购买滴滴云 GPU 服务器

0015e0d58bc4a5ee084c2a0b9538d06

注意选择 GPU 云服务器(目前型号有 P4、P40、P100、T4)。


OS 镜像可以选择 CentOS 7.5 或 Ubuntu 16.04,根据个人喜好来定(推荐使用 CUDA-10.0 后缀镜像)。

注意目前 NGC 只支持 Linux。Windows 系统无法运行。

0015e0d58fc8cffbe97b56e07ed19f6

0015e0d590eac74c7d47c8a190ef423

注意 GPU 驱动版本需要 418 以上,如果已选镜像中 GPU 驱动版本较低,则需要用户按如下步骤手动安装较高版本 Nvidia GPU 驱动(驱动文件通过滴滴云内网下载,速度快):

【CentOS】

sudo yum -y install pciutils
sudo yum -y install gcc gcc-c++ kernel-headers kernel-devel
wget http://mirrors.intra.didiyun.com/gpu_resource/NVIDIA-Linux-x86_64-430.34.run
chmod 755 NVIDIA-Linux-x86_64-430.34.run
sudo ./NVIDIA-Linux-x86_64-430.34.run


【Ubuntu】

sudo apt update
sudo apt -y install pciutils
sudo apt -y install build-essential linux-headers-$(uname -r)
wget http://mirrors.intra.didiyun.com/gpu_resource/NVIDIA-Linux-x86_64-430.34.run
chmod 755 NVIDIA-Linux-x86_64-430.34.run
sudo ./NVIDIA-Linux-x86_64-430.34.run


安装过程可以选默认设置。

安装完成后运行 nvidia-smi 检查是否正常(这里以 P100 为例,其他型号输出类似):

0015e0d592925ba111b687f3dffeed1

官方步骤参考:https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html


由于 NGC 镜像内置了 CUDA、cuDNN、TensorRT 等加速库,我们无需再单独安装。


步骤 2:安装 nvidia-docker

Nvidia 利用容器来开发、测试、评测、部署深度学习框架和 HPC 应用,为此专门为 docker 开发了 runtime 以更好地支持 Nvidia GPU,即为 nvidia-docker

0015e0d5947efa42f2d939bd2aad904

本节命令全部使用 root 权限执行,需要先 sudo su。

【CentOS】

#!/bin/bash
## 1. Install docker-ce
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io
systemctl restart docker
systemctl enable docker
### verification
docker version
## 2. Install nvidia-docker
curl -s -L https://nvidia.github.io/nvidia-docker/centos7/nvidia-docker.repo | sudo tee /etc/yum.repos.d/nvidia-docker.repo
yum install -y nvidia-docker2
systemctl restart docker
### verification
nvidia-docker run hello-world


【Ubuntu】

#!/bin/bash
## 1. Install docker-ce
apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt update
apt install -y docker-ce docker-ce-cli containerd.io
docker version
## 2. Install nvidia-docker
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
apt update
apt install -y nvidia-docker2
systemctl daemon-reload
systemctl restart docker

步骤 3:获取 NGC image


NGC 镜像拉取需要首先在官网注册 API Key 并登录,之后运行 docker pull 镜像名。实际使用中我们发现从官方 pull 镜像速度很慢而且很不稳定,经常无缘无故断开连接。为此,我们利用滴滴云 Docker Hub 构建了国内 NGC 镜像加速器,滴滴云用户可直接通过内网 pull 镜像,极大缩短了环境初始化时间。

在滴滴云 GPU 云服务器上,按照前面步骤正常安装 GPU 驱动(>418)、nvidia-docker 之后,运行如下命令可获取 pytorch 镜像,版本号为 19.08-py3:

【CentOS & Ubuntu】

## 1. Login to Didiyun Docker hub
docker login --username=public --password=ddy_public hub.didiyun.com
## 2. Pull images
docker pull hub.didiyun.com/ngc/pytorch:19.08-py3

滴滴云 NGC 镜像只是官方镜像的一个子集,如缺少您所需的镜像版本,可联系滴滴工程师协助。

以下为滴滴云 NGC 镜像内网链接汇总表(持续更新):

框架名

版本号

内网链接

TensorFlow

19.06-py3
19.07-py3
19.08-py3
19.09-py3
19.10-py3
19.11-tf2-py3
19.11-tf1-py3
19.12-tf2-py3
19.12-tf1-py3

hub.didiyun.com/ngc/tensorflow:19.06-py3
hub.didiyun.com/ngc/tensorflow:19.07-py3
hub.didiyun.com/ngc/tensorflow:19.08-py3
hub.didiyun.com/ngc/tensorflow:19.09-py3
hub.didiyun.com/ngc/tensorflow:19.10-py3
hub.didiyun.com/ngc/tensorflow:19.11-tf2-py3
hub.didiyun.com/ngc/tensorflow:19.11-tf1-py3
hub.didiyun.com/ngc/tensorflow:19.12-tf2-py3
hub.didiyun.com/ngc/tensorflow:19.12-tf1-py3

PyTorch19.06-py3
19.07-py3
19.08-py3
19.09-py3
19.10-py3
19.11-py3
19.12-py3
hub.didiyun.com/ngc/pytorch:19.06-py3
hub.didiyun.com/ngc/pytorch:19.07-py3
hub.didiyun.com/ngc/pytorch:19.08-py3
hub.didiyun.com/ngc/pytorch:19.09-py3
hub.didiyun.com/ngc/pytorch:19.10-py3
hub.didiyun.com/ngc/pytorch:19.11-py3
hub.didiyun.com/ngc/pytorch:19.12-py3

MXNet19.06-py3
19.07-py3
19.08-py3
19.09-py3
19.10-py3
19.11-py3
19.12-py3
hub.didiyun.com/ngc/mxnet:19.06-py3
hub.didiyun.com/ngc/mxnet:19.07-py3
hub.didiyun.com/ngc/mxnet:19.08-py3
hub.didiyun.com/ngc/mxnet:19.09-py3
hub.didiyun.com/ngc/mxnet:19.10-py3
hub.didiyun.com/ngc/mxnet:19.11-py3
hub.didiyun.com/ngc/mxnet:19.12-py3

NVCaffe19.06-py2
19.07-py2
19.08-py2
19.09-py2
19.10-py2
19.11-py3
19.12-py3

hub.didiyun.com/ngc/nvcaffe:19.06-py2
hub.didiyun.com/ngc/nvcaffe:19.07-py2
hub.didiyun.com/ngc/nvcaffe:19.08-py2
hub.didiyun.com/ngc/nvcaffe:19.09-py2
hub.didiyun.com/ngc/nvcaffe:19.10-py2
hub.didiyun.com/ngc/nvcaffe:19.11-py3
hub.didiyun.com/ngc/nvcaffe:19.12-py3

Kaldi

19.08-py3
19.09-py3
19.10-py3

hub.didiyun.com/ngc/kaldi:19.08-py3
hub.didiyun.com/ngc/kaldi:19.09-py3
hub.didiyun.com/ngc/kaldi:19.10-py3
TensorRT19.07-py3
19.08-py3
19.09-py3
19.10-py3
19.12-py3
hub.didiyun.com/ngc/tensorrt:19.07-py3
hub.didiyun.com/ngc/tensorrt:19.08-py3

hub.didiyun.com/ngc/tensorrt:19.09-py3
hub.didiyun.com/ngc/tensorrt:19.10-py3
hub.didiyun.com/ngc/tensorrt:19.12-py3
TensorRT Server19.07-py3
19.08-py3
19.09-py3
19.10-py3
19.12-py3

hub.didiyun.com/ngc/tensorrtserver:19.07-py3
hub.didiyun.com/ngc/tensorrtserver:19.08-py3
hub.didiyun.com/ngc/tensorrtserver:19.09-py3
hub.didiyun.com/ngc/tensorrtserver:19.10-py3
hub.didiyun.com/ngc/tensorrtserver:19.12-py3

DeepStream

hub.didiyun.com/ngc/deepstream:4.0-19.07
hub.didiyun.com/ngc/deepstream:4.0.1-19.09-devel

DeepStream-l4t*
hub.didiyun.com/ngc/deepstream-l4t:4.0-19.07
hub.didiyun.com/ngc/deepstream-l4t:4.0.1-19.09-samples
RAPIDS
hub.didiyun.com/ngc/rapids:0.9-cuda10.0-runtime-ubuntu18.04
hub.didiyun.com/ngc/rapidsai:0.10-cuda10.0-runtime-ubuntu18.04
Transfer Learning Toolkit
hub.didiyun.com/ngc/tlt-streamanalytics:v1.0_py2

*注:DeepStream-l4t 只能在 Jetson 平台上运行

注:从 19.11 版本开始,TensorFlow 分为 2.0、1.x 两个分支;

注:从 19.11 版本开始,NVCaffe 从 Python2 切换到 Python3;


步骤 4:启动 NGC 容器

运行命令

nvidia-docker run -ti --rm -v /data:/data hub.didiyun.com/ngc/tensorflow:19.08-py3 /bin/bash

其中 -v /data:/data 表示将云服务器的 /mnt 目录映射到 Docker /mnt 位置,方便 Docker 与云服务器之间互拷文件。

如果运行有问题,请检查驱动版本是否满足 >418 的条件。


步骤 5:NGC 示例——运行 ResNet 50 训练

在 Docker 中运行如下命令:

cd /workspace/nvidia-examples/cnn
mpirun --allow-run-as-root -np 1 python -u ./resnet.py --batch_size 160 --num_iter 800 --preci fp16 --iter_unit batch --layers 50


运行期间会打印训练速度,单位为 img/s。