# Summary 推理框架对速度的影响**非常大**,特别是在批量推理场景下。vLLM通常能带来**5-24倍**的速度提升。 - **Transformers**: 通用[[PyTorch]]操作 - **vLLM**: 定制 [GPU Kernel 内核](GPU%20Kernel%20内核.md),针对[[LLM]]推理优化 # Cues [vLLM](vLLM.md) [[Transformers]] # Notes ## Transformers vs vLLM 推理速度对比 推理框架对速度的影响**非常大**,特别是在批量推理场景下。vLLM通常能带来**5-24倍**的速度提升。 ### 📊 性能差异对比 |**性能指标**|**Transformers**|**vLLM**|**速度差异**| |---|---|---|---| |**吞吐量**|10-50 tokens/s|200-1000+ tokens/s|**5-20倍**| |**首token延迟**|200-500ms|50-150ms|**3-4倍**| |**批处理效率**|低(静态batch)|高(连续批处理)|**10-15倍**| |**内存利用率**|30-50%|80-95%|**2倍**| |**并发请求处理**|串行/简单并行|高效并发|**8-12倍**| ### 🚀 vLLM 速度优势的核心技术 #### 1. **PagedAttention(分页注意力)** ```python # Transformers: 为最长序列预分配内存 # 内存浪费严重,特别是变长输入 KV_cache = torch.zeros(batch_size, max_seq_len, ...) # 大量浪费 # vLLM: 动态分配,按需使用 # 类似操作系统的虚拟内存管理 KV_cache = PagedKVCache() # 只分配实际使用的部分 ``` #### 2. **连续批处理(Continuous Batching)** ```python # Transformers: 静态批处理 # 必须等最慢的样本完成 batch = [sample1, sample2, sample3] # sample1完成后也要等其他 # vLLM: 动态批处理 # 完成的立即替换新请求 batch = DynamicBatch() # 持续保持GPU满载 ``` #### 3. **优化的CUDA Kernel** 优化的CUDA [GPU Kernel 内核](GPU%20Kernel%20内核.md) - **Transformers**: 通用PyTorch操作 - **vLLM**: 定制CUDA kernel,针对LLM推理优化 ### 📈 实际性能对比示例 以您的代码场景为例(批量处理测试集): |**场景**|**Transformers (方案1)**|**vLLM (方案2)**| |---|---|---| |**1000条数据**|~10-15分钟|~1-2分钟| |**10000条数据**|~100-150分钟|~10-15分钟| |**内存效率**|每条独立加载|批量复用| |**GPU利用率**|20-40%|80-95%| ### 💡 为什么差异这么大? #### **Transformers的瓶颈** ```python # 方案1的推理循环 for idx, row in test_df.iterrows(): # 串行处理 inputs = tokenizer(prompt) # CPU开销 outputs = model.generate() # GPU等待CPU # GPU空闲时间多,利用率低 ``` #### **vLLM的优势** ```python # 方案2的批量推理 outputs = llm.generate( prompts, # 一次性处理所有 use_tqdm=True, # GPU持续满载运行 ) ``` ### 🎯 适用场景建议 |**选择Transformers**|**选择vLLM**| |---|---| |✅ 原型开发和调试|✅ 生产环境部署| |✅ 单样本/少量推理|✅ 大批量推理| |✅ 需要灵活修改模型|✅ 追求最高吞吐量| |✅ 资源受限环境|✅ 有充足GPU资源| |✅ 简单部署需求|✅ 可接受复杂配置| ### 🔧 优化建议 如果必须使用Transformers,可以通过以下方式提速: ```python # 1. 批处理(而非逐条) batch_size = 8 for i in range(0, len(data), batch_size): batch = data[i:i+batch_size] outputs = model.generate(batch) # 2. 使用torch.compile (PyTorch 2.0+) model = torch.compile(model) # 3. 使用Flash Attention model.config.use_flash_attention_2 = True ``` 但即使做了这些优化,Transformers仍然难以达到vLLM的性能水平,特别是在大规模批量推理场景下。