量化虽然显著减少了内存占用,并能加速单个操作的计算,但在服务大型语言模型 (LLM) 时,要实现高吞吐量会带来额外难题,尤其是在并发请求的内存管理方面。传统方法常遇到内存碎片和低效批处理的问题。在此,vLLM 等专用推理引擎显得尤其有价值。vLLM 是一个开源库,专门用于快速且内存高效的 LLM 推理,使其成为在重负载下部署量化模型的理想选择。LLM 服务中的内存瓶颈服务 LLM 涉及管理大型张量,特别是注意力机制所需的键值 (KV) 缓存。每个用户请求都会生成自己的 KV 缓存,该缓存会随生成的序列长度增加。在高并发环境里,高效管理这些缓存很困难:内存碎片: 传统系统通常会为每个序列的 KV 缓存预分配大块的连续内存空间。这可能导致严重的内部碎片(已分配块中未使用的内存)和外部碎片(已分配块之间无法使用的空闲内存),限制系统能处理的并发请求数量。低效批处理: 静态批处理将请求分组,但需要将较短序列填充到批处理中最长序列的长度。整个批处理必须等待最慢的序列完成其生成步骤,导致 GPU 利用率不足。vLLM 的解决方案:分页注意力vLLM 通过其核心创新:分页注意力 (PagedAttention),直接解决了这些内存难题。受操作系统中虚拟内存和分页技术的启发,分页注意力将 KV 缓存管理在称为“页”的非连续内存块中。与为每个序列分配一个大块内存不同,序列的 KV 缓存存储在可能许多更小的、固定大小的块中。块表将逻辑块(序列缓存中的位置)映射到物理块(GPU 内存中的实际位置)。这种方法有以下几个优点:接近零碎片: 由于块是按需分配且无需连续,因碎片造成的内存浪费大大减少。一个 4MB 的块可能只在末尾浪费几 KB,而连续分配方案中可能浪费数兆字节。高效内存共享: 分页注意力促进了高级内存共享策略,如写时复制。例如,从相同提示生成的多个输出可以共享与提示 KV 缓存对应的内存块,直到某个序列出现分歧,此时只需复制不同的块。实现连续批处理分页注意力的高效内存管理直接促成了一种更动态、更有效的批处理策略,称为连续批处理。与静态批处理不同,连续批处理允许推理引擎以更细粒度的步骤运行。当当前批处理中的序列完成生成时,它会立即从批处理中移除,其内存资源(物理块)被回收。调度器可以立即将新的等待请求插入批处理中,确保 GPU 尽可能持续接近其最大能力进行处理。这消除了与等待静态批处理中最慢序列相关的空闲时间,并大幅提升了整体 GPU 利用率,从而提高吞吐量。digraph G { rankdir=TB; node [shape=box, style=rounded, fontname="sans-serif", margin=0.2]; edge [fontname="sans-serif"]; subgraph cluster_static { label = "静态批处理"; bgcolor="#e9ecef"; style=filled; node [fillcolor="#ffc9c9"]; sb_req1 [label="请求 1 (短)"]; sb_req2 [label="请求 2 (长)"]; sb_req3 [label="请求 3 (中)"]; sb_batch [label="批处理 (等待请求 2)", shape=cylinder, fillcolor="#ced4da"]; sb_req1 -> sb_batch; sb_req2 -> sb_batch; sb_req3 -> sb_batch; sb_batch -> sb_gpu [label="GPU 处理 (空闲时间)", style=dashed]; sb_gpu [label="GPU", shape=doublecircle, fillcolor="#adb5bd"]; } subgraph cluster_continuous { label = "连续批处理 (vLLM)"; bgcolor="#e9ecef"; style=filled; node [fillcolor="#a5d8ff"]; cb_req1 [label="请求 1"]; cb_req2 [label="请求 2"]; cb_req3 [label="请求 3"]; cb_req4 [label="请求 4 (新)"]; cb_engine [label="vLLM 引擎\n(分页注意力)", shape=cylinder, fillcolor="#74c0fc"]; cb_req1 -> cb_engine; cb_req2 -> cb_engine; cb_req3 -> cb_engine; cb_engine -> cb_gpu [label="GPU 处理\n(高利用率)"]; cb_gpu [label="GPU", shape=doublecircle, fillcolor="#4dabf7"]; cb_req4 -> cb_engine [label="当请求 1 完成时\n添加请求 4", style=dashed]; } }静态批处理常导致 GPU 空闲,等待最长序列完成,而 vLLM 的连续批处理通过使用分页注意力动态管理请求,使 GPU 保持忙碌。vLLM 在量化模型中的使用vLLM 原生支持与 LLM 相关的常见量化方法,例如激活感知权重量化 (AWQ) 和 GPTQ。这意味着您可以将量化带来的模型大小减小和潜在的计算加速,与分页注意力和连续批处理带来的吞吐量提升结合起来。在 vLLM 中加载量化模型通常很简单。该库通常会根据模型文件自动检测量化类型,或允许明确指定。这是一个使用 vLLM Python API 加载并运行 AWQ 量化模型推理的示例:from vllm import LLM, SamplingParams # 指定量化模型的路径或 Hugging Face 标识符 # vLLM 通常会自动检测 AWQ/GPTQ 格式 model_id = "your-org/your-quantized-model-awq" # 定义生成采样参数 sampling_params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=100) # 初始化 vLLM 引擎 # 如果自动检测失败,明确设置 quantization='awq' # tensor_parallel_size 可用于多 GPU 推理 llm = LLM(model=model_id, quantization="awq", # 通常可选,取决于模型格式 trust_remote_code=True, # 某些模型必需 # tensor_parallel_size=2 # 2 块 GPU 示例 ) # 准备提示(可以是列表用于批处理) prompts = [ "vLLM 中 PagedAttention 的原理是什么?", "量化 LLM 提供的好处包括", ] # 运行推理 outputs = llm.generate(prompts, sampling_params) # 打印结果 for output in outputs: prompt = output.prompt generated_text = output.outputs[0].text print(f"Prompt: {prompt!r}") print(f"Generated: {generated_text!r}\n") # 对于服务,vLLM 还提供一个兼容 OpenAI 的服务器: # python -m vllm.entrypoints.openai.api_server --model your-org/your-quantized-model-awq --quantization awq此示例演示了如何加载 AWQ 模型。GPTQ 模型的处理过程类似,通常只需更改 quantization 参数或依赖自动检测。性能提升与注意事项通过采用分页注意力和连续批处理,vLLM 在处理高并发和可变序列长度时,通常能实现显著更高的吞吐量(按每秒请求数或每秒 token 数衡量),与基线 Hugging Face transformers 实现或 TGI 等其他优化服务器相比。在服务量化模型时,其优势尤为明显,因为每个序列的内存占用更低,允许同时批处理更多请求。{"layout": {"title": "示意性吞吐量:量化 LLM 服务", "xaxis": {"title": "部署方法"}, "yaxis": {"title": "吞吐量 (请求/秒)"}, "barmode": "group", "font": {"family": "sans-serif"}}, "data": [{"type": "bar", "name": "低并发", "x": ["HF Transformers", "TGI", "vLLM (量化)"], "y": [10, 15, 18], "marker": {"color": "#74c0fc"}}, {"type": "bar", "name": "高并发", "x": ["HF Transformers", "TGI", "vLLM (量化)"], "y": [12, 35, 80], "marker": {"color": "#4263eb"}}]}示意性比较,说明了 vLLM 潜在的吞吐量提升,特别是在高并发情况下,服务量化模型时。实际性能因模型、硬件和工作负载而异。请注意:兼容性: 确保您使用的 vLLM 版本支持特定的量化格式和模型架构。硬件: 性能提升在很大程度上取决于可用的 GPU 硬件。工作负载: vLLM 在提示和生成长度可变、请求量大的动态工作负载下表现出最显著的提升。总而言之,vLLM 为服务 LLM 提供了一个强大的引擎,其通过分页注意力和连续批处理实现的复杂内存管理使其非常适合部署量化模型。通过使用 vLLM,您可以最大化量化 LLM 的吞吐量,同时服务更多用户并有效使用您的硬件资源。量化与高级服务技术的这种结合对于构建可扩展且经济高效的 LLM 应用程序必不可少。