基于3090的Qwen3-8B量化版模型部署(awq和gguf)


最近在研究qwen3-8b本地部署,只有一张24GB的3090,好心酸,记录一下。


一、环境配置

(一)先配置python环境

先前调试过vllm0.4.1的环境,跑通义千问有报错…于是我又努力配了一套vllm0.9.1的(狗头)
安装顺序建议:先装vllm,它自带cpu的torch,若单纯安装vllm而不安装它的依赖,容易少包
之后卸载cpu的torch,装适配cuda的
最后看下transformers等依赖的版本是否过高,适当降降级,可以省去不少报错

虽然方法很麻烦,但是很好用,毕竟是主包含泪调出来的

cmake==4.1.0
modelscope==1.30.0
numpy==2.2.6
openai==2.2.0
pandas==1.5.3
torch==2.7.0+cu118
transformers==4.51.3
vllm==0.9.1
vllm_nccl_cu12==2.18.1.0.4.0
xformers==0.0.30

如果想知道其它未提到的依赖及其版本可以私信问我鸭~ (仅限vllm0.4.1和0.9.1的环境)

(二)再配置llama.cpp

教程参考博客
1、安装编译工具链 (Ubuntu系统):

sudo apt install build-essential

2、克隆仓库并编译,可选择cpu和gpu编译,此处选gpu

git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build  # CPU执行这条
cmake -B build -DGGML_CUDA=ON   # GPU执行这条
cmake --build build --config Release

在build文件夹下生成文件如图
在这里插入图片描述
3、若想使用 python -m llama_cpp.server ...的命令部署模型,还需要安装llama-cpp-python依赖。

export LLAMA_CUDA=1
export FORCE_CMAKE=1
export CMAKE_ARGS="-DLLAMA_CUDA=on"  # GPU版本
pip install --force-reinstall --no-cache-dir llama-cpp-python

可能遇到的问题

  • 步骤2:执行cmake -B build报错如下, 即在编译时缺少curl库,导致cmake配置失败
/llama.cpp$ cmake -B build
CMAKE_BUILD_TYPE=Release
-- Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF
-- CMAKE_SYSTEM_PROCESSOR: x86_64
-- GGML_SYSTEM_ARCH: x86
-- Including CPU backend
-- x86 detected
-- Adding CPU backend variant ggml-cpu: -march=native
-- ggml version: 0.9.4
-- ggml commit:  7a50cf38
-- Could NOT find CURL (missing: CURL_LIBRARY CURL_INCLUDE_DIR)
CMake Error at common/CMakeLists.txt:86 (message):
  Could NOT find CURL.  Hint: to disable this feature, set -DLLAMA_CURL=OFF
-- Configuring incomplete, errors occurred!

解决方案: 安装相关依赖 重新编译

sudo apt install libcurl4-openssl-dev
cmake -B build -DCMAKE_BUILD_TYPE=Release # 或者重新执行步骤2的后两行

二、Qwen3-8B模型部署

我已经被这个模型只需要4G就能跑,你怎么跑起来要20G质疑麻了,不要这么狠心的对待一个大模型入门新手啊喂!

(一)模型下载

魔塔的snapshot_download方式,把要下载的模型/版本(or仓库分支)放到文件里读取,代码使用多线程下载,批量下载不要太爽嘿嘿,而且有断点下载,不怕程序中断导致从头下载了
这里我遇到中断程序后相关目录会生成lock文件不让我继续下载的问题,检查了一下lock文件可以安全删除,删了继续下,问题不大,一般单个下载不会遇到,批量可以注意一下

from modelscope.hub.snapshot_download import snapshot_download

(二)模型部署

首先激活虚拟环境,conda activate demo_test,可以顺便cd到代码文件夹(虽然没什么卵用,哈哈哈)
如果部署时遇到---model xxx 未找到命令这种报错,检查是否每行都有换行符,以及是否有多余空格

llama.cpp部署命令

通过python3 -m llama_cpp.server --help查看各参数。
对于gguf模型,采用llama.cpp(其实也算ollama)进行部署

python -m llama_cpp.server \
--model /home/.../Qwen3-8B-GGUF/Qwen3-8B-Q5_K_M.gguf \
--model_alias qwen3-8b-q5 \
--host ... \
--port 8081 \
--n_gpu_layers -1 \
--n_ctx 40960
--chat_format chatml

参数解析

--model  # 本地模型路径 
--model_alias # 模型名称,调用时可根据模型名称定位到具体模型(好像没啥用)
--host  # 部署ip
--port 8081 # 接口
--n_gpu_layers -1  # -1是将全部加载至GPU,如果资源不够可以设置20或者99等,溢出来的会用cpu加载
--n_ctx 40960  # 长上下文最大长度,资源不够可以减小
--chat_format chatml # 聊天模版

