阅读473 返回首页    go 技术社区[云栖]


利用GPU性能指标进行弹性伸缩

随着人工智能大潮的风起云涌, 视频识别,语音识别,图像识别,自然语言翻译,AI画匠等基于GPU的在线预测也在遍地开花。而弹性伸缩对于人工智能服务来说尤为重要,一方面是业务压力峰值时巨大的计算力需求;另一方面当业务空闲时,GPU的空耗成本也是大家很难承受的。同时在与客户的交流中,我们也发现客户对于GPU资源的弹性伸缩也有很强的定制化需求,希望能自主控制触发条件,并在此基础上和自身业务指标相结合等等。

基于这种现实,我们提供了一套容器服务所扩容触发器结合第三方监控框架influxDB+Grafana的报警伸缩方案。 具体来说,分为4个部分:

  1. 创建容器服务节点扩缩容触发器
  2. 部署基于Grafana和InfluxDB的GPU监控应用
  3. 在Grafana中设置通知渠道,通过Webhook调用缩扩容触发器
  4. 定义触发条件

创建触发器

参考 利用阿里云容器服务实现自定义节点伸缩 创建触发器trigger_url, 请将这个触发器妥善保存。这里触发器的价值在于:

a) 预先指定扩容机器的配置,以及弹性伸缩的上下限;无需用户写复杂API调用扩容

b) 当缩容时,系统自动判断可以回收的机器;用户只需要触发,对于缩容细节无需了解

扩容触发器的URL通常为

https://cs.console.aliyun.com/hook/trigger?triggerUrl=<triggerUrl>=&secret=<secret>&type=scale_out&step=1

缩容触发器的URL通常为

https://cs.console.aliyun.com/hook/trigger?triggerUrl=<triggerUrl>=&secret=<secret>&type=scale_in

部署GPU监控应用

在容器服务里可以支持influxDB, 这里我们的方案是部署 influxDB+Grafana,利用Grafana的报警机制

  1. 登录 容器服务管理控制台

2. 单击左侧导航栏中的 节点

3. 选择您创建的GPU集群, 并且将鼠标挪动到任何一个节点信息附近感叹号图标。

4. 这时,可以看到当前节点的NODE_IP和NODE_ID。在本例子中,您的NODE_IP是 192.168.10.86 , NODE_ID是 1。请记住该信息。 我们在下一步中将使用该信息部署GPU监控应用。

5. 请将下面的应用模板部署到集群中, 单击左侧导航栏中的 应用, 并点击 创建应用 按钮。

version: '2'
services:
  # Define an InfluxDB service
  influxdb:
    container_name: influxdb
    image: influxdb:0.13
    volumes:
      - /var/lib/influxdb
    ports:
      - 8086:8086
      - 8083:8083
    labels:
      aliyun.monitoring.addon.influxdb: "https://${NODE_IP}:8086"
    environment:
      - constraint:aliyun.node_index==${NODE_ID}
  grafana:
    image: grafana/grafana:4.4.3
    container_name: grafana
    ports:
      - 3000:3000
    links:
      - influxdb
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD}
    labels: 
      aliyun.routing.port_3000: grafana
  config:
    image: registry.cn-beijing.aliyuncs.com/cheyang/grafana-config:egs-4.4.3
    links:
      - grafana:grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=${ADMIN_PASSWORD}

6. 在部署应用时,需要填写模板参数: NODE_IP, NODE_ID以及后续登录Grafana需要的ADMIN_PASSWORD, 点击确定后,监控应用就开始创建了。

7. 等监控应用创建成功后,在应用列表页面,单击本示例所创建应用的名称 grafana

8. 在服务页面点击 grafana 的 访问端点, 就可以登录 grafana 的登录界面

9. 在Grafana登录界面输入用户名admin和您之前设置的密码(ADMIN_PASSWORD对应的值), 您就可以看到GPU的性能数据,其中包括集群级别的和节点级别的。

设置通知渠道, 这里使用 webhook

  1. 点击 admin-> Alerting-> Notification channels

2. 点击右上角 New Channel,就可以进行通知渠道的配置, 完成后点击保存

  • **Name: ** 通知渠道名称,这里代表扩容,取名scale_out
  • **Type: ** 通知类型,这里代选择 webhook
  • **Url: ** webhook触发的Url, 这里前面获得的弹性扩容Trigger Url
  • **Http Method: ** 这里指触发Trigger Url的Http Action,请选择 POST

3. 这样就可以在通知渠道的列表页面看到 scale_out这个通知渠道

设置报警条件

  1. 点击 admin->Dashboards->Home 回到Dashboard页面,直接点击指标图标题 GPU Usage, 然后选择 Edit

2. 查看 Metrics 标签页中三条sql语句, 其中c 对应的是集群级别的GPU平均使用率, 这也是我们使用的报警条件;当然这个完全可以根据业务需要进行定制

关于$timeFilter GROUP BY time(30s)的含义,请参考 https://github.com/grafana/grafana/issues/7967

3. 跳转到 Alert 标签页, 点击 ** Create Alert **

4. 设置 Alert Config, 这里设置的指标是集群GPU平均使用率大于45%时报警

  • ** Query: ** 请设置为C,即集群级别的GPU使用率
  • ** IS ABOVE: ** 大于45, 代表使用率大于45%

5. 关联通知渠道, 单击左侧标题栏的 Notifications, 点击 Send to->+, 选择之前创建的 scale_out 通知渠道

6. 保存好后,图表的标题前会有一个灰色的心形标志, 这就代表设置完成,当对应指标达到配置的阈值就会出发报警,具体报警信息会触发通知渠道调用webhook

测试弹性扩容

  1. 对集群中的GPU施压,可以看到Grafana的视图中已经显示报警

2. 同时登陆容器服务管理的集群页面可以看到GPU集群的状态是伸缩中

3. 当扩容完成后,可以看到容器集群的节点数由2个增加到了3个.

4. 在Grafana的视图中也可以看到GPU使用率已经回到正常范围,集群状态恢复正常

总结

本文为您提供了一套可以拼装组合的GPU弹性伸缩方案,其中触发器与伸缩触发条件可以分离,触发条件也可以有更灵活的配置性。您可以根据峰值时间写一个crontab来触发,也可以写与您具体需求相符合的Alert条件, 满足应用运行的需要。阿里云容器服务希望为您提供元语,帮助您因地制宜的定义符合自身场景的弹性缩扩容方案。

最后更新:2017-09-28 23:03:17

  上一篇:go  李白诗句摘抄
  下一篇:go  智能机器人上演“最强大脑”,化身安全助手护航云安全