阿里云GPU云服务器机器学习
网站编辑2020-11-11 10:07:33883
典名科技本文介绍阿里云服务器GPU云服务器机器学习,如何在GPU实例上安装和使用cGPU服务,FastGPU构建一键训练任务,希望对您有所帮助。
使用cGPU服务隔离GPU资源
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。
背景信息 为了提高GPU硬件资源的利用率,需要在单张显卡上运行多个容器,并在多个容器间隔离GPU应用。
阿里云cGPU服务通过自研的内核驱动为容器提供虚拟的GPU设备,在保证性能的前提下隔离显存和算力,为充分利用GPU硬件资源进行训练和推理提供有效保障。您可以通过命令方便地配置容器内的虚拟GPU设备。
使用cGPU服务具有以下优势:
适配开源标准的Kubernetes和NVIDIA Docker方案。
无需重编译AI应用,无需替换CUDA库,升级CUDA、cuDNN的版本后无需重新配置。
支持同时隔离显存和算力。
安装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节点的用途。
| 命令 | 效果 |
|---|---|
| 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服务会从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 ® Telsa ® T4显卡,将m:n设置为8:4, 尽量增大权重值,保证分配足够的GPU算力。
FastGPU是一套阿里云推出的人工智能计算任务构建工具,提供便捷的接口和命令行,供您在阿里云IaaS资源上构建人工智能计算任务。本文以Ubuntu 18.04 64位为例介绍如何安装和使用FastGPU,并列出了FastGPU支持的运行时接口和命令行。
前提条件 客户端已安装Python 3.6或以上版本。
备注 您的ECS实例和本地机器、阿里云Cloud Shell工具等均可以作为客户端安装FastGPU来构建人工智能计算任务。
背景信息 FastGPU作为衔接您的线下人工智能算法和线上阿里云海量GPU计算资源的关键一环,方便您将人工智能计算任务构建在阿里云的IaaS资源上。使用FastGPU构建人工智能计算任务时,您无需关心IaaS层的计算、存储、网络等资源部署操作,达到简单适配、一键部署、随处运行的效果。
FastGPU提供以下两套组件:
运行时组件ncluster:提供便捷的接口将线下的人工智能训练和推理脚本快速部署在阿里云的IaaS资源上,更多运行时组件使用说明请参见运行时说明。
命令行组件ecluster:提供便捷的命令行工具,用于管理阿里云上人工智能计算任务的运行状态和集群的生命周期,更多命令行组件使用说明请参见命令行说明。
FastGPU的组成模块如下图所示。

