vLLM 是一个高吞吐量的 LLM 推理引擎,AWQ 是一种 4-bit 权重量化算法;合在一起就是:用 vLLM 加载并运行 AWQ 量化后的模型,以更小显存、更快速度跑大模型。

一、vLLM 是什么

  • vLLM:面向大语言模型(LLM)的高速推理/服务引擎,核心是 PagedAttention 技术,能显著提高吞吐、降低延迟。
  • 简单说:让 LLM 跑得更快、并发更高

二、AWQ 是什么

  • AWQ = Activation-aware Weight Quantization(激活感知权重量化)。
  • 属于后训练量化(PTQ),把模型权重从 FP16 压缩到 INT4,显存占用可减少约 75%,同时尽量保住精度。
  • 核心思路:
    1. 观察模型中间激活(activation)的分布;
    2. 找出对输出影响极大的少数关键权重(离群值);
    3. 保护这些关键权重不被过度量化,其他权重压到 4bit。

三、vLLM + AWQ = 干什么

  • vLLM 原生支持 AWQ 量化模型,直接加载即可,不用自己写复杂 CUDA 核。
  • 效果:
    • 显存占用↓:7B 模型从 ~13GB 降到 ~3–4GB;
    • 速度↑:比 FP16 快约 2–2.2 倍
    • 精度损失很小:通常保留 99%+ 原始能力。

四、怎么用(极简示例)

  1. 安装依赖
pip install vllm autoawq
  1. 直接加载 AWQ 模型(Hugging Face 上有大量现成 AWQ 模型)
from vllm import LLM

llm = LLM(
    model="TheBloke/Llama-2-7B-Chat-AWQ",
    quantization="awq"
)
output = llm.generate("Hello, what is AWQ?")

五、一句话总结

vLLM 负责跑得快,AWQ 负责装得下;vLLM+AWQ 就是在消费级显卡上高效跑大模型的主流方案。

那他为什么有算力架构的要求 不就是一些权重吗 直接加载不就行了吗

这是一个特别关键的误区:AWQ 不只是“存成 4bit 权重”,vLLM 也不只是“把权重读进来”
它俩真正要做的是:把 4bit 权重高速、正确地算完,这就必须依赖 GPU 硬件架构和专用加速核。下面把“为什么不能直接加载就行”讲透。


一、先澄清:AWQ 到底存了什么?

  • 你下载的 *-AWQ 文件:
    • 权重:INT4(4bit)
    • 同时还存了:缩放因子、分组信息、量化元数据
  • 并不是“简单压缩”,而是带结构的量化
    • 按通道/分组做了精细缩放
    • 保留了“重要权重”的精度
    • 推理时要实时反量化 + 矩阵乘法

结论: 它不是普通压缩包,加载后必须实时计算还原,不是直接就能用。


二、为什么需要“算力架构要求”?(核心)

1. INT4 矩阵乘法不是任何 GPU 都能高效做

大模型本质是超大矩阵乘法[N, K] × [K, M]

  • FP16:几乎所有 GPU 都能做
  • INT4
    • 老卡(Pascal、Maxwell,SM<7.5):没有原生 INT4 指令,只能用软件模拟 → 极慢、甚至不支持
    • 新卡(Ampere+,RTX 30/40、A100、H100,SM≥7.5):
      • Tensor Core / INT4 专用流水线
      • vLLM/AWQ 会调用 Marlin 内核、Triton 或 CUDA 汇编 来做加速

一句话:没有 SM7.5+,INT4 算不了,或者慢到不能用。

2. vLLM 不只是加载权重,它要做三件重活

  1. PagedAttention:显存管理 + KV Cache 动态分配
    要大量 显存带宽 + 原子操作,依赖 GPU L2、显存控制器
  2. INT4 → FP16 实时反量化
    每个前向都要做:INT4 权重 × 缩放因子 → FP16
    这是每个 token 都要算的密集操作
  3. 高度并行的矩阵乘法 + 动态批处理
    vLLM 要把多个请求拼成大 batch,吃满 GPU 算力

你以为是:读文件 → 放显存 → 跑。
实际是:读文件 → 解析量化结构 → 反量化 → 超大矩阵乘 → 动态显存管理 → 输出。

3. 为什么“直接加载不行”?

  • 就算你强行把 AWQ 权重加载到 CPU 或老 GPU:
    • 没有 INT4 硬件指令 → 用软件逐位解包 → 速度慢几十倍
    • 没有 Tensor Core → 矩阵乘法效率极低
    • vLLM 的 PagedAttention 依赖新 GPU 的显存原子指令 → 老卡直接报错或 OOM

结论:权重是 4bit,但计算必须用 FP16/FP32,且需要硬件加速。


