在 resource-types.xml
中
新增以下屬性
<configuration> <property> <name>yarn.resource-types</name> <value>yarn.io/gpu</value> </property> </configuration>
在 yarn-site.xml
中
DominantResourceCalculator
必須設定為啟用 GPU 排程/隔離。
對於 Capacity Scheduler
,請使用以下屬性來設定 DominantResourceCalculator
(在 capacity-scheduler.xml
中)
屬性 | 預設值 |
---|---|
yarn.scheduler.capacity.resource-calculator | org.apache.hadoop.yarn.util.resource.DominantResourceCalculator |
yarn-site.xml
中<property> <name>yarn.nodemanager.resource-plugins</name> <value>yarn.io/gpu</value> </property>
這是為了在 NodeManager 端啟用 GPU 隔離模組。
預設情況下,當上述設定完成時,YARN 會自動偵測並設定 GPU。只有在管理員有特殊需求時,才需要在 yarn-site.xml
中設定下列設定。
1) 允許的 GPU 裝置
屬性 | 預設值 |
---|---|
yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices | auto |
指定 YARN NodeManager 可以管理的 GPU 裝置(以逗號分隔)。GPU 裝置數量會回報給 RM 以進行排程決策。設為 auto(預設值)讓 YARN 自動從系統中偵測 GPU 資源。
如果自動偵測 GPU 裝置失敗,或管理員只想讓 YARN 管理部分 GPU 裝置,請手動指定 GPU 裝置。GPU 裝置由其次要裝置編號和索引識別。取得 GPU 次要裝置編號的常見方法是使用 nvidia-smi -q
並搜尋 次要編號
輸出。
當手動指定次要編號時,管理員也需要包含 GPU 的索引,格式為 index:minor_number[,index:minor_number...]
。手動指定的範例為 0:0,1:1,2:2,3:4"
,允許 YARN NodeManager 管理索引為 0/1/2/3
,次要編號為 0/1/2/4
的 GPU 裝置。
2) 偵測 GPU 的可執行檔
屬性 | 值 |
---|---|
yarn.nodemanager.resource-plugins.gpu.path-to-discovery-executables | /absolute/path/to/nvidia-smi |
當指定 yarn.nodemanager.resource.gpu.allowed-gpu-devices=auto
時,YARN NodeManager 需要執行 GPU 偵測二進位檔(目前只支援 nvidia-smi
)以取得與 GPU 相關的資訊。當值為空(預設值)時,YARN NodeManager 會嘗試自行尋找偵測可執行檔。設定值的範例為:/usr/local/bin/nvidia-smi
3) Docker 外掛程式相關設定
當使用者需要在 Docker 容器中執行 GPU 應用程式時,可以自訂下列設定。如果管理員遵循 nvidia-docker
的預設安裝/設定,則不需要這些設定。
屬性 | 預設值 |
---|---|
yarn.nodemanager.resource-plugins.gpu.docker-plugin | nvidia-docker-v1 |
指定 GPU 的 docker 命令外掛程式。預設使用 Nvidia docker V1.0,nvidia-docker-v2
可用於 V2.x。
屬性 | 預設值 |
---|---|
yarn.nodemanager.resource-plugins.gpu.docker-plugin.nvidia-docker-v1.endpoint | https://127.0.0.1:3476/v1.0/docker/cli |
指定 nvidia-docker-plugin
的終端點。請參閱文件:https://github.com/NVIDIA/nvidia-docker/wiki 了解更多詳情。
4) CGroups 掛載
GPU 隔離使用 CGroup devices 控制器 來執行每個 GPU 裝置隔離。應將下列組態新增至 yarn-site.xml
以自動掛載 CGroup 子裝置,否則管理員必須手動建立裝置子資料夾才能使用此功能。
屬性 | 預設值 |
---|---|
yarn.nodemanager.linux-container-executor.cgroups.mount | true |
container-executor.cfg
一般而言,下列組態需要新增至 container-executor.cfg
[gpu] module.enabled=true
當使用者需要在非 Docker 環境下執行 GPU 應用程式時
[cgroups] # This should be same as yarn.nodemanager.linux-container-executor.cgroups.mount-path inside yarn-site.xml root=/sys/fs/cgroup # This should be same as yarn.nodemanager.linux-container-executor.cgroups.hierarchy inside yarn-site.xml yarn-hierarchy=yarn
當使用者需要在 Docker 環境下執行 GPU 應用程式時
1) 將 GPU 相關裝置新增至 docker 區段
以逗號分隔的值,您可以透過執行 ls /dev/nvidia*
來取得此值
[docker] docker.allowed.devices=/dev/nvidiactl,/dev/nvidia-uvm,/dev/nvidia-uvm-tools,/dev/nvidia1,/dev/nvidia0
2) 將 nvidia-docker
新增至磁碟區驅動程式白名單。
[docker] ... docker.allowed.volume-drivers
3) 將 nvidia_driver_<version>
新增至唯讀掛載白名單。
[docker] ... docker.allowed.ro-mounts=nvidia_driver_375.66
4) 如果使用 nvidia-docker-v2
作為 gpu docker 外掛程式,請將 nvidia
新增至執行時期白名單。
[docker] ... docker.allowed.runtimes=nvidia
分散式 shell 目前支援指定記憶體和 vcore 以外的其他資源類型。
在不使用 docker 容器的情況下執行分散式 shell(要求 2 個工作,每個工作有 3GB 記憶體、1 個 vcore、2 個 GPU 裝置資源)
yarn jar <path/to/hadoop-yarn-applications-distributedshell.jar> \ -jar <path/to/hadoop-yarn-applications-distributedshell.jar> \ -shell_command /usr/local/nvidia/bin/nvidia-smi \ -container_resources memory-mb=3072,vcores=1,yarn.io/gpu=2 \ -num_containers 2
您應該可以看到類似這樣的輸出
Tue Dec 5 22:21:47 2017 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 375.66 Driver Version: 375.66 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla P100-PCIE... Off | 0000:04:00.0 Off | 0 | | N/A 30C P0 24W / 250W | 0MiB / 12193MiB | 0% Default | +-------------------------------+----------------------+----------------------+ | 1 Tesla P100-PCIE... Off | 0000:82:00.0 Off | 0 | | N/A 34C P0 25W / 250W | 0MiB / 12193MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
對於已啟動的容器工作。
您也可以使用 Docker 容器執行分散式 shell。必須指定 YARN_CONTAINER_RUNTIME_TYPE
/YARN_CONTAINER_RUNTIME_DOCKER_IMAGE
才能使用 docker 容器。
yarn jar <path/to/hadoop-yarn-applications-distributedshell.jar> \ -jar <path/to/hadoop-yarn-applications-distributedshell.jar> \ -shell_env YARN_CONTAINER_RUNTIME_TYPE=docker \ -shell_env YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=<docker-image-name> \ -shell_command nvidia-smi \ -container_resources memory-mb=3072,vcores=1,yarn.io/gpu=2 \ -num_containers 2