From 704b5cc8ef010409679de2ec13d2081e01783af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tan90=C2=BA?= Date: Tue, 4 Feb 2025 22:52:50 +0800 Subject: [PATCH 1/6] =?UTF-8?q?Create=20DeepSeek=E7=9A=84Infra=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "DeepSeek\347\232\204Infra\345\267\245\344\275\234" | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 "DeepSeek\347\232\204Infra\345\267\245\344\275\234" diff --git "a/DeepSeek\347\232\204Infra\345\267\245\344\275\234" "b/DeepSeek\347\232\204Infra\345\267\245\344\275\234" new file mode 100644 index 0000000..348a9cf --- /dev/null +++ "b/DeepSeek\347\232\204Infra\345\267\245\344\275\234" @@ -0,0 +1,12 @@ +## MoE 架构 + +## KVCache + +## 多头潜在注意力 (MLA) + +## 量化 + + + + + From 4d9078eaf3d4fa20fec7a1baa570ea39429560ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tan90=C2=BA?= Date: Tue, 4 Feb 2025 22:53:03 +0800 Subject: [PATCH 2/6] =?UTF-8?q?Rename=20DeepSeek=E7=9A=84Infra=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=20to=20DeepSeek=E7=9A=84Infra=E5=B7=A5=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...234" => "DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "DeepSeek\347\232\204Infra\345\267\245\344\275\234" => "DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" (100%) diff --git "a/DeepSeek\347\232\204Infra\345\267\245\344\275\234" "b/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" similarity index 100% rename from "DeepSeek\347\232\204Infra\345\267\245\344\275\234" rename to "DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" From 46064552e46be91cb825392544a97f0981f890e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tan90=C2=BA?= Date: Wed, 5 Feb 2025 14:24:06 +0800 Subject: [PATCH 3/6] =?UTF-8?q?Update=20DeepSeek=E7=9A=84Infra=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7\232\204Infra\345\267\245\344\275\234.md" | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git "a/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" "b/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" index 348a9cf..0339338 100644 --- "a/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" +++ "b/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" @@ -1,12 +1,36 @@ -## MoE 架构 -## KVCache +# 推理层面 -## 多头潜在注意力 (MLA) +## KVCache对推理的加速方法 -## 量化 +## 多头潜在注意力(MLA)如何压缩KVCache的显存占用 +# 介绍各种推理引擎常用的加速推理方法 +## Persistent Batch(也叫continuous batching) +说简单点就是用一个模型同时推理多个序列,增加模型吞吐量 +## KV Cache重用 +DeepSeek也使用了这种方法,最直观的感受是命中缓存的部分价格是 百万tokens/0.1元,便宜了一个数量级。 +![image](https://github.com/user-attachments/assets/2b819478-b361-4278-8add-54cbd1555121) + +KV Cache重用的方法可以参考SGLang的RadixAttention,最核心的思想就是具有相同前缀的输入可以共享KV Cache +SGLang论文:https://arxiv.org/abs/2312.07104 +![image](https://github.com/user-attachments/assets/40b6bf73-3ce1-4b4d-8384-06f95c4ce06d) +KV Cache共享示例,蓝色框是可共享的部分,绿色框是不可共享的部分,黄色框是不可共享的模型输出。 + +# 量化层面 + +## 简单介绍下什么是量化,以及介绍下基本的量化思路 +介绍点经典工作,如GPTQ,AWQ + +## KVCache量化 + +## 1.58bit的BitNet +这个算法简单到让我头皮发麻,要不是真有人跑通了,我都不敢信这样量化真能跑。 + +# 模型层面 + +## MoE架构如何减少激活值来加速计算 From 26ff683dc1dbfa427150de9af911ced54dd0979f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tan90=C2=BA?= Date: Wed, 5 Feb 2025 23:18:41 +0800 Subject: [PATCH 4/6] =?UTF-8?q?Update=20and=20rename=20DeepSeek=E7=9A=84In?= =?UTF-8?q?fra=E5=B7=A5=E4=BD=9C.md=20to=20DeepSeek=E6=88=90=E6=9C=AC?= =?UTF-8?q?=E4=B8=BA=E4=BB=80=E4=B9=88=E8=BF=99=E4=B9=88=E4=BD=8E/README.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md" | 56 +++++++++++++++++++ ...7\232\204Infra\345\267\245\344\275\234.md" | 36 ------------ 2 files changed, 56 insertions(+), 36 deletions(-) create mode 100644 "DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" delete mode 100644 "DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" diff --git "a/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" "b/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" new file mode 100644 index 0000000..45a05db --- /dev/null +++ "b/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" @@ -0,0 +1,56 @@ +大语言模型的性能与成本一直是业界关注的焦点,曾经业内的共识是训练大模型需要非常多的显卡,但DeepSeek-R1的出现打破了这一格局,DeepSeek在只用了OpenAI几十分之一的成本的情况下,训练出了能对标当时最先进的GPT-o1模型的DeepSeek-R1模型,DeepSeek不但训练成本显著低于OpenAI的模型。且每 100 万 tokens 的输入,R1 比 GPT-o1 模型便宜 90%,输出价格更是降低了 27 倍左右。DeepSeek-R1的发布大大降低了人们对大模型成本的预期,也因此让英伟达股价大跌,下面就来拆解一下DeepSeek成本大幅降低的原因。 + +# 推理层面 + +在大模型领域,“推理”这个中文单词有2个含义,一个是“inference”,指对输入的数据进行处理并生成输出结果的过程;另一个是“reasoning”,指大模型在运行过程中进行思考,并运用各种和逻辑方法来得出结论。 + +而这章介绍推理的是“inference”,即如何处理输入数据并生成输出结果。大模型的推理引擎有很多,并且都各有特色,这里我列举一些常见的LLM推理引擎: + +- Transformers(Hugging Face推出的库,适合实验和学习) +- vLLM(一个高效的推理加速框架) +- SGLang(适合在各种场景下定制推理方式,需要一定技术基础) +- Llama.cpp(纯C/C++实现,不需要安装额外依赖环境,同时支持多种除CUDA以外的GPU调用方式,需要一定技术基础) +- Ollama(对Llama.cpp的封装,使用起来非常简单,对小白友好) +- MLX(专门为苹果芯片优化的机器学习框架) +- Xinference(对`vLLM`、`SGLang`、`Llama.cpp`、`Transformers`、`MLX`的封装,特点是部署快捷、使用简单) +- LMDeploy(一个吞吐量比vLLM高的推理加速框架) + +下面介绍些常用的推理加速手段 + +## KV Cache + +大模型的生成过程是自回归式的,即每次都会输出一个新的token并拼接入序列,反复迭代直到结束。而在这推理过程中有一个步骤是计算自注意力,会对每个输入token计算其对应的**Q**(Query)、**K**(Key)和**V**(Value),并用公式 $Attention(Q,K,V)=(Q^TK)V$ 来计算注意力分数,自注意力的每次计算都有大量的重复内容,因此可以将计算结果保存下来留着下次使用,而这就是KV Cache。 + + + +## 多头潜在注意力(MLA)如何压缩KVCache的显存占用 + +# 介绍各种推理引擎常用的加速推理方法 + +## Persistent Batch(也叫continuous batching) + +说简单点就是用一个模型同时推理多个序列,增加模型吞吐量 + +## KV Cache复用 + +DeepSeek也使用了这种方法,最直观的感受是命中缓存的部分价格是 百万tokens/0.1元,便宜了一个数量级。 +![image](https://github.com/user-attachments/assets/2b819478-b361-4278-8add-54cbd1555121) + +KV Cache复用的方法可以参考SGLang的RadixAttention,最核心的思想就是具有相同前缀的输入可以共享KV Cache +SGLang论文:https://arxiv.org/abs/2312.07104 +![image](https://github.com/user-attachments/assets/40b6bf73-3ce1-4b4d-8384-06f95c4ce06d) +KV Cache共享示例,蓝色框是可共享的部分,绿色框是不可共享的部分,黄色框是不可共享的模型输出。 + +# 量化层面 + +## 简单介绍下什么是量化,以及介绍下基本的量化思路 +介绍点经典工作,如GPTQ,AWQ + +## KVCache量化 + +## 1.58bit的BitNet +这个算法简单到让我头皮发麻,要不是真有人跑通了,我都不敢信这样量化真能跑。 + +# 模型层面 + +## MoE架构如何减少激活值来加速计算 diff --git "a/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" "b/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" deleted file mode 100644 index 0339338..0000000 --- "a/DeepSeek\347\232\204Infra\345\267\245\344\275\234.md" +++ /dev/null @@ -1,36 +0,0 @@ - -# 推理层面 - -## KVCache对推理的加速方法 - -## 多头潜在注意力(MLA)如何压缩KVCache的显存占用 - -# 介绍各种推理引擎常用的加速推理方法 - -## Persistent Batch(也叫continuous batching) - -说简单点就是用一个模型同时推理多个序列,增加模型吞吐量 - -## KV Cache重用 - -DeepSeek也使用了这种方法,最直观的感受是命中缓存的部分价格是 百万tokens/0.1元,便宜了一个数量级。 -![image](https://github.com/user-attachments/assets/2b819478-b361-4278-8add-54cbd1555121) - -KV Cache重用的方法可以参考SGLang的RadixAttention,最核心的思想就是具有相同前缀的输入可以共享KV Cache -SGLang论文:https://arxiv.org/abs/2312.07104 -![image](https://github.com/user-attachments/assets/40b6bf73-3ce1-4b4d-8384-06f95c4ce06d) -KV Cache共享示例,蓝色框是可共享的部分,绿色框是不可共享的部分,黄色框是不可共享的模型输出。 - -# 量化层面 - -## 简单介绍下什么是量化,以及介绍下基本的量化思路 -介绍点经典工作,如GPTQ,AWQ - -## KVCache量化 - -## 1.58bit的BitNet -这个算法简单到让我头皮发麻,要不是真有人跑通了,我都不敢信这样量化真能跑。 - -# 模型层面 - -## MoE架构如何减少激活值来加速计算 From 02350625ff27e5dd502547a4239bce51373b7dae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tan90=C2=BA?= Date: Wed, 5 Feb 2025 23:22:53 +0800 Subject: [PATCH 5/6] Update README.md --- .../README.md" | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git "a/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" "b/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" index 45a05db..e46261e 100644 --- "a/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" +++ "b/DeepSeek\346\210\220\346\234\254\344\270\272\344\273\200\344\271\210\350\277\231\344\271\210\344\275\216/README.md" @@ -19,7 +19,11 @@ ## KV Cache -大模型的生成过程是自回归式的,即每次都会输出一个新的token并拼接入序列,反复迭代直到结束。而在这推理过程中有一个步骤是计算自注意力,会对每个输入token计算其对应的**Q**(Query)、**K**(Key)和**V**(Value),并用公式 $Attention(Q,K,V)=(Q^TK)V$ 来计算注意力分数,自注意力的每次计算都有大量的重复内容,因此可以将计算结果保存下来留着下次使用,而这就是KV Cache。 +大模型的生成过程是自回归式的,即每次都会输出一个新的token并拼接入序列,反复迭代直到结束。而在这推理过程中有一个步骤是计算自注意力,会对每个输入token计算其对应的**Q**(Query)、**K**(Key)和**V**(Value),并用公式 + +$$Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V$$ + +计算注意力分数。而每次自注意力的计算都有大量的重复内容,因此可以将计算结果保存下来留着下次使用,而这就是KV Cache。 From 452a8f84f9d77386edd648f1b9cc76243c98a089 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?tan90=C2=BA?= Date: Wed, 5 Feb 2025 23:24:47 +0800 Subject: [PATCH 6/6] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b20ebb1..1c372d5 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ | :----| :---- | :---- | | 骆秀韬 | 项目负责人 | 湖北第二师范学院 | | 姜舒凡 | 项目负责人 | | +| 陈嘉诺 | 负责Infra部分 | | ## 参与贡献