三、具体架构要求是什么?

  • CUDA 算力(SM)≥ 7.5(Ampere 及以后)
    • ✅ RTX 30 系列、40 系列
    • ✅ A10、A30、A40、A100、H100
    • ❌ GTX 10 系列、Titan V、V100(SM7.0,不支持 AWQ-Marlin)
  • 显存 ≥ 10GB(7B 模型),越大越好
  • CUDA 11.8+ / 12.x(支持新内核)

四、打个通俗比喻

  • FP16 模型:一本大字书,普通桌子(老 GPU)能读,慢但能读
  • AWQ 4bit 模型:一本压缩成微缩字 + 带解密表的书
    • 必须用专用放大镜 + 高速解码机器(SM7.5+ GPU + vLLM 内核)
    • 直接扔老桌子上:字太小看不清、解密不会做 → 要么乱码,要么慢死

五、一句话总结

AWQ 是“带结构的 4bit 权重 + 必须实时反量化计算”,vLLM 是“依赖新 GPU 硬件加速的推理引擎”;不是“直接加载就行”,而是“加载后还要高速算”,所以必须要求 SM7.5+、INT4/Tensor Core 这些算力架构。

用一张表把 AWQ、GPTQ、bitsandbytes 的硬件要求、速度、精度做个对比,方便你选型?

v100 不打补丁,默认不支持awq

在这里插入图片描述

下面给你一张极简、实用、横向对比表,然后用几句话讲清楚怎么选(只讲最关键的,不堆公式)。


一、AWQ / GPTQ / bitsandbytes 核心对比(4bit)

1)硬件要求(最关键)

方案 必须算力(SM) 能否老卡(10系/V100) 显存(7B) 特点
AWQ 4bit ≥7.5(30/40系、A100) ❌ 不支持 3.5–4GB 硬件加速最强,vLLM原生支持
GPTQ 4bit ≥7.5(Marlin)/ ≥7.0(Exllama) ⚠️ 7.0可用但慢 3.5–4GB 优化成熟,Marlin速度略逊AWQ
bitsandbytes NF4 ≥7.0(基本都能跑) ✅ 能跑(慢) 4–5GB 对硬件最友好,不用预量化

一句话:老卡(10系/V100)只能用 bitsandbytes;新卡(30/40系)优先 AWQ > GPTQ


2)推理速度(7B,RTX4090,相对FP16)

方案 速度(tok/s) 相对FP16 备注
FP16 ~120 基线
AWQ 4bit ~260–290 2.2–2.4× vLLM+Marlin最快
GPTQ 4bit ~240–270 2.0–2.2× 接近AWQ,略低
bitsandbytes 4bit ~100–140 0.8–1.2× 基本不提速,有时更慢

3)精度损失(Llama2-7B,PPL越低越好)

方案 PPL(越低越好) 相对FP16损失 特点
FP16 6.2 0% 基线
AWQ 4bit 6.6 ~4% 4bit里精度最好
GPTQ 4bit 6.8 ~5–6% 略差于AWQ
bitsandbytes 4bit 7.3 ~15% 损失最大

代码生成/复杂推理:AWQ > GPTQ ≫ bitsandbytes


4)量化方式 & 易用性

方案 量化时机 是否要离线做 校准数据 适合
AWQ 离线 ✅ 要先量化 少量/可选 生产部署、vLLM服务
GPTQ 离线 ✅ 要先量化 必须(128–256样本) 本地推理、追求稳定
bitsandbytes 加载时动态 ❌ 不用预量化 不需要 快速测试、QLoRA微调

二、为什么 AWQ/GPTQ 必须要新架构?(再浓缩)

  • 它们不是“压缩”,是4bit权重 + 反量化 + 专用矩阵乘法
  • 只有 SM7.5+ 才有:
    • 原生 INT4 指令
    • Tensor Core 高速矩阵单元
    • vLLM 的 PagedAttention 原子操作
  • 老卡:只能用软件模拟 → 慢 5–10 倍,甚至不支持。

三、一句话选型建议

  • 新卡(30/40系、A100)+ vLLM 生产AWQ(最快、精度最高)
  • 新卡、不想折腾GPTQ(生态成熟)
  • 老卡(10系/V100)/ 快速测试 / 微调bitsandbytes(唯一能用,慢一点)

# 核心答案:不会立刻销毁,会缓存复用;但绝对不会长期存满显存

我用最直白、最底层的逻辑给你讲清楚 AWQ 4bit → 实时计算 → 权重去哪了,你一下就懂。


1. 先搞懂:实时计算到底算的是什么?