安装FastGPU
运行FastGPU demo
本步骤以在Cloud Shell中运行BERT finetune任务为例,展示如何使用FastGPU。demo中自动创建的实例规格为ecs.gn6v-c10g1.20xlarge(8卡V100机型),任务部署时间约2.5分钟,训练时长约11.5分钟,总共耗时约14分钟,训练精度达到0.88以上。
运行时说明
- 获取阿里云账号AccessKey、默认地域、默认可用区等信息。
export ALIYUN_ACCESS_KEY_ID=L**** # Your actual aliyun access key id export ALIYUN_ACCESS_KEY_SECRET=v**** # Your actual aliyun access key secret export ALIYUN_DEFAULT_REGION=cn-hangzhou # The actual region the resource you want to use export ALIYUN_DEFAULT_ZONE=cn-hangzhou-i # The actual zone of the region you want to use - ncluster是一套Python库,使用时需要在Python脚本中导入ncluster。
import ncluster - 创建任务所需的资源或者复用已经存在的资源。
job = ncluster.make_job(name=args.name, run_name=f"{args.name}-{args.machines}", num_tasks=args.machines, image_name=IMAGE_NAME, instance_type=INSTANCE_TYPE)ncluster.make_job的参数如下表所示。参数名称 参数说明 参数示例 name job的名称。 'perseus-bert' run_name 运行时的环境名,一般设置为job名+实例数量。 f"perseus-bert-1" num_tasks 需要创建实例的个数。 1 表示创建1台实例,名称为task0.perseus-bert,对应perseus-bert.tasks[0]。
image_name 实例使用的镜像,支持公共镜像和自定义镜像。 'ubuntu_18_04_64_20G_alibase_20190624.vhd' instance_type 需要创建实例的实例规格。 'ecs.gn6v-c10g1.20xlarge' - 运行任务。支持以job或task的形式运行任务,job为一组task。说明 job和task支持相同的API,调用job的API作用于所有的task,调用task的API只作用于指定的task。示例如下:
- 调用job的API
# 为job中所有实例打开perseus-bert文件夹 job.run('cd perseus-bert') # 将当前目录中的perseus-bert文件夹上传到job中所有实例的/root目录下 job.upload('perseus-bert') - 调用task的API
# 为task0对应实例打开perseus-bert文件夹 job.tasks[0].run('cd perseus-bert') # 将当前目录中的perseus-bert文件夹上传到task0对应实例的/root目录下 job.tasks[0].upload('perseus-bert')
- 调用job的API
命令行说明
| 命令 | 命令说明 | 命令示例 |
|---|---|---|
| export | 获取阿里云账号的信息,在本地机器使用FastGPU时需要获取AccessKey、默认地域、默认可用区等信息。 |
|
| ecluster [help,-h,--help] | 查看所有ecluster命令。 | ecluster --help |
| ecluster {command} --help | 查看指定的ecluser命令。 | ecluster ls --help |
| ecluster create --config create.cfg | 基于配置文件创建实例。create.cfg文件定义实例的配置环境,运行命令前您需要先创建create.cfg文件,具体内容请参见表格下方的示例。 | ecluster create --config create.cfg |
| ecluster create --name {instance_name} --machines {instance_num} ... | 基于参数创建实例。 | ecluster create --name task0.ncluster-v100 --machines 1 |
| ecluster ls | 列出已自动创建的实例。包括以下信息:
| ecluster ls |
| ecluster ssh {instance_name} | 登录指定的实例。 | ecluster ssh task0.ncluster-v100 |
| ecluster tmux {instance_name} | 连接到运行中的任务,如果没有tmux会话,则使用ssh连接。 | ecluster tmux task0.ncluster-v100 |
| ecluster stop {instance_name} | 停止指定的实例。 |
|
| ecluster start {instance_name} | 启动指定的实例。 |
|
| ecluster kill {instance_name} | 释放指定的实例。 |
|
| ecluster mount {instance_name} | 为指定的实例挂载NAS文件系统到/ncluster目录。 | ecluster mount task0.ncluster-v100 |
| ecluster scp {source} {destination} | 安全拷贝文件或目录。 | ecluster scp /local/path/to/upload task0.ncluster-v100:/remote/path/to/save |
| ecluster addip {instance_name} | 将指定任务中实例的固定公网IP添加到安全组。 | ecluster addip task0.ncluster-v100 |
| ecluster rename {old_name} {new_name} | 重命名指定实例。 | ecluster rename task0.ncluster-v100 task1.ncluster-v100 |
; config.ini
[ncluster]
; The job name for current creation job.
name=ncluster-v100
; The number of machine you want to create
machines=1
; The system disk size for instances in GB
system_disk_size=300
; The data disk size for instances in GB
data_disk_size=0
; The system image name you want to installed in the instances.
image_name=ubuntu_18_04_64_20G_alibase_20190624.vhd
; The instance type you want to create at Alibaba Cloud.
instance_type=ecs.gn6v-c10g1.20xlarge
; The spot instance option; If you want to buy spot instance, please set it to True.
spot=False
; If only used to create instances, it can set to True.
confirm_cost=False
; Confirm the next operation will cost money, if set to True will default confirmed.
skip_setup=True
; Nas create/mount options; Set True will disable nas mount for current job.
disable_nas=True
; The zone id info. The option provided to use resource in the zone.
zone_id=cn-hangzhou-i
; Specify the vpc name
vpc_name=ncluster-vpc
[cmd]
install_script=pwd











