A100 跑 Qwen3.8-27B,FP8 还是 INT8?显存、速度、精度与微调兼容性怎么选

直接结论:在算家云 A100 SXM4 80GB 环境验证 Qwen3.8-27B 时,建议先用 BF16 建立基线,再重点测试 INT8 W8A8。FP8 在 A100 上通常只能走权重-only 兼容路径,不能直接套用 H100 的 FP8 性能结论。

发布时间:2026-09-21

本文以算家云 (suanjiayun.com) 单卡 A100 SXM4 80GB 作为验证环境,重点解决 FP8、INT8 和 BF16 的技术选型问题。由于目前没有对应的运行日志,文中不会把工程估算写成"实测",而是提供可以复现的启动、监控和验收方法。

一、先给结论:A100 上怎么选

A100 部署 Qwen3.8-27B,可以按下面的顺序决策:

任务 优先方案 原因
第一次部署、验证模型能力 BF16 路径简单,适合作为质量与性能基线
推理显存或批量吞吐受限 INT8 W8A8 A100 原生支持 INT8,vLLM 有对应后端
已经下载官方 FP8 检查点 先做兼容性测试 A100 不等于 H100 的 FP8 W8A8 路径
单卡 LoRA 微调 BF16 LoRA 优先 避免把推理量化格式误当成训练格式
BF16 LoRA 仍然 OOM 验证量化 PEFT 只训练额外参数,并单独检查模型兼容性
超长上下文或高并发服务 重新评估 KV Cache 权重能装下不等于服务容量足够

最容易踩的坑,是把"FP8 和 INT8 都是 8bit"理解成两者在 A100 上显存相同、速度相同、兼容性也相同。

实际上,它们的数值格式、量化方式、硬件执行路径和校准要求都不同。

二、Qwen3.8-27B 大约需要多少显存

Qwen3.8-27B 是一个包含视觉编码器的稠密模型。根据 Qwen3.8-27B 官方模型卡,其语言模型参数量为 27B,原生上下文长度为 262,144 tokens,并可扩展至 1M tokens。

仅按语言模型参数量估算:

权重格式 理论权重体积 计算方式
BF16/FP16 约54GB 27B × 2 bytes
FP8 约27GB 27B × 1 byte
INT8 约27GB 27B × 1 byte

这里的数值只是权重理论值,不是实际运行显存。

真正启动服务时,还要预留:

  • 量化尺度和元数据;
  • 未量化的归一化层、输出层等模块;
  • 视觉编码器及图像输入张量;
  • CUDA Context;
  • 推理框架工作区;
  • KV Cache;
  • 批处理与并发请求产生的临时张量。

因此,不能根据"27B × 1 byte≈27GB"直接断言实际显存占用,也不能保证 FP8 和 INT8 最终占用完全一致。

三、为什么 A100 上不能直接照搬 H100 的 FP8 结论

A100 属于 Ampere 架构。

NVIDIA 公布的 A100 规格包含 BF16、FP16、TF32 和 INT8 Tensor Core 性能,但它不是面向原生 FP8 W8A8 计算设计的 Hopper GPU。NVIDIA A100 官方规格

截至2026-09-21,vLLM 的量化兼容矩阵显示:

vLLM 量化实现 A100/Ampere 典型路径
INT8 W8A8 支持 INT8 权重和激活
FP8 W8A8 不属于原生支持范围 主要面向 Ada/Hopper
Marlin FP8 支持 FP8 权重、BF16/FP16 激活
BF16 支持 A100 原生基线路径

具体兼容状态可查看 vLLM 量化兼容矩阵

这意味着:即使 A100 成功加载了 FP8 模型,也不能据此认定它正在使用与 H100 相同的原生 FP8 W8A8 Tensor Core 路径。

在 Ampere 上,FP8 更常见的是权重-only 路径,即权重使用 FP8 保存,计算时激活值仍保持 BF16 或 FP16。

这类路径可以降低模型权重占用,但不保证一定比 BF16 或 INT8 更快。最终表现还取决于:

  • vLLM 版本;
  • 实际使用的量化 kernel;
  • 输入长度;
  • 批量大小;
  • 并发数;
  • 是否发生反量化;
  • 视觉编码器是否使用相同精度;
  • 是否存在不支持算子的回退。

四、先用 BF16 建立基线

量化测试必须与相同条件下的 BF16 结果比较。

否则,所谓"速度提升"可能只是来自上下文缩短、输出减少或者并发数变化,而不是量化本身。

1. 验证环境

本文采用以下验证口径:

