本文共 4637 字,大约阅读时间需要 15 分钟。
在深度学习中,要使用大量GPU进行计算。 而GPU往往价格不菲,随着模型变得越复杂,数据量积累,进行深度学习计算需要耗费极大的经济和时间成本。
阿里云容器服务提供的深度学习解决方案,基于Kubernetes为核心,支持cluster-autoscaler 进行节点弹性扩缩容。除了CPU,Memory 等基础指标外,还可以以GPU资源维度进行节点弹性扩缩容。
在深度学习常场景里,我们可以实现以下目标:需要您已创建好容器服务 Kubernetes集群。 您可以选择经典版Kubernetes 或者 托管版的Kubernetes集群。
由于需要运行系统组件容器,节点中至少有一个Worker节点。自动伸缩
配置
进入配置页面, 有两个配置需要注意:
点击提交按钮后,进入伸缩规则配置的页面。 接下来我们配置GPU的伸缩规则,我们选择期望的可用区和实例规格。
当集群已有的GPU数量不能够满足Pod需求时,集群内的AutoScaler组件能够监听感知到,并根据配置的规格计算需要出需要扩容的节点数量,并调用ESS触发伸缩。 为您分配出相应的ECS并加入Kubernetes集群中。
接下来您可以提交一个深度学习任务,声明使用2个GPU,验证我们的GPU弹性伸缩。我们推荐通过 提交深度学习的任务,可以根据文档()在笔记本上进行安装配置。arena top node
查看集群中的节点,以及GPU信息。 在当前的集群中,没有GPU节点和可用的GPU设备。# arena top nodeNAME IPADDRESS ROLE GPU(Total) GPU(Allocated)cn-beijing.i-2zec8yxlrlzfyvxxxxxx 192.168.1.1150 0-----------------------------------------------------------------------------------------Allocated/Total GPUs In Cluster:0/0 (0%)
arena submit mpi --name=mpi-dist \ --gpus=1 \ --workers=2 \ --image=uber/horovod:0.13.11-tf1.10.0-torch0.4.0-py3.5 \ --env=GIT_SYNC_BRANCH=cnn_tf_v1.9_compatible \ --syncMode=git \ --syncSource=https://github.com/tensorflow/benchmarks.git \ "mpirun python code/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model resnet101 --batch_size 64 --variable_update horovod --train_dir=/training_logs --summary_verbosity=3 --save_summaries_steps=10"
arena get <job name>
查看任务信息,由于没有支持GPU的的节点,任务是Pending状态# arena get mpi-distSTATUS: PENDINGNAMESPACE: defaultTRAINING DURATION: 6mNAME STATUS TRAINER AGE INSTANCE NODEmpi-dist PENDING MPIJOB 6m mpi-dist-worker-0 N/Ampi-dist PENDING MPIJOB 6m mpi-dist-worker-1 N/A
arena top node
查看节点,可以看到集群已完成扩容,新增了两个GPU节点,并全部被分配使用# arena top nodeNAME IPADDRESS ROLE GPU(Total) GPU(Allocated)cn-beijing.i-2ze8eum1gl34xxxxxxxx 192.168.3.1461 1cn-beijing.i-2ze8eum1gl34xxxxxxxx 192.168.3.145 1 1cn-beijing.i-2zec8yxlrlzfxxxxxxxx 192.168.1.115 0 0-----------------------------------------------------------------------------------------Allocated/Total GPUs In Cluster:2/2 (100%)
arena get <job name>
查看任务,可以发现任务已经开始运行了# arena get mpi-distSTATUS: RUNNINGNAMESPACE: defaultTRAINING DURATION: 10mNAME STATUS TRAINER AGE INSTANCE NODEmpi-dist RUNNING MPIJOB 10m mpi-dist-launcher-lpfvg 192.168.3.145mpi-dist RUNNING MPIJOB 10m mpi-dist-worker-0 192.168.3.145mpi-dist RUNNING MPIJOB 10m mpi-dist-worker-1 192.168.3.146
缩容触发时延
)后, 训练任务完成,节点也会被及时释放。# arena get mpi-distSTATUS: SUCCEEDEDNAMESPACE: defaultTRAINING DURATION: 12mNAME STATUS TRAINER AGE INSTANCE NODEmpi-dist SUCCEEDED MPIJOB 13m mpi-dist-launcher-lpfvg N/A
arena top nodeNAME IPADDRESS ROLE GPU(Total) GPU(Allocated)cn-beijing.i-2zec8yxlrlzfyvxxxxxx 192.168.1.1150 0-----------------------------------------------------------------------------------------Allocated/Total GPUs In Cluster:0/0 (0%)
此时由于训练任务完成, 且没有其他GPU任务占用节点上的GPU,刚刚通过自动伸缩扩容出来的GPU节点出现空闲,如果空闲时间超过 缩容时延
后没有新的任务占用GPU,节点会被自动释放。
竞价实例(Spot Instance) 也叫抢占式实例,是一种按需实例,旨在降低部分场景下使用ECS的成本。
创建竞价实例时,必须为指定的实例规格设置一个价格上限(一般可设置为按量实例原价),当指定的实例规格的当前市场价格低于出价时,就能成功创建竞价实例,并按当前市场价格计费。创建成功后,默认能稳定持有实例一小时。之后,当市场价格高于出价,或者资源供需关系变化(库存不足)时,实例会被自动释放。由于竞价实例的低价性,合理的使用阿里云ECS竞价实例,最高可以降低50% – 90% 的运营成本(相比按量付费的实例)。由于市面上可用的规格经常受到库存影响,可以将伸缩配置设置为多个可用区和多个规格,提高实例的创建成功率。 配置竞价实例的方法如下:这样我们通过弹性伸缩扩容集群时,弹出的是抢占实例,当前市场价格较低时,抢占实例相比按量付费实例可以极大降低成本。
需要注意 抢占实例拥有一小时保护期,即在创建后一个小时的保护期内,ECS不会释放您的实例,但是超过一小时的保护周期后,ECS每5分钟检测一次实例规格当前市场价格和库存,如果某一时刻的市场价格高于您的出价或资源库存不足,您的抢占式实例会被释放。
所以当配置抢占实例进行深度学习,有两种场景更合适:转载地址:http://dwtjl.baihongyu.com/