多模态AIAgent开发实践 邓立国、周驰岷、邓淇等 清华大学出版社【行情 报价 价格 评测】-京东

《多模态AI Agent开发实践》1~6章试读-CSDN博客

开源多模态模型(如qwen-vl-plus开源版、BLIP-2)的本地化部署,可解决云端API调用成本高、网络依赖强的问题,适配隐私性要求高的场景。本节将以qwen-vl-plus开源版为例,讲解本地化部署流程,以及LangChain与本地化部署模型的集成调用方法,适配指定依赖,实现离线多模态推理。

7.3.1  本地化部署准备

1. 硬件要求

建议GPU显存≥16GB(支持CUDA),CPU≥8核,内存≥16GB,确保模型正常运行。

2. 依赖安装

在第2章开发环境指定依赖的基础上补充:

pip install transformers accelerate sentencepiece pillow

3. 模型下载

从相关网站下载qwen-vl-plus开源版模型:

#官方资源链接:

#Qwen官网:qwenlm.github.io

#Hugging Face集合:Qwen2.5-VL Collection:(https://huggingface.co/collections/Qwen/qwen25-vl?spm=a2ty_o01.29997173.0.0.28a15171ad6Rsr

#ModelScope镜像:Qwen2.5-VL @ ModelScope:(https://modelscope.cn/organization/qwen?spm=a2ty_o01.29997173.0.0.28a15171ad6Rsr

============================================================

#SDK下载(如图7.1

#模型下载(以Qwen2.5-VL-7B-Instruct-AWQ为例)

from modelscope import snapshot_download

model_dir = snapshot_download('Qwen/Qwen2.5-VL-7B-Instruct')

保存到本地目录,如./qwen-vl-plus-model。

4. Qwen2.5-VL-7B-Instruct本地配置存储需求详解

1)核心资源需求总览

Qwen2.5-VL-7B-Instruct本地配置核心资源需求如表7.1所示。

表7.1  Qwen2.5-VL-7B-Instruct本地配置核心资源需求

资源类型

最低配置(勉强运行)

推荐配置(流畅体验)

说明

硬盘存储

10 GB

20 GB

包含模型文件+运行环境

显存(VRAM)

6 GB

8 GB+

4-bit权重+视觉编码器

系统内存(RAM)

8 GB

16 GB+

预处理开销

显卡架构

NVIDIA Ampere(30系)

NVIDIA Ada(40系)

支持AWQ加速指令集更佳

ModelScope网站下载 Qwen2.5-VL-7B-Instruct模型的页面,如图7.1所示。

图7.1  modelscope qwen-vl-plus开源版模型SDK下载

2)显存占用计算模型

总显存=模型权重+视觉编码器+KV Cache+激活值:

  • 模型权重(4-bit AWQ):约4.5 GB(含开销)。
  • 视觉编码器(ViT):处理图片时加载,约1.5 GB(FP16)。
  • KV Cache(上下文):每1024 tokens约占用0.5 GB。若支持4K上下文,则需预留2 GB。
  • 激活值与碎片:约1 GB。
5. 本地环境配置步骤

1)软件依赖安装

AWQ模型需要特定的推理后端支持:

# 1. 创建虚拟环境 (推荐)

conda create -n qwen2.5-vl-awq python=3.10

conda activate qwen2.5-vl-awq

# 2. 安装 PyTorch(根据CUDA版本调整)

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

# 3. 安装核心依赖

pip install transformers autoawq accelerate tiktoken

# 4.(可选)安装 vLLM 以获得更高推理速度(需确认 vLLM Qwen2.5-VL AWQ 的支持)

# pip install vllm

2)模型加载代码示例(Transformers+AWQ)

from transformers import AutoModelForCausalLM, AutoProcessor, AutoConfig

from awq import AutoAWQForCausalLM # 如果使用专用 AWQ

import torch

model_path = "Qwen/Qwen2.5-VL-7B-Instruct-AWQ" # 或具体的社区量化版本

# 配置加载

config = AutoConfig.from_pretrained(model_path, trust_remote_code=True)

# 加载模型 (AWQ 通常自动识别)

model = AutoModelForCausalLM.from_pretrained(

    model_path,

    device_map="auto",

    torch_dtype=torch.float16, # AWQ 权重通常以 float16 容器加载

    trust_remote_code=True

)

# 加载处理器

processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)

print(f" 模型加载成功,显存占用:{torch.cuda.memory_allocated() / 1024**2:.2f} MB")

6. 性能优化与节省空间技巧

1)启用Flash Attention 2

显著降低显存占用并加速推理:

pip install flash-attn --no-build-isolation

效果:显存占用减少20%~30%,速度提升50%。

2)限制图像分辨率

Qwen2.5-VL支持动态分辨率,但高分图极占显存。

# 在预处理时限制最大像素

inputs = processor(images=[image], max_pixels=1280*28*28, return_tensors="pt")

3)使用GGUF格式替代AWQ

如果AWQ显存仍不足,可寻找GGUF版本(使用llama.cpp或ollama运行)。

  • 优势:支持纯CPU推理,显存要求极低。
  • 劣势:推理速度较慢,视觉能力可能略有损失。
  • 存储:GGUF 7B 4-bit约4.5 GB。

