深度学习平台离线训练作业资源调度优化
如果无法正常显示,请先停止浏览器的去广告插件。
1. 深度学习离线训练任务资源调度优化
陈泽龙
58同城-TEG-AI Lab-AI平台部
2021.11.3
2. 个人简介
l
l
工作经历
l 2019年7月~至今 58同城 AI平台部
l 2016年7月~2019年7月 中科院信工所 后端
教育背景
l
2013年9月~2016年7月 硕士 中国科学院大学
联系方式:chenzelong@58.com
3. 目录
l 背景介绍
l 业界技术方案调研
l 离线调度优化实现
l 总结
4. 58人工智能平台
5. 深度学习平台总体架构
模型训练
开发实验
推理服务
代码在线调试 单机单卡训练
资源复用 参数服务器(多机多卡训练)
推理加速(TensorRT、MKL、OpenVINO)
负载均衡
弹性扩容
ABTest
深度学习框架
日
志
中
心
Docker、Nvidia-Docker2
Kubernetes
Prometheus
DNS
Calico
ETCD
资源管理
K40
rsyslog
Grafana
P40
…
服务发现
任务调度
存储
算力
CPU
T4
2080ti
…
RAID
监
控
中
心
HDFS
对象存储
(WOS)
高性能网络文件系
统(WFS)
镜
像
中
心
6. 离线任务运行
WEB系统
配置
Kubernetes
DNS
KubeDNS
Rank1
模型训练 模型训练
模型收集 模型收集
日志收集 日志收集
训练镜像
ring-allreduce
KubeDNS
HDFS/WFS
Rank0
训练文件
训练数据
Rank3 Rank2
模型训练 模型训练
模型收集 模型收集
日志收集 日志收集
WOS
用户模型
训练日志
镜
像
中
心
7. 离线资源管理
部门资源统一采购
季度采购
namespace:部门A namespace:部门X
private-resource private-resource
private-resource-k40 private-resource-k40
private-resource-p40
紧急采购
…
private-resource-p40
private-resource-rtx3090 private-resource-rtx3090
…… ……
namespace:部门A namespace:部门X
public-resource public-resource
public-resource-k40 public-resource-k40
部门资源
ResourceQuota
资源录入
借用资源上限申请
public-resource-p40
…
public-resource-p40
public-resource-rtx3090 public-resource-rtx3090
…… ……
借用资源
ResourceQuota
8. 离线资源调度
部门资源
P40
借用资源
K40
RTX3090
P40
内存
CPU
K40
任务提交
内存
CPU
排队任务不超过限额
充足
检查部门
资源是否
充足
RTX3090
不充足
检查借用
资源是否
充足
不充足
禁止提交
充足
检查集群
资源池资源
排队任务超过限额
禁止提交
9. 存在的问题
• 训练任务资源配置不合理,资源浪费严重。 —— 解决方法:增加提示信息,引
导用户去修改任务的资源配置,并根据历史的使用情况,主动调整任务的资源配
置。
• 借用机制导致资源超售,出现任务排队情况。 ——解决方法:配置抢占策略,
部门资源任务可以抢占借用资源的资源,并提供优先级队列,算力使用较高的任
务应该排在前面
• GPU卡型号多(RTX3090/P40/K40/T4),指定GPU型号训练导致任务不能及时启动
GPU卡利用不充分。 ——解决方法: 实现基于异构GPU的调度策略
10. 目录
l 背景介绍
l 业界技术方案调研
l 离线调度优化实现
l 总结
11. Kube-scheduler
Kube-scheduler 是Kubernetes集群默认的调度器,结合Node资源、负载情况、
数据位置等各种因素进行调度判断,负责将Pod调度到最优节点上。
Policy
Informer
Priorities
Predicates
Algorithm
Extenders
Plugins
Queue
PV PVC StorageClass CSINode
RS Deployment Service
RC
Node
PDB
Scheduler Pipeline
Scheduler thread
Pod
Wait thread Bind thread
Schedule Cache
Initial
Assu
med
Adde
d
Delet
ed
12. Kube-scheduler扩展
Scheduler Extender
Mutiple schedulers
ApiServer
Request
ApiServer
Filter
Kube-controller-manager
Filter
Response
http/https
Kube-scheduler
Kube-controller-manager
Extender
Priority
Bind
Kubelet Kubelet Kubelet
Kube-proxy Kube-proxy Kube-proxy
Kube-scheduler
Priority
Bind
http/https
Kube-scheduler
Custom-scheduler
Kubelet Kubelet Kubelet
Kube-proxy Kube-proxy Kube-proxy
Scheduler-extender
Scheduler Framework
绑定Pod至
Node
为Pod预定
Node节点
从调度队列
选择节点
Sort
13. Kube-batch
Actions Session Plugins
Allocate JobOrderFns
queueOrderFns
predicateFns
…… drf
Backfill
Reclaim
Preempt
Allocate
Pipiline
Evict
Jobs
Nodes
Queues
Snapshot
Cache
Watch
API Server
Register
gang
predict
priority
nodeorder
proportion
14. Volcano
Volcano 是基于kube-batch开发并独立出的Kubernetes的容器批量计算平台,源自于华
为云开源。主要包Scheduler,Controller和Admission三大组件。
l Volcano-Scheduler通过一系列的action和plugin,为每一个Pod选取合适节点。
l Volcano-Controller则负责跟Scheduler配合,负责管理Job(Volcano CRD)对象的整个生
命周期。
l Volcano-Admission主要负责对CRD API资源进行合法性校验。
15. Volcano-Controller
16. Volcano-Scheduler
17. Coscheduling Plugin
Coscheduling是阿里云实现的基于 Kubernetes Scheduling Framework的调
度插件,负责帮助 Kubernetes 原生调度器支持批作业调度。
Coscheduling通过label的形式定义PodGroup概念,将同一批作业打上相同
label。
通过以下阶段实现同一PodGroup的作业同时被调度:
Ø 使用Framework 的 Permit 插件提供的延迟绑定功能实现所有Pod统一进行
资源绑定
Ø 使用QueueSort 插件,实现相同PodGroup的作业在等待队列中处于连续位
置
18. 方案对比
调度引擎
优点
缺点
Kube-
scheduler 1、使用及版本更新更便捷
2、社区活跃 1、不能实现批调度
Kube-batch 1、可以实现批调度
2、可以默认调度器共存,多调度器共同进
行调度 1、使用多调度任务,会造成调度器冲突。
2、需要手动创建PodGroup
3、社区化产品,没有专门的维护团队,更新和
维护速度较慢,最后一次release是19年
Volcano 1、基于Kube-batch开发,可以实现批调
度
2、可以和默认调度器共存,多调度器共同
进行调度
3、支持多种类型的CRD
4、社区活跃 1、使用多调度任务,会造成调度器冲突。解决
方案之一为通过设置label,每个调度器管理自己
的label,但是会造成一定的资源浪费。
2、需要手动创建PodGroup
3、目前在github的Issues中未解决的bug较多
4、需要额外运行Volcano需要的组件,要注意组
件挂掉的风险
Coscheduling 1、可以实现批调度,且部署简单,直接修
改label即可创建PodGroup和启动数量
2、Kube-scheduler小组sig-scheduler的
官方插件
3、由阿里云团队开发,在github上咨询的
回复速度较快 1、资源不足时所有节点会一直处于Pending状
态,可能会被小任务抢占,通过设置任务队列,
进行资源进一步优化。
19. 目录
l 背景介绍
l 业界技术方案调研
l 离线调度优化实现
l 总结
20. 离线训练资源调度系统
接入层
任务运行
权限校验
资源检验
资源提示
任务调度器
部门资源任务队列
任务画像
逻辑层
资源计算调整
借用资源任务队列
任务调度
调度策略
Kubernetes
集群
存储层
Kubernetes
资源管理
HDFS/WFS 训练文件
节点调度
训练数据
服务发现
WOS
用户模型
训练日志
21. 离线任务调度流程
实时资源采集
任务历史画像
资源
数据
资源使用记录
任务实时画像
资源数据校正
资源建议值
确定优先级
状态监控
任务运行
调度管理
任务状态变更
部署管理
节点部署
Kubernetes
22. 任务画像
任务ID:xxx CPU最大/平均使用率
任务所属部门:xxx GPU最大/平均使用率
任务类型:TF/PyTorch
资源使用数据
基本信息
……
显存最大/平均使用率
……
CPU
GPU
内存
资源配置
离线训
练任务
等待时长
任务调度情况
训练时长
……
……
训练运行中
训练环境
等待调度
训练方式
训练参数
……
训练配置
任务训练状态
训练完成
……
23. 任务画像-数据采集
Ø 资源数据采集
自动推送
定时分析
副本存储
HDFS
数据校正
流式分析
实时入库
MySQL
Ø 任务调度情况采集
定时更新
任务运行状态上报
POD
节点状态监控
Kubernetes Watcher
调度
器
MySQL
24. 任务画像-画像构建
画像构建
前一天GPU使用
历史画像
前一天显存使
用
每天定时执行
历史画像计算
任务历史
画像打分
前一天CPU使用
任务实时资源
使用
实时画像
周期性计算
实时画像计算
任务等待调度
时长
任务实时
画像打分
25. 任务运行
资源验证
任务资源验证
任务
提交
配置验证
用户权限验证
参数配置验证
部门资源验证
集群资源验证
任务状态验证
多策略调度
优先级策略
抢占策略
异构GPU策略
资源自动调整
……
……
• 历史资源使用率较低,建议…
• 任务将使用借用资源,…
• ……
• 当前用户没有权限,无法运行
• 任务正在运行,…
• ……
26. 调度策略-资源自动调整
l 目的:解决任务资源配置不合理导致资源浪费问题
l 策略:根据历史资源使用情况及任务资源配置,调整任务运行资源配额
l GPU建议值 = MAX (最近3次运行GPU使用率均值,显存使用率的最大值) / 90%
l CPU limit = 最近3次的CPU最大使用值 / 50%
l CPU request = 最近3次的CPU平均使用值 / 50%
l 只选取运行时长超过30分钟,且和本次运行资源类型相同的记录
历史GPU
使用 建议配置 任务配置 训练节点配置
历史显存
使用 GPU建议值 GPU配置 GPU实际配置
历史CPU
使用 CPU建议值
+
CPU配置
=
CPU实际配置
27. 调度策略-优先级策略
l 目的:优先调度部门任务及高资源使用率任务
l 策略:不同资源使用情况的任务,配置不同的优先级
l 使用借用资源优先级低于使用部门资源
l 资源使用率高的任务优先级高于资源使用率低的任务
l 资源使用率较高的任务将优先运行
Priority private-10
映射
任务优先级
高
,
……
Priority private-2
Priority private-1
资源类型
部门资源情况
任务资源配置
任务画像
Priority public-10
……
Priority public-2
Priority public-1
低
28. 调度策略-抢占策略
l 目的:解决因超售导致的部门任务排队问题
l 策略:当整体资源不足时,高优先级任务可以抢占低优先级任务资源运行
29. 调度策略-被抢占任务重调度
l
如何发现任务被抢占并快速重新调度,保证低优先级任务不会被饿死
任务调度器
任
务
队
列
任务画像
5-构建任务画像,提高优先级
6-入队
任务调度
4-任务被抢占,重新调度
3-读取任务
运行状态
Kubernetes Watcher
2-读取
7-重新调度 0-注册监控
节点状态
Kubernetes
1-节点变化Action
任务A
POD
任务B
POD
MySQL
30. 调度策略-异构GPU调度
l 目的:解决GPU资源使用不均衡问题
l 策略:基于资源优先级配置,可以将任务调度到不同类型的GPU上
任务调度器
任务队列 Task 1
Task 1 参数配置
逻辑层
资源配置
Task 2
资源队列
Task 2
Kubernetes
集群
物理层
默认资源优
先级队列
用户资源优
先级队列
Kubernetes
K40
P40
RTX3090
…
GPUn
资源优先
级队列
RTX3090
P40
K40
31. 目录
l 背景介绍
l 业界技术方案调研
l 离线调度优化实现
l 总结
32. 总结
l
结合配置引导和自动调整,推动了任务资源合理配置,减少任务资源
浪费
l
基于任务画像的优先级和抢占调度,使用部门资源及资源利用率较高
的任务优先获得训练资源,得到及时调度
l 异构GPU调度,有助于充分利用不同类型的GPU卡
l 平台离线训练GPU使用率相对提升50.5%(48.24%->72.61%),
CPU使用率相对提升37.9%(32.99%->45.48%)
33. 未来规划
l
训练任务中断后,重新训练时,能做到继续原有模型训练,减少
训练时间
l 首次运行的任务能自动分配合理资源
l 训练任务灵活使用混部资源池
34. 欢迎关注58AI Lab
58同城AI Lab隶属TEG技术工程平台群,成立于2018年5月,旨在推动AI技术在
58同城的落地,打造AI中台能力,以提高前台业务人效、收入和用户体验。
开项项目:
Ø 《开源 | qa_match:一款基于深度学习
的问答匹配工具》
https://github.com/wuba/qa_match
Ø 《开源 | dl_inference:通用深度学习推
理服务》
https://github.com/wuba/dl_inference
招聘后端、算法工程师,欢迎投递
chenxingzhen@58.com
或加小秘书微信号咨询:WubaAILab
35. 欢迎关注58技术
后端、前端、客户端、大数据、
运维、测试、AI 等各方向文章
AI相关:
搜索、推荐、广告、
NLP、图像、语音、风控 等
58技术公众号
36.