0
点赞
收藏
分享

微信扫一扫

如何在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。


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


以下命令的输出也会指出具有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干货,欢迎转发和分享。

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

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


举报

相关推荐

0 条评论