直接结论:在算家云 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
需要确认:
- 是否正确识别 A100/Ampere;
- 使用了哪种量化配置;
- 是否调用 Marlin 或其他权重-only kernel;
- 激活值是否仍为 BF16/FP16;
- 是否有算子回退或反量化警告;
- 视觉编码器采用什么精度;
- 加载后的实际显存是否明显下降。
如果出现以下情况,不要通过关闭安全检查强行运行:
- GPU compute capability 不满足;
- FP8 W8A8 kernel 不支持;
- 量化配置无法识别;
- 模型结构或部分算子不兼容;
- 服务启动后立即退出;
- 峰值显存没有下降;
- 相同请求下的延迟明显高于 BF16。
在 A100 上,FP8 的合理定位是"兼容性和显存实验",而不是预设的最快方案。
六、为什么 INT8 W8A8 更值得在 A100 上验证
A100 原生支持 INT8 Tensor Core,vLLM 也将 LLM Compressor 的 INT8 W8A8 列为 Ampere 可用方案。
不过,INT8 并不是简单把每个参数缩小为一个字节。
W8A8 同时量化权重和激活。激活值随输入内容变化,通常需要使用具有代表性的数据进行校准。
推荐流程是:
- 从 BF16 原始模型开始;
- 准备与生产流量接近的校准数据;
- 使用 LLM Compressor 生成 INT8 W8A8 检查点;
- 用 vLLM 加载量化结果;
- 对比 BF16 的显存、吞吐和任务质量;
- 达到质量阈值后再考虑上线。
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,可以按以下顺序执行:
- BF16 能满足延迟和并发要求:继续使用 BF16;
- BF16 显存余量不足:验证 INT8 W8A8;
- 已有官方 FP8 检查点:检查实际 kernel 后再决定;
- 量化后仍无法满足并发:缩短上下文或增加 GPU;
- 质量下降无法接受:回退至 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 服务能启动,但准确率明显下降
常见原因包括:
- 校准数据与生产数据差异过大;
- 校准样本不足;
- 序列长度分布不匹配;
- 不应量化的敏感层被量化;
- 视觉编码器没有单独处理;
- 质量测试集过小。
处理顺序:
- 补充真实业务校准数据;
- 增加代表性长输入;
- 检查忽略层配置;
- 分开测试文本和视觉任务;
- 与 BF16 输出重新对照;
- 无法达到质量阈值时回退 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等可控长度完成验收,再逐级增加。