Mistral 7B 是一款新型大语言模型,拥有惊人的7.3万亿参数,其性能甚至超越了拥有13万亿参数的Liama2。
在所有测试基准中,Mistral 7B 的表现均优于先前的最佳13B模型(即Llama 2),并且在数学及代码生成能力上,它还超越了表现最佳的34B模型(即LLaMa 34B)。此外,Mistral 7B 在编码性能上几乎能与Code-Llama 7B相媲美,同时并未在非代码相关基准上的性能上有所妥协。Mistral 7B 引入了分组查询注意力(GQA)和滑动窗口注意力(SWA)两种机制。GQA 显著提升了推断速度,并在解码过程中降低了内存需求,从而能够支持更大的批处理,提高吞吐量,这对于实时应用场景尤为重要。而SWA 则旨在以更低的计算成本更有效地处理长序列,从而解决了大型语言模型(LLM)在处理长序列时常见的限制。这两种注意力机制共同推动了Mistral 7B 在性能和效率上的显著提升。
模型论文可见Mistral 7B。
Mistral 7B 基于 transformer 架构,下图将展示该架构的主要参数。
滑动窗口注意力(SWA)机制通过transformer的堆叠层来捕捉超出窗口大小W范围的信息。具体来说,在层k中位置i的隐藏状态hi会关注前一层中位置介于i-W到i之间的所有隐藏状态。通过这种方式,hi能够递归地访问到输入层中距离W×k个标记的标记。在transformer的最后一层,当窗口大小W设置为4096时,理论上hi的注意力跨度可以达到大约131,000个标记。
在实际应用中,对于长度为16,000的序列和窗口大小W=4096,通过对FlashAttention和xFormers进行改进,相较于普通的注意力模型,SWA机制实现了2倍的速度提升。
此外,SWA机制还引入了一个滚动缓存缓冲区来优化内存使用。由于注意力跨度是固定的,因此可以使用一个大小为W的滚动缓冲区来存储键和值。在时间步i时,键和值会被存储在缓存的位置i mod W中。这样,当位置i超过W时,缓存中的旧值会被新值覆盖,从而确保缓存的大小不会无限制地增长。以一个窗口大小W=3的示例来说,在长度为32,000的序列上,这种方法可以将缓存的内存使用量减少8倍,同时保持模型的性能不变。
预先填充和分块。在生成序列时,我们需要逐个预测标记,因为每个标记都取决于前面的标记。然而,提示是预先知道的,我们可以使用提示来预先填充 (k, v) 缓存。如果提示非常大,我们可以将其分成较小的块,并使用每个块来预先填充缓存。为此,我们可以将窗口大小选择为我们的块大小。对于每个块,我们需要计算缓存和块上的注意力。图3展示了注意力掩码如何作用于缓存和块上。
首先安装所需要的依赖,推荐新建 conda 环境安装。
# 确保安装了 cuda 版的 pytorch, 如果已经安装了忽视这条
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
pip install -r ./requirements.txt
须在 linux 环境下运行,因为 Windows 下 bitsandbytes 包为 bitsandbytes-windows 会造成 transfromers 包无法正常识别,且 Windows 没有 Flash Attention。
在此处下载模型,解压到 7b-v0.1-hf/1。
运行 infer.py,输入你想使用的prompt,即可得到模型的回复。推理部分可在 Windows 下进行,速度稍慢些但可以正常走完。
python infer.py --prompt="As a data scientist, can you explain the concept of regularization in machine learning?"
使用准备好的数据集(位于dataset,mlabonne/guanaco-llama2-1k)微调模型。你也可以使用自己的数据集,打开train.py 编辑dataset 的路径即可。
该数据的风格为指令由 [INST] [/INST] 包围,进行微调后,模型便可以很好地处理类似的prompt。
运行train.py 。
python train.py
微调后的模型可以使用 PeftModel 连接 adapter,重新进行推理。所有代码已经准备在adapter.py中,运行即可,输入数据集风格的 prompt。
python adapter.py --prompt="<s>[INST] How become a certified data professional [/INST]"
编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!