LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/144881432


vLLM

大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,就能够访问和使用。通过简单的 API 调用,执行各种任务,从而在各种应用中实现智能化,不仅提高模型的可访问性,还降低技术门槛。

参考:

  1. 使用 LLaMA-Factory 微调大模型 环境配置与训练推理
  2. 使用 LLaMA-Factory 微调 Qwen2-VL SFT(LoRA) 图像数据集
  3. 使用 LLaMA-Factory 微调 Qwen2-VL DPO(LoRA) 图像数据集

LLaMA-Factory 版本:v0.9.1

1. 准备服务

已准备的大模型位置:

[your path]/huggingface/Qwen/Qwen2-VL-7B-Instruct/

同时选择与模型,相匹配的模版(template),例如 模型 Qwen2-VL-7B-Instruct 和 模版 qwen2_vl 匹配。

启动 HTTP 服务,端口自定义8000,推理后端(infer_backend) 使用 huggingface,即:

CUDA_VISIBLE_DEVICES=0 API_PORT=8000 python src/api.py \
--model_name_or_path [your path]/huggingface/Qwen/Qwen2-VL-7B-Instruct/ \
--template qwen2_vl \
--infer_backend huggingface

或者 推理后端(infer_backend) 使用 vllm,即:

CUDA_VISIBLE_DEVICES=0 API_PORT=8000 python src/api.py \
--model_name_or_path [your path]/huggingface/Qwen/Qwen2-VL-7B-Instruct/ \
--template qwen2_vl \
--infer_backend vllm \
--vllm_enforce_eage

安装 vllm 库:

# To fix: pip install vllm>=0.4.3,<0.6.5
pip install vllm==0.6.4

服务运行成功日志:

Visit http://localhost:8000/docs for API document.
INFO:     Started server process [1118972]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     10.4.12.94:63908 - "POST /v1/chat/multimodal HTTP/1.1" 404 Not Found
INFO:     10.4.12.94:63942 - "GET /docs HTTP/1.1" 200 OK
INFO:     10.4.12.94:63942 - "GET /openapi.json HTTP/1.1" 200 OK
INFO:     10.4.12.94:63978 - "GET /openapi.json HTTP/1.1" 200 OK

2. 调用服务

使用 CURL 访问 HTTP 服务,传入图像地址,即:

curl -X POST 'http://[your ip]:8000/v1/chat/completions' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"model":"Qwen2-VL-7B-Instruct","messages":[{"role":"user","content":[{"type":"text","text":"<image>请帮我描述一下图像的内容。"},{"type":"image_url","image_url":{"url":"[your path]/llm/vision_test_data/image2.png"}}]}]}'

输入的 Json 格式:

{"model": "Qwen2-VL-7B-Instruct","messages": [{"role": "user","content": [{"type": "text","text": "<image>请帮我描述一下图像的内容。"}, {"type": "image_url","image_url": {"url": "[your path]/llm/vision_test_data/image2.png"}}]}]
}

HTTP 服务返回的 Json 答案:

{"id": "chatcmpl-6e42da18fad542609711a8536e46a1fd","object": "chat.completion","created": 1735785603,"model": "Qwen2-VL-7B-Instruct","choices": [{"index": 0,"message": {"role": "assistant","content": "图像中,一个人正躺在一张床上,床单上有一个粉红色的格子图案和一个可爱的卡通人物。他们穿着白色的袜子,腿上放着一把电吉他。旁边有一个蓝色的卡通玩偶,看起来像是哆啦A梦。背景中可以看到一些模糊的家具和装饰品。","tool_calls": null},"finish_reason": "stop"}],"usage": {"prompt_tokens": 366,"completion_tokens": 66,"total_tokens": 432}
}

服务输入格式,与OpenAI一致,参考:https://platform.openai.com/docs/guides/vision

服务调用日志:

[INFO|2025-01-02 10:39:59] llamafactory.api.chat:157 >> ==== request ====
{"model": "Qwen2-VL-7B-Instruct","messages": [{"role": "user","content": [{"type": "text","text": "<image>请帮我描述一下图像的内容。"},{"type": "image_url","image_url": {"url": "[your path]/llm/vision_test_data/image2.png"}}]}]
}
INFO:     10.4.12.94:64885 - "POST /v1/chat/completions HTTP/1.1" 200 OK

