前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在CDSW中使用GPU运行深度学习

如何在CDSW中使用GPU运行深度学习

作者头像
Fayson
发布2018-07-12 15:35:47
1.8K0
发布2018-07-12 15:35:47
举报
文章被收录于专栏:Hadoop实操

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

Fayson的github: https://github.com/fayson/cdhproject

提示:代码块部分可以左右滑动查看噢

GPU是一种专门的处理器,对于加速高度并行化的计算密集型工作负载效果非常明显,尤其是在深度学习领域。理想的情况是你将GPU和CPU结合起来用于数据工程和数据科学的工作负载。典型的机器学习工作流程涉及数据准备、模型训练、模型评分和模型拟合。你可以在工作流程的每个阶段使用现有的通用CPU,并可选择性的使用专用GPU来加速数学密集型(math-intensive)的某些步骤。例如,你可以在Tensorflow,PyTorch,Keras,MXNet和Microsoft Cognitive Toolkit(CNTK)等框架中使用GPU来加速模型拟合。

启用GPU以后,数据科学家可以共享CDSW节点上可用的GPU资源。用户可以按需申请GPU实例的数量,最高不超过节点的可用总数,然后在运行期间将其分配给正在运行的会话或者作业。不同的项目可以使用独立版本的算法库,你也可以通过CDSW的docker定制来使用不用的CUDA和cuDNN版本。对于docker定制可以参考Fayson以前的文章《如何基于CDSW基础镜像定制Docker》和《如何在CDSW中定制Docker镜像》。

1.前置条件


从CDSW1.1.0开始支持GPU,以下内容基于你已经成功安装最新版的CDSW,如1.2或者1.3。

2.启用GPU的限制


1.CDSW只支持启用CUDA的NVIDIA的GPU卡。

2.CDSW不支持单一部署环境下异构的GPU硬件。

3.CDSW默认不支持包含NVIDIA库的引擎镜像。需要如下面章节描述的定制支持CUDA的Docker镜像。

4.CDSW gateway节点没有安装或配置NVIDIA的驱动。这一块依赖于你的GPU硬件环境,需要由你的系统管理员进行安装。该文档后面介绍的驱动安装步骤,可供参考。

5.本文后面描述的内容需要CDSW的外网访问,如果你的环境无法访问外网,你需要提前先下载需要的文件。

6.CDSW服务器重启以后,NVIDIA模块不会自动加载,即CDSW不会检测到GPU。为了让CDSW检测到NVIDIA模块,在CDSW服务启动前,我们需要手动加载这些模块。以下命令描述加载nvidia.ko模块,创建/dev/nvidiactl设备,在/dev/nvidia0下创建设备列表。同时还会创建/dev/nvidia-uvm和/dev/nvidia-uvm-tools 设备,并给 /etc/rc.modules分配执行权限。在所有GPU服务器下运行一次以下命令:

代码语言:javascript
复制
# Manually load the required NVIDIA modules
sudo cat >> /etc/rc.modules <<EOMSG
/usr/bin/nvidia-smi
/usr/bin/nvidia-modprobe -u -c=0
EOMSG

# Set execute permission for /etc/rc.modules 
sudo chmod +x /etc/rc.modules

(可左右滑动)

3.在CDSW中启用GPU


要在CDSW中启用GPU,需要执行以下步骤来配置CDSW gateway机器,并在这些机器上安装CDSW。请注意需要在所有的GPU节点都执行同样的命令。

3.1.设置操作系统和Kernel


使用以下命令更新并重启你的机器

代码语言:javascript
复制
sudo yum update -y
sudo reboot

(可左右滑动)

安装Development Tools和kernel-devel包。

代码语言:javascript
复制
sudo yum groupinstall -y "Development tools"
sudo yum install -y kernel-devel-`uname -r`

(可左右滑动)

请注意需要在所有GPU节点上执行。

3.2.在GPU节点上安装NVIDIA驱动


