LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)
欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/144881432
大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互大模型,通常基于云计算架构,无需在本地部署复杂的模型和硬件,就能够访问和使用。通过简单的 API 调用,执行各种任务,从而在各种应用中实现智能化,不仅提高模型的可访问性,还降低技术门槛。
参考:
- 使用 LLaMA-Factory 微调大模型 环境配置与训练推理
- 使用 LLaMA-Factory 微调 Qwen2-VL SFT(LoRA) 图像数据集
- 使用 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.
相关文章:

LLM - 使用 LLaMA-Factory 部署大模型 HTTP 多模态服务 (4)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144881432 大模型的 HTTP 服务,通过网络接口,提供 AI 模型功能的服务,允许通过发送 HTTP 请求,交互…...

icp备案网站个人备案与企业备案的区别
个人备案和企业备案是在进行ICP备案时需要考虑的两种不同情况。个人备案是指个人拥有的网站进行备案,而企业备案则是指企业或组织名下的网站进行备案。这两者在备案过程中有一些明显的区别。 首先,个人备案相对来说流程较为简单。个人备案只需要提供个人…...

如何不修改模型参数来强化大语言模型 (LLM) 能力?
前言 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿,多则上千亿,对其的训…...
AF3 AtomAttentionEncoder类的init_pair_repr方法解读
AlphaFold3 的 AtomAttentionEncoder 类中,init_pair_repr 方法方法负责为原子之间的关系计算成对表示(pair representation),这是原子转变器(atom transformer)模型的关键组成部分,直接影响对蛋白质/分子相互作用的建模。 init_pair_repr源代码: def init_pair_repr(…...
DDoS攻击防御方案大全
1. 引言 随着互联网的迅猛发展,DDoS(分布式拒绝服务)攻击成为了网络安全领域中最常见且危害严重的攻击方式之一。DDoS攻击通过向目标网络或服务发送大量流量,导致服务器过载,最终使其无法响应合法用户的请求。本文将深…...
Vue中常用指令
一、内容渲染指令 1.v-text:操作纯文本,用于更新标签包含的文本,但是使用不灵活,无法拼接字符串,会覆盖文本,可以简写为{{}},{{}}支持逻辑运算。 用法示例: //把name对应的值渲染到…...

Servlet解析
概念 Servlet是运行在服务端的小程序(Server Applet),可以处理客户端的请求并返回响应,主要用于构建动态的Web应用,是SpringMVC的基础。 生命周期 加载和初始化 默认在客户端第一次请求加载到容器中,通过反射实例化…...

带虚继承的类对象模型
文章目录 1、代码2、 单个虚继承3、vbptr是什么4、虚继承的多继承 1、代码 #include<iostream> using namespace std;class Base { public:int ma; };class Derive1 :virtual public Base { public:int mb; };class Derive2 :public Base { public:int mc; };class Deri…...
深度学习中的离群值
文章目录 深度学习中有离群值吗?深度学习中的离群值来源:处理离群值的策略:1. 数据预处理阶段:2. 数据增强和鲁棒模型:3. 模型训练阶段:4. 异常检测集成模型: 如何处理对抗样本?总结…...

如何利用Logo设计免费生成器创建专业级Logo
在当今的商业世界中,一个好的Logo是品牌身份的象征,它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间,尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来,让我们深入探讨如何利用这些工具来创…...
Mysql SQL 超实用的7个日期算术运算实例(10k)
文章目录 前言1. 加上或减去若干天、若干月或若干年基本语法使用场景注意事项运用实例分析说明2. 确定两个日期相差多少天基本语法使用场景注意事项运用实例分析说明3. 确定两个日期之间有多少个工作日基本语法使用场景注意事项运用实例分析说明4. 确定两个日期相隔多少个月或多…...

运算指令(PLC)
加 ADD 减 SUB 乘 MUL 除 DIV 浮点运算 整数运算...

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏
本篇教程将带你实现一个数字填色小游戏,通过简单的交互逻辑,学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能: 数字选择:用户点击…...

机器学习经典算法——逻辑回归
目录 算法介绍 算法概念 算法的优缺点 LogisticRegression()函数理解 环境准备 算法练习 算法介绍 算法概念 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的机器学习算法。 它基于线性回归的思想,但通过引入一个逻辑函数&…...
【数据仓库金典面试题】—— 包含详细解答
大家好,我是摇光~,用大白话讲解所有你难懂的知识点 该篇面试题主要针对面试涉及到数据仓库的数据岗位。 以下都是经典的关于数据仓库的问题,希望对大家面试有用~ 1、什么是数据仓库?它与传统数据库有何区别? 数据仓库…...

【UE5 C++课程系列笔记】19——通过GConfig读写.ini文件
步骤 1. 新建一个Actor类,这里命名为“INIActor” 2. 新建一个配置文件“Test.ini” 添加一个自定义配置项 3. 接下来我们在“INIActor”类中获取并修改“CustomInt”的值。这里定义一个方法“GetINIVariable” 方法实现如下,其中第16行代码用于构建配…...
JS 中 json数据 与 base64、ArrayBuffer之间转换
JS 中 json数据 与 base64、ArrayBuffer之间转换 json 字符串进行 base64 编码 function jsonToBase64(json) {return Buffer.from(json).toString(base64); }base64 字符串转为 json 字符串 function base64ToJson(base64) {try {const binaryString atob(base64);const js…...
USB 驱动开发 --- Gadget 驱动框架梳理
编译链接 #----》 linux_5.10/drivers/usb/gadget/Makefileobj-$(CONFIG_USB_LIBCOMPOSITE) libcomposite.o libcomposite-y : usbstring.o config.o epautoconf.o libcomposite-y composite.o functions.o configfs.o u_f.oobj-$(CONFIG_USB_GADG…...

细说STM32F407单片机中断方式CAN通信
目录 一、工程配置 1、时钟、DEBUG、USART6、GPIO、CodeGenerator 2、CAN1 3、NVIC 二、软件设计 1、KEYLED 2、can.h 3、can.c (1)CAN1中断初始化 (2)RNG初始化和随机数产生 (3) 筛选器组设置…...

Python应用指南:高德交通态势数据
在现代城市的脉络中,交通流量如同流动的血液,交通流量的动态变化对出行规划和城市管理提出了更高的要求。为了应对这一挑战,高德地图推出了交通态势查询API,旨在为开发者提供一个强大的工具,用于实时获取指定区域或道路…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...