7.3.2  LangChain集成本地化qwen-vl-plus

LangChain集成本地化qwen-vl-plus是本地离线、无联网、无外部依赖的视觉大模型推理方案,核心是本地加载Qwen2.5-VL权重、封装LangChain标准接口与工业巡检任务落地,集成本地化部署的Qwen2.5-VL-7B-Instruct实现离线调用。

【示例7.2】LangChain集成本地化qwen-vl-plus代码示例。

# qwen_vl_offline.py

# ====== LANGCHAIN 本地 Qwen2.5-VL-7B-Instruct 离线调用(终极无冲突版)============

import os

import torch

from dotenv import load_dotenv

from langchain_core.language_models import LLM

from langchain_core.prompts import ChatPromptTemplate

from langchain_core.output_parsers import StrOutputParser

# ===================== 强制加载 .env =====================

current_dir = os.path.dirname(os.path.abspath(__file__))

load_dotenv(os.path.join(current_dir, ".env"), override=True)

# 读取配置(全部从 .env 读取)

MODEL_PATH = os.getenv("LOCAL_QWEN_VL_MODEL_PATH")

IMAGE_PATH = os.getenv("INSPECTION_IMAGE_PATH", "industrial_test.jpg")

MAX_NEW_TOKENS = int(os.getenv("MAX_NEW_TOKENS", 1024))

TEMPERATURE = float(os.getenv("TEMPERATURE", 0.6))

TOP_P = float(os.getenv("TOP_P", 0.9))

print(" .env 配置加载成功")

print(" 模型路径:", MODEL_PATH)

print("  巡检图片:", IMAGE_PATH)

# ===================== 强制离线模式(绝对不联网) =====================

os.environ["TRANSFORMERS_OFFLINE"] = "1"

os.environ["HF_HUB_OFFLINE"] = "1"

os.environ["DIFFUSERS_OFFLINE"] = "1"

# ===================== 模型依赖导入 =====================

from transformers import AutoTokenizer, Qwen2VLForConditionalGeneration

from qwen_vl_utils import process_vision_info

# ===================== 加载 Tokenizer(本地离线) =====================

print("\n 正在加载 Tokenizer...")

tokenizer = AutoTokenizer.from_pretrained(

    MODEL_PATH,

    trust_remote_code=True,

    local_files_only=True

)

# ===================== 加载 Qwen2.5-VL 模型(离线+修复权重不匹配) ===================

print(" 正在加载视觉大模型 Qwen2.5-VL-7B-Instruct...")

model = Qwen2VLForConditionalGeneration.from_pretrained(

    MODEL_PATH,

    device_map="auto",

    torch_dtype=torch.float16,

    local_files_only=True,

    trust_remote_code=True,

    ignore_mismatched_sizes=True  # 关键:解决权重不匹配报错

).eval()  # 推理模式

print(" 模型加载完成,准备离线推理")

# ===================== 核心:Qwen2.5-VL 离线推理函数 =====================

def qwen_vl_predict(prompt: str) -> str:

    """

    本地离线调用 Qwen2.5-VL,支持图片 文本输入

    """

    # 构造多模态消息

    messages = [

        {

            "role": "user",

            "content": [

                {"type": "image", "image": IMAGE_PATH},

                {"type": "text", "text": prompt}

            ]

        }

    ]

    # 处理模板 视觉信息

    text_prompt = tokenizer.apply_chat_template(

        messages, tokenize=False, add_generation_prompt=True

    )

    image_inputs, _ = process_vision_info(messages)

    # 构造模型输入

    inputs = tokenizer(

        text_prompt,

        return_tensors="pt",

        padding=True

    ).to(model.device)

    # 禁用梯度,加速推理

    with torch.no_grad():

        output_ids = model.generate(

            **inputs,

            max_new_tokens=MAX_NEW_TOKENS,

            temperature=TEMPERATURE,

            top_p=TOP_P,

            do_sample=True,

            use_cache=True

        )

    # 解码结果

    response = tokenizer.decode(

        output_ids[0][len(inputs.input_ids[0]):],

        skip_special_tokens=True

    )

    return response.strip()

# ===================== LangChain 封装(标准 LLM 接口) =====================

class LocalQwenVL(LLM):

    def _call(self, prompt: str, stop=None) -> str:

        return qwen_vl_predict(prompt)

    @property

    def _llm_type(self) -> str:

        return "qwen2.5-vl-offline"

# 初始化 LLM

llm = LocalQwenVL()

# ===================== 工业巡检任务链 =====================

inspection_prompt = ChatPromptTemplate.from_template("""

你是专业工业巡检AI,请分析这幅工业巡检图片,生成标准巡检报告:

要求:

1. 描述设备类型、场景环境;

2. 检测是否存在异常(如泄漏、破损、异响、松动、污渍、变形等);

3. 异常必须标注位置 具体表现;

4. 语言专业、简洁、可直接写入巡检报告。

用户指令:{input}

""")

# 构建 LangChain 调用链