执行llama部署命令可能报错:系统中libstdc++.so.6缺少GLIBCXX_3.4.30 解决方案:

# 查看当前虚拟虚拟环境中是否有GLIBCXX_3.4.30    (修改具体路径,将demo_test换为具体虚拟环境名称)
strings /home/../anaconda3/envs/demo_test/lib/libstdc++.so.6 | grep GLIBCXX_3.4.30
# 若查找后没有输出,即系统中没有,需要升级安装,安装后再strings..查看
conda install -c conda-forge libstdcxx-ng

vllm部署命令

我把vllm从0.4.1升级到0.9.1之后,起服务的速度变慢了,它要等个1-2分钟才能把服务起好,不造为啥,可能变强了也变秃了吧~

python -m vllm.entrypoints.openai.api_server \
--model /home/.../Qwen3-8B-AWQ \
--served-model-name qwen3-8b-awq \
--quantization awq \
--host ... \
--port 8081 \
--gpu-memory-utilization 0.8 \
--max-num-seqs 8 \
--max-model-len 8192 \
--tensor-parallel-size 1 \
--trust-remote-code 

参数解析

# 开头的openai.api_server不要忘了写openai
--model # /home/.../Qwen3-8B-AWQ \  # 这里写至模型所在文件夹即可
--served-model-name qwen3-8b-awq \  # 模型名称
--host ... \
--port ... \
--quantization awq \  # ----若是量化模型,这行必须写,例如gptq、int8、int4...(?)其它的可以不写,具体要自己百度~
--gpu-memory-utilization 0.7 \  # gpu显存的利用率上限(取值0~1),合理设置避免OOM
--max-num-seqs 8 \  # 最多同时处理n个推理请求,我这小卡也就设置个2了
--max-model-len 8192 \  # 最大上下文长度,token
--tensor-parallel-size 1 \  # 指定张量并行的gpu数量
--trust-remote-code

(三)运行显存情况

  1. vllm方式运行Qwen3-8B-AWQ量化模型,设置的长上下文32768,我的显卡直接噌到22GB
    模型基础显存5.7G + kv缓存12.83G + 图形2.88G ≈ 22G oh…(小岳岳:我的天哪.GIF)
    在这里插入图片描述
  2. llama.cpp方式运行Qwen3-8B-GGUF量化模型Q5_K_M.gguf,设置的长上下文40960,只需要11.5G左右,是AWQ的一半…最大的Q8_0在相同参数下也只需要17.5G左右的显存。
    在这里插入图片描述

唉,幻视甲方了,谁不想用最少的资源跑最牛逼的模型?要是我这24GB能把豆包部署上就好了(开个玩笑…)


三、模型测试

思考模式软开关

我是用linux命令部署的模型,没有在代码里预加载之类的,只能用软开关了
提示词末尾软开关,空格+思考模式 .... /think... /no_think,一定要有空格o_o

用例展示

其实模型运行时间还挺不好说的,提示词短,问的简单,一两秒就出结果;提示词长了,复杂了,可能要十多秒;数据量大了,运行一两分钟也是有的,所以很讨厌被问 “你这个模型要运行多长时间?”
哪怕豆包关闭深度思考模式,不使用流式输出,运行结果也需要十多秒吧(?)我太难了

OK写到这本来想展示个postman调用,李奶奶的,postman天天加载中什么劲鸭


有说extra_body无效的,我没管一直带着了。好了postman老实了,展示下:
在这里插入图片描述
对于AWQ测试的时候没遇到过非思考模式下依旧输出空白think块的问题,但是GGUF就有,俺也不知道咋整,烦人

