目录
一、问题和需求
我们在利用qwen3-4B正常的bfloat16模型做信息抽取的过程中,速度很慢,需要40s。经过测试发现,要让模型进行较好的,稳定的json输出信息,pydantic模型是不能缺少的。
我得出暂时的结论,整个抽取信息的速度主要取决两个因素:
1. pydantic模型总体的量。
2. 模型的"聪明程度",越聪明的模型,想的越多,输出越慢。
具体的测试可以看我之前的博客:
Langchain如何让大模型结构化输出指定的字段信息-CSDN博客
如何把整个信息流程提速?先做到可以用,再做到好用。
提升模型抽取信息的速度的思路主要有三个:
1.参数量不变,部署量化版本的模型。如:qwen3-4B-bfloat4。
2.把pydantic模型简化成两个部分,做到并发调用模型,然后拼接json信息。
3.使用程序化的代码做预处理:先用正则表达式或规则程序抽取能抽取的信息,再把不能抽取的信息给大模型处理,减轻模型的任务量。
4. 部署参数量更小,但是量化精度不要太低的模型,尝试写不同的提示词,抛弃pydantic模型校验输出,得到速度更快的输出。
二、部署量化模型
2.1 使用ollama部署
2.1.1 ollama部署的代码
本身使用ollama部署的模型都是GGUF的模型,比较简单。模型的详细信息在下面网站中。
ollama run qwen3:4b
使用代码调用ollama模型服务:
from langchain_ollama import ChatOllama
from langchain_openai import ChatOpenAI
def get_ollama_llm(MODEL_PATH:str,MODEL_URL:str, temperature:Optional[float] = 0.1):
'''通过ollama调用llm,返回langchain的llm对象'''
# 方法一:MODEL_URL="http://localhost:11434"
# ollama_llm = ChatOllama(
# model=MODEL_PATH,
# base_url=MODEL_URL, # Ollama服务地址
# temperature=temperature,
# extra_body={
# "top_k": 20,
# "chat_template_kwargs": {"enable_thinking": False},
# },
# )
# 方法二:MODEL_URL="http://localhost:11434/v1"
ollama_llm = ChatOpenAI(
streaming=True,
openai_api_base=MODEL_URL, # VLLM 服务地址
model_name=MODEL_PATH,
temperature=temperature,
# max_tokens=max_tokens,
openai_api_key="EMPTY", # 本地部署不需要 API key,但需要设置一个非空值
extra_body={
"top_k": 20,
"chat_template_kwargs": {"enable_thinking": False},
},
)
return ollama_llm
if __name__ == "__main__":
text = "讲个笑话"
llm = get_ollama_llm(MODEL_PATH="qwen3:4b",MODEL_URL="http://localhost:11434/v1")
# llm = get_api_llm()
# 非思考模式 prompt后面加上一个/no_think
# logger.info(llm.invoke(f"{text} /no_think")) # 直接调用
# print(llm.invoke(text).content)
# 简单的控制台流式输出调试
for chunk in llm.stream(f"{text}"): # 同步流式方法
print(chunk.content, end="", flush=True) # 无需异步环境
但是非常可惜,我使用了很多方法来让模型不思考,直接输出,模型都还是会思考输出。
尝试了下面的方法:
1.运行模型的时候,ollama run qwen3:4b /no_think
2. 调用模型的时候提供如代码所示的参数和,提示词中写 /no_think
3. 重新构建qwen3-4B.modelfile,里面的模版中给定no_think
4. 使用之前的通过VLLM部署模型的qwen3_nonthinking.jinja文件夹的内容。
如果读者有解决方法,可以评论区留意讨论。
2.1.2 测试ollama部署的gguf模型的推理速度
# 启用100%GPU来跑模型
export OLLAMA_USE_GPU=1
# 显示模型推理速度详情
ollama run qwen3:4b --verbose
2.2 使用vllm部署量化模型
我之前是有用过vllm部署qwen3-4B-bfloat16非量化版本的模型。教程如下,可以参考一下环境安装。
超详细VLLM框架部署qwen3-4B加混合推理探索!!!_vllm qwen3-CSDN博客
2.2.1 获取量化版本模型
模型选择一:动态量化模型,支持思考和非思考模式
Qwen3-4B-unsloth-bnb-4bit · 模型库
模型选择二:普通量化模型,支持思考和非思考模式
模型选择三:普通量化模型,仅支持非思考模式
Qwen3-4B-Instruct-2507-bnb-4bit · 模型库
模型选择四:普通量化模型,仅支持思考模式
Qwen3-4B-Thinking-2507-unsloth-bnb-4bit · 模型库
上述模型,可以按照自己的需求选择下载。
动态量化模型和普通的量化模型的区别如下:
场景 |
推荐配置 |
理由 |
---|---|---|
移动端/低显存设备 |
模型二 |
显存占用更小,满足基础问答、摘要等需求 |
数学/代码/长文本推理 |
模型一 |
保留关键层精度,减少量化误差 |
工具调用(MCP) |
模型一 |
保障函数解析准确性,避免工具调用失败 |
注:两者均使用 NF4量化+双量化(Double Quant),核心量化技术一致
可以理解成动态量化模型,并不是把全部的层都量化了,还保留了部分bfloat16精度的层。
以模型一下载为例子:
# 下载modelscope
pip install modelscope
modelscope download --model unsloth/Qwen3-4B-unsloth-bnb-4bit --local_dir /root/model/Qwen3-4B-unsloth-bnb-4bit
2.2.2 安装VLLM
conda create -n vllmtest python=3.12 -y
conda activate vllmtest
# 下载vllm
pip install --upgrade vllm
pip install "vllm>=0.8.5" -i https://mirrors.aliyun.com/pypi/simple/
PS: 如果之前有成功安装过VLLM包的虚拟环境,可以用克隆到新的虚拟环境,这样后续操作就不会把原来可以用的环境搞的不能用