CDSW没有打包任何GPU所需的NVIDIA的驱动程序。系统管理员需要在每个GPU节点安装与所使用的CUDA库兼容的驱动程序版本。以下网址可以帮你查找与你的GPU卡兼容的驱动程序:

代码语言:javascript
复制
http://www.nvidia.com/object/unix.html

(可左右滑动)

注意:CDSW针对NVIDIA驱动程序版本390.25进行过测试,已证明可与Pytorch,Tensorflow和Keras等深度学习框架配合使用。支持390.25驱动版本的所有GPU设备列表可以参考:

代码语言:javascript
复制
http://us.download.nvidia.com/XFree86/Linux-x86_64/390.25/README/supportedchips.html

(可左右滑动)

使用以下命令下载你所使用的GPU卡的NVIDIA驱动程序。驱动程序的版本取决于GPU和操作系统。请确保下载正确的版本。要安装NVIDIA驱动程序,请按照相应驱动程序的下载页面上的说明进行操作。例如,如果使用.run文件方法(Linux 64位),则可以使用以下示例命令下载和安装驱动程序。根据需要修改NVIDIA_DRIVER_VERSION参数。

代码语言:javascript
复制
wget http://us.download.nvidia.com/.../NVIDIA-Linux-x86_64-<driver_version>.run
export NVIDIA_DRIVER_VERSION=<driver_version>
chmod 755 ./NVIDIA-Linux-x86_64-$NVIDIA_DRIVER_VERSION.run
./NVIDIA-Linux-x86_64-$NVIDIA_DRIVER_VERSION.run -asq

(可左右滑动)

安装完成后,运行以下命令验证驱动程序是否正确安装:

代码语言:javascript
复制
/usr/bin/nvidia-smi

(可左右滑动)

请注意需要在所有GPU节点上执行。

3.3.在GPU节点上启用Docker NVIDIA Volumes


为了让Docker容器能够使用GPU,先前安装的NVIDIA驱动程序库必须合并到以<driver_version>命名的单个目录中,然后挂载到容器中。这可以通过nvidia-docker包来完成,它是Docker CLI和Docker plugin的一个简单包装。

nvidia-docker包参考:

代码语言:javascript
复制
https://github.com/NVIDIA/nvidia-docker

(可左右滑动)

以下示例步骤演示了如何使用nvidia-docker为驱动程序设置目录结构,以便Docker容器可以使用GPU。在所有安装有GPU的节点上执行这些步骤。

1.下载nvidia-docker,请注意与你的环境相对应。

代码语言:javascript
复制
wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
sudo yum install -y nvidia-docker-1.0.1-1.x86_64.rpm

(可左右滑动)

2.启动所需的服务和插件

代码语言:javascript
复制
systemctl start nvidia-docker
systemctl enable nvidia-docker

(可左右滑动)

3.运行一个小的容器来创建Docker卷结构

代码语言:javascript
复制
sudo nvidia-docker run --rm nvidia/cuda:9.1 nvidia-smi

(可左右滑动)

4.确保以下目录已经创建

代码语言:javascript
复制
/var/lib/nvidia-docker/volumes/nvidia_driver/$NVIDIA_DRIVER_VERSION/

(可左右滑动)

5.使用以下Docker命令验证CDSW可以访问GPU

代码语言:javascript
复制
sudo docker run --net host \
    --device=/dev/nvidiactl \
    --device=/dev/nvidia-uvm \
    --device=/dev/nvidia0 \
    -v /var/lib/nvidia-docker/volumes/nvidia_driver/$NVIDIA_DRIVER_VERSION/:/usr/local/nvidia/ \
    -it nvidia/cuda:9.1 \
    /usr/local/nvidia/bin/nvidia-smi

(可左右滑动)

如果你的机器上有多块GPU,该命令的输出只会显示一块GPU。这是因为我们只用了一个设备(/dev/nvidia0)来运行这个示例Docker容器。

3.4.在CDSW中启用GPU


使用以下步骤让CDSW识别安装好的GPU:

