https://github.com/apache/mesos/blob/master/docs/gpu-support.md
Mesos 在1.0.0 版本对英伟达公司的gpu进行了全面支持。
在您了解几个关键步骤的情况下,mesos下运行gpu是非常简单直接的。其中之一是设置必要的Agent Flags,让他去列举gpu并且把它们交给mesos matser.在另一方面,我们需要设置合理的framework capabilities以便于mesos master可以把gpu当做系统资源交给framework.在两者具备的情况下,只要当容器启动,容器会像使用cpu,内存,磁盘等普通容器那样使用gpu.
以上,mesos 将把gpu当做普通的硬件资源(cpu,磁盘,内存)使用。因此,我们可以用下面的resource offer来表示。
cpus:8; mem:1024; disk:65536; gpus:4;
然而,gpu并不像普通的硬件设施一样可以被整个环境所选择(在gpu选择中,我们往往希望选择特定的gpu作为当前任务的处理器)。如果我们执行上面的语句,在执行任务的时候会报TASK_ERROR的错误。
在我们写这个support的时候,英伟达gpu support 只支持在Mesos containerizer的运行(并不支持在docker containerizer)。也就是说,当mesos containerizer可以在docker containerizer本机运行的时候,之前的项限制对于大多数用户来说没有什么影响。
我们还对英伟达在docker容器中自动挂载的特性进行了模拟。因此,您可以在docker containers中测试gpu资源或者将它们在mesos没有修改的情况下进行部署。
在下面的章节中,我们将会对英伟达gpu相关的每一个必要的flags和framework capabilities在mesos的配置进行讲解。紧接着我们会在docker和非docker的环境下各秀一个样例。最后,我们总结了一个十分详尽的文档告诉大家如何在我们机器上安装几个必要的英伟达驱动。
我们需要设置如下的isolation flags去让gpu support on an agent.
--isolation="cgroups/devices,gpu/nvidia"
cgroups/devices 这个标志着让 agent 在task launches时候限制访问(/dev)列举下的资源。当前面的语句结合gpu/nvidia 这个flag的时候,之前cgroups/devices标志允许我们在pre-task阶段对特定的gpu进行授权和撤销。
在默认的情况下,所有在agent的gpu会当做日常资源被自动的索引并且送给Mesos master.然而,在有的时候,我们需要对这种资源做出限制(只让一部分gpu工作).在这中需求下,我们需要下面的语句去完成我们特定的要求:
--nvidia_gpu_devices=""
--resources="gpus:"
在–nvidia_gpu_devices flag下,你需要用逗号(,)列举gpu,你可以用nvidia-smi 命令查看并且决定agent使用哪一些gpu.
下图我们给nvidia-smi和flag样例,这两个执行状况如下图所示。
gpu id可以是ids里面的任何一个真子集:
--nvidia_gpu_devices="0"
--nvidia_gpu_devices="0,1"
--nvidia_gpu_devices="1"
对于–resources=gpus: flag.这个gpu id必须和–nvidia_gpu_devices数量一致,如果不一致启动agent时候会报错。在此特别提醒。
一旦在如上的flags启动agent.gpu 资源会当做传统资源被送到mesos master.然而master 只会向有gpu frameworks(GPU_RESOURCES framework capability)提供gpu计算资源。
这一个选择保证尽量避免了gpu的机器消耗非gpu的资源(这种情况在每一个计算单元都分布gpu时候是没有多少影响,但是mixed系统它会成为一个大麻烦)。
我们提供了一种设置capability的c++版本,代码如下:
FrameworkInfo framework;
framework.add_capabilities()->set_type(
FrameworkInfo::Capability::GPU_RESOURCES);
GpuScheduler scheduler;
driver = new MesosSchedulerDriver(
&scheduler,
framework,
127.0.0.1:5050);
driver->run();
下面我们将介绍在gpu集群执行task的方法。第一个是没有docker环境的,第二个是有docker环境的。(环境不同,功能相同)。
注意:两个例子都在假设你已经安装英伟达gpu在mesos的所有依赖的情况下进行的。关于依赖请关注最下面external-dependencies的内容。
下面的命令行展示了最基本的在含有gpu的mesos集群上(localhost)run task的情况。agent flags已经如上设置,并且在GPU_RESOURCES framework capability设置的情况下,我们接下来执行此命令使用gpu资源。
$ mesos-master \
--ip=127.0.0.1 \
--work_dir=/var/lib/mesos
$ mesos-agent \
--master=127.0.0.1:5050 \
--work_dir=/var/lib/mesos \
--isolation="cgroups/devices,gpu/nvidia"
$ mesos-execute \
--master=127.0.0.1:5050 \
--name=gpu-test \
--command="nvidia-smi" \
--framework_capabilities="GPU_RESOURCES" \
--resources="gpus:1"
如果一切没有问题的话,您可以看到如下的stdout输出:
下面的命令行展示了最基本的在含有gpu的mesos 集群上(localhost)run task的情况。agent flags已经如上设置,并且在GPU_RESOURCES framework capability设置的情况下,另外,这里需要设置docker containers 的flag。
$ mesos-master \
--ip=127.0.0.1 \
--work_dir=/var/lib/mesos
$ mesos-agent \
--master=127.0.0.1:5050 \
--work_dir=/var/lib/mesos \
--image_providers=docker \
--executor_environment_variables="{}" \
--isolation="docker/runtime,filesystem/linux,cgroups/devices,gpu/nvidia"
$ mesos-execute \
--master=127.0.0.1:5050 \
--name=gpu-test \
--docker_image=nvidia/cuda \
--command="nvidia-smi" \
--framework_capabilities="GPU_RESOURCES" \
--resources="gpus:1"
任何运行的Mesos必须有合法的英伟达驱动程序。并且强烈建议安装对应的英伟达库(Nvidia CUDA toolkit).许多jobs依赖cuda。没有这个东西在运行job时候会出现问题或者出现很大限制。
英伟达的驱动可以在以下的链接下载,下载前请确定与您机器匹配的gpu,os和您准备要安装的cuda toolkits.
http://www.nvidia.com/Download/index.aspx
不过很多linux因为预先安装了Nouveau(open source video driver)会与您即将安装的英伟达驱动发生冲突,下面的链接可以帮助您卸载Nouveau。
http://www.dedoimedo.com/computers/centos-7-nvidia.html
http://www.allaboutlinux.eu/remove-nouveau-and-install-nvidia-driver-in-ubuntu-15-04/
安装好英伟达驱动之后您可以按照下面的方法安装cuda-toolkits
http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/
另外的,基于上面的链接,我们强烈推荐将CUDA’s lib加入ldcache以便于mesos task链接的准确性。具体操作命令如下:
sudo bash -c "cat > /etc/ld.so.conf.d/cuda-lib64.conf << EOF
/usr/local/cuda/lib64
EOF"
sudo ldconfig
特别的,如果你没有将CUDAs lib进行ldcache.你必须配置LD_LIBRARY_PATH.这个不是推荐方式,可能出现warning.
一旦我们安装了英伟达的驱动,您可以运行nvidia-smi工具.查看gpu情况.
nvidia-smi
结果如图:
另外,您还可以根据以下的链接进一步查看安装情况(推荐使用):
http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/#install-samples
最后,您最好运行以下mesos在英伟达gpu下面的单元测试确保他们都能通过。
我们现有的单元测试如下:
DockerTest.ROOT_DOCKER_NVIDIA_GPU_DeviceAllow
DockerTest.ROOT_DOCKER_NVIDIA_GPU_InspectDevices
NvidiaGpuTest.ROOT_CGROUPS_NVIDIA_GPU_VerifyDeviceAccess
NvidiaGpuTest.ROOT_INTERNET_CURL_CGROUPS_NVIDIA_GPU_NvidiaDockerImage
NvidiaGpuTest.ROOT_CGROUPS_NVIDIA_GPU_FractionalResources
NvidiaGpuTest.NVIDIA_GPU_Discovery
NvidiaGpuTest.ROOT_CGROUPS_NVIDIA_GPU_FlagValidation
NvidiaGpuTest.NVIDIA_GPU_Allocator
NvidiaGpuTest.ROOT_NVIDIA_GPU_VolumeCreation
NvidiaGpuTest.ROOT_NVIDIA_GPU_VolumeShouldInject)
大写后面的’.’的字母标志运行单元测试时候指定过滤器.在这里指定的过滤器包括ROOT, CGROUPS, NVIDIA_GPU.这标志着必须在gpu的root用户并且有CGROUPS权限下才能执行。这一些测试目的是确保英伟达gpu的存在以及可用。
如果这些都符合的话,您可以用以下命令取执行单元测试:
[mesos]$ GTEST_FILTER="" make -j check
[mesos]$ sudo bin/mesos-tests.sh --gtest_filter="*NVIDIA_GPU*"