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识别并运用千问VLM以及自己写的提示词进行推理我是用锐龙9的CPU推理大概半分钟左右的时间。import torch from transformers import Qwen2VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info # ---------- 配置 ---------- MODEL_PATH rC:\Users\Andy\Qwen2-VL-2B-Instruct IMAGE_PATH D:/Project/pythonproject/qwentest/test.png # 图片路径 DEVICE cpu # 用 CPU # ---------- 加载模型和处理器 ---------- # CPU 下必须用 float32默认且 device_mapcpu model Qwen2VLForConditionalGeneration.from_pretrained( MODEL_PATH, torch_dtypetorch.float32, device_mapcpu ) processor AutoProcessor.from_pretrained(MODEL_PATH) # ---------- 构造多模态消息 ---------- # 提示词明确要求只输出文字 prompt 我今天1430去洗澡有没有热水明确回答我有没有热水。 messages [ { role: user, content: [ {type: image, image: IMAGE_PATH}, {type: text, text: prompt}, ], } ] text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) image_inputs, video_inputs process_vision_info(messages) inputs processor( text[text], imagesimage_inputs, videosvideo_inputs, paddingTrue, return_tensorspt, ) # 将输入移到 CPU已经默认在 CPU但显式调用也无妨 inputs inputs.to(DEVICE) # ---------- 推理 ---------- print(正在推理CPU 速度较慢请耐心等待...) generated_ids model.generate( **inputs, max_new_tokens256, # CPU 下可减少 token 数加快速度 do_sampleFalse, ) # 去除输入部分 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_tokensTrue, clean_up_tokenization_spacesFalse ) print(识别结果) print(output_text[0])我这个图片和模型的路径都是绝对路径图片如下所示设置的提示词是我今天1430去洗澡有没有热水明确回答我有没有热水。运行结果如下可以看见千问通过图片OCR结果以及语言模型的固有知识回答了问题。视觉语言模型区别于传统流水式OCR识别在于其可以将图片里面不同的信息块结合起来作为整体来看这就是Transform架构的全局视野能力。千问VLM能整体理解图片中的文字内容其技术根源正是Transformer架构的自注意力机制。注意推理的时候内存会大幅使用使用CPU推理电脑内存至少要有32G的内存。
部署Qwen2-VL-2B进行图片OCR识别及VLM推理
发布时间:2026/7/18 4:42:43
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识别并运用千问VLM以及自己写的提示词进行推理我是用锐龙9的CPU推理大概半分钟左右的时间。import torch from transformers import Qwen2VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info # ---------- 配置 ---------- MODEL_PATH rC:\Users\Andy\Qwen2-VL-2B-Instruct IMAGE_PATH D:/Project/pythonproject/qwentest/test.png # 图片路径 DEVICE cpu # 用 CPU # ---------- 加载模型和处理器 ---------- # CPU 下必须用 float32默认且 device_mapcpu model Qwen2VLForConditionalGeneration.from_pretrained( MODEL_PATH, torch_dtypetorch.float32, device_mapcpu ) processor AutoProcessor.from_pretrained(MODEL_PATH) # ---------- 构造多模态消息 ---------- # 提示词明确要求只输出文字 prompt 我今天1430去洗澡有没有热水明确回答我有没有热水。 messages [ { role: user, content: [ {type: image, image: IMAGE_PATH}, {type: text, text: prompt}, ], } ] text processor.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) image_inputs, video_inputs process_vision_info(messages) inputs processor( text[text], imagesimage_inputs, videosvideo_inputs, paddingTrue, return_tensorspt, ) # 将输入移到 CPU已经默认在 CPU但显式调用也无妨 inputs inputs.to(DEVICE) # ---------- 推理 ---------- print(正在推理CPU 速度较慢请耐心等待...) generated_ids model.generate( **inputs, max_new_tokens256, # CPU 下可减少 token 数加快速度 do_sampleFalse, ) # 去除输入部分 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_tokensTrue, clean_up_tokenization_spacesFalse ) print(识别结果) print(output_text[0])我这个图片和模型的路径都是绝对路径图片如下所示设置的提示词是我今天1430去洗澡有没有热水明确回答我有没有热水。运行结果如下可以看见千问通过图片OCR结果以及语言模型的固有知识回答了问题。视觉语言模型区别于传统流水式OCR识别在于其可以将图片里面不同的信息块结合起来作为整体来看这就是Transform架构的全局视野能力。千问VLM能整体理解图片中的文字内容其技术根源正是Transformer架构的自注意力机制。注意推理的时候内存会大幅使用使用CPU推理电脑内存至少要有32G的内存。