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,旨在为开发者提供一个强大的工具,用于实时获取指定区域或道路…...

医学图像分析工具01:FreeSurfer || Recon -all 全流程MRI皮质表面重建
FreeSurfer是什么 FreeSurfer 是一个功能强大的神经影像学分析软件包,广泛用于处理和可视化大脑的横断面和纵向研究数据。该软件由马萨诸塞州总医院的Martinos生物医学成像中心的计算神经影像实验室开发,旨在为神经科学研究人员提供一个高效、精确的数据…...

.NET框架用C#实现PDF转HTML
HTML作为一种开放标准的网页标记语言,具有跨平台、易于浏览和搜索引擎友好的特性,使得内容能够在多种设备上轻松访问并优化了在线分享与互动。通过将PDF文件转换为HTML格式,我们可以更方便地在浏览器中展示PDF文档内容,同时也更容…...

mamba-ssm安装
注意1:mamba-ssm要与casual-conv1d一起安装。 注意2:mamba-ssm与cuda、pytorch版本要对应。需要看你下载的代码的requirements.txt causal-conv1d与mamba的whl包官网下载: https://github.com/Dao-AILab/causal-conv1d/releases?page3 htt…...

网络IP协议
IP(Internet Protocol,网际协议)是TCP/IP协议族中重要的协议,主要负责将数据包发送给目标主机。IP相当于OSI(图1)的第三层网络层。网络层的主要作用是失陷终端节点之间的通信。这种终端节点之间的通信也叫点…...

双指针算法详解
目录 一、双指针 二、双指针题目 1.移动零 解法: 代码: 2.复写零 编辑 解法: 代码: 边界情况处理: 3.快乐数 编辑 解法:快慢指针 代码: 4.盛水最多的容器 解法:(对撞指针)…...

MySQL的最左匹配原则是什么
最左匹配原则是应用于联合索引的规则。 对于以下表F:f1,f2,f3;建立了联合索引(f2,f3),那么我们在查询的时候如果是: select * from F where f2 ? and f3 ?; 或 sele…...

LeetCode:106.从中序与后序遍历序列构造二叉树
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:106.从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder …...

22. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--切换主币种
这篇文章我们将结合主币种设置以及收支记录实现切换主币种后重新计算以前记录的转换后的金额。那么,为什么要在切换主币种后要重新计算转换后的金额呢?有以下两个原因: 统一的币种,方便我们统计数据方便用户按照当地的币种查看收…...

01.02周四F34-Day43打卡
文章目录 1. 地是湿的。昨晚估计下雨了。2. 你可能把包丢在餐厅里了吧?3. 她说他可能误了航班。4. 我本来应该早点来的,但路上特别堵。5. 约翰可能在那次事故中受了重伤。6. 这是一个情景对话7. 我本可以走另一条路的。8. 我准是瘦了不少,你看我这裤子现在多肥。9. 钱没了!会…...

行业商机信息付费小程序系统开发方案
行业商机信息付费小程序系统,主要是整合优质行业资源,实时更新的商机信息。在当今信息爆炸的时代,精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览:用户在工作间隙或闲暇时间,…...