基于Kubernetes的云上机器学习—GPU弹性扩缩容-程序员宅基地

技术标签: python  git  人工智能  

前言

在深度学习中,要使用大量GPU进行计算。 而GPU往往价格不菲,随着模型变得越复杂,数据量积累,进行深度学习计算需要耗费极大的经济和时间成本。

解决方案

阿里云容器服务提供的深度学习解决方案,基于Kubernetes为核心,支持cluster-autoscaler 进行节点弹性扩缩容。除了CPU,Memory 等基础指标外,还可以以GPU资源维度进行节点弹性扩缩容。
在深度学习常场景里,我们可以实现以下目标:

  1. 当出现计算高峰,集群中存量的GPU计算资源不满足需求时, 自动按需求使用量弹出实例,加入到集群中。及时应对资源不足。
  2. 当计算任务完成,autoScaler 发现弹出的节点GPU资源闲置,我们能够及时回收闲置的GPU节点,节省成本。

如何使用

前提

需要您已创建好容器服务 Kubernetes集群。 您可以选择经典版Kubernetes 或者 托管版的Kubernetes集群。
由于需要运行系统组件容器,节点中至少有一个Worker节点。

配置GPU 自动伸缩规则
  1. 打开容器 容器服务控制台 。在集群列表中,选择您的集群,进入 自动伸缩  配置

    image.png

  1. 进入配置页面, 有两个配置需要注意:

    • 缩容触发时延: 当集群资源出现空闲,经过计算满足缩容条件后,延后一段时间后才释放资源。 
    • 静默时间:一次扩容动作完成后,静默一段时间后再进入下一个伸缩检测的周期。防止任务频繁创建删除,导致的节点频繁扩缩容。

    image.png

  点击提交按钮后,进入伸缩规则配置的页面。 接下来我们配置GPU的伸缩规则,我们选择期望的可用区和实例规格。
    image.png        

  1. 完成后,可以看到伸缩组。

    image.png
点击我们创建的伸缩规则,可以进入ESS查看ECS的伸缩规则。

验证GPU伸缩