<think>我们面对的是如何在低价老旧显卡上部署Qwen3-30B模型的问题。根据引用内容,我们可以提取以下关键信息: 1. Qwen3系列模型支持模型并行(Tensor Parallelism)KV Cache分片技术(引用[2])。 2. 对于大模型,可以通过多卡部署,例如Qwen3-14B需要2×A100(引用[2]),而Qwen3-32B的部署命令中使用了`--tensor-parallel-size`参数(引用[3][4])。 3. 可以使用vLLM框架进行部署,它支持分页注意力(Paged Attention)来优化显存管理(引用[2])。 4. 量化技术可以显著降低显存需求,例如FP8量化(引用[2])INT4量化(之前讨论中提到)。 用户的需求是使用低价老旧显卡多卡协同运行Qwen3-30B模型。因此,我们需要考虑以下因素: - 老旧显卡的显存容量(通常较低,如11GB的GTX 1080 Ti,或者更老的显卡) - 多卡协同的通信开销(需要支持NVLink或者PCIe通信) - 模型并行(Tensor Parallelism)量化技术(INT4/INT8)的结合使用 ### 方案设计 1. **硬件选择**:选择多张显存较大的老旧显卡,例如4张GTX 1080 Ti(每张11GB,总显存44GB),或者4张RTX 2080 Ti(每张11GB)。但注意,这些显卡的FP16计算性能可能不高,且不支持最新的INT4张量核心加速(如RTX 30系列以上的显卡才有)。 2. **模型并行**:使用Tensor Parallelism(TP)将模型分片到多张显卡上。根据引用[2][3],Qwen3-32B的部署使用了`--tensor-parallel-size`参数(设置为4或2),我们可以参考设置。 3. **量化技术**:为了在显存较小的老旧显卡上运行,必须使用量化。引用[2]提到FP8量化对Qwen3-8B效果显著,我们可以尝试使用INT4或INT8量化。注意,老旧显卡可能不支持FP8,但INT8通常支持。 4. **推理框架**:使用vLLM(引用[2][3][4])进行部署,因为它支持分页注意力,可以更高效地管理显存,尤其对于长上下文。 ### 部署步骤 #### 1. 环境准备 - 安装支持老旧显卡的驱动CUDA(例如CUDA 11.0,根据显卡选择)。 - 安装vLLM框架(注意:vLLM对CUDA版本有要求,需要选择兼容的版本)。 #### 2. 模型准备 - 下载Qwen3-30B的INT4量化模型(例如GGUF格式,或者使用Hugging Face上的量化版本)。 - 或者自行量化:使用AutoGPTQ或GGML等工具将模型量化为INT4。 #### 3. 启动命令 参考引用[3][4]的vLLM启动命令,但需要调整参数以适应多张老旧显卡量化模型。 例如,使用4张GTX 1080 Ti(每张11GB)部署Qwen3-30B-INT4模型: ```bash CUDA_VISIBLE_DEVICES=0,1,2,3 nohup vllm serve /path/to/Qwen3-30B-INT4 \ --tensor-parallel-size 4 \ # 使用4张卡进行张量并行 --max-model-len 8192 \ # 根据显存情况设置最大上下文长度 --port 6001 \ --gpu-memory-utilization 0.9 \ # 尽量利用显存,但避免溢出 --quantization int4 \ # 指定量化方式(如果vLLM支持) --served-model-name Qwen3-30B-INT4 \ > vllm.log 2>&1 & ``` 注意:vLLM目前(0.4.1版本)对量化模型的支持情况,可能需要使用vLLM的`--dtype float16`并配合量化模型(如AWQ格式)来加载。如果使用GGUF格式,则需要通过llama.cpp的api来部署,但这里我们优先使用vLLM。 #### 4. 显存估算 - Qwen3-30B的INT4模型大约需要15GB基础显存(之前计算),加上KV缓存中间变量,每张卡需要约10GB。因此4张11GB的显卡(总显存44GB)可以满足要求。 - 如果使用FP16模型,则30B模型需要约60GB显存,即使分片到4张卡,每卡也需要15GB,而老旧显卡通常只有11GB,因此必须量化。 ### 可能的问题与解决方案 - **问题1:老旧显卡不支持INT4指令集** 解决方案:使用INT8量化(虽然压缩率低,但兼容性好)。INT8模型大约需要30GB显存,4张11GB卡(44GB)可以满足。 - **问题2:多卡通信带宽不足** 解决方案:尽量使用支持NVLink的显卡(如旧款Titan V),或者降低并行度(使用更多卡,如8卡,但通信开销更大)。 - **问题3vLLM对老旧显卡的支持** 解决方案:如果vLLM不支持,可考虑使用Text Generation Inference(TGI)或DeepSpeed。 ### 备选方案:使用DeepSpeed 如果vLLM不支持老旧显卡,可以使用DeepSpeed的推理引擎,它支持模型并行量化。 ```bash # 示例命令(需根据实际情况调整) deepspeed --num_gpus 4 infer.py \ --model Qwen3-30B \ --dtype int8 \ --tensor_parallel_size 4 ``` ### 性能预期 由于老旧显卡的计算能力较弱,且多卡通信开销大,预期推理速度较慢(可能只有10-20 tokens/s)。但对于预算有限的场景,这是一个可行的方案。 ### 相关问题 1. 如何将Qwen3-30B模型量化为INT4格式? 2. 在4张GTX 1080 Ti上部署Qwen3-30B-INT4,每张卡的显存占用是多少? 3. 使用vLLM部署多卡量化模型时,如何监控每张显卡的显存计算负载? 4. 对于不支持INT4指令集的老旧显卡,INT4量化模型是否还能运行?速度如何? 5. 除了vLLM,还有哪些推理框架支持多卡部署Qwen3-30B?</think>### 低价老旧显卡部署 Qwen3-30B 多卡方案 #### 一、核心挑战与解决思路 1. **显存瓶颈** - 老旧显卡(如 GTX 1080 Ti/RTX 2080)单卡显存仅 8-11GB,需 **4-6 张卡协同** 满足 Qwen3-30B 的 FP16 需求(24GB+) - **解决方案**: - **量化压缩**:采用 INT4/INT8 量化,显存需求降至 12-16GB[^2] - **模型分片**:通过 Tensor Parallelism(TP)将模型层拆分到多卡[^3] ```bash # 示例:4卡分片启动 vllm serve /path/Qwen3-30B-INT4 --tensor-parallel-size 4 --quantization int4 ``` 2. **计算能力限制** - 老旧显卡 FP16 算力仅 10-20 TFLOPS(如 RTX 2080 Ti: 13.4 TFLOPS) - **解决方案**: - **算子优化**:使用 FlashAttention-2 减少计算量[^2] - **批处理调度**:vLLM 的分页注意力机制提升吞吐[^3] --- #### 二、硬件选型与配置(总预算 ≤ 8000元) | 显卡型号 | 单卡显存 | 推荐数量 | 总显存 | 适配方案 | 成本估算 | |----------------|----------|----------|--------|-------------------|----------| | **GTX 1080 Ti**| 11GB | 3 张 | 33GB | INT4量化+TP=3 | ¥4500 | | **RTX 2080** | 8GB | 4 张 | 32GB | INT8量化+TP=4 | ¥6000 | | **Tesla P40** | 24GB | 2 张 | 48GB | FP16+TP=2 | ¥5000 | > 💡 **推荐组合**: > **2×Tesla P40(48GB)** > 4×RTX 2080(32GB) > - Tesla P40 支持 FP16 计算,无需强制量化 > - 通过 NVLink 或 PCIe 3.0 x16 互联(带宽 ≥ 32GB/s) --- #### 三、关键部署步骤 1. **模型量化准备** ```bash # 使用 AutoGPTQ 转换为 INT4 python quantize.py Qwen3-30B --bits 4 --output Qwen3-30B-INT4 ``` 2. **vLLM 多卡启动配置** ```bash # 4卡 INT4 部署(适配 RTX 2080) CUDA_VISIBLE_DEVICES=0,1,2,3 vllm serve Qwen3-30B-INT4 \ --tensor-parallel-size 4 \ --max-model-len 8192 \ --gpu-memory-utilization 0.92 \ # 极限利用显存 --enforce-eager \ # 规避老驱动兼容问题 --quantization int4 ``` 3. **通信优化(无 NVLink 时)** - 调整 PCIe 传输策略: ```python # 在 vLLM 配置中增加 distributed_init_method="tcp://[主机IP]:[端口]" ``` --- #### 四、性能预期与调优 | 配置 | 吞吐量(tokens/s) | 延迟(首token) | |----------------------|------------------|---------------| | 4×RTX 2080 (INT4) | 18-25 | 350-500ms | | 2×Tesla P40 (FP16) | 22-30 | 300-450ms | **调优建议**: 1. **动态批处理**:启用 `--max-num-seqs 16` 提升吞吐[^3] 2. **KV Cache 压缩**:对长文本启用 `--block-size 16` 减少显存碎片 3. **混合精度**:部分层用 FP16,关键层用 INT8(需自定义模型分片) --- #### 五、备选方案:CPU offload 若显卡总数不足,可结合 CPU 内存: ```bash # 启用 DeepSpeed 卸载 (需 128GB RAM) deepspeed --num_gpus 2 infer.py \ --model Qwen3-30B \ --deepspeed configs/ds_offload.json # 配置显存-内存交换策略 ``` > ⚠️ **注意**:此方案速度下降 3-5 倍,仅适合非实时任务 --- ### 相关问题 1. Tesla P40 不支持 FP16 张量核心,如何优化 Qwen3 的计算效率? 2. 在多卡部署中,如何监控每张显卡的显存计算负载? 3. 使用 PCIe 3.0 互联时,如何减少多卡通信瓶颈? 4. Qwen3-30B 的 INT4 量化在老旧显卡上精度损失是多少? 5. 是否有开源工具能自动拆分模型到异构显卡(如 2×P40 + 2×GTX 1080)? > 引用文献: > [^1]: NVIDIA 官方 Qwen3 部署指南 > [^2]: Qwen3 架构优化说明(流式生成/KV 缓存) > [^3]: vLLM 多卡部署命令实例 > [^4]: FP8 量化模型启动配置
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值