没有高端GPU也能跑多模态:Qwen3.5-9B-AWQ-BF16-INT8 的 KTransformers CPU-GPU 混合推理实践
没有高端GPU也能跑多模态:Qwen3.5-9B-AWQ-BF16-INT8 的 KTransformers CPU-GPU 混合推理实践
Qwen3.5-9B-AWQ-BF16-INT8 是 Qwen3.5-9B 多模态大模型的 AWQ 混合量化版本。结合 KTransformers 的 CPU-GPU 混合推理框架,你无需高端显卡,在普通电脑 + 一张消费级 GPU 上就能流畅运行支持图片、视频理解的多模态大模型。本文将带你从零理解它「为什么能跑」、量化是如何做到的,并给出 KTransformers 部署实操步骤。
一、为什么需要 CPU-GPU 混合推理
想让大模型「看得懂图、看得懂视频」,多模态模型是必选项。但传统部署方式有个硬门槛:
- 显存吃紧:9B 参数的模型即便用 BF16,加上视觉编码器与 KV 缓存,往往也要吃满一张中高端显卡;
- 纯 CPU 太慢:把整个模型塞进 CPU 内存,精度够了,速度却让人难以忍受。
KTransformers 的 CPU-GPU 混合推理 恰好化解了这两个矛盾:
把占大头的线性层权重放在 CPU 内存里,用高度优化的 CPU 算子(如 IPEx / OneDNN 后端)完成计算;把对延迟敏感的 KV 缓存、采样、部分注意力算子交给 GPU。
这样一来,你只需要显存不大的一张显卡就能把「主体」跑起来,多模态大模型不再是「高端机器专属」。而 Qwen3.5-9B-AWQ-BF16-INT8 正是为这类场景量身打造的量化权重。
二、认识 Qwen3.5-9B-AWQ-BF16-INT8 模型
这个仓库是 Hugging Face Transformers 格式的预训练 + 后训练权重,官方声明兼容 Transformers、vLLM、SGLang、KTransformers 等主流框架(见 README.md)。
| 维度 | 说明 |
|---|---|
| 基础模型 | Qwen/Qwen3.5-9B(多模态,image-text-to-text) |
| 参数量 | 9B,32 层,隐藏维度 4096 |
| 架构 | Gated DeltaNet(线性注意力)+ Gated Attention 混合,高效低延迟 |
| 视觉能力 | 内置视觉编码器,支持图片与视频输入 |
| 上下文 | 原生 262,144 tokens,可借助 YaRN 扩展到约 1,010,000 |
| 量化形态 | AWQ INT8 权重 + BF16 敏感层(compressed-tensors / pack-quantized) |
| 模型体积 | 约 14.14 GB,拆分为 3 个分片 |
📌 核心文件速览:
- config.json:模型结构与量化配置,是理解「哪些层保留高精度」的关键
- recipe.yaml:AWQ 量化配方,记录了量化位宽、分组与敏感层豁免规则
- model.safetensors.index.json:权重分片索引(对应
model-00001-of-00003.safetensors等 3 个分片) - tokenizer.json / chat_template.jinja:分词器与对话模板
- preprocessor_config.json / video_preprocessor_config.json:图像 / 视频预处理参数
三、AWQ 混合量化:INT8 与 BF16 如何分工
「AWQ-BF16-INT8」这个名字,其实就把量化策略讲清楚了:大部分权重用 INT8,少数敏感层保留 BF16。
AWQ(Activation-aware Weight Quantization,激活感知权重量化)的核心思想是:不是所有权重都同等重要。它借助校准数据,找出对输出影响大的「显著通道」,在量化时给予额外保护,从而用更低的位宽逼近原始精度。
从 recipe.yaml 可以看到这份配方的细节:
- 量化目标:所有
Linear层 → 8 bit、对称(symmetric)、group_size=32、group 策略,observer: mse; - 豁免(保留 BF16)的敏感层:
- 整个视觉编码器
model.visual.*(保证图文对齐质量) - 线性注意力相关
linear_attn.*、conv1d - 词嵌入
embed_tokens、输出头lm_head、多 token 预测模块mtp
- 整个视觉编码器
- 平滑与缩放:通过
mappings对 layernorm / 投影层做 activation smoothing,并启用duo_scaling,进一步降低量化误差。
这份配置最终写入 config.json 的 quantization_config 字段(quant_method: compressed-tensors,format: pack-quantized),供推理框架自动识别加载。
效果:精度几乎无损(README 基准显示 MMLU-Pro 82.5、GPQA Diamond 81.7、OCR 类任务领先同级),而体积与显存占用显著下降,是「性价比」与「能力」的平衡点。
四、KTransformers 部署:CPU-GPU 混合推理实操
具体参数请以 KTransformers 官方「Qwen3.5 部署指南」为准,以下为通用流程。
1. 准备硬件
- CPU:多核 x86_64,内存 ≥ 32GB(建议 64GB,容纳量化后的 14.14GB 权重 + KV 缓存)
- GPU:8GB 起即可(16GB 更从容),用于 KV 缓存与部分算子
- 系统:Linux(KTransformers 主要支持环境)
2. 安装 KTransformers 并校验 CPU 算子
git clone https://github.com/kvcache-ai/ktransformers.git
cd ktransformers
bash ./build.sh
pip install -r requirements.txt
python setup.py develop
# 校验 CPU 加速算子是否可用(关键,直接影响速度)
kt-kernel --test
3. 下载模型
在 GitCode 上获取本仓库权重(模型文件较大,建议用下载工具或 git lfs):
git clone https://gitcode.com/hf_mirrors/cyankiwi/Qwen3.5-9B-AWQ-BF16-INT8
4. 启动 KTransformers 推理服务
python -m ktransformers \
--model_path ./Qwen3.5-9B-AWQ-BF16-INT8 \
--model_type qwen3_5 \
--backend cuda:ipex \
--chat
--backend cuda:ipex:GPU 用 CUDA,CPU 侧走 Intel IPEx 加速(按需可换cuda:onednn);- 启动后可通过 OpenAI 兼容接口(
/v1)发起对话,也可用--chat直接进入交互式聊天。
5. 用 OpenAI 兼容 API 发起请求
文本、图片、视频都走同一套 Chat Completions 接口:
- 文本:普通
messages列表; - 图片:
type: image_url; - 视频:
type: video_url(可经mm_processor_kwargs设置fps)。
采样参数建议(来自 README.md 官方推荐):
| 模式 | 推荐参数 |
|---|---|
| 思考模式·通用任务 | temperature=1.0, top_p=0.95, top_k=20, presence_penalty=1.5 |
| 思考模式·精准编码 | temperature=0.6, top_p=0.95, top_k=20, presence_penalty=0.0 |
| 指令模式·通用 | temperature=0.7, top_p=0.8, top_k=20, presence_penalty=1.5 |
💡 若只想快速得到答案、不做思考,可在 chat_template_kwargs 中设 enable_thinking: False 关闭思考内容。
五、硬件与内存配置建议
| 配置项 | 最低建议 | 舒适建议 | 说明 |
|---|---|---|---|
| 内存(CPU) | 32GB | 64GB | 容纳 14.14GB 权重 + KV 缓存与算子开销 |
| 显存(GPU) | 8GB | 16GB | 主要承载 KV 缓存与部分算子 |
| 上下文长度 | 32K | 128K+ | 遇到 OOM 时优先下调上下文 |
| 后端 | cuda:onednn |
cuda:ipex |
视 CPU / 依赖选择,先跑 kt-kernel --test |
六、常见问题与优化建议
- 遇到 OOM(显存不足):优先调小上下文窗口(官方建议至少保留 128K 以维持思考能力,但本地低显存可进一步压缩)。
- 生成速度慢:先跑
kt-kernel --test确认 CPU 加速算子可用;再确认选择了ipex/onednn后端而非纯 Torch 回退。 - 输出重复 / 跑飞:适当调高
presence_penalty(0~2),过高可能导致语言混杂。 - 长上下文(>262K):参考 README「Processing Ultra-Long Texts」一节,通过修改
rope_parameters或启动参数启用 YaRN。 - 多模态预处理:视频理解可按需调整 video_preprocessor_config.json 的
longest_edge,提升长视频采样帧率。
七、总结
Qwen3.5-9B-AWQ-BF16-INT8 用 AWQ INT8 + BF16 敏感层的混合量化,把多模态大模型的体积和显存需求打了下来;再配合 KTransformers 的 CPU-GPU 混合推理,让「没有高端 GPU 也能跑多模态」从口号变成现实。
对新手而言,这条路径的意义在于:用一台普通电脑 + 一张消费级显卡,就能私有化部署支持图片与视频理解的 9B 多模态模型,兼顾能力、成本与可控性。
📚 延伸阅读:模型能力与基准详见 README.md;量化规则见 recipe.yaml;结构配置见 config.json。