使用 Python 源码的调用 API 模型服务的方式:

import requestsclass xTATVision(object):"""调用服务器接口"""def __init__(self, base_url='http://[your ip]:8000'):self.base_url = base_urldef create(self, model, messages, max_tokens=None):# 构建请求的 URLurl = f"{self.base_url}/v1/chat/completions"# 构建请求的 headers 和 dataheaders = {'accept': 'application/json','Content-Type': 'application/json'}data = {"model": model,"messages": messages}if max_tokens is not None:data["max_tokens"] = max_tokens# 发送 POST 请求response = requests.post(url, headers=headers, json=data)# 检查响应状态码if response.status_code == 200:# 返回 JSON 响应内容return response.json()else:# 打印错误信息并返回 Noneprint(f"请求失败,状态码:{response.status_code}")return None# 使用示例
if __name__ == "__main__":client = xTATVision()response = client.create(model="Qwen2-VL-7B-Instruct",messages=[{"role": "user","content": [{"type": "text", "text": "请帮我描述一下图像的内容。"},{"type": "image_url","image_url": {"url": "[your path]/llm/vision_test_data/image2.png",},},],}],max_tokens=300,)# 打印响应内容if response:print(response)

遇到 Bug,len(images) is less than the number of <image> tokens.,即标签 <image> 与图像数量不匹配。

原因:图像数量与标签数量不匹配,即图像传输方式错误,参考 OpenAI 的 Image HTTP 格式,即:

messages=[{"role": "user","content": [{"type": "text", "text": "What's in this image?"},{"type": "image_url","image_url": {"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",},},],}
],

遇到警告(WARNING):Current vllm-flash-attn has a bug inside vision module, so we use xformers backend instead. You can run pip install flash-attn to use flash-attention backend.

原因:需要重新安装 flash-attn 库,参考 配置 FlashAttention 。

警告:

WARNING 12-31 17:18:51 utils.py:603] Current `vllm-flash-attn` has a bug inside vision module, so we use xformers backend instead. You can run `pip install flash-attn` to use flash-attention backend.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/66234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学英语学压测:02jmeter组件-测试计划和线程组ramp-up参数的作用

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#xff1a;先看关键单词&#xff0c;再看英文&#xff0c;最后看中文总结&#xff0c;再回头看一遍英文原文&#xff0c;效果更佳&#xff01;&#xff01; 关键词 Functional Testing功能测试[ˈfʌŋkʃənəl ˈtɛstɪŋ]Sample样…

多线程访问FFmpegFrameGrabber.start方法阻塞问题

一、背景 项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放 通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能&#xff0c;其底层利用javacv的FFmpegFrameGrabber进行拉流、推流&#xff0c;进而实现了视频中转。 …

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建

FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包&#xff0c;广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发&#xff0c;旨在为神经科学研究人员提供一个高效、精确的数据…

OKHttp调用第三方接口,响应转string报错okhttp3.internal.http.RealResponseBody@4a3d0218

原因分析 通过OkHttp请求网络&#xff0c;结果请求下来的数据一直无法解析并且报错&#xff0c;因解析时String res response.body().toString() 将toString改为string即可&#xff01;

oceanbase集群访问异常问题处理

1.报错现象 2.问题排查 检查obproxy状态发现为不可用状态 重启obproxy 依次重启Obproxy集群 观察任务状态 重启完成 Obproxy状态正常 3.验证登录 登录成功

ruckus R510升级到Unleashe后不能访问

ruckus R510 是IPQ4019&#xff0c;升级到Unleashe&#xff0c;它弹窗提示 但是这个IP没办法用&#xff0c;访问不了AP。 必应了一下&#xff0c;官方提示用advance ip scanner扫描。 扫描持续好久&#xff0c;发现IP竟然是从主路由获得。 9090的端口不用填&#xff0c;甚至不…

使用R语言绘制标准的中国地图和世界地图

在日常的学习和生活中&#xff0c;有时我们常常需要制作带有国界线的地图。这个时候绘制标准的国家地图就显得很重要。目前国家标准地图服务系统向全社会公布的标准中国地图数据&#xff0c;是最权威的地图数据。 今天介绍的R包“ggmapcn”&#xff0c;就是基于最新公布的地图…

