温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
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
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/
提示:代码块部分可以左右滑动查看噢
为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。
推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。
原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操