1、配置相关环境

首先需要建立一个conda虚拟环境,我这里新建了一个名字为qwen2vl_cpu_env的虚拟环境。

python -m venv qwen2vl_cpu_env

之后激活虚拟环境,激活后,命令行前缀会显示qwen2vl_cpu_env。

qwen2vl_cpu_env\Scripts\activate

我使用CPU进行推理,安装CPU的pytorch,如果你有GPU推理会更快。

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu

安装之后可以验证。

python -c "import torch; print(torch.__version__)"

之后安装其他依赖。

pip install transformers accelerate qwen-vl-utils -i https://pypi.mirrors.ustc.edu.cn/simple/

如果需要从国内 ModelScope 下载模型需要安装这个(推荐,解决下载太慢)。

pip install modelscope -i https://pypi.mirrors.ustc.edu.cn/simple/

之后在虚拟环境激活状态下,执行以下命令下载千问的模型,权重以及其他配置文件。

modelscope download --model qwen/Qwen2-VL-2B-Instruct --local_dir ./Qwen2-VL-2B-Instruct

你在哪里执行的命令模型就放在哪里了,比如我这个模型下载到了C: \Users\Andy>里面。下载完成后,当前目录下会出现 Qwen2-VL-2B-Instruct 文件夹(约 4.5 GB)。

2、编写脚本使用千问进行推理

编写以下脚本进行图像ocr识别并运用千问LLM以及自己写的提示词进行推理,我是用锐龙9的CPU推理,大概半分钟左右的时间。

import torch
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info

# ---------- 配置 ----------
MODEL_PATH = r"C:\Users\Andy\Qwen2-VL-2B-Instruct"
IMAGE_PATH = "D:/Project/pythonproject/qwentest/test.png"      # 图片路径
DEVICE = "cpu"                         # 用 CPU

# ---------- 加载模型和处理器 ----------
# CPU 下必须用 float32(默认),且 device_map="cpu"
model = Qwen2VLForConditionalGeneration.from_pretrained(
    MODEL_PATH,
    torch_dtype=torch.float32,
    device_map="cpu"
)

processor = AutoProcessor.from_pretrained(MODEL_PATH)

# ---------- 构造多模态消息 ----------
# 提示词明确要求只输出文字
prompt = "我今天14:30去洗澡有没有热水?明确回答我有没有热水。"

messages = [
    {
        "role": "user",
        "content": [
            {"type": "image", "image": IMAGE_PATH},
            {"type": "text", "text": prompt},
        ],
    }
]

text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)

inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    padding=True,
    return_tensors="pt",
)
# 将输入移到 CPU(已经默认在 CPU,但显式调用也无妨)
inputs = inputs.to(DEVICE)

# ---------- 推理 ----------
print("正在推理(CPU 速度较慢,请耐心等待)...")
generated_ids = model.generate(
    **inputs,
    max_new_tokens=256,          # CPU 下可减少 token 数,加快速度
    do_sample=False,
)

# 去除输入部分
generated_ids_trimmed = [
    out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]

output_text = processor.batch_decode(
    generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)

print("识别结果:")
print(output_text[0])

我这个图片和模型的路径都是绝对路径,图片如下所示:

设置的提示词是:我今天14:30去洗澡有没有热水?明确回答我有没有热水。

运行结果如下:

可以看见千问通过图片OCR结果以及LLM的固有知识回答了问题。

注意推理的时候内存会大幅使用,使用CPU推理电脑内存至少要有32G

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