AWQ 模型存在显存里的是:

  • 4bit 压缩权重(很小,7B=3.5GB)
  • 缩放因子、量化表

推理时 实时计算 的是:

FP16 临时权重 = 4bit 权重 × 缩放因子

这个 FP16 临时权重 就是模型真正用来算矩阵乘法的东西。


2. 这个临时权重会销毁吗?

答案:不会马上销毁,但也不会永久占着显存

它遵循 GPU 计算的缓存机制

情况 A:同一层重复计算(同一个模型层)

  • 临时权重 会留在缓存里
  • 下一次 token 进来 直接复用
  • 不销毁、不重复计算 → 速度快

情况 B:算完这一层,去到下一层

  • 上一层的临时权重 会被覆盖/释放
  • 显存不会堆积
  • 永远只保留 当前正在计算的那一层的临时权重

情况 C:整个句子生成结束

  • 所有临时权重 全部销毁
  • 显存回到初始状态(只存 4bit 权重)

3. 最关键的结论(一定要记住)

AWQ 永远只在显存里存 4bit 原始权重,绝不保存完整的 FP16 权重!

如果它把实时计算出来的 FP16 权重都存着:

  • 7B 模型 → 立刻占 13GB 显存
  • 那量化就完全失去意义

所以它的策略是:

按需计算 → 用完即覆盖/释放 → 永远不保存完整权重


4. 用生活比喻让你秒懂

你可以把 AWQ 看作 开水机

  • 4bit 权重 = 桶装水(很小,一直放着)
  • 实时计算 = 烧开水(现烧现用)
  • 临时 FP16 权重 = 一杯热水
  • 用完 → 杯子空出来 → 下次再烧新的

绝对不会把所有水都烧开存着!


5. 最终极简总结

  • 4bit 权重:永久存在显存,不销毁
  • 实时计算的 FP16 临时权重
    • 计算时存在
    • 切换层时 覆盖/销毁
    • 推理结束 全部清空
  • 显存永远不会爆炸
  • 这就是 AWQ 省显存的核心原理

*显存占用动态变化图(超直观)

结合vLLM + AWQ 4bit推理流程,用阶段拆解+显存占用数值直观展示,以 Llama2-7B、RTX 显卡、默认推理场景为例,全程标注数据和内存变化。

基础参考:
完整FP16权重 ≈ 13GB
AWQ 4bit原始权重+量化参数 ≈ 3.5GB
单网络层反量化后临时FP16数据 ≈ 几百MB(远小于完整权重)


一、整体显存分区(常驻区 + 临时区)

GPU显存分为两块,职责完全分离:

  1. 常驻区(永久保留,推理全程不释放)
    存放:AWQ 4bit原始权重、缩放因子、量化元数据、模型配置、CUDA上下文
    占用:≈3.5GB
  2. 临时区(动态复用,用完即覆写/释放)
    存放:反量化得到的FP16临时权重、中间计算结果、激活值、KV Cache
    特点:不会一次性生成完整FP16模型,仅单层/局部数据

二、全流程显存动态变化(分阶段)

阶段1:模型加载完成,等待请求(空闲状态)

  • 常驻区:3.5GB(4bit权重+元数据)
  • 临时区:几乎为空,仅保留基础运行环境
  • 总显存占用:≈3.5GB
  • 状态:没有任何反量化操作,无FP16临时权重

阶段2:接收请求,开始推理(逐层计算)

大模型由数十层网络堆叠而成,推理按从上到下逐层执行

  1. 读取当前层的4bit权重 + 缩放因子
  2. 实时反量化 → 生成当前层专属FP16临时权重(≈几百MB)
  3. 执行矩阵乘法、激活等运算
  • 显存变化:
    常驻区:始终 3.5GB 不变
    临时区:加载当前层FP16数据,占用小幅上涨
  • 关键规则:
    ✅ 只生成当前正在计算的单层临时数据
    ❌ 不会把整个模型全部反量化成FP16

阶段3:切换网络下一层

  • 上一层的FP16临时权重直接被新数据覆盖(无额外销毁开销,显存原地复用)
  • 重复「读取4bit权重 → 反量化 → 计算」流程
  • 全程:临时区峰值始终控制在几百MB级别,不会累积

阶段4:单Token计算完成,生成下一个Token

vLLM 搭配 PagedAttention,会在临时区分配 KV Cache(保存上下文向量,提升并发/速度):

  • KV Cache 随生成长度缓慢占用显存(短句几十MB,长句几百MB)
  • 反量化逻辑不变:依旧是单层现算、用完即覆

此时总显存峰值
3.5GB(常驻) + 几百MB(临时权重) + 几百MB(KV Cache)
合计 ≈ 4~4.5GB

