文档

eGPU接口使用示例

更新时间:

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

使用数值分配显存大小

image

可使用环境变量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

按比例分配显存大小

image

按比例分配显存大小通过两个环境变量设置。

  • 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卡上启动一个可用显存大小约为5G的容器:

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
  • 本页导读 (1)