天天看點

Mesos Nvidia GPU Support 翻譯

原文位址

https://github.com/apache/mesos/blob/master/docs/gpu-support.md

Mesos 在1.0.0 版本對英偉達公司的gpu進行了全面支援。

Overview

  在您了解幾個關鍵步驟的情況下,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的環境下各秀一個樣例。最後,我們總結了一個十分詳盡的文檔告訴大家如何在我們機器上安裝幾個必要的英偉達驅動。

 

  

Agent Flags

我們需要設定如下的isolation flags去讓gpu support on an agent. 

cgroups/devices 這個标志着讓 agent 在task launches時候限制通路(/dev)列舉下的資源。目前面的語句結合gpu/nvidia 這個flag的時候,之前cgroups/devices标志允許我們在pre-task階段對特定的gpu進行授權和撤銷。

在預設的情況下,所有在agent的gpu會當做日常資源被自動的索引并且送給Mesos master.然而,在有的時候,我們需要對這種資源做出限制(隻讓一部分gpu工作).在這中需求下,我們需要下面的語句去完成我們特定的要求:

--nvidia_gpu_devices="<list_of_gpu_ids>"
--resources="gpus:<num_gpus>"
           

在–nvidia_gpu_devices flag下,你需要用逗号(,)列舉gpu,你可以用nvidia-smi 指令檢視并且決定agent使用哪一些gpu.

下圖我們給nvidia-smi和flag樣例,這兩個執行狀況如下圖所示。

Mesos Nvidia GPU Support 翻譯

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時候會報錯。在此特别提醒。

Framework Capabilities

一旦在如上的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,
    :);

driver->run();
           

Minimal GPU Capable Cluster

下面我們将介紹在gpu叢集執行task的方法。第一個是沒有docker環境的,第二個是有docker環境的。(環境不同,功能相同)。

注意:兩個例子都在假設你已經安裝英偉達gpu在mesos的所有依賴的情況下進行的。關于依賴請關注最下面external-dependencies的内容。

Minimal Setup Without Support for Docker Containers

下面的指令行展示了最基本的在含有gpu的mesos叢集上(localhost)run task的情況。agent flags已經如上設定,并且在GPU_RESOURCES framework capability設定的情況下,我們接下來執行此指令使用gpu資源。

$ mesos-master \
      --ip=.. \
      --work_dir=/var/lib/mesos

$ mesos-agent \
      --master=..: \
      --work_dir=/var/lib/mesos \
      --isolation="cgroups/devices,gpu/nvidia"

$ mesos-execute \
      --master=..: \
      --name=gpu-test \
      --command="nvidia-smi" \
      --framework_capabilities="GPU_RESOURCES" \
      --resources="gpus:1"
           

如果一切沒有問題的話,您可以看到如下的stdout輸出:

Mesos Nvidia GPU Support 翻譯

Minimal Setup With Support for Docker Containers

下面的指令行展示了最基本的在含有gpu的mesos 叢集上(localhost)run task的情況。agent flags已經如上設定,并且在GPU_RESOURCES framework capability設定的情況下,另外,這裡需要設定docker containers 的flag。

$ mesos-master \
      --ip=.. \
      --work_dir=/var/lib/mesos

$ mesos-agent \
      --master=..: \
      --work_dir=/var/lib/mesos \
      --image_providers=docker \
      --executor_environment_variables="{}" \
      --isolation="docker/runtime,filesystem/linux,cgroups/devices,gpu/nvidia"

$ mesos-execute \
      --master=..: \
      --name=gpu-test \
      --docker_image=nvidia/cuda \
      --command="nvidia-smi" \
      --framework_capabilities="GPU_RESOURCES" \
      --resources="gpus:1"
           

如果一切ok,會出現下面的圖檔:

Mesos Nvidia GPU Support 翻譯

External Dependencies

任何運作的Mesos必須有合法的英偉達驅動程式。并且強烈建議安裝對應的英偉達庫(Nvidia CUDA toolkit).許多jobs依賴cuda。沒有這個東西在運作job時候會出現問題或者出現很大限制。

Installing the Required Tools

英偉達的驅動可以在以下的連結下載下傳,下載下傳前請确定與您機器比對的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.

Verifying the Installation

一旦我們安裝了英偉達的驅動,您可以運作nvidia-smi工具.檢視gpu情況.

結果如圖:

Mesos Nvidia GPU Support 翻譯

另外,您還可以根據以下的連結進一步檢視安裝情況(推薦使用):

http://docs.nvidia.com/cuda/cuda-getting-started-guide-for-linux/#install-samples

最後,您最好運作以下mesos在英偉達gpu下面的單元測試確定他們都能通過。

Running Mesos Unit Tests

我們現有的單元測試如下:

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*"
           

繼續閱讀