阶段5:整段文本生成结束(推理完毕)

  1. KV Cache、所有层的FP16临时权重、中间计算结果 全部释放
  2. 临时区回归空闲状态
  3. 常驻区 3.5GB 4bit权重 依然保留(下次请求直接复用,不用重新加载模型)
  • 回到空闲状态:总占用 ≈3.5GB

三、可视化简图(文字版,一目了然)

【空闲状态】
显存 [ 常驻区:3.5GB(4bit权重) ] + [ 临时区:空 ]
总占用:3.5GB

【推理中(计算第N层)】
显存 [ 常驻区:3.5GB(4bit权重) ] + [ 临时区:当前层FP16(几百MB) + KV Cache ]
总占用:4.0 ~ 4.5GB

【切换到第N+1层】
显存 [ 常驻区:3.5GB(4bit权重) ] + [ 临时区:新一层FP16(覆盖旧数据) + KV Cache ]
总占用:4.0 ~ 4.5GB

【生成结束】
临时区全部清空,回到空闲状态 → 总占用:3.5GB

四、核心要点复盘

  1. 永远不会出现完整FP16权重(13GB)
    这是量化省显存的核心,全程只在局部、单层做临时反量化。
  2. 临时数据不做“主动删除”,靠覆写复用
    GPU计算优先原地覆盖内存,效率远高于手动销毁。
  3. 4bit原始权重常驻显存
    避免重复加载模型,提升连续请求的响应速度。
  4. KV Cache是额外显存开销
    文本越长、并发数越高,这块占用越大,但和权重反量化无关。

补充对比(帮你加深理解)

如果不做量化,直接加载原生FP16模型:

  • 加载后常驻显存直接占用 13GB
  • 无需反量化,计算更快,但显存开销翻倍以上。

这里用结构化图文+ASCII示意图直观呈现,分显存分区、流转过程、对比图,一目了然。

一、显存分区静态图(常驻区 / 临时区)

以 Llama2-7B + AWQ 4bit 为例

┌─────────────────────────────────────────────────────┐
│                GPU 总显存空间                        │
│  ┌─────────────── 常驻区 (全程不释放) ─────────────┐  │
│  │ 4bit原始权重 + 量化参数 + 模型配置              │  │
│  │ 占用:≈ 3.5 GB                                 │  │
│  └─────────────────────────────────────────────────┘  │
│                                                       │
│  ┌─────────────── 临时区 (动态复用/释放) ──────────┐  │
│  │ 单层FP16临时权重 | 中间计算值 | KV Cache        │  │
│  │ 峰值:≈ 0.5~1 GB                                │  │
│  └─────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────┘

二、全流程动态流转图(5个状态)

状态1:模型加载完成,空闲待命

[常驻区: 3.5GB]  ✅ 一直保留
[临时区: 空]
────────────────────────────
总显存占用:3.5 GB

状态2:开始推理,计算第 N 层网络

只把当前层4bit权重反量化为FP16,写入临时区

[常驻区: 3.5GB]
[临时区: 第N层 FP16权重 + KV Cache]  ≈ 几百MB
────────────────────────────
总显存占用:4.0 ~ 4.5 GB

状态3:切换到第 N+1 层网络

旧层数据原地覆盖,不额外占用显存、不主动删除

[常驻区: 3.5GB]
[临时区: 第N+1层 FP16权重(覆盖旧数据) + KV Cache]
────────────────────────────
总显存占用:4.0 ~ 4.5 GB

状态4:持续生成多个Token(长文本)

KV Cache 小幅增长,反量化逻辑不变,依旧单层复用

[常驻区: 3.5GB]
[临时区: 当前层FP16 + 增大后的KV Cache]
────────────────────────────
总显存占用:4.5 GB 左右(上限可控)

状态5:文本生成结束,推理完成

临时区所有数据全部释放清空,回到初始空闲状态

[常驻区: 3.5GB]
[临时区: 空]
────────────────────────────
总显存占用:3.5 GB

三、对比图:AWQ 4bit VS 原生 FP16

直观看出为什么量化省显存

1)vLLM + AWQ 4bit(量化方案)

常驻:3.5GB(4bit权重)
临时:最大 ~1GB(单层临时数据)
👉 全程峰值:≈ 4.5GB
❌ 从未出现完整 13GB FP16 权重

2)原生 FP16 模型(无量化)

常驻:13GB(完整FP16权重)
临时:计算中间值 + KV Cache
👉 起步就占用 13GB+

四、核心逻辑简图(一句话版)

4bit常驻权重(3.5GB) ──读取──→ 单层反量化 ──→ 临时FP16(用完即覆盖)
                                        ↓
                              计算完成 → 不保存、不堆积
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