本文来源公众号“Ai学习的老章”,仅用于学术分享,侵权删,干货满满。
有朋友好奇为啥 4 张 4090 才跑起来
今天咱们了解一下大模型量化。
看能不能 1 张 4090 跑起来?
还以 QwQ-32B 为例(这个模型确实很强,我很喜欢)
https://modelscope.cn/models/unsloth/QwQ-32B-GGUF/files
这里的模型有一个量化类型,Q、K、L、M看起来一脸懵
再顺便说一句,大家喜欢用 ollama 起模型,如果自己看模型说明,它默认都是量化模型
DeepSeek-R1 爆火的时候,unsloth 就发布过最小 1.58 位量化版本的 R1,把 DeepSeek-R1 这个非常大的模型(它有 6710 亿个参数,也就是 671B)通过“量化”把原本 720GB 的模型压缩到只有 131GB 的大小。
简单来说
量化是一种将模型的浮点权重(通常是 32 位或 16 位)转换为低位整数(如 2 位、4 位、8 位等)的技术,目的是减少模型的存储空间和计算资源需求,同时尽可能保持模型的性能。
最主流的有以下量化的方法:
方法类型 | 代表技术 | 核心特征 | 适用场景 |
---|---|---|---|
训练后量化 | GPTQ | 4bit 权重量化,动态反量化推理 | GPU 加速推理 |
感知量化 | AWQ | 激活值引导的智能量化 | 精度敏感型任务 |
混合推理 | GGUF/GGML | CPU-GPU 异构计算框架 | 边缘设备部署 |
然后这里还设计不同的量化位宽,其实常见也就K-Quants 增强系列
量化类型 | 位宽策略 | 存储效率 | 技术特点 |
---|---|---|---|
Q2_K | 2.56bit/权重 | 超高压缩率 | 16 块超块结构 |
Q3_K | 3.44bit/权重(type-0) | 性能优先 | 平衡压缩与精度 |
Q4_K | 4.5bit/权重(type-1) | 通用型 | 主流部署方案 |
Q5_K | 5.5bit/权重 | 精度增强 | 关键层保护 |
Q6_K | 6.56bit/权重 | 准无损压缩 | 复杂任务保留 |
Q8_K | 8bit 中间结果量化 | 资源充足场景 | 梯度计算优化 |
还有常见到的 IQ 系列量化方法
-
IQ4_NL:4 位量化,超块包含 256 个权重,权重 w 通过 super_block_scale 和 importance matrix 计算得到
-
IQ4_XS:4 位量化,超块包含 256 个权重,每个权重占用 4.25 位,通过 super_block_scale 和 importance matrix 计算得到
目前最流行的是混合量化策略,主打一个动态精度分配
-
K_M 混合策略:对 attention.wv 等关键张量采用 Q6_K,其余使用 Q4_K
-
K_S 均质策略:全模型统一量化配置,所有张量均使用 Q4_K
其中
-
K:表示 k-quants 量化方法
-
S (Small):简单量化,所有张量均使用相同位数量化
-
M (Mixed):混合量化,对关键张量使用更高精度的量化,其余使用标准精度
在相同位数下,K_M 系列模型(比如今天我们要演示的 QwQ-32B-Q4_K_M)通常在模型大小和性能之间取得最佳平衡,是推荐的选择。
关于量化,还有大量知识点,大量细节,这里没法展开。
实践
下载量化模型
我们用 modelscope 命令下载,安装方法 pip install modelscope
modelscope download unsloth/QwQ-32B-GGUF --include "QwQ-32B-Q4_K_M.gguf" --local-dir ./
QwQ 模型原版是 bf16 精度,模型文件 40 多 GB,运行起来打满了 4 张 4090。
Q4_K_M 量化版,模型文件 19.85GB,我们尝试用 2 张 4090 跑起来
为什么不用 1 张呢?我试了,报错显存不足了
官方建议用 ollama 或 llama.cpp,感兴趣自己看吧,我就不演示了:https://modelscope.cn/models/unsloth/QwQ-32B-GGUF/summary
我决定用 vLLM 试试
启动命令(建议照抄,试错无数次换来的):
CUDA_VISIBLE_DEVICES=4,5 vllm serve ./QwQ-32B-Q4_K_M.gguf --served-model-name QwQ:32B-4 --port 3001 --max_model_len 84720 --tensor-parallel-size 2 --enable-reasoning --resoning-parser deepseek_r1
启动需要时间,ok 之后把它配置到 open-webui。
随便问 2 个问题
看后台日志,生成速度还是不错的
比 4 张 4090 跑起来的满参数 QwQ 还快呢
显存利用情况——4 和 5 满载
然后用 4 张卡把 QwQ:32B 完整拉起来 显卡全部工作起来了
说实话,智商差的不多,大家能猜到左右两边哪一个是量化版吗?
最后提一句,直接用 Ollama 手工创建可启动的量化模型文件,方法如下,我遭遇的问题是运行后模型陷入无限思考,但是直接 ollama 从官网拉取,就没有问题。可能是配置文件不齐全,没再深究,感兴趣可以看看,有了 vLLM 我要完全抛弃 ollama 了。
先创建一个 Modelfile 格式的文件——vim Modelfile
FROM ./QwQ-32B-Q4_K_M.gguf
Modelfile 除了上面的 FROM 参数,还有很多可以配置的东西。参考:https://github.com/ollama/ollama/blob/main/docs/modelfile.md
第二步,创建 ollama 的本地模型,下面的命令中 you-model-name 是自己起的名字,随便写。-f 指定刚才创建的 Modelfile 的路径
ollama create QwQ:32B -f Modelfile
执行过程耗时较长,创建完成后,我们就可以运行刚才创建的模型:
OLLAMA_GPUS="4" ollama run QwQ:32B
我测试单张 4090 可以跑,问题就是无限思考,没细究,已弃疗。
THE END !
文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。