本文以一個具體的示例為您介紹eGPU優化套件的主要接口功能。
背景信息
所有開關和配置都通過在容器啟動時指定環境變量的方式指定,下文為一個具體的示例,將啟動一個使能eGPU并控制顯存為2G算力50%的容器:
sudo docker run \
--runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=all \
-e AMP_VGPU_ENABLE=1 \
-e GPU_MEM_PER_DEVICE=2000000000 \
-e GPU_UTIL_PER_DEVICE=50 \
-e NVIDIA_VISIBLE_DEVICES=1 \
-e AMP_USE_HOST_DAEMON=1 \
image_name
使能eGPU
指定AMP_VGPU_ENABLE=1來使能eGPU。這是一個總開關,如果不指定,eGPU不會對啟動容器做任何修改,將用默認的方式啟動容器。
AMP_USE_HOST_DAEMON=1是一個環境變量配置參數,不需要修改,啟動容器時攜帶即可。
指定顯卡
目前eGPU功能支持單容器多卡場景。可以使用NVIDIA_VISIBLE_DEVICES來指定容器可用顯卡的UUID,例如:
NVIDIA_VISIBLE_DEVICES=GPU-28df2127-fac9-f8fd-77de-e461c85c8ef2,GPU-7bda088d-4609-6f9d-8ada-6bcba97e664a
也可以通過GPU Index來指定,例如:
NVIDIA_VISIBLE_DEVICES=3,5
也可將UUID和GPU Index混用。
使用數值分配顯存大小
可使用環境變量GPU_MEM_PER_DEVICE(單位為Byte)來指定容器內可用顯存大小。用戶最終可查詢和使用的顯存量為:
Available_Memory = GPU_MEM_PER_DEVICE - ALIYUN_COM_GPU_MEM_RESERVED
需要ALIYUN_COM_GPU_MEM_RESERVED是因為eGPU功能需要保留一小部分顯存來保證功能的正確性,需要從分配給容器的顯存里減去。ALIYUN_COM_GPU_MEM_RESERVED配置時單位為MB,目前默認為10MB。
啟動容器
如下面的例子,將啟動一個可用顯存大小約為5G的容器:
sudo docker run \
--runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=all \
-e AMP_VGPU_ENABLE=1 \
-e GPU_MEM_PER_DEVICE=5000000000 \
-e NVIDIA_VISIBLE_DEVICES=0 \
-e AMP_USE_HOST_DAEMON=1 \
image_name
按比例分配顯存大小
按比例分配顯存大小通過兩個環境變量設置。
ALIYUN_COM_GPU_MEM_DEV為正整數,表示為host上卡的每張卡的顯存大小。
ALIYUN_COM_GPU_MEM_CONTAINER為正整數,表示容器可用顯存大小。
eGPU會自動獲得host上卡的總顯存實際大小,設為GPU_Memory(單位為Byte)。計算用戶可用顯存大小的公式為(精確到Byte):
Available_Memory = GPU_Memory * ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV- ALIYUN_COM_GPU_MEM_RESERVED
僅配置ALIYUN_COM_GPU_MEM_CONTAINER時:ALIYUN_COM_GPU_MEM_DEV程序會自動獲取,并round up到GB為單位的整數。此時ALIYUN_COM_GPU_MEM_CONTAINER應配置為整數,單位為GB。
配置ALIYUN_COM_GPU_MEM_DEV和ALIYUN_COM_GPU_MEM_CONTAINER:此時 ALIYUN_COM_GPU_MEM_DEV和ALIYUN_COM_GPU_MEM_CONTAINER不做單位限制,可以通過控制它們的絕對數值大小來控制分配粒度。
實際以GB為比例單位應用配置時,看到的顯存可能不足ALIYUN_COM_GPU_MEM_DEV*1024*1024*1024 Byte。這是因為Nvidia標稱的顯存量也并不是足量的,比如16GB V100的卡,顯存一般為16160MB,約等于15.78GB,這里會等比例減少。
啟動一個可用顯存大小約為5G的容器
需要ALIYUN_COM_GPU_MEM_RESERVED是因為eGPU功能需要保留一小部分顯存來保證功能的正確性,需要從分配給容器的顯存里減去。ALIYUN_COM_GPU_MEM_RESERVED配置時單位為MB,目前默認為10MB。
如下面的例子,在16GB GPU卡上啟動一個可用顯存大小約為5GB的容器:
sudo docker run \
--runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=all \
-e AMP_VGPU_ENABLE=1 \
-e ALIYUN_COM_GPU_MEM_CONTAINER=5 \
-e ALIYUN_COM_GPU_MEM_DEV=16 \
-e NVIDIA_VISIBLE_DEVICES=0 \
-e AMP_USE_HOST_DAEMON=1 \
image_name
GPU Out Of Memory
當容器使用的顯存超過被分配的顯存(Container_Memory)被檢測到時,會提示OOM錯誤,用戶進程會被強制結束執行。如果ALIYUN_COM_GPU_OOM_SCRIPT被配置,則用戶進程會主動調用該環境變量指定的腳本或程序實現通知,然后結束執行。
算力控制
通過環境變量GPU_UTIL_PER_DEVICE來配置容器可用算力,取值為百分比。如果不設置該環境變量,或設置值為0或大于95,則算力控制功能不再使能。
如下面的例子,啟動一個算力控制為整卡三分之一能力的容器:
sudo docker run \
--runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=all \
-e AMP_VGPU_ENABLE=1 \
-e GPU_UTIL_PER_DEVICE=33 \
-e NVIDIA_VISIBLE_DEVICES=0 \
-e AMP_USE_HOST_DAEMON=1 \
image_name