项目 验证配置
运行环境 算家云专业版 Pro
GPU 单张 A100 SXM4 80GB
模型 Qwen/Qwen3.8-27B
基线精度 BF16
首轮上下文 8192 tokens
对比方案 BF16、FP8、INT8 W8A8
推理框架 vLLM,记录实际安装版本
并发数 1、4、8 分别测试

这里不直接写死 CUDA、PyTorch 和 vLLM 版本,因为 Qwen 官方建议使用较新的推理框架,而不同 vLLM 安装方式对应的依赖组合可能不同。

复现时应记录真实环境,而不是照抄一个未经验证的版本组合。

2. 记录软硬件信息

bash 复制代码
nvidia-smi --query-gpu=name,memory.total,driver_version \
  --format=csv

python --version

pip show torch vllm transformers

建议把输出保存到文件:

bash 复制代码
{
  nvidia-smi --query-gpu=name,memory.total,driver_version \
    --format=csv
  python --version
  pip show torch vllm transformers
} | tee environment.txt

3. 启动 BF16 服务

bash 复制代码
vllm serve Qwen/Qwen3.8-27B \
  --dtype bfloat16 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90 \
  --served-model-name qwen38-bf16

虽然模型支持更长上下文,但第一次启动不建议直接设置262K或1M。

上下文长度不仅影响模型能否加载,还会影响 KV Cache、预填充耗时和并发容量。先从8192完成验收,再逐级增加,更容易定位问题。

4. 检查服务状态

bash 复制代码
curl -i http://127.0.0.1:8000/health

正常情况下,接口应返回 HTTP 200。

继续发送一个最小请求:

bash 复制代码
curl http://127.0.0.1:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen38-bf16",
    "messages": [
      {
        "role": "user",
        "content": "用三点说明INT8量化为什么需要校准数据"
      }
    ],
    "temperature": 0,
    "max_tokens": 256
  }'

验收标准:

  • 服务健康检查正常;
  • 模型加载过程没有 CUDA OOM;
  • API 返回内容非空;
  • 返回的模型名称正确;
  • 连续请求不会导致服务进程退出;
  • 输出没有明显乱码或模板错误。

五、如何验证官方 FP8 检查点

Qwen 官方已经发布 Qwen/Qwen3.8-27B-FP8。模型卡说明该检查点采用块大小为128的细粒度 FP8 量化。

关闭 BF16 服务后,可以启动 FP8 检查点:

bash 复制代码
vllm serve Qwen/Qwen3.8-27B-FP8 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90 \
  --served-model-name qwen38-fp8

不要只看服务是否成功启动,还要检查日志中的实际执行路径。

重点搜索:

bash 复制代码
rg -i "fp8|marlin|quant|kernel|fallback|warning|ampere" vllm-fp8.log

需要确认:

  1. 是否正确识别 A100/Ampere;
  2. 使用了哪种量化配置;
  3. 是否调用 Marlin 或其他权重-only kernel;
  4. 激活值是否仍为 BF16/FP16;
  5. 是否有算子回退或反量化警告;
  6. 视觉编码器采用什么精度;
  7. 加载后的实际显存是否明显下降。

如果出现以下情况,不要通过关闭安全检查强行运行:

  • GPU compute capability 不满足;
  • FP8 W8A8 kernel 不支持;
  • 量化配置无法识别;
  • 模型结构或部分算子不兼容;
  • 服务启动后立即退出;
  • 峰值显存没有下降;
  • 相同请求下的延迟明显高于 BF16。

在 A100 上,FP8 的合理定位是"兼容性和显存实验",而不是预设的最快方案。

六、为什么 INT8 W8A8 更值得在 A100 上验证

A100 原生支持 INT8 Tensor Core,vLLM 也将 LLM Compressor 的 INT8 W8A8 列为 Ampere 可用方案。

不过,INT8 并不是简单把每个参数缩小为一个字节。

W8A8 同时量化权重和激活。激活值随输入内容变化,通常需要使用具有代表性的数据进行校准。

推荐流程是:

  1. 从 BF16 原始模型开始;
  2. 准备与生产流量接近的校准数据;
  3. 使用 LLM Compressor 生成 INT8 W8A8 检查点;
  4. 用 vLLM 加载量化结果;
  5. 对比 BF16 的显存、吞吐和任务质量;
  6. 达到质量阈值后再考虑上线。

vLLM 文档建议可以从约512条校准样本、2048 tokens 长度开始,再根据业务输入调整。

校准集应匹配真实任务:

