Skip to content

Commit

Permalink
add ml
Browse files Browse the repository at this point in the history
  • Loading branch information
liqiankun1111 committed Jan 12, 2024
1 parent 13d8303 commit 001c645
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 4 deletions.
9 changes: 7 additions & 2 deletions _posts/MachineLearning/2021-08-18-gpu.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ CPU和GPU的主要区别在于它们的设计目标。CPU的设计初衷是执
1. GPU的core不能做任何类似out-of-order exectutions那样复杂的事情,总的来说,GPU的core只能做一些最简单的浮点运算,例如 multiply-add(MAD)或者 fused multiply-add(FMA)指令,后来经过发展又增加了一些复杂运算,例如tensor张量(tensor core)或者光线追踪(ray tracing core)相关的操作。
2. GPU的编程方式是SIMD(Single Instruction Multiple Data)意味着所有Core的计算操作完全是在相同的时间内进行的,但是输入的数据有所不同。如果这个工作给到CPU来做,需要N的时间才可以做完,但是给到GPU只需要一个时钟周期就可以完成。
2. **多个core之间通讯**:在图像缩放的例子中,core与core之间不需要任何协作,因为他们的任务是完全独立的。然而,GPU解决的问题不一定这么简单,假设一个长度为8的数组,在第一步中完全可以并行执行两个元素和两个元素的求和,从而同时获得四个元素,两两相加的结果,以此类推,通过并行的方式加速数组求和的运算速度。如果是长度为8的数组两两并行求和计算,那么只需要三次就可以计算出结果。如果是顺序计算需要8次。如果GPU想要完成上述的推理计算过程,显然,**多个core之间要可以共享一段内存空间以此来完成数据之间的交互**,需要多个core可以在共享的内存空间中完成读/写的操作。我们希望每个Cores都有交互数据的能力,但是不幸的是,**一个GPU里面可以包含数以千计的core,如果使得这些core都可以访问共享的内存段是非常困难和昂贵的**。**出于成本的考虑,折中的解决方案是将各类GPU的core分类为多个组,形成多个流处理器(Streaming Multiprocessors )**或者简称为SMs。
2. SM块的底部有一个96KB的L1 Cache。L1 CACHE拥有两个功能,一个是用于SM上Core之间相互共享内存(寄存器 也可以),另一个则是普通的cache功能。存在全局的内存GMEM,但是访问较慢,Cores当需要访问GMEM的时候会首先访问L1,L2如果都miss了,那么才会花费大代价到GMEM中寻找数据。
2. SM块的底部有一个96KB的L1 Cache/SRAM。**每个SM都有自己的L1缓存,SM间不能互相访问彼此的L1**。L1 CACHE拥有两个功能,一个是用于SM上Core之间相互共享内存(寄存器 也可以),另一个则是普通的cache功能。存在全局的内存GMEM,但是访问较慢,Cores当需要访问GMEM的时候会首先访问L1,L2如果都miss了,那么才会花费大代价到GMEM中寻找数据。

GPU架构总体如下图所示:

Expand All @@ -85,7 +85,12 @@ GPU架构总体如下图所示:
![](/public/upload/machine/gpu_sm.jpg)

流式多处理器(Streaming Multiprocessor、SM)是 GPU 的基本单元,每个 GPU 都由一组 SM 构成,SM 中最重要的结构就是计算核心 Core
1. 线程调度器(Warp Scheduler):线程束(Warp)是最基本的单元,每个线程束中包含 32 个并行的线程,它们**使用不同的数据执行相同的命令**,调度器会负责这些线程的调度;
1. 线程调度器(Warp Scheduler):线程束(Warp)是最基本的单元,每个线程束中包含 32 个并行的线程,GPU 控制部件面积比较小,为了节约控制器,**一个 Warp 内部的所有 CUDA Core 的 PC(程序计数器)一直是同步的,但是访存地址是可以不同的,每个核心还可以有自己独立的寄存器组,它们使用不同的数据执行相同的命令**,这种执行方式叫做 SIMT(Single Instruction Multi Trhead)。调度器会负责这些线程的调度;
1. 一个 Warp 中永远都在执行相同的指令,如果分支了怎么处理呢?其实 Warp 中的 CUDA Core 并不是真的永远都执行相同的指令,它还可以不执行。这样会导致 Warp Divergence,极端情况下,每一个Core的指令流都不一样,那么甚至还可能导致一个 Warp 中仅有一个 Core 在工作,效率降低为 1/32.