linux上安装MySQL教程

1.准备好MySQL压缩包&#xff0c;并进行解压 tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /usr/local 2.检查是否有mariadb数据库 rpm -aq|grep mariadb 关于mariadb:是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目…

计算机网络基础(7)中科大郑铨老师笔记

应用层 目标&#xff1a;  网络应用的 原理&#xff1a;网络应用协议的概念和实现方面 传输层的服务模型 客户-服务器模式 对等模式(peerto-peer) 内容分发网络  网络应用的 实例&#xff1a;互联网流行的应用层协 议  HTTP  FTP  SMTP / POP3 / IMAP  DNS…

Spring源码分析之事件机制——观察者模式(二)

目录 获取监听器的入口方法 实际检索监听器的核心方法 监听器类型检查方法 监听器的注册过程 监听器的存储结构 过程总结 Spring源码分析之事件机制——观察者模式&#xff08;一&#xff09;-CSDN博客 Spring源码分析之事件机制——观察者模式&#xff08;二&#xff…

CSS——4. 行内样式和内部样式(即CSS引入方式)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>方法1&#xff1a;行内样式</title></head><body><!--css引入方式&#xff1a;--><!--css的引入的第一种方法叫&#xff1a;行内样式将css代码写…

python之移动端测试---appium

Appium Appium介绍环境准备新版本appium的用法介绍元素定位函数被封装&#xff0c;统一使用By.xxx(定位方式)&#xff1a;通过文本定位的写法 一个简单的请求示例APP操作api基础apk安装卸载发送&#xff0c;拉取文件uiautomatorviewer工具使用获取页面元素及属性模拟事件操作模…

剑指Offer|LCR 021. 删除链表的倒数第 N 个结点

LCR 021. 删除链表的倒数第 N 个结点 给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1…

基于物联网疫苗冷链物流监测系统设计

1. 项目开发背景 随着全球对疫苗运输要求的提高&#xff0c;特别是针对温度敏感型药品&#xff08;如疫苗&#xff09;的冷链管理&#xff0c;如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中&#xff0c;任何温度或湿度的…

软件逆向之标志位

进位标志CF&#xff08;Carry Flag&#xff09; 介绍&#xff1a;如果运算结果的最高位产生了一个进位&#xff08;加法&#xff09;或借位&#xff08;减法&#xff09;&#xff0c;那么&#xff0c;其值为1&#xff0c;否则其值为0。无符号数。 示例&#xff1a; mov al&…

【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查

简单的数据查询&#xff0c;我们可以在mapper接口里面去实现&#xff0c;但是如果是复杂的查询&#xff0c;我们就可以使用xml配置文件去做&#xff0c; 官网链接xml配置文件 实现效果 实现代码 根据mapper接口的包结构&#xff0c;在resources包里面新建同名同结构的xml文件…

(leetcode算法题)384. 打乱数组 398. 随机数索引

问题转化&#xff1a; 题目要求将nums中的数字出现的次序随机打乱 转化成&#xff1a;对于 0 号位置来说&#xff0c;nums[i], ..., nums[n - 1] 可以等概率的出现 ... && ... && 对于 n - 1号位置来说&#xff0c;nums[i], ..., nums[n - 1] 可以等概率的出…

Pycharm连接远程解释器

这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径&#xff0c;并设置同步映射&#xff08;1&#xff09;配置服务器的系统环境&#xff08;2&#xff09;配置服务器的conda环境 4 进入到程序入口&#xff08;main.py&#…

kafka使用以及基于zookeeper集群搭建集群环境

一、环境介绍 zookeeper下载地址&#xff1a;https://zookeeper.apache.org/releases.html kafka下载地址&#xff1a;https://kafka.apache.org/downloads 192.168.142.129 apache-zookeeper-3.8.4-bin.tar.gz kafka_2.13-3.6.0.tgz 192.168.142.130 apache-zookee…

大模型系列18-AI Agents

什么是AI Agents Al Agent智能体&#xff0c;是指一种能够模拟人类思考和行为来自动执行任务&#xff0c;以解决复杂问题的程序或系统 架构图 思考->行动->观测 思考依赖记忆以及规划决策&#xff0c;行动依赖工具&#xff0c;观测依赖感知 举例 长沙今天白天和晚上的…