模型经过微调和评估后,重心从训练性能转向推理效率。向用户提供模型服务的环境有不同于训练环境的制约因素。在生产环境中,低延迟、高吞吐量和尽可能小的内存占用是主要目标。本节介绍将微调模型从训练产物转化为可用于部署的高效资产的最后工程步骤。通过量化减小模型大小优化模型的一种非常有效的方法是量化。此过程涉及降低模型权重的数值精度。大多数模型使用32位浮点数(FP32)进行训练。量化将这些权重转换为较低精度格式,例如8位整数(INT8)甚至4位浮点数(FP4)。这种转换有两个主要益处:模型更小: 将精度从32位降至8位可以将模型的存储和内存占用量减少四倍。计算速度更快: 许多现代CPU和GPU执行整数运算的速度比浮点运算快得多,从而降低了推理延迟。虽然此过程可能导致模型准确性略有下降,但性能提升通常很可观,使其成为部署的标准做法。Hugging Face生态系统与bitsandbytes等库配合使用,使这变得直接简便。以下是如何加载一个8位量化模型:from transformers import AutoModelForCausalLM # 启用8位量化加载模型 model_name = "mistralai/Mistral-7B-v0.1" model_8bit = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", load_in_8bit=True ) print(model_8bit.get_memory_footprint())加载4位精度(由QLoRA普及)可提供更大的内存节省,并且也易于使用。from transformers import AutoModelForCausalLM, BitsAndBytesConfig # 配置4位量化 quantization_config = BitsAndBytesConfig(load_in_4bit=True) # 使用4位配置加载模型 model_4bit = AutoModelForCausalLM.from_pretrained( model_name, device_map="auto", quantization_config=quantization_config ) print(model_4bit.get_memory_footprint())下图显示了这种数据精度的降低。digraph G { rankdir=TB; node [shape=box, style="rounded,filled", fontname="Arial"]; edge [fontname="Arial"]; fp32 [label="FP32 权重\n(32位浮点数)", fillcolor="#a5d8ff"]; int8 [label="INT8 权重\n(8位整数)", fillcolor="#96f2d7"]; process [label="量化\n过程", shape=ellipse, fillcolor="#ffec99"]; fp32 -> process [label=" 高精度 \n 高内存 "]; process -> int8 [label=" 低精度 \n 低内存 "]; }量化过程将高精度浮点权重转换为较低精度格式,减少内存使用并通常加速计算。通过模型编译加速推理另一种高效的优化方法是模型编译。当你运行一个标准PyTorch模型时,Python解释器会引入额外开销。模型编译器将动态操作图转换为静态、优化的版本,该版本针对其运行的特定硬件进行调整。此过程可以涉及将多个操作融合成一个内核,从而最大程度地减少内存移动和计算开销。PyTorch 2.0 引入了 torch.compile(),这是一个提供先进编译技术的函数。应用它通常只需一行代码的修改,即可带来明显的速度提升。import torch from transformers import AutoModelForCausalLM # 加载你的微调模型 model = AutoModelForCausalLM.from_pretrained("./my-finetuned-model") model.to("cuda") model.eval() # 将模型设置为评估模式 # 编译模型 # 'max-autotune' 模式使编译器花费更多时间 # 寻找最快的可能内核。 compiled_model = torch.compile(model, mode="max-autotune") # 像往常一样使用编译后的模型进行推理 # 第一次运行会因为编译过程而变慢 # 后续运行会快得多。使用torch.compile()时,首次推理会较慢,因为模型在后台进行优化和编译。随后的调用将使用缓存的优化代码,运行速度会快得多。优化生成循环文本生成方式对性能有很大影响。transformers中的 generate() 方法高度可配置,有几个参数对推理速度特别有影响。一个影响很大的参数是 use_cache。在自回归模型中,每个新令牌都是基于所有先前生成的令牌生成的。注意力机制需要在每一步处理这个不断增长的序列。use_cache 参数(默认为 True)允许模型存储注意力层的内部状态(键值对)。对于下一个令牌,它只需计算最新令牌的注意力,而无需重新计算整个序列。禁用此缓存将大大减慢除最短输出之外的所有内容的生成速度。此外,使用贪婪解码(do_sample=False)比Top-K或核采样等采样方法更快,因为它避免了构建概率分布并从中采样的额外开销。导出为ONNX便携格式尽管编译后的PyTorch模型速度很快,但它仍然依赖于Python和PyTorch生态系统。为了实现最大的可移植性并使用专用、高性能的推理引擎,可以将模型导出为开放神经网络交换(ONNX)格式。ONNX为机器学习模型提供了一种标准化格式。一旦模型采用ONNX格式,您就可以使用ONNX兼容运行时(例如ONNX Runtime)来运行它。这些运行时用C++编写,并针对各种硬件进行了高度优化,包括CPU、GPU和专用AI加速器。transformers.onnx模块有助于此转换。from transformers.onnx import export, OnnxConfig from transformers import AutoTokenizer, AutoModelForCausalLM model_path = "./my-finetuned-model" onnx_path = "./my-finetuned-model-onnx" # 1. 加载分词器和模型 tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path) # 2. 定义ONNX配置 class MyOnnxConfig(OnnxConfig): @property def inputs(self): # 定义模型在ONNX图中的输入 return { "input_ids": {0: "batch_size", 1: "sequence_length"}, "attention_mask": {0: "batch_size", 1: "sequence_length"}, } # 3. 导出模型 onnx_config = MyOnnxConfig.from_model_config(model.config) export(tokenizer, model, onnx_config, onnx_config.outputs, onnx_path)此过程会生成一组.onnx文件,它们代表模型的计算图。然后,您可以使用ONNX Runtime或NVIDIA Triton Inference Server等推理服务器加载这些文件以进行生产部署。下图勾勒出一个完整的推理准备流程,从微调模型开始,到可部署的ONNX产物结束。digraph G { graph [fontname="Arial"]; node [shape=box, style="rounded,filled", fontname="Arial"]; edge [fontname="Arial"]; subgraph cluster_prep { label = "准备流程"; bgcolor="#e9ecef"; start_model [label="微调模型\n(.safetensors)", fillcolor="#d0bfff"]; quantized_model [label="量化模型\n(例如,到INT8)", fillcolor="#a5d8ff"]; onnx_model [label="导出到ONNX\n(.onnx)", fillcolor="#96f2d7"]; start_model -> quantized_model [label="步骤1:减小大小"]; quantized_model -> onnx_model [label="步骤2:转换格式"]; } subgraph cluster_deploy { label = "部署"; bgcolor="#e9ecef"; inference_server [label="推理服务器\n(ONNX Runtime, Triton)", shape=cylinder, fillcolor="#b2f2bb"]; } onnx_model -> inference_server [label="步骤3:部署"]; }为部署准备模型的典型流程包括可选的量化,然后转换为ONNX等标准格式,最后可通过专用推理引擎提供服务。通过应用这些技术,您可以将您的微调模型转变为能够处理生产工作负载的高效且可扩展的服务。每个步骤都在性能、大小和准确性之间提供权衡,使您能够根据特定的应用程序需求调整最终模型。