生产任务 校准数据应包含
代码助手 真实语言分布、长短代码、错误栈
JSON抽取 实际字段、缺失值、长文本
中文问答 真实中文问题与上下文
多模态问答 实际图片类型和问题格式
长文档分析 接近生产长度的文档切片

如果只使用随机网页文本校准代码模型或结构化抽取任务,即使通用问答看起来正常,也可能在生产任务上出现明显精度损失。

INT8 启动命令

Qwen 官方目前提供的是 BF16 和 FP8 检查点。本文不虚构不存在的官方 INT8 模型ID。

假设已经通过校准生成并验证了本地 INT8 W8A8 检查点,可以这样启动:

bash 复制代码
export INT8_MODEL=/path/to/qwen38-27b-int8-w8a8

vllm serve "$INT8_MODEL" \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90 \
  --served-model-name qwen38-int8

INT8_MODEL 是明确的本地路径占位符,不代表 Qwen 官方已经发布同名模型。

由于 Qwen3.8-27B 包含视觉编码器,量化前还必须确认当前 LLM Compressor 和 vLLM 是否覆盖该模型的全部目标层。不能把其他纯文本模型的 INT8 配置直接套过来,再把服务能启动当成量化完成。

七、统一测试 BF16、FP8 和 INT8

三种方案必须使用相同测试条件。

至少固定:

  • 同一张 A100;
  • 同一版 vLLM;
  • 同一批提示词;
  • 相同输入长度;
  • 相同输出上限;
  • 相同上下文长度;
  • 相同采样参数;
  • 相同并发数;
  • 相同热身次数;
  • 相同质量验收集。

1. 记录显存和利用率

在另一个终端运行:

bash 复制代码
nvidia-smi \
  --query-gpu=timestamp,memory.used,utilization.gpu,power.draw \
  --format=csv \
  -l 1 | tee gpu-metrics.csv

记录时不要只截取服务刚启动的一瞬间。至少覆盖:

  • 模型加载;
  • 热身请求;
  • 单并发请求;
  • 多并发请求;
  • 长输入请求;
  • 测试结束后的空闲状态。

2. 最小延迟测试脚本

安装客户端:

bash 复制代码
pip install -U openai

保存为 benchmark.py

python 复制代码
import os
import time
import statistics
from openai import OpenAI

model = os.environ["MODEL_NAME"]

client = OpenAI(
    base_url="http://127.0.0.1:8000/v1",
    api_key="EMPTY",
)

prompts = [
    "解释Python生成器与普通函数的区别。",
    "写一个合并两个有序数组的Python函数。",
    "从文本中抽取姓名、日期和金额,并返回JSON。",
]

durations = []
output_tokens = []

for index in range(13):
    prompt = prompts[index % len(prompts)]
    start = time.perf_counter()

    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": prompt}],
        temperature=0,
        max_tokens=256,
    )

    elapsed = time.perf_counter() - start

    # 前3轮作为热身
    if index >= 3:
        durations.append(elapsed)
        output_tokens.append(
            response.usage.completion_tokens or 0
        )

durations_sorted = sorted(durations)
p50 = statistics.median(durations_sorted)
p95_index = max(0, int(len(durations_sorted) * 0.95) - 1)
p95 = durations_sorted[p95_index]
throughput = sum(output_tokens) / sum(durations)

print(f"model={model}")
print(f"requests={len(durations)}")
print(f"p50_latency={p50:.3f}s")
print(f"p95_latency={p95:.3f}s")
print(
    "end_to_end_output_throughput="
    f"{throughput:.2f} token/s"
)

分别启动服务后运行:

bash 复制代码
export MODEL_NAME=qwen38-bf16
python benchmark.py

FP8 和 INT8 依次替换模型名称。

这个脚本统计的是包含请求开销和首 token 延迟的端到端输出吞吐,不是排除预填充后的纯解码速度。

3. 结果记录表

方案 成功加载 峰值显存 P50延迟 P95延迟 输出吞吐 任务通过率
BF16 待测试 待测试 待测试 待测试 待测试 基线
FP8 待测试 待测试 待测试 待测试 待测试 待测试
INT8 W8A8 待测试 待测试 待测试 待测试 待测试 待测试

不要只比较 token/s。

如果 INT8 吞吐更高,但代码测试、JSON合法率或者视觉问答准确率明显下降,这个量化方案仍然不适合上线。

八、精度应该怎么验收

"肉眼看起来差不多"不足以证明量化精度可接受。