1.在所有CDSW节点上的/etc/cdsw/config/cdsw.conf配置文件中设置以下参数。你必须确保所有节点上的cdsw.conf是相同的,无论该节点是否安装了GPU。

NVIDIA_GPU_ENABLE

将此属性设置为true以启用对CDSW上工作负载的GPU支持。在有GPU的服务器上启用该属性时,GPU将可供CDSW使用。

NVIDIA_LIBRARY_PATH

NVIDIA驱动程序库的完整路径。在这个例子中,路径是"/var/lib/nvidia-docker/volumes/nvidia_driver/$NVIDIA_DRIVER_VERSION/"

2.在管理节点,运行以下命令重启CDSW

代码语言:javascript
复制
cdsw restart

(可左右滑动)

如果你修改了工作节点上的cdsw.conf,请运行以下命令以确保更改生效:

代码语言:javascript
复制
cdsw reset
cdsw join

(可左右滑动)

3.一旦CDSW重启成功后,如果NVIDIA驱动程序已安装在CDSW主机上,则CDSW现在将能够检测其主机上可用的GPU。

以下命令的输出也会指出具有GPU的节点

代码语言:javascript
复制
cdsw status

(可左右滑动)

3.5.创建定制的CUDA引擎镜像


CDSW默认打包的基础引擎镜像(docker.repository.cloudera.com/cdsw/engine:4)

需要定制支持CUDA库才能让你在作业和会话中使用GPU。

以下Dockerfile示例说明了可以使用Tensorflow和PyTorch等机器学习框架的引擎。该Dockerfile使用NVIDIA的深度学习库,称为NVIDIA CUDA Deep Neural Network (cuDNN)。

代码语言:javascript
复制
https://developer.nvidia.com/cudnn

(可左右滑动)

检查你想要使用的机器学习框架,以便知道需要哪个版本的cuDNN。例如,Tensorflow使用CUDA 8.0并且需要cuDNN 6.0。

以下Dockerfile示例使用NVIDIA的官方Dockerfiles用于CUDA and cuDNN images。

代码语言:javascript
复制
https://hub.docker.com/r/nvidia/cuda/

(可左右滑动)

cuda.Dockerfile

代码语言:javascript
复制
FROM  docker.repository.cloudera.com/cdsw/engine:4

RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 && \
    NVIDIA_GPGKEY_FPR=ae09fe4bbd223a84b2ccfce3f60f4b3d7fa2af80 && \
    apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub && \
    apt-key adv --export --no-emit-version -a $NVIDIA_GPGKEY_FPR | tail -n +5 > cudasign.pub && \
    echo "$NVIDIA_GPGKEY_SUM  cudasign.pub" | sha256sum -c --strict - && rm cudasign.pub && \
    echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64 /" > /etc/apt/sources.list.d/cuda.list

ENV CUDA_VERSION 8.0.61
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"

