Skip to content

Commit

Permalink
feat: add ml
Browse files Browse the repository at this point in the history
  • Loading branch information
liqiankun1111 committed Feb 18, 2024
1 parent dab26bc commit e9ab34b
Show file tree
Hide file tree
Showing 33 changed files with 163 additions and 32 deletions.
14 changes: 8 additions & 6 deletions _posts/Kubernetes/Scheduler/2021-11-22-hybrid_deployment.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,14 @@ keywords: Kubernetes 混部
[阿里大规模业务混部下的全链路资源隔离技术演进](https://mp.weixin.qq.com/s/_DTQ4Q2dC-kN3zyozGf9QA)

整体脉络:
1. 粗放的资源评估,hpa。PS:用户配置值超过峰值 ==> 即便按峰值配了恰当的 limit,仍然有很多时候用不到,前者用vpa 解决(这样一台机器可以塞更多在线应用),后者用混部解决。
1. 粗放的资源评估,hpa。PS:用户配置Pod.limit超过峰值 ==> 即便按峰值配了恰当的 limit,仍然有很多时候用不到,前者用vpa 解决(这样一台机器可以塞更多在线应用),后者用混部解决。
2. 节点分时复用
2. 节点超卖(卖的资源是“已经卖出去的”的资源),然后又有一系列辅助动作保证Pod QoS。
1. 识别出节点的弹性资源,上报,调度器用上 弹性资源。
1. 节点不要成为热点(节点压力过大本身就会影响业务);在线任务调度延迟不受大的影响:不受离线影响(优化os 抢占策略),不要被其它在线影响。 如何识别干扰源,如何压制干扰源?离线的混部任务一般都是可重试的,因此驱逐可以作为一种兜底手段。也别让离线任务过的太惨(离线任务一直没资源跑就调离这个node)。
3. 统一资源抽象,调度器支持全场景的资源类型 ==> 本质是对节点上不同pod的分类管理(时延敏感型、xx),**跳出request和limit的概念限定之外**,干脆提出一个资源池的概念。节点划分资源池,高优池支持绑核、cpu负载控制在50%以下,池间强隔离,不同池运行不同类型的任务,池资源大小随负载动态调整。PS: 如果一个系统可以做到workload 需要资源就立马给,不需要就立马剥夺,我们就不需要request和limit 了, 但是现实做不到,资源分配和回收有延迟,所以就只能分级处理,QoS越高的冗余越大。

理想状态:字节:**当联邦层被架设在不同的离线和在线集群之上后**,我们通过统一的虚拟化队列管理,实现了离线到在线的非常灵活的资源拆借逻辑。举一个例子,原来在准备活动资源时,可能会涉及大量的运维和搬迁,而现在只需要通过平台调整对应的 Quota ,就可以高效地实现离线到在线的容量切换,实现百万核心分钟级别地交付和梯度式回收
PS: 理想状态:给到 pod 准确、实时的limit(更好的监控),且保证pod 之间不会互相影响(更好的隔离)。20年左右一位阿里云的大佬就提到,调度的理想境界就是,部署一个服务,你只要配好QoS(比如接口延迟不低于xx),剩下的全交给调度器解决

## 统一调度的渊源

Expand Down Expand Up @@ -187,6 +187,11 @@ Crane 提供了 Request 推荐、副本数推荐、HPA 推荐以及 EPA 等业
2. 阶段二:Kubernetes/YARN 联合混部
3. 阶段三:在离线统一调度混部

[降本增效的秘密:抖音集团如何实践潮汐混部](https://mp.weixin.qq.com/s/dRqge-_BnbK1WsmXo6OuBw)
1. 最开始开展混部项目的时候,我们的底层隔离能力还并不十分完善,所以我们早期采取的是 “0/1” 的方式进行混部,同一时段不会同时有在线业务和离线业务运行在同一台机器上,当在线服务的波谷来临后,几乎所有服务都会因为弹性缩容而导致副本数降低。当集群的部署水位低于设置的阈值后,控制面会通过一定规则选取部分在线节点,将该节点上的 Pod 驱逐到别的节点上,并标记该节点不可调度,最后将离线服务调度到该节点上实现资源的出借。当在线服务的波峰来临后,会发生一个逆向的控制过程,控制面在通知并确保离线任务撤离后,重新将节点设置为在线可调度状态,实现资源的回收。分时弹性混部的控制面最主要的职责就是控制节点的动态出让和回收。
2. 离线业务稳定性保证。弹性资源最大的特点是它整体的资源供应量不确定,当在线服务出现抖动时,我们需要优先保证在线服务的稳定性,极端情况下需要通过杀死离线业务来为在线服务腾挪资源。而离线任务通常运行的时间长,频繁杀死和重跑任务对离线业务来说也会造成较大的影响。为了解决资源回收的过程中无脑地杀死离线业务的问题,研发团队构建了弹性资源的优先级,基于优先级实现资源回收。以 PS-Worker 架构的离线分布式训练为例,PS 作业可能会处于一个 High 的优先级;能够满足基本运行的 Min 的 Worker 处于中优的优先级;为了进行弹性加测的 Worker 处于 low 的优先级。除此之外,我们在分时弹性混部的控制面引入提前通知的机制,在提前通知的时间窗口内,不会再调度新的离线任务,同时尽可能保证那些已经被调度的任务顺利跑完,从而将任务杀死率维持在一个可接受的范围内。
3. 总体来说,分时弹性混部比较适合基础设施能力建设尚处于早期的用户,在现有环境中快速上量,实现资源效能提升。

[字节跳动 YARN 云原生化演进实践](https://mp.weixin.qq.com/s/a6P1ZrIoy6xlHrTG2-GNKQ)

[字节跳动大规模K8s集群管理实践](https://mp.weixin.qq.com/s/P3-CrOVSSaVAT5tH9m06EA) 值得细读。单集群支持运行各种负载,上面联邦层管理,最上面给用户一个paas平台,资源可以在集群范围内腾挪。每个任务出费用单;下调某类、部门的资源用量 腾挪给突发活动等。基本上理清了一个公司 paas 的终态。datacenters as a computer。
Expand Down Expand Up @@ -227,10 +232,7 @@ Crane 提供了 Request 推荐、副本数推荐、HPA 推荐以及 EPA 等业

[字节跳动开源 Katalyst:在离线混部调度,成本优化升级](https://mp.weixin.qq.com/s/A5_1h3RLmDNazmAddbhYaA)

[降本增效的秘密:抖音集团如何实践潮汐混部](https://mp.weixin.qq.com/s/dRqge-_BnbK1WsmXo6OuBw)
1. 最开始开展混部项目的时候,我们的底层隔离能力还并不十分完善,所以我们早期采取的是 “0/1” 的方式进行混部,同一时段不会同时有在线业务和离线业务运行在同一台机器上,当在线服务的波谷来临后,几乎所有服务都会因为弹性缩容而导致副本数降低。当集群的部署水位低于设置的阈值后,控制面会通过一定规则选取部分在线节点,将该节点上的 Pod 驱逐到别的节点上,并标记该节点不可调度,最后将离线服务调度到该节点上实现资源的出借。当在线服务的波峰来临后,会发生一个逆向的控制过程,控制面在通知并确保离线任务撤离后,重新将节点设置为在线可调度状态,实现资源的回收。分时弹性混部的控制面最主要的职责就是控制节点的动态出让和回收。
2. 离线业务稳定性保证。弹性资源最大的特点是它整体的资源供应量不确定,当在线服务出现抖动时,我们需要优先保证在线服务的稳定性,极端情况下需要通过杀死离线业务来为在线服务腾挪资源。而离线任务通常运行的时间长,频繁杀死和重跑任务对离线业务来说也会造成较大的影响。为了解决资源回收的过程中无脑地杀死离线业务的问题,研发团队构建了弹性资源的优先级,基于优先级实现资源回收。以 PS-Worker 架构的离线分布式训练为例,PS 作业可能会处于一个 High 的优先级;能够满足基本运行的 Min 的 Worker 处于中优的优先级;为了进行弹性加测的 Worker 处于 low 的优先级。除此之外,我们在分时弹性混部的控制面引入提前通知的机制,在提前通知的时间窗口内,不会再调度新的离线任务,同时尽可能保证那些已经被调度的任务顺利跑完,从而将任务杀死率维持在一个可接受的范围内。
3. 总体来说,分时弹性混部比较适合基础设施能力建设尚处于早期的用户,在现有环境中快速上量,实现资源效能提升。
**当联邦层被架设在不同的离线和在线集群之上后**,我们通过统一的虚拟化队列管理,实现了离线到在线的非常灵活的资源拆借逻辑。举一个例子,原来在准备活动资源时,可能会涉及大量的运维和搬迁,而现在只需要通过平台调整对应的 Quota ,就可以高效地实现离线到在线的容量切换,实现百万核心分钟级别地交付和梯度式回收。

### 美团

Expand Down
17 changes: 17 additions & 0 deletions _posts/Life/2018-11-02-experience_of_other_people.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,20 @@ keywords: 认知
为何要想这些东西,因为如果这些东西想不清楚,他们会一次次来占用你的精力、带来困惑和烦扰。以后看到这类“经验文” 应该不会再引起难受了。**有一句话:很多人为了不思考愿意做任何事情。但其实,很多人没认识到该思考这个问题,也没认识到一直拒绝思考导致自己付出了多大的代价。**

**思考是对复杂事务、信息降维处理, 以便于主动规划,而不总是被动应对。你应该先有一套知识图谱、方法论,然后碰到新东西,去充实它们。而不是左支右绌,忙于应对。**

## 知识模型

[开发人员和架构师的知识模型](https://mp.weixin.qq.com/s/C8o7emsIzm7eOoBqWUjbyQ)
1. 作为开发人员,更加关注知识的深度,以便有足够的知识储备满足工作需要。开发人员在职业生涯的早期,应该关注于自身知识储备的增长,并保持技术深度。PS:学习了,深度=你知道自己知道。广度=你知道自己知道+你知道自己不知道。
![](/public/upload/life/developer_breadth_depth.jpg)
2. 作为架构师,之所以技术的广度比深度更重要,是因为架构师的重要职责之一是进行架构决策。系统架构设计是关于权衡的艺术,在特定的问题域上下文下,架构师需要在诸多可行的解决方案间进行权衡和决策,这也对其技术广度提出了要求。开发人员成长为架构师,应该更加关注知识的广度,并在几个特定领域深耕,以便有足够的知识支撑架构决策。
![](/public/upload/life/architecture_breadth_depth.jpg)

虽然开发人员和架构师在知识域的关注点上存在差异,但在认知层面都可以统一到Bloom认知层次模型。该模型将认知层次划分为逐步递进的六个层次:
![](/public/upload/life/bloom_taxonomy.jpg)

不论是架构师还是开发人员,Bloom认知层次模型都适用。通过不断的学习扩展自身的知识体系,在识记、理解和应用的同时,要持续的培养分析、评估和创造的能力,逐步向高层次的认知水平提升。但需要注意的是:**知识不等于认知**,避免陷入知识学习的陷阱。知识是无限的,没有人能够以有限的精力去学习无限的知识。不论是开发人员还是架构师,又或者其他角色,不应该只将精力投入在知识边界的扩充,而**应该注重从知识到认知提升的转变**。格物以致知,对表象不断的归纳、演绎直至事物的本象,探寻事物背后的规律,建立更高层的认知。这种认知层次由下及上的跃升有两种方式:
1. 悟:由内向外,通过不断积累、持续思考,由量变到质变,直至 “开悟”
2. 破:自外向内,高层次或不同的思想输入碰撞,加速认知层次的突破

![](/public/upload/life/knowledge_recognize.jpg)
6 changes: 6 additions & 0 deletions _posts/Life/2018-11-02-programmer_growth.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,12 @@ keywords: 程序猿成长

很多研发主管都喜欢有事没事在钉钉、微信里询问一下具体的工作进度,或者拉个会议对一下进度,所以 “已读 + ding 一下“ 对他们来说是一个很好的功能。我们非常不鼓励这种依赖即时通信工具或会议的方式来沟通、了解开发进度,这种方式非常同步,就和同步调用一样。正确的做法,应该是开发同学每天根据自己的情况及时在项目管理工具对自己的任务进行进度更新和总结反馈,研发主管自己按需关注任务的研发进度和情况,彼此没事不要相互打扰。

**软件研发要避免的四大误区**,软件研发的各种各种理论方法,本质是围绕实用来进行设计的,一切架构、设计、研发管理方法都应该是属于实用主义。
1. 技术上的主次混淆。比如一个团队负责业务开发, 在执行过程中发现缺少一个基础组件,所以安排员工自己去做这样一套工具组件出来。后续推广、维护。
2. 管理懒惰与重度规范化问题。有人专门做规范化工作、列入KPI,结果除了这个人其他人都不关心规范化
3. 架构经验的拿来主义,要了解这个经验它是怎么来的,经验创造出来的一个过程, 推导这个经验的过程,需要大量的实践与深度思考同时进行。
4. 性能洁癖主义。

### 管理规则与管理责任

[梁汝波:10万员工的组织如何保持活力?](https://mp.weixin.qq.com/s/VEtPHhYhTnY1N6v67dMWqQ)
Expand Down
3 changes: 3 additions & 0 deletions _posts/MachineLearning/2021-08-18-ai_platform.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,9 @@ ML的迭代属性意味着, 如果没有完备的自动更新流程,想要
|CI/CD|将代码部署至生产环境|将数据处理管道部署至生产环境|部署代码及训练管道至生产环境|
|监控|SLO|SLO|SLO<br>异常监控<br>统计监控|

当我们在说云原生AI的时候,我们在说什么?
![](/public/upload/machine/ai_cloud_native.jpg)

## 业界实践

[2022年8个好用的MLOps工具和平台](https://mp.weixin.qq.com/s/IdJqiXSl4vcsN3etWdWrig) 未读
Expand Down
9 changes: 9 additions & 0 deletions _posts/MachineLearning/2021-08-18-gpu.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,15 @@ CUDA 编程主打一个多线程 thread,多个 thread 成为一个 thread bloc
3. 如果 warp 中的所有线程都采取相同的分支路径(例如,都满足某个条件语句),则它们会继续同步执行。但是,如果线程在分支上有不同的路径(即分歧),则 warp 会执行每个路径,但不是所有线程都会在每个路径上活跃。这可能导致效率下降,因为即使某些线程在特定路径上没有工作,整个 warp 也必须等待该路径完成。为了确保高效执行,开发人员可能需要确保他们的代码减少 warp 分歧。
4. Global memory 就是我们常说的 显存 (GPU memory),其实是比较慢的。Global memory 和 shared memory 之间是 L2 cache,L2 cache 比 global memory 快。每次 shared memory 要到 global memory 找东西的时候, 会去看看 l2 cache 里面有没有, 有的话就不用去 global memory 了. 有的概率越大, 我们说 memory hit rate 越高, CUDA 编程的一个目的也是要尽可能提高 hit rate. 尤其是能够尽可能多的利用比较快的 SRAM (shared memory).但是因为 SRAM 比较小, 所以基本原则就是: 每次往 SRAM 移动数据的, 都可能多的用这个数据. 避免来来回回的移动数据. 这种 idea 直接促成了最近大火的 FlashAttention. FlashAttention 发现很多操作计算量不大, 但是 latency 很高, 那肯定是不符合上述的 "每次往 SRAM 移动数据的". 怎么解决呢?Attention 基本上是由 matrix multiplication 和 softmax 构成的. 我们已经知道了 matrix multiplication 是可以分块做的, 所以就剩下 softmax 能不能分块做? softmax 其实也是可以很简单的被分块做的. 所以就有了 FlashAttention.

GPU的线程在执行的时候是分块(block)执行的(通过SIMD执行),所以块(block)内的线程其实是共享pc寄存器,这种执行方式就隐含了,在任何一个时刻,一个块当中的所有线程,会进行一模一样的动作:如果是读内存,那么大家一起读;如果是写内存,那么大家一起写。从而,对于这种情况,相较于各个线程有自己的一片内存区域(按照线程组织数据),**按照块组织数据效率会更高**。所以我们可以看到,一般给CPU用的数据,都是线性排列的。而给GPU用的数据,基本上都是按照块(对应着GPU编程模型当中的线程块)来组织的。例如,从全局内存中加载的粒度是32*4字节,恰好是32个浮点数,每个线程束中的每个线程恰好一个浮点数。同样的原因,在片上存储空间以及多层高速缓存(cache)的组织方面,GPU也是突出了一个分块交换的概念,对线程组(block)的尺寸是非常敏感的。而这些在CPU上就不是那么明显。[GPU深度学习性能的三驾马车:Tensor Core、内存带宽与内存层次结构](https://zhuanlan.zhihu.com/p/669987669)

Ampere 架构的 GPU一些重要的运算延迟周期时间
1. 访问全局内存(高达80GB):约380个周期
2. 二级缓存(L2 cache):约200个周期
3. 一级缓存或访问共享内存(每个流式多处理器最多128KB):约34个周期
4. 乘法和加法在指令集层面的结合(fused multiplication and addition,FFMA):4个周期
5. Tensor Core(张量计算核心)矩阵乘法运算:1个周期

### 执行模型


Expand Down
2 changes: 2 additions & 0 deletions _posts/MachineLearning/2021-09-27-model_serving.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@ spec:

[CPU 推理优化](https://mp.weixin.qq.com/s/LQ6xjHqv0YYDRXtQTB5qPw) 直接使用 TensorFlow 提供的 C++ 接口调用 Session::Run,无法实现多 Session 并发处理 Request,导致单 Session 无法实现 CPU 的有效利用。如果通过多 Instance 方式(多进程),无法共享底层的 Variable,导致大量使用内存,并且每个 Instance 各自加载一遍模型,严重影响资源的使用率和模型加载效率。为了提高 CPU 使用率,也尝试多组 Session Intra/Inter,均会导致 latency升高,服务可用性降低。

[小红书推搜场景下如何优化机器学习异构硬件推理突破算力瓶颈!](https://mp.weixin.qq.com/s/tqHBSRV0fYB9BRBXqLyNEg) 罗列的比较详细。

## 调优

算法工程师视角
Expand Down
2 changes: 2 additions & 0 deletions _posts/MachineLearning/2021-10-31-from_rnn_to_attention.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ Seq2Seq模型可以认为是一个序列到序列转换的通用框架,具有

[NLP注意力机制的视觉应用——谈谈看图说话的SAT模型](https://zhuanlan.zhihu.com/p/353350370)

深度学习中的“注意力”概念源于改进循环神经网络(RNN)使其能够处理较长序列或句子,例如,将句子从一种语言翻译成另一种语言。我们通常不会选择逐字翻译,因为这种方式忽略了每种语言特有的复杂语法结构和惯用表达,会导致翻译不准确或无意义。为克服上述问题,引入了注意力机制,允许模型在每个时间步都能够访问所有序列元素。**注意力机制的关键在于选择性地确定在特定上下文中哪些词语是最重要的**

对于一个由 n 个单词组成的句子来说,不同位置的单词,重要性是不一样的。因此,我们需要让模型“注意”到那些相对更加重要的单词,这种方式我们称之为注意力机制,也称作 Attention 机制。比如“我今天中午跑到了肯德基吃了仨汉堡”。这句话中,你一定对“我”、“肯德基”、“仨”、“汉堡”这几个词比较在意,不过,你是不是没注意到“跑”字?其实 Attention 机制要做的就是这件事:找到最重要的关键内容。它对网络中的输入(或者中间层)的不同位置,给予了不同的注意力或者权重,**通过权重矩阵来自发地找到token之间的关系**,网络就可以逐渐知道哪些是重点,哪些是可以舍弃的内容了。

与标准Seq2Seq模型相比,**注意力模型最大的改进在于其不再要求编码器将输入序列的所有信息都压缩为一个固定长度的上下文序列c中**,取而代之的是**将输入序列映射为多个上下文序列$c_1,c_2,...,c_n$**,其中$c_i$是与输出$y_i$对应的上下文信息。
Expand Down
2 changes: 2 additions & 0 deletions _posts/MachineLearning/2022-03-02-ml_framework.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ keywords: ml framework

[手把手教你如何自己设计实现一个深度学习框架](https://mp.weixin.qq.com/s/0bDyrSjg_VmUgAenNuysqg) 未读

[从零构建现代深度学习框架(TinyDL-0.01)](https://mp.weixin.qq.com/s/tFl0RQd3ex98_SAOIIfM_Q)

## 发展脉络

[大模型时代,AI框架的机遇和挑战](https://mp.weixin.qq.com/s/h7UsG1FU8eqbeE04MtP67Q)AI框架经历了四个阶段的发展:
Expand Down
Loading

0 comments on commit e9ab34b

Please sign in to comment.