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

news2025/1/6 19:26:33

欢迎关注我的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 requests


class xTATVision(object):
    """
    调用服务器接口
    """
    def __init__(self, base_url='http://[your ip]:8000'):
        self.base_url = base_url

    def create(self, model, messages, max_tokens=None):
        # 构建请求的 URL
        url = f"{self.base_url}/v1/chat/completions"

        # 构建请求的 headers 和 data
        headers = {
            '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:
            # 打印错误信息并返回 None
            print(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.coloradmin.cn/o/2271139.html

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

相关文章

数据库知识汇总2

一. 范式 定义&#xff1a;范式是符合某一种级别的关系模式的集合。 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式&#xff1b; 一个低一级范式的关系模式&#xff0c;通过模式分解&#xff08;schema decomposition&#xff09;可以转换为若干个高一…

TP 钱包插件版本的使用

目前 TokenPocket 的几个平台中&#xff0c;以 ios 和 安卓版本最为常见&#xff0c;其实很少有人知道&#xff0c;浏览器上有一个插件版本的 Tp, 用电脑多的话&#xff0c;这也是一个挺好的选择。 最新版本现在支持Chrome、Brave 浏览器、Edge&#xff08;Firefox及Opera正在…

反向传播算法的偏置更新步骤

偏置的更新步骤 假设我们有一个三层神经网络&#xff08;输入层、隐藏层和输出层&#xff09;&#xff0c;并且每层的激活函数为 sigmoid 函数。我们需要更新隐藏层和输出层的偏置。以下是详细的步骤&#xff1a; 1. 计算误差项&#xff08;Error Term&#xff09; 输出层的…

(二)当人工智能是一个函数,函数形式怎么选择?ChatGPT的函数又是什么?

在上一篇文章中&#xff0c;我们通过二次函数的例子&#xff0c;讲解了如何训练人工智能。今天&#xff0c;让我们进一步探讨&#xff1a;面对不同的实际问题&#xff0c;应该如何选择合适的函数形式&#xff1f; 一、广告推荐系统中的函数选择 1. 业务目标 想象一下&#x…

Vue3 中的插槽

Vue3 中插槽的使用&#xff0c;插槽是 Vue 中的一个特别特性&#xff0c;插槽就是模版内容。例如<h1>标题 1</h1>标题 1 就是插槽&#xff0c;Vue 是无法识别模板内容的&#xff0c;只能通过属性进行传递。Slot 主要包括默认、具名和作用域。Slot开发起来难度不大&…

单元测试3.0+ @RunWith(JMockit.class)+mock+injectable+Expectations

Jmockit使用笔记_基本功能使用Tested_Injectable_Mocked_Expectations_jmockit.class-CSDN博客 静态变量直接赋值就好&#xff0c;没必要mock了 测试框架Jmockit集合junit使用 RunWith(JMockit.class) 写在测试案例类上的注解 Tested 在测试案例中,写在我们要测试的类上…

靶机系列|VULNHUB|DC-3

描述 DC-3 是另一个专门建造的易受攻击实验室&#xff0c;旨在获得渗透测试领域的经验。 与之前的 DC 版本一样&#xff0c;这个版本的设计考虑到了初学者&#xff0c;尽管这一次只有一个标志、一个入口点&#xff0c;根本没有线索。 必须具备 Linux 技能和熟悉 Linux 命令行…

sqlserver sql转HTMM邮件发送

通过sql的形式&#xff0c;把表内数据通过邮件的形式发送出去 declare title varchar(100) DECLARE stat_date CHAR(10),create_time datetime SET stat_dateCONVERT(char(10),GETDATE(),120) SET create_timeDATEADD(MINUTE,-20,GETDATE()) DECLARE xml NVARCHAR (max) DECLAR…

MCU芯片是什么意思_有哪些作用?

MCU(Microcontroller Unit)芯片&#xff0c;即微控制单元&#xff0c;是一种集成了中央处理器(CPU)、存储器(ROM、RAM)以及各种外设接口(如输入输出引脚、定时器、串口等)的集成电路芯片。它通过超大规模集成电路技术&#xff0c;将具有数据处理能力的中央处理器、随机存储器、…

朱姆沃尔特隐身战舰:从失败到威慑

前言 "朱姆沃尔特"号驱逐舰是美国海军雄心勃勃的项目&#xff0c;旨在重塑未来海战。它融合了隐身、自动化和强大火力&#xff0c;然而由于技术问题和预算超支&#xff0c;原计划建造32艘的目标被大幅缩减&#xff0c;最终只建造了三艘。该舰的设计特点包括“穿浪逆船…

【虚拟机】VMware 16图文安装和配置 AlmaLinux OS 9.5 教程

准备工作 下载AlmaLinux ISO文件&#xff1a;从AlmaLinux官方网站&#xff08;https://almalinux.org/&#xff09;下载最新版本的ISO文件。 安装VMware Workstation&#xff1a;确保您的计算机上已安装VMware Workstation。&#xff08;注&#xff1a;我这边使用的是VMware16…

【论文阅读】SCGC : Self-supervised contrastive graph clustering

论文地址&#xff1a;SCGC : Self-supervised contrastive graph clustering - ScienceDirect 代码地址&#xff1a; https://github.com/gayanku/SCGC 摘要 图聚类旨在发现网络中的群体或社区。越来越多的模型使用自编码器&#xff08;autoencoders&#xff09;结合图神经网…

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中&#xff0c;一个好的Logo是品牌身份的象征&#xff0c;它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间&#xff0c;尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来&#xff0c;让我们深入探讨如何利用这些工具来创…

蓝桥杯-Python

1. 冒泡排序 算法步骤&#xff1a; 比较相邻元素&#xff0c;如果第一个大于第二个则交换从左往右遍历一遍&#xff0c;重复第一步&#xff0c;可以保证最大的元素在最后面重复上述操作&#xff0c;可以得到第二大、第三大、… n int(input()) a list(map(int, input()…

数据库实时会话管理,性能问题诊断后的临门一脚

目录 前言 实时会话管理 DBdoctor 实时会话功能 1.实时会话列表 2.结束会话 3.操作历史 4.SQL分析 结语 前言 在之前的文章中我们介绍了DBdoctor性能洞察功能&#xff0c;它能够快速量化数据库连接会话单条SQL的资源消耗&#xff0c;实现性能问题快速根因定位并给出优…

GBase 8s 数据库备份还原

每一天都是一个新的篇章&#xff0c;等待着你去书写属于自己的故事&#xff01;&#xff01;&#xff01; 一&#xff1a;备份 1.1.下载脚本文件&#xff0c;并上传到数据库服务器上相应目录。 解压后目录为&#xff1a; 说明&#xff1a; dbcomm.sh&#xff1a;导出注释脚本…

PHP框架+gatewayworker实现在线1对1聊天--发送消息(6)

文章目录 发送消息原理说明发送功能实现html部分javascript代码PHP代码 发送消息原理说明 接下来我们发送聊天的文本信息。点击发送按钮的时候&#xff0c;会自动将文本框里的内容发送出去。过程是我们将信息发送到服务器&#xff0c;服务器再转发给对方。文本框的id为msgcont…

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围&#xff0c;因此不同的存储前缀可以有不同的密钥信息&#xff0c;例如允许在单个查询中连接跨组织的数据。密钥也可以持久化&#xff0c;这样就不需要在每次启动DuckDB时都指定它…

告别Kibana:Elasticsearch 桌面客户端的新变革

告别Kibana&#xff1a;Elasticsearch 桌面客户端的新变革 在大数据处理与分析领域&#xff0c;Elasticsearch 及其相关技术的应用日益广泛。长期以来&#xff0c;Kibana 在数据可视化与查询管理方面占据重要地位&#xff0c;但随着技术的不断发展&#xff0c;用户对于更高效、…

模块化通讯管理机在物联网系统中的应用

安科瑞刘鸿鹏 摘要 随着能源结构转型和智能化电网的推进&#xff0c;电力物联网逐渐成为智能电网的重要组成部分。本文以安科瑞ANet系列智能通信管理机为例&#xff0c;探讨其在电力物联网中的应用&#xff0c;包括数据采集、规约转换、边缘计算、远程控制等技术实践&#…