
vLLM 怎么使用 fp8_per_tensor 等在线量化方案在加载时降低模型显存占用【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm在 vLLM 中加载 BF16/FP16 大模型时机器可能因显存不足OOM而无法启动。vLLM 的在线量化Online Quantization可以解决这个问题把模型的 Linear 和 MoE 权重在加载时转换为 FP8 等低精度格式不需要预先量化的 checkpoint也不需要校准数据。代价是精度降低——vLLM 文档对此的表述是 Quantized models take less memory at the cost of lower precision。适用前提手头是普通的 BF16/FP16 权重未量化 checkpoint希望在加载阶段就地完成量化并减少显存占用。在线量化做了什么来自 在线量化文档 的定义权重在模型加载model loading期间被转换激活值activations在每次前向传播中动态缩放不需要 pre-quantized checkpoint也不需要校准数据。因此它和下载别人量化好的模型是两条路径如果你能直接拿到静态量化模型文档提到可从 HF Hub 下载例如 Red Hat AI 发布的静态量化版本可以直接使用且无需额外配置。本文聚焦的是没有量化 checkpoint 时用quantization参数在加载时做动态量化。选择量化方案quantization参数支持以下在线方案来源online.md 的 Supported Schemes 表Scheme权重配方激活配方备注fp8_per_tensorfp8_e4m3 数据fp32 per-tensor scalefp8_e4m3 数据fp32 per-tensor scale在部分 GPUAda、Hopper上linear 激活改用 per-token scaling 以获得更好性能fp8_per_blockfp8_e4m3 数据fp32 per-128x128-block scalefp8_e4m3 数据fp32 per-1x128-block scalemxfp8fp8_e4m3 数据e8m0 per-1x32-block scalefp8_e4m3 数据e8m0 per-1x32-block scalew8a8 需要 SM 100Blackwell 或更新其他 GPU 使用 w8a16 fallbackmxfp4fp4_e2m1 数据e8m0 per-1x32-block scalelinear部分 backend 用 fp4_e2m1 激活部分用 BF16MOEfp4_e2m1 激活Linear MXFP4 backend 按平台自动选择可用--linear-backend固定如--linear-backend flashinfer选型时的关键限制只有文档明确写出的两条mxfp8的 w8a8 路径要求 SM 100mxfp4的 linear 激活精度取决于所选 backend。fp8_per_tensor是文档 Quick Start 中给出的默认示例方案。离线推理中使用最简用法是给LLM构造函数传quantization参数from vllm import LLM # Per-tensor FP8 量化每个权重张量一个 scale llm LLM(meta-llama/Llama-3.1-8B, quantizationfp8_per_tensor) # Per-block FP8 量化权重 128x128 block scaling激活 1x128 block scaling llm LLM(meta-llama/Llama-3.1-8B, quantizationfp8_per_block) # MXFP8 量化权重和激活 llm LLM(meta-llama/Llama-3.1-8B, quantizationmxfp8) # MXFP4 权重激活量化取决于选中的 linear_backend llm LLM(meta-llama/Llama-3.1-8B, quantizationmxfp4)上面的meta-llama/Llama-3.1-8B是文档示例中的模型名替换成你要部署的模型标识即可。模型本身保持 BF16/FP16 原样不需要先做量化导出。服务端vllm serve中使用同样的方案名通过--quantization传给 CLIvllm serve meta-llama/Llama-3.1-8B --quantization fp8_per_tensor vllm serve meta-llama/Llama-3.1-8B --quantization fp8_per_block vllm serve meta-llama/Llama-3.1-8B --quantization mxfp8 vllm serve meta-llama/Llama-3.1-8B --quantization mxfp4可选分支细粒度控制 dense 与 MoE 层如果默认所有层同一方案不合适可以用quantization_config字典分别控制lineardense 层和moe专家层未设置的字段回退到--quantization简写的默认值来源online.md 的 Advanced Configurationfrom vllm import LLM # Linear: per-block FP8; MoE: per-tensor FP8继承自简写默认值 llm LLM( ibm-granite/granite-3.0-1b-a400m-base, quantizationfp8_per_tensor, quantization_config{ linear: fp8_per_block, }, )反向操作linear 继承 per-tensor、MoE 单独用 per-block把linear换成moe即可。CLI 中quantization_config可以传 JSON 字符串也可以用点号键两者等价vllm serve model --quantization-config {moe:{activation:mxfp8}} vllm serve model --quantization-config.moe.activation mxfp8model为文档示例中的占位写法替换为你的模型标识。其他两个可选控制项排除部分层quantization_config的ignore字段接受精确层名、re:前缀的正则、以及 fnmatch 模式。对融合层如融合后的qkv_proj模式可以直接匹配融合名也可以匹配其全部未融合的 shard 名llm LLM( ibm-granite/granite-3.0-1b-a400m-base, quantizationfp8_per_tensor, quantization_config{ ignore: [ model.layers.1.self_attn.o_proj, # 精确层名 re:.*[qkv]_proj, # 正则跳过所有 QKV 投影 *mlp.experts*, # fnmatch跳过所有 MoE 专家 ], }, )按层指定不同方案targets字段的键是层名/正则/fnmatch 模式值是方案名fp8_per_tensor、fp8_per_block、fp8_per_channel、mxfp8、int8_per_channel_weight_only、nvfp4_per_token。注意targets与linear/moe互斥只能设其一未匹配任何模式的层保持 checkpoint 原有 dtype同层同时匹配targets和ignore、或匹配多个targets模式都会报错。另一个在线量化的用法对部分量化 checkpoint如只有 MoE 专家被量化的 Quark checkpoint可以对其未量化的层补加在线量化checkpoint 原来的quant_method仍负责它已量化的层vllm serve amd/Qwen3.5-35B-A3B-MXFP4 \ --quantization-config.linear mxfp8文档说明该命令的效果是为只有 MOE 专家被量化的 Quark checkpoint 的 dense linear 层加上 MXFP8 量化。限制与效果确认文档给出的限制和边界在线量化的代价是精度降低这是文档明示的取舍没有承诺精度无损mxfp8的 w8a8 需要 SM 100Blackwell 或更新其他 GPU 自动走 w8a16 fallbackfnmatch风格模式只被在线量化支持不会应用到 Quark 或 compressed-tensors 配置quantization_config.ignore是 online-only 的排除机制原始quant_method只依赖它自己的 ignore 实现和config.json中指定的被忽略层。关于效果确认文档没有给出固定的显存数值或成功日志格式。可核对的事实是行为层面的——量化在加载时发生权重在模型加载期间转换服务随后按正常方式对外提供推理如果此前是 OOM 导致无法加载判断依据就是模型能否完成加载并正常出 token。量化之外的补充手段如果加上在线量化后显存仍紧张内存节约文档 还列出几个可叠加的选项均与当前场景直接相关from vllm import LLM llm LLM( modelQwen/Qwen2.5-VL-3B-Instruct, max_model_len2048, # 限制上下文长度 max_num_seqs2, # 限制最大 batch size )用enforce_eagerTrue完全关闭 CUDA Graph 捕获CUDA graphs 默认开启会额外占用 GPU 显存用compilation_configCompilationConfig(modeCompilationMode.VLLM_COMPILE, cudagraph_capture_sizes[1, 2, 4, 8, 16])只捕获部分 batch size在速度和显存之间取平衡多卡场景可用tensor_parallel_size把模型切分到多张 GPU。注意启用 TP 后每个进程都会读取整个模型再分片磁盘读取时间会随 TP 规模变长文档建议可用 examples/features/sharded_state/load_sharded_state_offline.py 把 checkpoint 预转换为分片格式后再加载。【免费下载链接】vllmA high-throughput and memory-efficient inference and serving engine for LLMs项目地址: https://gitcode.com/GitHub_Trending/vl/vllm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考