本文以一个具体的示例为您介绍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