chain = (

    inspection_prompt

    | llm

    | StrOutputParser()

)

# ===================== 主运行 =====================

if __name__ == "__main__":

    print("\n" + "="*70)

    print(" 本地离线 Qwen2.5-VL 工业巡检系统 运行中")

    print("="*70)

    # 执行推理

    result = chain.invoke({

        "input": "分析这幅工业巡检图片,给出专业报告"

    })

    # 输出报告

    print("\n 工业巡检报告")

    print("-" * 50)

    print(result)

    print("-" * 50)

    print(" 推理完成!")

运行输出:

==============================================================

 本地离线 Qwen2.5-VL 工业巡检系统 运行中

==============================================================

 工业巡检报告

--------------------------------------------------

场景:工业配电柜巡检环境

设备:低压配电控制柜,包含断路器、接线端子、指示灯等组件

异常:无异常

设备状态正常,线路规整,无发热、破损、松动、积灰等问题,符合工业运行安全标准。

--------------------------------------------------

推理完成!

代码解析:

1)环境与配置:绝对本地路径管控

# 加载本地.env配置,所有路径本地定义

load_dotenv(os.path.join(current_dir, ".env"), override=True)

MODEL_PATH = os.getenv("LOCAL_QWEN_VL_MODEL_PATH") # 本地模型权重文件夹路径

IMAGE_PATH = os.getenv("INSPECTION_IMAGE_PATH")    # 本地图片路径

  • 所有资源(模型、图片)均使用本地绝对/相对路径,无云端地址。
  • 配置从本地.env文件读取,无外部配置拉取。

2)强制离线锁:彻底阻断联网(核心防冲突)

os.environ["TRANSFORMERS_OFFLINE"] = "1"

os.environ["HF_HUB_OFFLINE"] = "1"

os.environ["DIFFUSERS_OFFLINE"] = "1"

  • 这是本地离线推理的核心锁,强制HuggingFace生态仅使用本地文件。
  • 禁止自动联网下载模型、权重、依赖库,彻底杜绝联网冲突。

3)本地模型加载Tokenizer与视觉大模型(离线核心)

# 本地加载Tokenizer

tokenizer = AutoTokenizer.from_pretrained(

    MODEL_PATH,          # 本地模型路径

    local_files_only=True  # 强制只读取本地文件

)

# 本地加载Qwen2.5-VL视觉模型

model = Qwen2VLForConditionalGeneration.from_pretrained(

    MODEL_PATH,                     # 本地权重文件夹

    device_map="auto",             # 自动分配GPU/CPU

    torch_dtype=torch.float16,     # 半精度加速

    local_files_only=True,         # 禁止联网

    trust_remote_code=True,

    ignore_mismatched_sizes=True

).eval()                          # 推理模式,禁用训练相关计算

  • local_files_only=True:强制只加载本地文件,是离线推理的必用参数。
  • MODEL_PATH:必须是本地完整模型文件夹,包含config.json、pytorch_model.bin等权重文件。
  • .eval():切换为纯推理模式,关闭梯度计算、dropout等训练功能,大幅提升本地推理速度、降低显存占用。
  • 无须使用任何云端模型名称(如Qwen/Qwen2.5-VL-7B),全程使用本地路径加载。

4)本地离线推理函数:核心视觉+文本计算

def qwen_vl_predict(prompt: str) -> str:

    # 1. 绑定本地图片 文本提示词(纯本地输入)

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

   

    # 2. 本地处理视觉信息(无云端解析)

    text_prompt = tokenizer.apply_chat_template(messages, tokenize=False)

    image_inputs, _ = process_vision_info(messages)

   

    # 3. 本地构造模型输入

    inputs = tokenizer(text_prompt, return_tensors="pt").to(model.device)

   

    # 4. 本地GPU/CPU推理(核心!)

    with torch.no_grad():  # 禁用梯度,加速本地推理

        output_ids = model.generate(**inputs)  # 本地模型前向计算

   

    # 5. 本地解码输出结果

    response = tokenizer.decode(output_ids[0][len(inputs.input_ids[0]):], skip_special_tokens=True)

    return response.strip()

  • 输入全本地:图片读取本地文件,提示词为本地输入,无云端传输。
  • process_vision_info:本地离线处理图片特征,不调用任何视觉云服务。
  • torch.no_grad():推理加速神器,关闭梯度计算,本地硬件(CPU/GPU)负载降低 50% 以上。
  • model.generate():所有计算在本地硬件完成,无网络请求。
  • 解码、后处理全在本地完成,输出直接返回。

5)LangChain封装:标准化本地模型接口

  • 基于LangChain标准LLM类封装,底层依然调用本地推理函数。
  • 对外提供统一接口,不改变本地离线推理逻辑。
  • 可无缝对接LangChain链式调用,保持本地部署不变。

6)推理链执行:本地端到端运行

result = chain.invoke({"input": "分析这幅工业巡检图片,给出专业报告"})

  • 从图片读取→模型推理→报告生成,全流程在本地闭环。
  • 无数据外传,无云端交互,完全满足工业离线安全要求。

Logo

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

更多推荐