cGPU服务可以隔离GPU资源,实现多个容器共用一张显卡。本章节介绍如何在GPU实例上安装和使用cGPU服务。
前提条件
安装cGPU服务前,请完成以下准备工作:
- 提交工单获取cGPU安装包下载链接。
- 确保GPU实例满足以下要求:
- GPU实例规格为gn6i、gn6v、gn6e、gn5i、gn5、ebmgn6i或ebmgn6e。
- GPU实例操作系统为CentOS 7.6、CentOS 7.7、Ubuntu 16.04、Ubuntu 18.04或Aliyun Linux。
- GPU实例已安装418.87.01或更高版本的NVIDIA驱动。
- GPU实例已安装19.03.5或更高版本的Docker。
安装cGPU服务
运行cGPU服务
影响cGPU服务的环境变量如下表所示,您可以在创建容器时指定环境变量的值,控制容器可以通过cGPU服务获得的算力。
环境变量名称 | 取值类型 | 说明 | 示例 |
---|---|---|---|
CGPU_DISABLE | Boolean | 是否启用cGPU服务,取值范围:
|
无 |
ALIYUN_COM_GPU_MEM_DEV | Integer | 设置GPU实例上每张显卡的总显存大小,和实例规格有关。
说明 显存大小按GiB取整数。
|
一台GPU实例规格为ecs.gn6i-c4g1.xlarge,配备1张NVIDIA ® Tesla ® T4显卡。在GPU实例上执行nvidia-smi查看总显存大小为15109 MiB,取整数为15 GiB。 |
ALIYUN_COM_GPU_MEM_CONTAINER | Integer | 设置容器内可见的显存大小,和ALIYUN_COM_GPU_MEM_DEV结合使用。如果不指定本参数或指定为0,则不使用cGPU服务,使用默认的NVIDIA容器服务。 | 在一张总显存大小为15 GiB的显卡上,设置环境变量ALIYUN_COM_GPU_MEM_DEV=15 和ALIYUN_COM_GPU_MEM_CONTAINER=1 ,效果是为容器分配1 GiB的显存。 |
ALIYUN_COM_GPU_VISIBLE_DEVICES | Integer或uuid | 指定容器内可见的GPU显卡。 | 在一台有4张显卡的GPU实例上,执行nvidia-smi -L查看GPU显卡设备号和UUID。返回示例如下所示:
然后,设置以下环境变量:
|
ALIYUN_COM_GPU_SCHD_WEIGHT | Integer | 设置容器的算力权重,取值范围:1~min(max_inst, 16)。 | 无 |
以ecs.gn6i-c4g1.xlarge为例演示2个容器共用1张显卡。
查看procfs节点
cGPU服务运行时会在/proc/cgpu_km下生成并自动管理多个procfs节点,您可以通过procfs节点查看和配置cGPU服务相关的信息。下面介绍各procfs节点的用途。
了解procfs节点的用途后,您可以在GPU实例中执行命令进行切换调度策略、修改权重等操作,示例命令如下表所示。
命令 | 效果 |
---|---|
echo 2 > /proc/cgpu_km/0/policy | 将调度策略切换为权重抢占调度。 |
cat /proc/cgpu_km/0/free_weight | 查看显卡上可用的权重。 如果free_weight=0 ,新创建容器的权重值为0,该容器不能获取GPU算力,不能用于运行需要GPU算力的应用。 |
cat /proc/cgpu_km/0/$dockerid/weight | 查看指定容器的权重。 |
echo 4 > /proc/cgpu_km/0/$dockerid/weight | 修改容器获取GPU算力的权重。 |
升级cGPU服务
卸载cGPU服务
cGPU服务算力调度示例
cGPU服务加载cgpu_km的模块时,会按照容器最大数量(max_inst)为每张显卡设置时间片(X ms),用于为容器分配GPU算力,本示例中以Slice 1、Slice 2…Slice N表示。使用不同调度策略时的调度示例如下所示。
- 平均调度
在创建容器时,为容器分配时间片。cGPU服务会从Slice 1时间片开始调度,提交任务到物理GPU,并执行一个时间片(X ms)的时间,然后切换到下一个时间片。每个容器获得的算力相同,都为
1/max_inst
。如下图所示。
- 抢占调度
在创建容器时,为容器分配时间片。cGPU服务会从Slice 1开始调度,但如果没有使用某个容器,或者容器内没有进程打开GPU设备,则跳过调度,切换到下一个时间片。
示例如下:- 只创建一个容器Docker 1,获得Slice 1时间片,在Docker 1中运行2个TensorFlow进程,此时Docker 1最大获得整个物理GPU的算力。
- 再创建一个容器Docker 2,获得Slice 2时间片。如果Docker 2内没有进程打开GPU设备,调度时会跳过Docker 2的时间片Slice 2。
- 当Docker 2内有进程打开GPU设备时,Slice 1和Slice 2都加入调度,Docker 1和Docker 2最大分别获得1/2物理GPU的算力。如下图所示。
- 权重抢占调度
如果在创建容器时设置ALIYUN_COM_GPU_SCHD_WEIGHT大于1,则自动使用权重抢占调度。cGPU服务按照容器数量(max_inst)将物理GPU算力划分成max_inst份,但如果ALIYUN_COM_GPU_SCHD_WEIGHT大于1,cGPU服务会将数个时间片组合成一个更大的时间片分配给容器。
设置示例如下:- Docker 1:ALIYUN_COM_GPU_SCHD_WEIGHT=m
- Docker 2:ALIYUN_COM_GPU_SCHD_WEIGHT=n
调度效果如下:- 如果只有Docker 1运行, Docker 1抢占整个物理GPU的算力。
- 如果Docker 1和Docker 2同时运行,Docker 1和Docker 2获得的理论算力比例是m:n。和抢占调度不同的是,即使Docker 2中没有GPU进程也会占用n个时间片的时间。
说明 m:n设置为2:1和8:4时的运行表现存在差别。在1秒内切换时间片的次数,前者是后者的4倍。
权重抢占调度限制了容器使用GPU算力的理论最大值。但对算力很强的显卡(例如NVIDIA
® V100显卡),如果显存使用的较少,在一个时间片内即可完成计算任务。此时如果m:n值设置为8:4,则剩余时间片内GPU算力会闲置,限制基本失效。因此建议根据显卡算力设置适当的权重值,例如:- 如果使用NVIDIA ® V100显卡,将m:n设置为2:1,尽量降低权重值,避免GPU算力闲置。
- 如果使用NVIDIA ® Tesla ® T4显卡,将m:n设置为8:4, 尽量增大权重值,保证分配足够的GPU算力。