随着人工智能大潮的风起云涌, 视频识别,语音识别,图像识别,自然语言翻译,AI画匠等基于GPU的在线预测也在遍地开花。而弹性伸缩对于人工智能服务来说尤为重要,一方面是业务压力峰值时巨大的计算力需求;另一方面当业务空闲时,GPU的空耗成本也是大家很难承受的。同时在与客户的交流中,我们也发现客户对于GPU资源的弹性伸缩也有很强的定制化需求,希望能自主控制触发条件,并在此基础上和自身业务指标相结合等等。
基于这种现实,我们提供了一套容器服务所扩容触发器结合第三方监控框架influxDB+Grafana的报警伸缩方案。 具体来说,分为4个部分:
- 创建容器服务节点扩缩容触发器
- 部署基于Grafana和InfluxDB的GPU监控应用
- 在Grafana中设置通知渠道,通过Webhook调用缩扩容触发器
- 定义触发条件
创建触发器
参考 利用阿里云容器服务实现自定义节点伸缩 创建触发器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的报警机制
- 登录 容器服务管理控制台。
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: "http://${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
- 点击 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这个通知渠道
设置报警条件
- 点击 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
测试弹性扩容
- 对集群中的GPU施压,可以看到Grafana的视图中已经显示报警
2. 同时登陆容器服务管理的集群页面可以看到GPU集群的状态是伸缩中
3. 当扩容完成后,可以看到容器集群的节点数由2个增加到了3个.
4. 在Grafana的视图中也可以看到GPU使用率已经回到正常范围,集群状态恢复正常
总结
本文为您提供了一套可以拼装组合的GPU弹性伸缩方案,其中触发器与伸缩触发条件可以分离,触发条件也可以有更灵活的配置性。您可以根据峰值时间写一个crontab来触发,也可以写与您具体需求相符合的Alert条件, 满足应用运行的需要。阿里云容器服务希望为您提供元语,帮助您因地制宜的定义符合自身场景的弹性缩扩容方案。