![](/public/upload/machine/warp_divergence.jpg)
2. GPU 需要数据高度对齐,一个 Warp 的内存访问是成组的,一次只能读取连续的且对齐的 128byte(正好是WarpSize 32 * 4 byte),CPU 是一个核心一个 L1,GPU 是两个 Warp 一个 L1 Cache,整个Warp 有一个核心数据没准备好都执行不了。
3. GPU 的线程切换不同于 CPU,在 CPU 上切换线程需要保存现场,将所有寄存器都存到主存中,GPU 的线程切换只是切换了寄存器组(一个 SM 中有高达 64k 个寄存器),延迟超级低,几乎没有成本。一个 CUDA Core 可以随时在八个线程之间反复横跳,哪个线程数据准备好了就执行哪个。 这是 GPU 优于 CPU 的地方,也是为了掩盖延迟没办法的事情。
2. 访问存储单元(Load/Store Queues):在核心和内存之间快速传输数据;
3. 核心(Core):GPU 最基本的处理单元,也被称作流处理器(Streaming Processor),每个核心都可以负责整数和单精度浮点数的计算;
4. 特殊函数的计算单元(Special Functions Unit、SPU)
Expand Down
1 change: 1 addition & 0 deletions _posts/MachineLearning/2023-09-25-llm_retrieval.md
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ LLM 擅长于一般的语言理解与推理,而不是某个具体的知识点
1. [大模型应用中大部分人真正需要去关心的核心——Embedding](https://mp.weixin.qq.com/s/Uqt3H2CfD0sr4P5u169yng)
2. [分享Embedding 模型微调的实现](https://mp.weixin.qq.com/s/1AzDW9Ubk9sWup2XJWbvlA) ,此外,原则上:embedding 所得向量长度越长越好,过长的向量也会造成 embedding 模型在训练中越难收敛。
3. [手工微调embedding模型,让RAG应用检索能力更强](https://mp.weixin.qq.com/s/DuxqXcpW5EyLI3lj4ZJXdQ) 未细读
4. [如何提高LLMs的文本表征(Text Embedding)能力?](https://mp.weixin.qq.com/s/ZIXjMWKIkgWsFZJGJGgfFQ)
3. 许多向量存储支持了对元数据的操作。LangChain 的 Document 对象中有个 2 个属性,分别是page_content和metadata,metadata就是元数据,我们可以使用metadata属性来过滤掉不符合条件的Document。元数据过滤的方法虽然有用,但需要我们手动来指定过滤条件,我们更希望让 LLM 帮我们自动过滤掉不符合条件的文档。SelfQueryRetriever
4. **增加追问机制**。这里是通过Prompt就可以实现的功能,只要在Prompt中加入“如果无法从背景知识回答用户的问题,则根据背景知识内容,对用户进行追问,问题限制在3个以内”。这个机制并没有什么技术含量,主要依靠大模型的能力。不过大大改善了用户体验,用户在多轮引导中逐步明确了自己的问题,从而能够得到合适的答案。

Expand Down
10 changes: 10 additions & 0 deletions _posts/MachineLearning/2023-10-30-llm_agent.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ Agent在LangChain框架中负责决策制定以及工具组的串联,可以根

大佬:这一波Agent热潮爆发,其实是LLM热情的余波,大家太希望挖掘LLM潜力,为此希望LLM担任各方面的判断。但实际上有一些简单模块是不需要LLM的,不经济也不高效。例如我们要抽取每轮对话的情绪,可以用LLM,其实也可以用情绪识别模型。例如我们希望将长对话压缩后作为事件记忆存储,可以用LLM,也可以用传统摘要模型,一切只看是否取得ROI的最佳平衡,而不全然指望LLM。

[一文说清:大模型AI Agent在企业应用中的6种基础类型](https://mp.weixin.qq.com/s/ArzlkcCW0gmXFRFRLszqTg)
1. 创作与生成类助手,简单的借助Prompt工程即可实现
2. 企业知识助手,本质上也是一种提示工程:借助于在大模型输入时携带相关的私有知识上下文,让大模型理解、总结、整理并回答用户问题。只是这里的私有知识上下文需要借助嵌入模型(Embedding Model)、向量数据库(Vector Store)、文档加载分割(Document Loader&Splitter)等相关技术来获得。
3. 数据分析助手,基本以三种方式为主:自然语言转API、转SQL、以及代码解释器(转代码)。DB-GPT、OpenAgents、OpenInterpreter
4. 应用/工具助手,能够把自然语言转换成对企业应用或者互联网开放API调用的一种基础Agent形式。比如:如果你需要AI帮你在协同办公系统中提交一个付款申请,那么你需要调用办公系统的接口;当然,在复杂任务场景下的这种调用往往不是单一的,复杂性主要体现在大模型对自然语言转API的能力:能否根据上下文理解,精确匹配到需要使用的API(一个或者多个);能否准确地提取或生成每个API的调用参数。LangChain、Assistants API、OpenAgents。
5. Web操作助手,主要能力是自动化Web网络浏览、操作与探索的动作与过程,以简化web浏览访问与操作。对于个人来说,可以作为个人数字助理,简单对话即可让AI帮你完成Web浏览与操作,比如在线订票。而对于企业来说,则可以作为企业的数字员工,来简化企业日常工作中重复性较高、流程与规则固定、大批量的前端操作性事务。比如批量订单处理、批量客户联络、批量网站抓取等,提高效率,降低错误率。传统的RPA机器人也是用来完成此类工作的AI形式,由于这种AI机器人工作在软件的最上层即操作层面,好处是流程直观、简单、也可以配置化,且对应用无侵入性;但其缺点是与前端应用耦合性大,每个任务需要根据前端应用界面做精心配置与调试,自适应能力较差。在大模型出现以后,给这一类RPA智能也带来了新的优化空间。
6. 自定义流程助手,严格来说是上面的几种基础Agent能力的组合,理想中的AI Agent是在丢给他一个工具包与一些知识以后,借助于大模型的理解、推理能力,完全自主的规划与分解任务,设计任务步骤,并智能的使用各种工具,检索知识,输出内容,完成任务。但是在企业应用中,由于企业知识、应用、业务需求的千差万别,以及大模型自身的不确定性,如果这么做,那么结果很可能是“开盲盒”一样的不可控。所以这也是越来越多的Agents项目要强调可控性的原因,即能够对AI智能体的执行过程与细节进行更多的控制,来让AI按照人类确认过的工作流程来完成任务。
PS: 人规定流程 + 单个步骤代码化(有些场景代码无法实现 或 个性化成本太高) ==> 人规定流程 + 单个步骤智能化 ==> 自动分析流程 + 单个步骤智能化


## Agent不只是一个工具

Expand Down Expand Up @@ -228,6 +237,7 @@ Final Answer: I will be 38 in ten years and the weather this week is sunny.
根据输出再回头看agent的官方解释:An Agent is a wrapper around a model, which takes in user input and returns a response corresponding to an “action” to take and a corresponding “action input”. **本质上是通过和大模型的多轮对话交互来实现的**(对比常规聊天时的一问一答/单轮对话), 不断重复“Action+ Input -> 结果 -> 下一个想法”,一直到找到最终答案。通过特定的提示词引导LLM模型以固定格式来回复,LLM模型回复完毕后,解析回复,这样就获得了要执行哪个tool,以及tool的参数。然后就可以去调tool了,调完把结果拼到prompt中,然后再让LLM模型根据调用结果去总结并回答用户的问题。


大多数 Agent 主要是在某种循环中运行 LLM。目前,我们使用的唯一方法是 AgentExecutor。我们为 AgentExecutor 添加了许多参数和功能,但它仍然只是运行循环的一种方式。langgraph是一个新的库,旨在创建语言 Agent 的图形表示。这将使用户能够创建更加定制化的循环行为。用户可以定义明确的规划步骤、反思步骤,或者轻松设置优先调用某个特定工具。

## 原理

Expand Down
9 changes: 8 additions & 1 deletion _posts/MachineLearning/2023-12-16-llm_inference.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,14 @@ PS:Transformer (和Attention) layer 已经支持了缓存机制 (use_cache

Batching就是将一段时间内到达的用户请求合并到一起,提交到GPU中执行,从而提高系统的吞吐量。然而,**与传统的 DNN Model 在推理时只要正向执行一遍不同,基于 Transformer 的 Generative Model 在推理时是迭代式的(Iterative),每个请求都需要迭代式执行多次,每次生成部分结果(一个 Token),且每个请求的迭代次数可能是不同的(例如迭代直到模型生成一个 End-Of-Sequence Token)**。因此将现有的 Batching 方式应用在 Generative Model 时,可能导致有的请求已经迭代结束了,但是还需要和同Batch中没有迭代结束的请求继续一起执行。这个问题的核心在于,传统的 Batching 技术是以 Request 为粒度的,将多个 Request 绑定在一起提交给执行引擎,多个 Request 同时开始同时结束。因此需要一个新的 Batching 的方式,这也是本项工作核心的 Insight:使用更细粒度的,Iteration-level Batching,在每个 Iteration 中将不同的 Request 合并到一起。

### 推理时的模型并行(未完成)
### Flash Attention

[图解大模型计算加速系列:Flash Attention V1,从硬件到计算逻辑](https://mp.weixin.qq.com/s/J2i2MDv4us_GMwCyku0tnw)
1. Fast(with IO-Awareness),计算快。它发现:计算慢的卡点不在运算能力,而是在读写速度上。所以它通过**降低对显存(HBM)的访问次数**来加快整体运算速度(通过分块计算(tiling)和核函数融合(kernel fusion)来降低对显存的访问),这种方法又被称为IO-Awareness。
2. Memory Efficicent,节省显存。在标准attention场景中,forward时我们会计算并保存N*N大小的注意力矩阵;在backward时我们又会读取它做梯度计算,这就给硬件造成了的存储压力。在Flash Attention中,则巧妙避开了这点,使得存储压力降至。在后文中我们会详细看这个trick。
3. Exact Attention,精准注意力。

我们知道显存的带宽相比SRAM要小的多,读一次数据是很费时的,但是SRAM存储又太小,装不下太多数据。所以我们就以SRAM的存储为上限,尽量保证每次加载数据都把SRAM给打满,能合并的计算我们尽量合并在一起,节省数据读取时间。举例来说,我现在要做计算A和计算B。在老方法里,我做完A后得到一个中间结果,写回显存,然后再从显存中把这个结果加载到SRAM,做计算B。但是现在我发现SRAM完全有能力存下我的中间结果,那我就可以把A和B放在一起做了,这样就能节省很多读取时间,我们管这样的操作叫kernel融合。kernel包含对线程结构(grid-block-thread)的定义,以及结构中具体计算逻辑的定义。flash attention将矩阵乘法、mask、softmax、dropout操作合并成一个kernel,做到了只读一次和只写回一次,节省了数据读取时间。

## 模型服务框架

Expand Down
8 changes: 7 additions & 1 deletion _posts/MachineLearning/2023-12-16-llm_train.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ PS:ZeRO是一种显存优化的数据并行(data parallelism, DP)方案,它
6. 为什么不用 ZeRO2,因为在 GA 的基础上面 Gradient 切分反而多了通信次数
7. FP16/BF16/FP8 训练,通信压缩
8. Overlapped distributed optimizer
除此之外,还有一个非常重要的事情。就是训练集群故障的监测和自动恢复,备机也很重要(因为现在的分布式训练框架和算法并没有那么灵活,计算节点的掉线而不能恢复,通常意味着训练长时间的中断)。毋庸置疑,集群的稳定性能够节省机时的浪费,快速可恢复能够保障训练的迭代顺利进行。

### DeepSpeed

Expand Down Expand Up @@ -173,6 +172,13 @@ PS:
1. 故障检测,踢掉故障worker,踢掉多余worker(有时用户要求worker数必须是N的整数倍),worker 被踢掉之后,由controller来创建新的pod? 若worker 被踢掉之后,新的pod 因为资源不够一直pending,当前集群不满足客户要求的最小worker数,如何处理呢?
2. 除了controller、crd等,代码上,DLRover 提供了 ElasticTrainer 来封装训练过程,dlrover-run 来启动训练代码(只要是能用 torchrun 启动的任务,都是支持用 dlrover-run 来跑的。dlrover-run 是扩展了torchrun,所以原生的torchrun的配置都支持。)。

[Flash Checkpoint on DLRover 正式发布:千亿参数模型训练秒级容错](https://mp.weixin.qq.com/s/Bjv6z2PJS1dIRGAiskSs2g)训练程序一般采用周期 checkpoint 方案来将训练状态持久化到存储。为了保证训练状态的一致性,checkpoint 的时候训练需要暂停。常规的 checkpoint 当前面临以下问题:
1. 耗时与模型大小和存储的 IO 性能密切相关,需要几分钟到几十分钟。
2. 太频繁的 checkpoint 会大幅降低训练可用时间。
3. 低频的 checkpoint 的间隔太长,会导致故障后浪费的迭代步数太多。

DLRover 推出了 Flash Checkpoint (FCP) 方案,同步将训练状态写到共享内存(比如每 10 步一次),然后异步从共享内存写到存储系统(每隔 250 步持久化到 CPFS),将 checkpoint 时间开销降低到秒级。如果非机器宕机故障,DLRover 可以直接重启训练进程,这时可以直接从主机内存中加载 Checkpoint,省去读存储文件的 IO 开销。

## 其它


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ keywords: 分布式事务

[Seata:打造行业首个分布式事务产品](https://mp.weixin.qq.com/s/KD4UNAVoxGUB8I0puZezKw) 未细读。

[分布式事务概述与项目实战](https://mp.weixin.qq.com/s/0Io-X0S9AY-s0HeRb_jbag) 未细读。

## 原子提交协议

ACID中的一致性,是个很偏应用层的概念。这跟ACID中的原子性、隔离性和持久性有很大的不同。原子性、隔离性和持久性,都是数据库本身所提供的技术特性;而一致性,则是由特定的业务场景规定的。要真正做到ACID中的一致性,它是要依赖数据库的原子性和隔离性的,但是,就算数据库提供了所有你所需要的技术特性,也不一定能保证ACID的一致性。这还取决于你在应用层对于事务本身的实现逻辑是否正确无误。PS:ACID 中的一致性与事务一致性要解决的问题是不同的。
Expand Down
1 change: 1 addition & 0 deletions _posts/Technology/JVM/2019-07-26-arthas.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ keywords: Java Arthas
[arthas idea plugin](https://github.com/WangJi92/arthas-idea-plugin) 这个解决问题的创新、死磕精神特别牛逼。[如何使用Arthas提高日常开发效率?](https://mp.weixin.qq.com/s/UAO5qHvO6VIhvyCSZnW--g)

[JVM调优好用的内存分析工具](https://mp.weixin.qq.com/s/Pq1umv3011N2m_D8K0zmeA)
[性能优化思路及常用工具及手段](https://mp.weixin.qq.com/s/MsqqFFkb1L4T8LlHIS97Kw) 非常经典。

## dashboard 与 JVM 运行指标

Expand Down
Binary file added public/upload/machine/warp_divergence.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 001c645

Please sign in to comment.