该示例用的谷歌的gemma-2b-it模型
Gemma是Google的一系列轻量级、最先进的开源模型,基于用于创建Gemini模型的相同研究和技术构建。它们是文本到文本、仅解码的大型语言模型,提供英文、开源权重、预训练变体和指令调优变体。Gemma模型非常适合各种文本生成任务,包括问答、摘要和推理。其相对较小的体积使其可以在资源有限的环境中部署,如笔记本电脑、台式机或您自己的云基础设施,使每个人都能访问最先进的AI模型,促进创新。
我们第一步先试着来跑通它。
1、在CPU上运行模型
一、从transformers库中导入AutoTokeniser和AutoTokenizer和AutoModelForGausalLM,同时导入torch以使用PyTorch的功能。
二、加载预训练模型和分词器:
1、tokenizer加载gemma-2b-it模型的分词器。
2、model:加载因果语言模型,指定张量的数据类型为torch.bfloat16,这是一种16位浮点类型,比标准的32位浮点数更节省内存。
三、准备输入文本:脚本使用字符串“Write me a poem about Machine Learning”,并通过分词器将其转换为模型能理解的输入ID
四、调用model.generate函数,并传入输入ID,它使用模型生成文本。
五、解码并打印输出:使用分词器的decode函数将生成的输出(一系列ID)解码回可读的字符串。
2、在单个/多个GPU上运行模型
加载预训练模型和分词器:加载模型时,使用了device_map=“auto”参数,这允许库自动选择可用的设备(如GPU)来运行模型。同时,指定了torch_dtype=torch.bfloat16来使用16位浮点数。
将输入文本转换为张量并移动到GPU:在生成输入ID之后,使用.to(“cuda”)将张量移动到GPU上,以加速模型的生成过程。
生成文本:调用model.generate函数,并传入转换后的输入张量。
3、在GPU上使用不同的精度运行模型
此模型的原生权重以 `bfloat16`精度导出。您可以使用 `float16`,这在某些硬件上可能更快,加载模型时指明 `torch_dtype` 即可。
确保您的机器上安装了NVIDIA的CUDA工具包,并且Pytorch支持CUDA,因为脚本使用了.to(“cuda”)将模型和数据移动到GPU上运行。
device_map=“auto”和torch.float16参数用于自动选择设备并使用16位浮点数来减少内存使用并可能加速计算。
revision=“float16”指定了使用特定版本的模型,这个版本支持16位浮点数。
4、使用 bitsandbytes 实现8位整数(int8)量化版本
创建了一个BitsAndBytesConfig对象,并将load_in_8bit设置为True,以启用8位整数量化。
使用AutoModelForCausalLM.from_pretrained加载模型,并传递量化配置。
5、使用 4-bit precision
使用4位精度(int4)量化来优化模型的内存占用和推理速度。
总而言之,讲讲为什么要量化?
1、减少内存占用:量化可以显著减少模型参数所需的存储空间。4位量化意味着每个权重和激活值使用更少的比特来表示,从而减少模型大小。
2、加速推理:量化可以提高模型的推理速度。在某些硬件上,特别是那些优化了低精度计算的硬件,量化后的模型可以更快的执行
3、降低能耗:量化后的模型由于计算需求降低,可能在运行时消耗更多的能源,这对于移动设备和边缘设备尤其重要。
4、提升吞吐量:在服务器或GPU上,量化可以提高模型的吞吐量,因为量化模型通常比32位浮点运算更快。
5、硬件兼容性:一些硬件加速器和特定处理器对低精度运算有特别的优化,量化模型可以更好地利用这些硬件特性。
然而,4位量化也带来了一些挑战:
1、牺牲精度:量化到4位精度可能会导致模型精度的显著下降,因为可用的表示范围非常有限。
2、量化噪声:量化可能会引入噪声
3、模型微调:量化后的模型可能需要额外的微调来恢复性能,这需要额外的微调来恢复性能,这需要额外的训练时间和计算资源。
4、兼容性问题:并非所有的深度学习框架和硬件都支持4位量化,这可能限制了量化模型的部署选项。
其他优化
Flash Attention 2
安装Flash Attention库:Flash Attention是一种高效的注意力机制实现,旨在加速Transformer模型中的自注意力计算。Flash Attention 2是该技术的第二代版本,它进一步优化了性能和内存使用。
使用transformers
库中的AutoModelForCausalLM里的
from_pretrained方法来加载预训练模型,并指定模型ID。同时,设置torch_dtype=torch.float16来使用16位浮点数,这有助于减少模型大小和加速计算。
在加载模型时,通过设置attn_implementation="flash_attention_2"
来启用Flash Attention 2。
使用.to(0)
将模型移动到第一个GPU设备上。如果您的系统有多个GPU,您可以选择适当的设备编号。
聊天模板
指令调优模型使用聊天模板,必须遵守以进行对话使用。最简单的方法是使用标记器的内置聊天模板,如下片段所示。
让我们加载模型并将聊天模板应用于对话。在此示例中,我们将从单个用户交互开始:
创建聊天模板:chat列表包含了一个字典,其中指定了角色(role
)和内容(content
)。
应用聊天模板:使用分词器的apply_chat_template
方法将聊天模板应用于对话,tokenize=False
表示不对输入内容进行分词,add_generation_prompt
表示添加生成提示。
构建提示文本:应用聊天模板后,prompt
变量包含了格式化的文本,每个角色的回合都由特定的标记包围。
生成文本: 使用分词器的encode
方法将提示文本编码为模型可以理解的输入ID,设置add_special_tokens=False
以避免添加额外的特殊标记。然后,使用模型的generate
方法生成文本,max_new_tokens
指定了生成的最大新令牌数。
模型生成输出: outputs
变量包含了模型生成的文本的ID,可以通过分词器的decode
方法将其解码回文本。