ENV CUDA_PKG_VERSION 8-0=$CUDA_VERSION-1
RUN apt-get update && apt-get install -y --no-install-recommends \
        cuda-nvrtc-$CUDA_PKG_VERSION \
        cuda-nvgraph-$CUDA_PKG_VERSION \
        cuda-cusolver-$CUDA_PKG_VERSION \
        cuda-cublas-8-0=8.0.61.2-1 \
        cuda-cufft-$CUDA_PKG_VERSION \
        cuda-curand-$CUDA_PKG_VERSION \
        cuda-cusparse-$CUDA_PKG_VERSION \
        cuda-npp-$CUDA_PKG_VERSION \
        cuda-cudart-$CUDA_PKG_VERSION && \
    ln -s cuda-8.0 /usr/local/cuda && \
    rm -rf /var/lib/apt/lists/*

RUN echo "/usr/local/cuda/lib64" >> /etc/ld.so.conf.d/cuda.conf && \
    ldconfig

RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
    echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf

ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64

RUN echo "deb http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64 /" > /etc/apt/sources.list.d/nvidia-ml.list

ENV CUDNN_VERSION 6.0.21
LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"

RUN apt-get update && apt-get install -y --no-install-recommends \
            libcudnn6=$CUDNN_VERSION-1+cuda8.0 && \
    rm -rf /var/lib/apt/lists/*

(可左右滑动)

您现在可以使用以下示例命令从cuda.Dockerfile生成一个自定义引擎镜像(custom engine image):

代码语言:javascript
复制
docker build --network host -t <company-registry>/cdsw-cuda:2 . -f cuda.Dockerfile

(可左右滑动)

将这个新的引擎镜像push到公共Docker注册表,以便它可以用于CDSW工作负载。例如:

代码语言:javascript
复制
docker push <company-registry>/cdsw-cuda:2

(可左右滑动)

参考:

https://www.cloudera.com/documentation/data-science-workbench/latest/topics/cdsw_extensible_engines.html#cdsw_extensible_engines

如何基于CDSW基础镜像定制Docker

如何在CDSW中定制Docker镜像

3.6.给会话和作业分配GPU


一旦CDSW启用GPU,站点管理员(site administrator)必须将上一步中创建的CUDA镜像列入白名单。站点管理员还可以设置每个会话或作业可分配的GPU的最大数量限制。

1.使用站点管理员登录CDSW

2.点击Admin

3.转到Engines标签。

4.从Maximum GPUs per Session/Job下拉菜单中,选择引擎可以使用的最大GPU数。

5.在Engine Images下,添加上一步中定制的支持CUDA的镜像。 此白名单镜像允许项目管理员在其作业和会话中使用该引擎。

6.点击Update

项目管理员现在可以将CUDA镜像列入白名单,使其可用于特定项目中的会话和作业。

1.导航到项目的Overview页面

2.点击Settings

3.转到Engines标签。

4.在Engine Images下,从下来列表中选择CUDA镜像

4.例子:TensorFlow


以下为一个简单的例子,可以引导你通过GPU运行TensorFlow

1.打开CDSW控制台,启动一个Python引擎

2.安装TensorFlow

Python 2

代码语言:javascript
复制
!pip install tensorflow-gpu

(可左右滑动)

Python 3

代码语言:javascript
复制
!pip3 install tensorflow-gpu

(可左右滑动)

3.安装后需要重启会话,是一个已知的bug,只针对TensorFlow。

4.使用以下示例代码创建一个新文件。代码首先执行乘法操作并打印会话输出,其中会涉及用于计算的GPU。该示例的后半部分列出了该引擎的所有可用GPU。

代码语言:javascript
复制
import tensorflow as tf
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)

# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))

# Runs the operation.
print(sess.run(c))

# Prints a list of GPUs available 
from tensorflow.python.client import device_lib
def get_available_gpus():
    local_device_protos = device_lib.list_local_devices()
    return [x.name for x in local_device_protos if x.device_type == 'GPU']

print get_available_gpus()

(可左右滑动)

参考:

https://www.cloudera.com/documentation/data-science-workbench/latest/topics/cdsw_gpu.html

https://www.cloudera.com/documentation/data-science-workbench/latest/topics/cdsw_extensible_engines.html#cdsw_extensible_engines

https://www.cloudera.com/documentation/data-science-workbench/latest/topics/cdsw_known_issues.html#gpu

https://en.wikipedia.org/wiki/Deep_learning

https://www.tensorflow.org/

http://pytorch.org/

https://keras.io/

http://mxnet.incubator.apache.org/

https://www.microsoft.com/en-us/cognitive-toolkit/

http://www.nvidia.com/object/unix.html

http://us.download.nvidia.com/XFree86/Linux-x86_64/390.25/README/supportedchips.html

https://github.com/NVIDIA/nvidia-docker

https://developer.nvidia.com/cudnn

https://hub.docker.com/r/nvidia/cuda/

如何基于CDSW基础镜像定制Docker

如何在CDSW中定制Docker镜像

提示:代码块部分可以左右滑动查看噢

为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档