1.ChatGLM2 介绍
ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。

更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。如果您发现我们的开源模型对您的业务有用,我们欢迎您对下一代模型 ChatGLM3 研发的捐赠。
Github 链接
2.项目介绍
本项目提供了 ChatGLM2-6B 非量化版本在 windows 平台 2张3060显卡机型上进行部署、推理测试教程
3.环境配置
AMD Ryzen 5 3500X 6-Core Processor 3.59 GHz
内存 32.0 GB
Windows 10 企业版
2张N卡:
NVIDIA GeForce RTX 3060 Ti 8G显存
NVIDIA GeForce RTX 3060 12G显存
大容量硬盘:12T
https://blog.csdn.net/weixin_44626085/article/details/132919803
4.vsc创建ai_test.ipynb
通过配置jupter来运行后面的程序
vsc选ipykernel:
http://127.0.0.1:8888/tree?token=11c74157a160f6f8f6a1d4a0791ee24c549f78eb4bb8d402
# 确认GPU型号与显存大小
(base) ai001@CHINAMI-I6IUQDH:~$ nvidia-smi Thu Apr 4 13:35:23 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.104.07 Driver Version: 537.34 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA GeForce RTX 3060 Ti On | 00000000:04:00.0 On | N/A | | 0% 48C P8 9W / 200W | 921MiB / 8192MiB | 1% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce RTX 3060 On | 00000000:07:00.0 Off | N/A | | 30% 44C P8 7W / 170W | 12115MiB / 12288MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | 0 N/A N/A 38 G /Xwayland N/A | | 0 N/A N/A 206890 C /python3.9 N/A | | 1 N/A N/A 38 G /Xwayland N/A | | 1 N/A N/A 206890 C /python3.9 N/A | +---------------------------------------------------------------------------------------+
5.环境准备
5.1 目录位置设置
!pwd !cd /mnt/e/AI-lab/ChatGLM2-6B/ # 检查模型文件正确挂载 !ls -lh /mnt/e/AI-lab/ChatGLM2-6B/
/mnt/e/AI-lab/ChatGLM2-6B total 12G -rwxrwxrwx 1 ai001 ai001 6.1K Apr 1 19:21 '=1.24.0' -rwxrwxrwx 1 ai001 ai001 16K Apr 1 22:11 '=2.0' -rwxrwxrwx 1 ai001 ai001 946 Sep 13 2023 FAQ.md -rwxrwxrwx 1 ai001 ai001 4.1K Sep 13 2023 MODEL_LICENSE -rwxrwxrwx 1 ai001 ai001 4.1K Sep 16 2023 MODEL_LICENSE.txt -rwxrwxrwx 1 ai001 ai001 8.1K Sep 16 2023 README.md -rwxrwxrwx 1 ai001 ai001 16K Sep 13 2023 README_EN.md drwxrwxrwx 1 ai001 ai001 4.0K Sep 16 2023 __pycache__ -rwxrwxrwx 1 ai001 ai001 64K Apr 4 13:50 ai_test.ipynb -rwxrwxrwx 1 ai001 ai001 2.1K Sep 13 2023 api.py -rwxrwxrwx 1 ai001 ai001 69K Apr 1 23:02 chatglm2-6b.ipynb -rwxrwxrwx 1 ai001 ai001 2.3K Apr 1 21:36 cli_demo.py -rwxrwxrwx 1 ai001 ai001 1.3K Sep 16 2023 config.json -rwxrwxrwx 1 ai001 ai001 2.3K Sep 16 2023 configuration_chatglm.py drwxrwxrwx 1 ai001 ai001 4.0K Sep 13 2023 evaluation -rwxrwxrwx 1 ai001 ai001 1.5K Sep 16 2023 gitattributes.txt -rwxrwxrwx 1 ai001 ai001 54K Sep 16 2023 modeling_chatglm.py -rwxrwxrwx 1 ai001 ai001 5.6K Sep 13 2023 openai_api.py -rwxrwxrwx 1 ai001 ai001 45K Apr 4 12:36 p-tuning-v2.ipynb drwxrwxrwx 1 ai001 ai001 4.0K Apr 3 21:17 ptuning -rwxrwxrwx 1 ai001 ai001 1.8G Sep 14 2023 pytorch_model-00001-of-00007.bin -rwxrwxrwx 1 ai001 ai001 1.9G Sep 14 2023 pytorch_model-00002-of-00007.bin -rwxrwxrwx 1 ai001 ai001 1.8G Sep 14 2023 pytorch_model-00003-of-00007.bin -rwxrwxrwx 1 ai001 ai001 1.7G Sep 14 2023 pytorch_model-00004-of-00007.bin ... -rwxrwxrwx 1 ai001 ai001 2.3K Sep 13 2023 utils.py -rwxrwxrwx 1 ai001 ai001 2.3K Sep 16 2023 utils.py.1 -rwxrwxrwx 1 ai001 ai001 4.2K Apr 1 21:31 web_demo.py -rwxrwxrwx 1 ai001 ai001 2.5K Sep 13 2023 web_demo2.py Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
5.2 模型需要的python组件安装
!pip install -r requirements.txt -i https://mirror.sjtu.edu.cn/pypi/web/simple
Looking in indexes: https://mirror.sjtu.edu.cn/pypi/web/simple Requirement already satisfied: protobuf in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 1)) (5.26.1) Requirement already satisfied: transformers==4.30.2 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 2)) (4.30.2) Requirement already satisfied: cpm_kernels in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 3)) (1.0.11) Requirement already satisfied: torch>=2.0 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 4)) (2.2.2) Requirement already satisfied: gradio in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 5)) (3.40.0) Requirement already satisfied: mdtex2html in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 6)) (1.3.0) Requirement already satisfied: sentencepiece in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 7)) (0.2.0) Requirement already satisfied: accelerate in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 8)) (0.28.0) Requirement already satisfied: sse-starlette in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from -r requirements.txt (line 9)) (2.0.0) Requirement already satisfied: filelock in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (3.13.3) Requirement already satisfied: huggingface-hub=0.14.1 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (0.22.2) Requirement already satisfied: numpy>=1.17 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (1.26.4) Requirement already satisfied: packaging>=20.0 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (24.0) Requirement already satisfied: pyyaml>=5.1 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (6.0.1) Requirement already satisfied: regex!=2019.12.17 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (2023.12.25) Requirement already satisfied: requests in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (2.31.0) Requirement already satisfied: tokenizers!=0.11.3,=0.11.1 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (0.13.3) Requirement already satisfied: safetensors>=0.3.1 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (0.4.2) Requirement already satisfied: tqdm>=4.27 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from transformers==4.30.2->-r requirements.txt (line 2)) (4.66.2) Requirement already satisfied: typing-extensions>=4.8.0 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from torch>=2.0->-r requirements.txt (line 4)) (4.10.0) Requirement already satisfied: sympy in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from torch>=2.0->-r requirements.txt (line 4)) (1.12) Requirement already satisfied: networkx in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from torch>=2.0->-r requirements.txt (line 4)) (3.2.1) Requirement already satisfied: jinja2 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from torch>=2.0->-r requirements.txt (line 4)) (3.1.3) Requirement already satisfied: fsspec in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from torch>=2.0->-r requirements.txt (line 4)) (2024.3.1) ... Requirement already satisfied: referencing>=0.28.4 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from jsonschema>=3.0->altair=4.2.0->gradio->-r requirements.txt (line 5)) (0.34.0) Requirement already satisfied: rpds-py>=0.7.1 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from jsonschema>=3.0->altair=4.2.0->gradio->-r requirements.txt (line 5)) (0.18.0) Requirement already satisfied: uc-micro-py in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from linkify-it-py=1->markdown-it-py[linkify]>=2.0.0->gradio->-r requirements.txt (line 5)) (1.0.3) Requirement already satisfied: six>=1.5 in /home/ai001/anaconda3/envs/chatglm2-6b/lib/python3.9/site-packages (from python-dateutil>=2.7->matplotlib~=3.0->gradio->-r requirements.txt (line 5)) (1.16.0) Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
6.加载模型
指定从第二张显卡运行
# 加载模型 import os os.environ['CUDA_VISIBLE_DEVICES'] = '1' model_path = "/mnt/e/ai-lab/ChatGLM2-6B" from transformers import AutoTokenizer, AutoModel from utils import load_model_on_gpus tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) model = load_model_on_gpus("/mnt/e/ai-lab/ChatGLM2-6B", num_gpus=1) model = model.eval()
7.使用 Markdown 格式打印模型输出
# 使用 Markdown 格式打印模型输出 from IPython.display import display, Markdown, clear_output def display_answer(query, history=[]): for response, history in model.stream_chat( tokenizer, query, history=history): clear_output(wait=True) display(Markdown(response)) return history
8. 准备提示语
这里我们复制一篇文章《语言大模型100K上下文窗口的秘诀》,测试一下 ChatGLM2-6B 对于长 prompt 的理解能力
# 准备提示语 # 这里我们复制一篇文章《语言大模型100K上下文窗口的秘诀》,测试一下 ChatGLM2-6B 对于长 prompt 的理解能力 prompt = ''' 语言大模型100K上下文窗口的秘诀 目录 收起 重点概览 1. 为何上下文长度如此重要? 2. 原始Transformer和上下文长度 3. 多头注意力回顾 多头注意力(Multi-Head Attention) 缩放点积注意力(Scaled Dot-Product Attention) Transformer的复杂度和上下文长度 Transformer训练阶段和推理阶段的区别 4. 增加上下文长度的优化技术 [技巧1] 更好的位置编码——ALiBi [技巧2] 稀疏注意力机制 [技巧3] FlashAttention——用于GPU的注意力层高效实现 [技巧4] 多查询注意力(Multi-Query Attention,MQA) [技巧5] 条件计算 [技巧6] 大型内存GPU 5. 结论 上下文窗口(context window)是指语言模型在进行预测或生成文本时,所考虑的前一个词元(token)或文本片段的大小范围。 在语言模型中,上下文窗口对于理解和生成与特定上下文相关的文本至关重要。较大的上下文窗口可以提供更丰富的语义信息、消除歧义、处理上下文依赖性,并帮助模型生成连贯、准确的文本,还能更好地捕捉语言的上下文相关性,使得模型能够根据前文来做出更准确的预测或生成。 最新发布的语言大模型的上下文窗口越来越大。本文详细探讨了大型上下文窗口的技术可能性,尤其分析了将上下文长度增加到100K背后的六大优化技巧。本文作者Galina Alperovich是英国数据安全服务商Soveren的机器学习负责人。 (以下内容由OneFlow编译,转载请联系OneFlow获得授权。来源:https://medium.com/gopenai/how-to-speed-up-llms-and-use-100k-context-window-all-tricks-in-one-place-ffd40577b4c) 作者 | Galina Alperovich OneFlow编译 翻译 | 杨婷、贾川、宛子琳 最近有几个新的语言大模型(LLM)发布,这些模型可以使用非常大的上下文窗口,例如65K词元(MosaicML的MPT-7B-StoryWriter-65k+)和100K词元的上下文窗口(Antropic)。在Palm-2技术报告中,谷歌并没有透露具体上下文大小,但表示他们“显著增加了模型的上下文长度”。 相比之下,当前GPT-4模型可以使用32K输入词元的上下文长度,而大多数开源LLM的上下文长度为2K词元。 如此大的上下文长度意味着提示(prompt)可以达到一本书的大小。《了不起的盖茨比》有72K词元,210页,按1.7分钟/页的阅读速度计算,需要6小时的阅读时间。因此,模型可以扫描并保留此数量的“自定义”信息来处理查询! 我想要弄清楚大型上下文窗口的技术可能性。本文搜集了一些零散信息,内容如下: 为何上下文长度如此重要,且能在LLM中起到举足轻重的作用? 处理大型上下文长度时,原始Transformer架构的主要局限性是什么? Transformer架构的计算复杂度 目前有哪些可以加速Transformer并将上下文长度增加到100K的优化技术? 重点概览 本文将互换使用“上下文长度”、“上下文窗口”和“输入词元数量”,并用n来表示。 鉴于文章内容较长,以下为要点总结: 第一个问题是注意力层(attention layer)计算的二次方时间(Quadratic time)和空间复杂度,即输入词元数量n。 当嵌入大小d>n时,第二个问题是嵌入大小d的线性层的二次方时间复杂度。 第三个问题是原始架构中使用的位置正弦嵌入(Positional Sinusoidal Embedding )。 在Transformer架构中,可学习(learnable)矩阵权重的形状与输入词元n的数量无关。 因此,在2K上下文长度中训练的Transformer可以使用任意长度的词元,甚至是100K词元。但如果不是在100K词元上训练出来的,那么该模型在100K词元的推理过程中不会产生有意义的推理结果。 由于n、d相关的二次复杂度,在巨型语料库上训练Vanilla Transformer,并且只在较大的上下文长度上训练是不可行的。据估计,在2K上下文长度上训练LLaMA的费用约为300万美元,因此,100K的花费约为1.5亿美元。 一种选择是,可以在2K词元上下文中训练模型,然后在更长的上下文词元(例如65K)中微调。但由于位置正弦编码(Positional Sinusoidal Encoding)的存在,这不适用于原始Transformer模型。 [技巧1] 为解决此问题,可删除位置正弦编码并使用ALiBi,这一简单位置嵌入不会影响准确性。然后可以在2K词元上训练,在100K词元上微调。 [技巧2] 无需计算所有词元间的注意力分数(attention scores)。某些词元比其他词元更重要,因此可使用稀疏注意力。这将提升训练和推理速度。 [技巧3] Flash Attention有效地实现了GPU的注意力层。它使用切片(tiling)技术,避免生成不适合GPU SRAM容量的大型中间矩阵(n,n)。这将提升训练和推理速度。 [技巧4] 选择多查询注意力(Multi-Query attention),而非多头注意力。这意味着线性投影K和V时,可在跨所有注意力头(head)中共享权重。这极大地加快了增量(incremental)推理速度。 [技巧5] 条件计算(Conditional computation)避免将所有模型参数应用于输入序列中的所有词元。CoLT5仅对最重要的词元应用重量级计算,并使用较轻量级的层处理其余词元。这将加速训练和推理。 [技巧6] 为适应大型上下文,需要GPU中有大量RAM,因此人们使用80GB的A100 GPU。 总之,训练和推理速度越快,可使用的上下文长度就越大。 以下是上述要点的详细内容。 1. 为何上下文长度如此重要? 上下文长度是LLM的关键限制之一,将其增加到现在的100K是一项难以置信的成就。 对于语言大模型,其中一个重要用例是人们想要“将大量自定义数据输入LLM”(与公司或特定问题相关的文档,各种异构文本等),并询问有关此特定数据的问题,而不是LLM在训练期间接入一些来自互联网的抽象数据。 为了克服这一局限性,人们做了以下尝试: 尝试总结技巧和复杂的链式提示。 维护向量数据库以保留自定义文档的嵌入,然后通过相似性指标在它们之间展开“搜索”。 尽可能使用自定义数据微调LLM(并非所有商业LLM都允许自定义微调,对开源LLM进行自定义微调并不常见)。 为特定数据开发定制小型LLM(同样,这并非常规任务) 较大的上下文长度能够让已经很强大的LLM(用整个互联网数据训练的模型)查询用户的上下文和数据,以更强的个性化在完全不同的层面与你交互。所有这些都无需更改模型权重并能够“在内存中”即时“训练”。 总体而言,大型上下文窗口可让模型更加准确、流畅,提升模型创造力。 这就好比是计算机的RAM,操作系统保留了所有应用程序的实时上下文,由于上下文长度充足,LLM可以像“推理计算机”一样,保留大量用户上下文。 2. 原始Transformer和上下文长度 需要注意的是,在Transformer架构中,所有可学习矩阵权重的形状与输入词元数量n无关。所有可训练参数(嵌入查找、投影层、softmax层和注意力层)都不依赖于输入长度,并且必须处理可变长度(variable-length)的输入。该架构具有的开箱即用的特性非常不错。 这意味着,如果你用2K的上下文长度训练了一个Transformer模型,可以对任意大小的词元序列进行推断,唯一的问题在于,如果模型没有在上下文长度为100K的情况下进行训练,那么它在推断过程中将无法对100K个词元产出有意义的结果。这种情况下,训练数据的分布与推断过程中的分布相差很远,模型的表现就像任何其他机器学习模型一样,面临失败风险。 为训练具有较大上下文长度Transformer,我们的解决方案是将其分为两个阶段进行训练:首先在2K个词元的上下文长度上训练基本模型,然后继续在更长的上下文中进行训练(微调),例如65K或100K。MosaicML就采用这种方法。但问题是,原始的Transformer架构无法直接实现这一点,因此需要使用一些技巧(请参阅后文的技巧1)。 3. 多头注意力回顾 大型上下文长度所面临的挑战与Transformer架构的计算复杂度有关。为讨论复杂度,我们首先回顾一下注意力层的工作原理。 Q - 查询(query),K - 键(key),V - 值(value),这些符号是论文中与信息检索相关的符号表示法。在信息检索中,你可以将一个“查询”输入系统,并搜索与之最接近的“键”。 n - 输入的词元数量d - 文本嵌入维度h - 注意力头的数量k - Q和K的线性投影大小v - V的线性投影大小 多头注意力(Multi-Head Attention) 1. 我们有一个查找嵌入层,用于接收词元作为输入,并返回大小为(1,d)的向量。因此,对于一个由n个词元组成的序列,我们得到大小为(n,d)的文本嵌入矩阵X,然后将其与位置正弦嵌入相加。 2. 多头注意力层旨在为词元序列计算新的嵌入表示,该词元序列可以被视为对原始文本编码X,但需要,(1)根据词元间相对于上下文的重要性进行加权,(2)根据词元的相对位置进行加权。 3. 我们使用h个注意力头对嵌入矩阵X(n×d)进行并行处理。为了使所有的注意力头都得到Q、K和V,我们需要对X进行线性投影,将其分别投影到k、k和v维度。为此,可以通过将X分别与形状为(d,k)、(d,k)和(d,v)的h个矩阵相乘来实现。你可将其理解为用(n,d)乘以(h,d,k)、(h,d,k)和(h,d,v)。 4. 注意力头返回大小为(n,v)的h个注意力分数矩阵。然后,我们将来自所有注意力头(n,h*v)的片段进行连接,并对其进行线性投影,为后续步骤做准备。 《Attention is All You Need》论文中注意力架构的高级图解 缩放点积注意力(Scaled Dot-Product Attention) 现在详细讨论一个注意力头。 Q、K、V是X的3个线性投影,大小分别为(n,k)、(n,k)和(n,v),通过乘以每个注意力头的可学习权重(learnable weight)获得。 通过计算Q和K(转置)之间的距离(点积),我们得到了注意力分数。将矩阵(n,k)与(k,n)相乘,得到矩阵(n,n),然后我们将其与掩码矩阵相乘,以将一些词元置零(在解码器中需要)。接下来,我们对其进行缩放,并应用softmax函数,使注意力分数范围在0到1之间。这样,我们就得到一个形状为(n,n)的矩阵,其中n_ij表示第i个和第j个词元之间的相对注意力分数(0-1之间),这展示了这些词元在给定长度为n的特定上下文中有多“接近(close)”。 然后,我们将这个注意力分数矩阵(n,n)乘以大小为(n,d)的“值(value)”V,以获得由这些相对注意力分数加权得到的文本嵌入。 在原始论文中,一个注意力头中的注意力分数矩阵通过该公式计算 下图是Multi-Query注意力论文的代码片段,展示了如何使用批(batching)处理计算多头注意力,并且在每一步都清晰地给出了形状信息。代码里还包括在解码过程中使用的掩码乘法操作。 一段非常好的代码,展示了注意力层中每一步的形状。来源:Multi-Query Transformer的复杂度和上下文长度 2个矩阵乘法(a,b)*(b,c)的复杂度为O(a*b*c)。 为简单起见,我们假设k*h = O(d),并利用这个假设来推导注意力机制的复杂度。 注意力层的复杂度由两部分组成: 1. 线性投影得到Q,K,V:大小为(n,d)的嵌入矩阵乘以h个可学习矩阵(d,k),(d,k)和(d,v)。因此,复杂度约为O(nd²) 2. 将Q与变换后的K相乘,然后再乘以V:(n,k)*(k,n)=(n,n),以及(n,n)*(n,v)=(n,v)。复杂度约为O(n²d)。 因此,注意力层的复杂度为O(n²d + nd²),其中n是上下文长度(输入词元的数量), d是嵌入大小。从这里我们可以看出,注意力层计算的复杂度与输入词元数n和嵌入大小d相关,分别是二次方关系。 当d>n时(例如,在LLaMa中,n=2K,d=4K),O(nd²)这个术语非常重要。 当n>d时(例如,在使用n=65K和d=4K进行MosaicML训练时),O(n²d)这个术语非常重要。 提醒一下,二次方增长的情况有多糟糕: 2000²=4000000, 100000²=10000000000 举例说明一下二次方复杂度是如何影响模型训练成本的。LLaMa模型的训练估计价格约为300万美元(https://matt-rickard.com/commoditization-of-large-language-models-part-3),具有650亿个参数,2K的上下文长度和4K的嵌入大小。预估时间大部分是GPU训练时间。如果我们将上下文长度从2K增加到100K(增加了50倍),训练时间也会增加大约50倍(由于上下文更大,迭代次数较少,但每次迭代的时间更长)。因此,以100K上下文训练LLaMa模型的成本约为1.5亿美元。 对该计算稍作详细说明: 假设token数量为n时,注意力的复杂度为O(n²d + nd²),需要进行M次迭代来进行训练。如果我们将上下文长度从n增加到p*n,由于上下文长度变大,所需的迭代次数将变为M/p(这里简单假设它是线性的,实际情况可能会高点或低点,具体取决于任务)。现在我们有两个方程式: (1)n的复杂度为M * (n²d + nd²)(2)pn的复杂度为M/p * ((pn)²d + (pn)d²) 经过一系列简化和除法,得到比值(2)/(1)的近似为 (d + p*n)/(d + n)。 如果 d n时,速度瓶颈不在注意力层,而是在前馈层(feedforward)和投影层。减少浮点运算的常见方法是采用某种条件计算,避免将所有模型参数应用于输入序列的所有词元。 在上文“稀疏注意力”部分探讨了一些更重要的词元。顺着这一思路,在CoLT5论文(https://arxiv.org/pdf/2303.09752.pdf)中,作者将所有前馈和注意力计算划为两个分支:重型分支(heavy)和轻型分支(light)。轻型层应用于所有词元,而重型层仅应用于重要的词元。 “轻型和重型前馈分支仅在其隐藏层维度上有所不同,其中轻型分支的隐藏层维度小于标准T5前馈层,而重型分支的隐藏维度更高。” 这一方法已被证明在处理长达64K个输入词元的极长序列时,无论速度还是准确性都优于现有的LongT5模型。 一个带条件计算的CoLT5 Transformer层概述。所有词元都经轻量级注意力和多层感知器(MLP)层处理,q路由的查询词元在v路由的键值词元上执行更重的注意力计算,而m路由的词元则经过一个更重的多层感知器层处理。 [技巧6] 大型内存GPU 这并不算一个技巧,而是一个必要条件。为了容纳大量上下文,需要大型内存GPU,因此通常使用80GB的A100 GPU。 5. 结论 现在可以猜测到,这些拥有数十亿参数的大型语言模型是如何在65-100K个词元的超大上下文窗口中进行训练的。 看到优秀的研究人员从不同的角度解决同一问题,不断进行优化并提出精彩的想法,真是令人鼓舞。大家的共同努力造就了这一具有重要意义的优雅解决方案。 我喜欢其中一位研究人员关于训练语言大模型的说法:“从来没有所谓的‘秘密武器’,只有仔细深入的研究。” 参考文献 [1] Introducing 100K Context Windows by Antropic(https://www.anthropic.com/index/100k-context-windows) [2] MPT-7B by MosaicML(https://www.mosaicml.com/blog/mpt-7b) [3] Palm-2 Technical report by Google(https://ai.google/static/documents/palm2techreport.pdf) [4] ALiBI: Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation(https://arxiv.org/abs/2108.12409) [5] FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness(https://arxiv.org/abs/2205.14135) [6] Multi-Query attention: Fast Transformer Decoding: One Write-Head is All You Need(https://arxiv.org/pdf/1911.02150.pdf) [7] Attention is All You Need(https://arxiv.org/abs/1706.03762) [8] Video on Positional Sinusoidal Embedding(https://www.youtube.com/watch?v=dichIcUZfOw&ab_channel=HeduAI) [9] Overview of the FlashAttention paper(https://shreyansh26.github.io/post/2023-03-26_flash-attention/) [10] Sliding Window Attention(https://paperswithcode.com/method/sliding-window-attention) [11] Constructing Transformers For Longer Sequences with Sparse Attention Methods(https://shreyansh26.github.io/post/2023-03-26_flash-attention/) [12] FlashAttention implementation in Triton language(file:///C:/Users/Administrator/Desktop/%E4%B8%8B%E7%8F%AD%E4%BA%A4.docx#L584) [13] How to Accelerate HuggingFace Throughput by 193% with Triton and ClearML(https://clear.ml/blog/increase-huggingface-triton-throughput-by-193/) [14] ClearML Serving(https://github.com/allegroai/clearml-serving) [15] Analyzing the Pros and Cons of NVIDIA Triton Inference Server vs. Other Inference Engines(https://ts2.space/en/nvidia-triton-inference-server-vs-other-inference-engines-which-is-best-for-your-project/) [16] COLT5: Faster Long-Range Transformers with Conditional Computation(https://arxiv.org/pdf/2303.09752.pdf) [17] LongT5: Efficient Text-To-Text Transformer for Long Sequences(https://arxiv.org/abs/2112.07916) [18] PaLM(https://arxiv.org/pdf/2204.02311.pdf) [19] BigBird attention mechanism(https://arxiv.org/abs/2007.14062 '''
9.先看一下模型基于原本知识的回答
display_answer("想要增强大语言模型的上下文窗口,可以使用哪些技术手段?")
要提高大语言模型的上下文窗口,可以使用以下技术手段: 上下文池(Context Pooling):将过去对话中的上下文信息存储在一个集合中,以便更好地处理当前对话。 上下文过滤(Context Filtering):通过对当前对话的文本进行预处理,提取出与上下文相关的信息,用于更好地理解当前对话。 上下文嵌入(Context Embedding):将上下文信息嵌入到当前对话的文本中,以便更好地处理上下文信息。 上下文聚合(Context Aggregation):将多个上下文信息进行聚合,以获得更全面的上下文信息。 对话历史(Dialogue History):通过记录对话历史,以便更好地理解上下文信息,并动态地更新当前对话的上下文。 语言模型架构优化(Language Model Architecture Optimization):通过优化语言模型的架构,以提高其处理上下文信息的能力。 训练数据增强(Training Data Enrichment):通过对训练数据进行增强,以增加训练数据的多样性,从而提高模型的泛化能力。 领域自适应(Domain Adaptation):通过在不同的领域进行训练,以提高模型对不同领域的适应能力,并更好地处理上下文信息。
10.注入文章内容后的回答
history = display_answer(prompt + "\n 根据这篇文章内容,请回答我的问题:想要增强大语言模型的上下文窗口,可以使用哪些技术手段?")
为了增强大语言模型的上下文窗口,你可以尝试以下技术手段: 增加上下文长度:通过增加输入序列的上下文长度,可以让模型在推理过程中处理更多的上下文信息,从而提高模型的性能。 使用多头注意力:多头注意力可以让模型在处理问题时从多个角度进行思考,能够更好地处理上下文信息。 启用条件计算:条件计算可以让模型在处理问题时使用上下文信息,从而提高模型的性能。 使用稀疏注意力:稀疏注意力可以让模型在处理问题时只关注重要的信息,从而减少计算量,提高模型的性能。 减小注意力头大小:减小注意力头大小可以让模型在推理过程中使用更多的上下文信息,从而提高模型的性能。 增加可训练的参数数量:增加可训练的参数数量可以让模型在训练过程中学习更多的知识,从而提高模型的性能。 这些技术手段的具体实现可能因具体情况而异,需要根据具体情况进行选择和调整。
11.测试完毕释放显存资源
(base) ai001@CHINAMI-I6IUQDH:~$ nvidia-smi Thu Apr 4 14:14:15 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.104.07 Driver Version: 537.34 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA GeForce RTX 3060 Ti On | 00000000:04:00.0 On | N/A | | 0% 49C P8 10W / 200W | 938MiB / 8192MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce RTX 3060 On | 00000000:07:00.0 Off | N/A | | 0% 39C P8 6W / 170W | 12115MiB / 12288MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | 0 N/A N/A 38 G /Xwayland N/A | | 0 N/A N/A 206890 C /python3.9 N/A | | 1 N/A N/A 38 G /Xwayland N/A | | 1 N/A N/A 206890 C /python3.9 N/A | +---------------------------------------------------------------------------------------+ (base) ai001@CHINAMI-I6IUQDH:~$ kill -9 206890 (base) ai001@CHINAMI-I6IUQDH:~$ nvidia-smi Thu Apr 4 14:14:31 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.104.07 Driver Version: 537.34 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA GeForce RTX 3060 Ti On | 00000000:04:00.0 On | N/A | | 0% 49C P8 10W / 200W | 930MiB / 8192MiB | 2% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ | 1 NVIDIA GeForce RTX 3060 On | 00000000:07:00.0 Off | N/A | | 0% 39C P8 6W / 170W | 0MiB / 12288MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | 0 N/A N/A 38 G /Xwayland N/A | | 1 N/A N/A 38 G /Xwayland N/A | +---------------------------------------------------------------------------------------+ (base) ai001@CHINAMI-I6IUQDH:~$