cxl
Published on 2025-04-17 / 440 Visits
21
0

探索vLLM:开源跨平台大模型工具的无限可能

在人工智能领域,每一次技术的革新都预示着新的可能性和机遇。继 ollama 之后,VLLM作为新一代开源跨平台大型模型工具,正以其独特的魅力和强大的功能,吸引着全球开发者与研究者的目光。

vLLM 是什么?​​

vLLM​ 是一个专为大规模语言模型(LLM)推理和部署优化的开源框架,由加州大学伯克利分校的研究团队开发。它通过创新的显存管理技术和高效的并行计算策略,显著提升了模型推理速度、吞吐量和显存利用率,尤其适合在生产环境中部署千亿参数级别的模型(如 Llama、GPT、Mixtral 等)。发现一个比较有意思的事情,就是vLLM中的v存在歧义,官网没查出来,查了许多资料都没有确定这个V到底指的是什么,有说是virtual虚拟的、有说是very很大的、也有说是visual可视化的,甚至连百度查询多次都有不同答案的,让我越查越懵哈哈哈。。。

为什么需要 vLLM?​​

在大语言模型时代,开发者面临两大核心挑战:

  1. 显存爆炸
    传统框架(如 HuggingFace Transformers)加载模型时,显存占用极高。例如,一个 70B 参数的模型需要 140GB 显存,远超单张 GPU 的容量。

  2. 推理效率低下
    静态批处理(Static Batching)导致 GPU 空闲等待,高并发场景下吞吐量骤降,无法满足实时性要求(如客服机器人)。

vLLM 的解决方案​:

  • 显存利用率提升至 ​90%+​,支持在单卡运行更大的模型。

  • 吞吐量达到传统框架的 ​2-4 倍,每秒处理数百请求。

  • 完全兼容 OpenAI API 协议,无缝对接现有 AI 应用生态。

vLLM 的三大核心技术​

​PagedAttention:显存管理的革命​

  • 问题​:传统框架的 KV Cache(键值缓存)造成显存碎片化,类似手机内存被零散占用。

  • 突破​:将 KV Cache 划分为可动态分配的“内存块”,模仿操作系统的虚拟内存分页机制。

  • 效果​:

    • 显存浪费减少 ​70%​,支持超长上下文(如 32K tokens)。

    • 允许多个请求共享显存块,提升并发能力。


(动态分配显存块,支持并行处理多个请求)

连续批处理(Continuous Batching)​​

  • 传统瓶颈​:静态批处理要求所有请求同时开始和结束,导致 GPU 空闲。

  • vLLM 方案​:动态合并处于不同生成阶段的请求,让 GPU 始终满载运行。

  • 结果​:

    • 吞吐量提升 ​3-6 倍,尤其适合高并发场景(如聊天机器人)。

    • 平均响应延迟降低 ​50%​

硬件优化与量化支持​

  • 多硬件适配​:

    • 支持 NVIDIA/AMD GPU、CPU 卸载、多卡张量并行。

    • 自动优化底层计算内核(如 FlashAttention-2)。

  • 量化技术​:

    • 支持 4-bit AWQ、3-bit GPTQ 量化,显存需求降低 ​40-70%​

    • 例如:70B 模型从 140GB → ​40GB​(AWQ 量化)。

vLLM 的典型应用场景​

场景

传统方案痛点

vLLM 解决方案

高并发聊天机器人

响应慢,吞吐量不足

连续批处理提升并发至 1000+ QPS

长文本生成

显存不足,无法生成长内容

PagedAttention 支持 32K+ tokens

企业模型服务

部署成本高,扩展性差

多 GPU 并行 + 量化降低硬件成本

实时翻译/摘要

延迟高,无法实时处理

吞吐量提升 4 倍,延迟低于 200ms

vLLM vs. 传统框架​

特性

vLLM

HuggingFace Transformers

TensorRT-LLM

显存效率

⭐⭐⭐⭐⭐(PagedAttention)

⭐⭐(静态分配)

⭐⭐⭐⭐(静态优化)

吞吐量

⭐⭐⭐⭐⭐(连续批处理)

⭐⭐(静态批处理)

⭐⭐⭐(动态批处理)

部署便捷性

⭐⭐⭐⭐(OpenAI 兼容)

⭐⭐⭐(需自行封装 API)

⭐⭐(依赖复杂编译)

模型支持

1000+ HuggingFace 模型

所有 HuggingFace 模型

需手动转换模型格式

生产级扩展

多 GPU/多节点、Docker 部署

需额外开发

依赖 Triton 推理服务器

vLLM安装与使用

vLLM 是一个 Python 库,包含预编译的 C++ 和 CUDA (12.1) 二进制文件。

依赖环境

  • 操作系统:Linux

  • Python:3.8 - 3.12

  • GPU:计算能力 7.0 或更高(例如 V100、T4、RTX20xx、A100、L4、H100 等)

以下使用 anaconda 方式创建新环境安装

  conda create -n vllm python=3.12 -y
  conda activate vllm
  pip install vllm  # 下载速度慢的话记得加上镜像源 -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
  pip install modelscope 

下载模型保存到本地,我挑了个deepseek的蒸馏版本下载:https://modelscope.cn/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B,进入python环境执行以下命令

  #模型下载到本地。
  from modelscope import snapshot_download
  model_dir = snapshot_download('deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B',cache_dir="/root/llm/models")

下载完成后查看保存目录,然后使用vllm运行

  ls /root/llm/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B
  vllm serve /root/llm/models/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B

不过很尴尬,报错了查了一下AI,说是没有C语言相关编译环境,安装一下就好了

  sudo apt-get install build-essential

于是接着重新运行 vllm serve语句,又报错又AI了一把,说是要调大这个 gpu_memory_utilization 的参数值,最大是1,最小是0,大致意思是能用到显存的百分比是多少,默认值是0.9,即90%,于是我调到0.95后重新运行,还是一样,再调到0.99再试,还是一样,哪怕根据提示调整 max_model_len的值也一样,最终我发现调这些没用,因为即使全部显存(6G)都不够运行这个模型的,查了一下需要16G~_~根本原因还是超纲了,于是我换成另外一个模型 Qwen/Qwen2.5-0.5B-Instruct ,最终成功运行

客户端测试

  from openai import OpenAI
  client = OpenAI(
      base_url="http://192.168.3.77:8000/v1",   # 这里如果使用 localhost 或 127.0.0.1 报错拒绝连接的话就用具体IP
          api_key="token-abc123"
  )
  completion = client.chat.completions.create(
          model="/root/llm/models/Qwen/Qwen2.5-0.5B-Instruct",
          messages=[
                  {"role": "user", "content": "请使用java编写堆排序!"}
          ]
  )
  print(completion.choices[0].message)

我将上述代码写进test.py文件保存执行后正常打印输出


Comment