当集群已有的GPU数量不能够满足Pod需求时,集群内的AutoScaler组件能够监听感知到,并根据配置的规格计算需要出需要扩容的节点数量,并调用ESS触发伸缩。 为您分配出相应的ECS并加入Kubernetes集群中。
接下来您可以提交一个深度学习任务,声明使用2个GPU,验证我们的GPU弹性伸缩。
我们推荐通过 Arena 提交深度学习的任务,可以根据文档(https://github.com/kubeflow/arena/blob/master/docs/installation_cn/README.md)在笔记本上进行安装配置。

  1. 在提交任务前,通过 arena top node 查看集群中的节点,以及GPU信息。 在当前的集群中,没有GPU节点和可用的GPU设备。
# arena top node
NAME                               IPADDRESS      ROLE    GPU(Total)  GPU(Allocated)
cn-beijing.i-2zec8yxlrlzfyvxxxxxx  192.168.1.115  <none>  0           0
-----------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/0 (0%)
  1. 提交一个分布式MPI的任务,任务指定了2个Worker,每个Worker需要1个GPU。那么我们的集群需要2个GPU
 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"
  1. 通过 arena get <job name>  查看任务信息,由于没有支持GPU的的节点,任务是Pending状态
# arena get mpi-dist
STATUS: PENDING
NAMESPACE: default
TRAINING DURATION: 6m

NAME      STATUS   TRAINER  AGE  INSTANCE           NODE
mpi-dist  PENDING  MPIJOB   6m   mpi-dist-worker-0  N/A
mpi-dist  PENDING  MPIJOB   6m   mpi-dist-worker-1  N/A
  1. 等待不到1分钟,界面上我们可以看到伸缩规则中出现了2个实例,实例已完成扩容。

image.png

  1. 接着通过 arena top node  查看节点,可以看到集群已完成扩容,新增了两个GPU节点,并全部被分配使用
# arena top node
NAME                               IPADDRESS      ROLE    GPU(Total)  GPU(Allocated)
cn-beijing.i-2ze8eum1gl34xxxxxxxx  192.168.3.146  <none>  1           1
cn-beijing.i-2ze8eum1gl34xxxxxxxx  192.168.3.145  <none>  1           1
cn-beijing.i-2zec8yxlrlzfxxxxxxxx  192.168.1.115  <none>  0           0
-----------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
2/2 (100%)
  1. 通过 arena get <job name>   查看任务,可以发现任务已经开始运行了
# arena get mpi-dist
STATUS: RUNNING
NAMESPACE: default
TRAINING DURATION: 10m

NAME      STATUS   TRAINER  AGE  INSTANCE                 NODE
mpi-dist  RUNNING  MPIJOB   10m  mpi-dist-launcher-lpfvg  192.168.3.145
mpi-dist  RUNNING  MPIJOB   10m  mpi-dist-worker-0        192.168.3.145
mpi-dist  RUNNING  MPIJOB   10m  mpi-dist-worker-1        192.168.3.146
  1. 等待几分钟后(取决于您配置的 缩容触发时延  )后, 训练任务完成,节点也会被及时释放。
# arena get mpi-dist
STATUS: SUCCEEDED
NAMESPACE: default
TRAINING DURATION: 12m

NAME      STATUS     TRAINER  AGE  INSTANCE                 NODE
mpi-dist  SUCCEEDED  MPIJOB   13m  mpi-dist-launcher-lpfvg  N/A
  1. 查看节点及GPU信息,这时候可以看到刚刚弹出的GPU节点已被成功释放
arena top node
NAME                               IPADDRESS      ROLE    GPU(Total)  GPU(Allocated)
cn-beijing.i-2zec8yxlrlzfyvxxxxxx  192.168.1.115  <none>  0           0
-----------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/0 (0%)

此时由于训练任务完成, 且没有其他GPU任务占用节点上的GPU,刚刚通过自动伸缩扩容出来的GPU节点出现空闲,如果空闲时间超过 缩容时延  后没有新的任务占用GPU,节点会被自动释放。

竞价实例模式

竞价实例(Spot Instance) 也叫抢占式实例,是一种按需实例,旨在降低部分场景下使用ECS的成本。
创建竞价实例时,必须为指定的实例规格设置一个价格上限(一般可设置为按量实例原价),当指定的实例规格的当前市场价格低于出价时,就能成功创建竞价实例,并按当前市场价格计费。创建成功后,默认能稳定持有实例一小时。之后,当市场价格高于出价,或者资源供需关系变化(库存不足)时,实例会被自动释放。
由于竞价实例的低价性,合理的使用阿里云ECS竞价实例,最高可以降低50% – 90% 的运营成本(相比按量付费的实例)。由于市面上可用的规格经常受到库存影响,可以将伸缩配置设置为多个可用区和多个规格,提高实例的创建成功率。 https://yq.aliyun.com/articles/640929
配置竞价实例的方法如下:

  1. 进入之前配置的GPU伸缩规则中,点击进入ESS伸缩组的配置详情:

image.png

  1. 选择 【组内实例配置信息来源】, 点击修改按钮:

image.png

  1. 设置规格为抢占实例, 并选择期望的实例规格:

image.png

这样我们通过弹性伸缩扩容集群时,弹出的是抢占实例,当前市场价格较低时,抢占实例相比按量付费实例可以极大降低成本。

需要注意 抢占实例拥有一小时保护期,即在创建后一个小时的保护期内,ECS不会释放您的实例,但是超过一小时的保护周期后,ECS每5分钟检测一次实例规格当前市场价格和库存,如果某一时刻的市场价格高于您的出价或资源库存不足,您的抢占式实例会被释放。
所以当配置抢占实例进行深度学习,有两种场景更合适:

  1. 任务运行时间在一个小时内。 ECS 能保护抢占实例在1个小时内可以安全运行,如果任务在一小时内运行完成,那么不会有释放风险,  一个小时以后的任务有收到库存和竞价影响被释放的风险。
  2. 通过checkpoint之类的机制,一定训练步数后将Checkpoint保存到共享存储上,可以防止竞价实例被释放导致模型信息丢失。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34326179/article/details/89557485

智能推荐

Struts2之图书管理系统_用spring整合采用struts2开发的登录程序,实现同样的“图书管理系统”登录功能-程序员宅基地

文章浏览阅读666次。趁着周末,梳理一下前几周学的struts2,回顾起struts2,它和springmvc同是action层的解决方案,讲图书系统的同时,先让我们了解一下三层架构,以SSH框架为例。参考来源:http://blog.csdn.net/inter_peng/article/details/410217271.Action/Service/DAO简介:Action是管理业务(Service)..._用spring整合采用struts2开发的登录程序,实现同样的“图书管理系统”登录功能

yolov8的predict使用方法,更改predict.py的输出结果,输出label的真实坐标,保存图片和txt文档,图片中没有异物生成空的txt文档_yolov8 predict-程序员宅基地

文章浏览阅读1.4w次,点赞23次,收藏135次。更改predict.py的输出结果,输出label的真实坐标,保存图片和txt文档,图片中没有异物生成空的txt文档_yolov8 predict

JAVA线程之Thread类详解-程序员宅基地

文章浏览阅读9.7w次,点赞42次,收藏195次。ss_thread

lynis-程序员宅基地

文章浏览阅读89次。 lynis 是个不错的安全审计工具。 常见用法:lynis -c 逐项手动检查,并在最后给出建议lynis -Q 显式自动扫描,并在最后给出建议lynis -q 静默自动扫描,只给出警告 顺便说下另一个问题,在centos 5下安装lynis出错: ERROR with rpm_check_debug vs depsolve:rpmlib(Fil..._languard network scanner 2.0

## 实现MQTT数据在MySQL上的数据持久化实验_用c# 实现emqx 数据持续化到mysql-程序员宅基地

文章浏览阅读663次。一.硬件连接二.软件部分1.云服务器2.安装宝塔面板在腾讯云上安装宝塔面板:安装SSH 连接工具,安装步骤https://www.bt.cn/bbs/thread-1971-1-1.html,挂载磁盘后(查看),根据系统执行框内命令开始安装(这里我选用的是Ubuntu系统)在云服务中打开端口(入站规则和出站规则都要添加)找到腾讯云公网IP地址,在浏览器中输入该IP地址+端口(这里我采用的是8888端口)3.安装EMQX Cloud在云服务器上安装EMQX Cloud,下载链接:htt_用c# 实现emqx 数据持续化到mysql

前端表格合并单元格技巧_前端table单元格合并-程序员宅基地

文章浏览阅读1.3k次。前端表格合并单元格技巧_前端table单元格合并

随便推点

sublime text python c++_sublime python中如何用 c++-程序员宅基地

文章浏览阅读810次。1.python/c++指定pathctrl+b编译ctrl+shift+b编译运行2.c++实现控制台输出使用批处理文件。本解决方法以C语言程序为例,编译器是gcc,我下载了MINGW直接解压到C盘根目录下,并设置了相应的PATH。其它编程语言可以按照这个思路适当修改批处理文件。新建两个批处理文件,一个名为runp.bat,内容如下:@ec_sublime python中如何用 c++

python基础——matplotlib——scatter和plot方法中的maker参数(点的样式)_python scatter marker-程序员宅基地

文章浏览阅读2w次,点赞15次,收藏66次。一、scatterscatter方法主要用来做散点图展示,而plot方法主要用来做折线图展示,也可以用于散点图的展示。两个方法的参数基本是通用的。以scatter方法为例,常用参数包括:plt.scatter( ['x', 'y', 's=None', 'c=None', 'marker=None', 'cmap=None', 'norm=None', 'vmin=None', 'vmax=None', 'alpha=None', 'linewidths=None', 'verts=&._python scatter marker

【MQTT协议详解】MQTT协议-程序员宅基地

文章浏览阅读3.2w次,点赞39次,收藏399次。MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于 **发布/订阅** 范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议。 *简而言之,MQTT其实就是一个用于TCP通信的消息协议而已。既然消息协议,"消息" 自然是表示MQTT其实本质就是消息,消息在某种理解上,可以理解报文,报文包,数据等等;既然是协议,自然表示它有着自己的规则,什么叫规则?就是规定这个消息该以怎样的**........_mqtt协议

计算机硬盘各分区名称,电脑分区后修改磁盘名称的方法步骤-程序员宅基地

文章浏览阅读9.7k次。我们新安装的磁盘,分区之后想对磁盘命名,直接修改是不行的,那么怎么解决呢,下面就由学习啦小编给你们介绍电脑分区后修改磁盘名称的方法吧,希望能帮到大家哦!电脑分区后修改磁盘名称的方法:首选我们打开桌面上的“这台电脑”或者计算机,小编是win8系统。然后选择需要修改的磁盘右键并“重命名”,就会出来需要管理员身份怎么办,意思是这边是不能修改的。选择任务栏最又左下角处的“桌面图标”右键,然后选择“磁盘管理..._如何修改电脑磁盘名称

该网页无法正常运作127.0.0.1 将您重定向的次数过多。 尝试清除 Cookie. ERR_TOO_MANY_REDIRECTS---关于flask遇到的此状况的解决办法_127.0.0.1 重定向次数过多。-程序员宅基地

文章浏览阅读1w次。问题:原因:那我自己的例子来讲,是装饰器中,只出现红色区域代码时,重定向无限循环导致的,每次重定向又会发送一个请求,满足重定向的条件(仍然是未登录)循环…解决:对重定向后的path做一个处理(详见,问题描述中的绿色框框),return None,即可跳出重定向,留在登录界面..._127.0.0.1 重定向次数过多。

CentOS8提高篇8:CentOS制作U盘启动盘_centos启动盘-程序员宅基地

CentOS制作U盘启动盘的步骤和要注意的问题。准备相关软件和镜像文件,使用UltraISO虚拟光驱制作启动盘,注意写入方式为“RAW”。制作的CentOS7启动盘可以当U盘使用,而CentOS8启动盘只能用作启动盘。