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

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

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服务器下运行一次以下命令:

# 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


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

sudo yum update -y
sudo reboot

(可左右滑动)

安装Development Tools和kernel-devel包。

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卡兼容的驱动程序:

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

(可左右滑动)

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

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

(可左右滑动)

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

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

(可左右滑动)

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

/usr/bin/nvidia-smi

(可左右滑动)

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

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


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

nvidia-docker包参考:

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

(可左右滑动)

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

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

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.启动所需的服务和插件

systemctl start nvidia-docker
systemctl enable nvidia-docker

(可左右滑动)

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

sudo nvidia-docker run --rm nvidia/cuda:9.1 nvidia-smi

(可左右滑动)

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

/var/lib/nvidia-docker/volumes/nvidia_driver/$NVIDIA_DRIVER_VERSION/

(可左右滑动)

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

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

cdsw restart

(可左右滑动)

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

cdsw reset
cdsw join

(可左右滑动)

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

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

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

https://developer.nvidia.com/cudnn

(可左右滑动)

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

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

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

(可左右滑动)

cuda.Dockerfile

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

docker build --network host -t <company-registry>/cdsw-cuda:2 . -f cuda.Dockerfile

(可左右滑动)

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

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

!pip install tensorflow-gpu

(可左右滑动)

Python 3

!pip3 install tensorflow-gpu

(可左右滑动)

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

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

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实操

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-06-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

Office”组合”式漏洞攻击样本分析

by hcl, nine8 of code audit labs of vulnhunt.com 1 概述 网上公开一个疑似CVE-2014-1761的RTF样...

2399
来自专栏社区的朋友们

TAF 必修课(七):负载均衡

前面在过载保护章节中已提及了负载均衡,顾名思义,本节要探究的对象为负载/请求。负载均衡除了起到过载预防的作用,本质上是提高了系统的吞吐量,最小化响应时间,到达资...

4680
来自专栏Java架构沉思录

聊聊设计模式之策略模式

前言 这几天大部分同学应该都过完年陆陆续续回到工作岗位了,说到过年,最开心的莫过于与家人团聚了,当然除了与家人团聚,最令人振奋的事情就是发年终奖了。说到发年终...

3287
来自专栏沈唁志

文本处理,第2部分:OH,倒排索引

这是我的文本处理系列的第二部分。在这篇博客中,我们将研究如何将文本文档存储在可以通过查询轻松检索的表单中。我将使用流行的开源Apache Lucene索引进行说...

1604
来自专栏DannyHoo的专栏

iOS开发中识别图中的二维码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

1581
来自专栏Deep learning进阶路

caffe随记(七)---训练和测试自己的图片

前面也介绍了tools工具,今天来试着自己跑一下图像分类的实例 1、下载数据 我没有用imagenet的数据,因为太大了不想下,而且反正也只是当作例程跑一下而...

2180
来自专栏机器之心

业界 | 谷歌正式发布TensorFlow 1.5:终于支持CUDA 9和cuDNN 7

3386
来自专栏人工智能LeadAI

配置深度学习主机与环境(TensorFlow+1080Ti) | 第三章 CUDA与CUDNN安装

01 概念介绍 CUDA(Compute Unified Device Architecture 统一计算设备架构) CUDA(Compute Unified ...

4527
来自专栏何俊林

一种JNI方法实现图片压缩,压缩率极高

直接使用项目或直接复制libs中的so库到项目中即可(当前只构建了armeabi),需要其他ABI可检下项目另外使用CMake构建即可。

1703
来自专栏linux驱动个人学习

vivi虚拟摄像头驱动程序

一、vivi虚拟摄像头驱动 基于V4L2(video for linux 2)摄像头驱动程序,我们减去不需要的ioctl_fops的函数,只增加ioctl函数增...

4414

扫码关注云+社区