可以准备一个小型任务集:

  • 代码生成:执行单元测试;
  • JSON抽取:检查 JSON 合法率和字段准确率;
  • 分类任务:统计准确率或F1;
  • 问答任务:使用人工评分或固定评分规则;
  • 多模态任务:固定图片、问题和答案标准;
  • 长上下文任务:检查关键信息召回率。

建议至少比较:

text 复制代码
BF16任务通过率
FP8任务通过率
INT8任务通过率

再设置业务阈值,例如:

text 复制代码
量化模型任务通过率下降不得超过预先约定的范围

这个范围应由业务风险决定,不应由文章替读者设定。

客服分类、内容摘要可以接受的偏差,和代码生成、科研分析、结构化抽取通常不同。

九、推理和微调必须分开选

1. 推理

单卡 A100 部署 Qwen3.8-27B,可以按以下顺序执行:

  1. BF16 能满足延迟和并发要求:继续使用 BF16;
  2. BF16 显存余量不足:验证 INT8 W8A8;
  3. 已有官方 FP8 检查点:检查实际 kernel 后再决定;
  4. 量化后仍无法满足并发:缩短上下文或增加 GPU;
  5. 质量下降无法接受:回退至 BF16。

2. LoRA/PEFT微调

FP8 或 INT8 推理检查点不应直接等同于可训练基座。

Hugging Face 文档指出,量化后的基础权重通常不会直接进行常规全量训练;8bit、4bit 训练主要用于在冻结基座上训练额外参数,例如 LoRA Adapter。PEFT量化文档

对于单卡 A100 80GB,更稳妥的顺序是:

  • 先尝试 BF16 基座加 LoRA;
  • 开启梯度检查点;
  • 从较短序列开始;
  • 使用 micro batch 1;
  • 记录训练峰值显存;
  • 再逐步增加序列长度和梯度累积;
  • BF16 LoRA 仍然 OOM 时,再验证量化 PEFT。

全参数微调还要保存梯度、优化器状态以及可能存在的高精度主权重。不能因为约54GB的 BF16 权重能够加载,就判断单卡 A100 可以完成全参数微调。

十、以算家云(suanjiayun.com) 为例操作演示

前面的对比实验需要单张 A100 80GB、独立运行环境,以及持续保存模型、日志和监控文件的能力。

算家云当前可核实提供 A100 SXM4 80GB,可用于完成这组 BF16、FP8 与 INT8 对照实验。具体实例库存、镜像版本和可用区域应以创建实例时的实时页面为准。算家云官网

建议先完成小规模 PoC,不要直接部署长上下文生产服务。

第一步:创建验证实例

在算家云专业版 Pro 选择单张 A100 SXM4 80GB。

创建完成后,立即保存:

bash 复制代码
nvidia-smi
python --version
pip freeze | tee requirements-lock.txt

第二步:规划持久化目录

模型权重、测试脚本和结果不要只放在临时目录中。

建议至少分开保存:

text 复制代码
/workspace/models
/workspace/scripts
/workspace/logs
/workspace/results

模型文件较大。下载前应确认磁盘剩余空间,避免模型下载到一半才出现空间不足。

第三步:运行 BF16 基线

先用8192上下文启动 BF16:

bash 复制代码
vllm serve Qwen/Qwen3.8-27B \
  --dtype bfloat16 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90 \
  --served-model-name qwen38-bf16 \
  2>&1 | tee /workspace/logs/bf16.log

同时运行显存监控:

bash 复制代码
nvidia-smi \
  --query-gpu=timestamp,memory.used,utilization.gpu,power.draw \
  --format=csv \
  -l 1 | tee /workspace/results/bf16-gpu.csv

第四步:依次验证量化方案

关闭 BF16 服务后,依次启动 FP8 和经过校准的 INT8 检查点。

每次测试都保持:

  • 相同的提示词;
  • 相同输入长度;
  • 相同输出上限;
  • 相同并发数;
  • 相同上下文长度;
  • 相同热身次数。

最终把以下文件一起保存:

text 复制代码
environment.txt
requirements-lock.txt
bf16.log
fp8.log
int8.log
bf16-gpu.csv
fp8-gpu.csv
int8-gpu.csv
benchmark-result.csv
quality-result.csv

这里使用算家云 A100 的原因,是本题需要可重复创建的80GB GPU环境完成对照验证,而不是用产品名称替代量化分析。

最终仍应根据自己的输入长度、并发量、任务通过率和延迟要求决定方案。

十一、常见问题与处理方法

1. BF16 启动时直接 CUDA OOM

先确认:

bash 复制代码
nvidia-smi

检查是否有其他进程占用显存。

然后依次尝试:

  • --gpu-memory-utilization 从0.90调低;
  • 缩短 --max-model-len
  • 减少并发请求;
  • 确认没有重复启动服务;
  • 检查是否加载了错误模型或重复副本。

2. FP8 模型提示当前硬件不支持

先检查 vLLM 版本和启动日志中的具体量化配置。

如果检查点要求原生 FP8 W8A8,而当前后端没有 A100 兼容路径,应回退到 BF16,或者使用经过验证的 Marlin 权重-only 路径。不要修改源码绕过硬件检查。

3. INT8 服务能启动,但准确率明显下降

常见原因包括:

  • 校准数据与生产数据差异过大;
  • 校准样本不足;
  • 序列长度分布不匹配;
  • 不应量化的敏感层被量化;
  • 视觉编码器没有单独处理;
  • 质量测试集过小。

处理顺序:

  1. 补充真实业务校准数据;
  2. 增加代表性长输入;
  3. 检查忽略层配置;
  4. 分开测试文本和视觉任务;
  5. 与 BF16 输出重新对照;
  6. 无法达到质量阈值时回退 BF16。

4. 量化后显存下降,但速度没有提升

这不一定是异常。

可能原因包括:

  • 当前批量太小;
  • 量化与反量化开销抵消收益;
  • 使用权重-only路径;
  • 计算瓶颈转移到注意力或视觉编码器;
  • 输入过短,框架调度开销占比过高;
  • 实际执行 kernel 与预期不同。

应同时测试并发1、4、8,而不是只看单请求速度。

十二、哪些情况不适合采用本文方案

以下情况不应直接照搬本文参数:

  • 需要接近262K或1M的超长上下文;
  • 生产请求包含大量高分辨率图片或长视频;
  • 需要全参数微调;
  • 对量化误差几乎零容忍;
  • 当前本地机器已经能稳定满足任务;
  • 使用的 vLLM 版本尚未支持对应模型结构;
  • 生产环境要求多机高可用和严格SLA;
  • 没有代表性校准数据却准备直接上线 INT8。

本文提供的是单卡 A100 的量化验证起点,不是所有业务的最终生产配置。

FAQ

1. A100 能直接运行 Qwen3.8-27B-FP8 吗?

可能可以通过框架提供的兼容 kernel 加载,但不能据此认定使用了原生 FP8 W8A8 Tensor Core。必须检查 vLLM 日志和实际性能。

2. FP8 和 INT8 的显存占用完全一样吗?

不一定。两者理论权重都接近每参数1 byte,但量化尺度、未量化层、对齐方式和执行后端会造成实际差异。

3. A100 跑 INT8 一定比 BF16 快吗?

不一定。性能取决于 kernel、输入长度、批量大小、并发数和量化开销。低并发、短输入场景的提升可能不明显。

4. 单张 A100 80GB 能微调 Qwen3.8-27B 吗?

可以从保守的 LoRA 配置开始验证。全参数微调的显存需求远高于模型权重,通常需要多卡、分片或卸载方案。

5. 为什么不直接把上下文设置为官方的262K?

因为上下文长度会显著影响 KV Cache、预填充耗时和并发容量。首次部署应从8K等可控长度完成验收,再逐级增加。

相关推荐
Zhu7584 小时前
docker环境,vLLM 部署 Qwen3.8-27B
docker·qwen·vllm
basketball61618 小时前
Python FastAPI 介绍以及常用方法
python·fastapi·vllm·ai infra
维核科技1 天前
AI 网络安全:攻防的新战线
私有化部署·本地部署·大模型部署·离线部署·维核智创
论文复现现场1 天前
RTX 3090 如何跑 13B 级大模型推理?4-bit AWQ、vLLM 部署与并发调优实战
模型量化·vllm·大模型推理·awq·算家云·rtx3090
一颗小树x2 天前
vLLM大模型推理:Jetson AGX Thor 的 GPU 共享内存清理实战
jetson·vllm·vlm·gpu内存清理
维核科技2 天前
冷启动与预热优化
私有化部署·本地部署·大模型部署·离线部署
论文复现现场3 天前
Qwen3.8-27B 做 GRPO 需要几张 GPU?4×RTX 4090 与 8×RTX 4090 显存、vLLM 和 ZeRO-3 配置分析
deepspeed·qlora·大模型训练·vllm·rtx4090·grpo·qwen3.8
安易算力3 天前
昇腾生态开发深度实践:CANN算子库架构解析与MindSpore模型优化
网络·容器·架构·kubernetes·vllm
SunnyRivers3 天前
vLLM 官方调优方案
优化·vllm