当前位置: 首页 > article >正文

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 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.kler.cn/a/466574.html

相关文章:

  • 小程序26-事件绑定和事件对象
  • c#中集中常见的集合去重方式
  • 智能型企业的发展与开源AI智能名片S2B2C商城小程序的应用
  • docker 安装与配置 gitlab
  • 为什么 Netflix 部分功能放弃React,选择“原生”JavaScript?
  • LeetCode 191 位1的个数
  • 计算机网络——期末复习(5)期末考试样例1(含答案)
  • 代理模式和适配器模式有什么区别
  • StableDiffusionWebUI本地部署指南(WIN)
  • 【HarmonyOS】鸿蒙应用如何进行页面横竖屏切换以及注意事项,自动切换横竖屏,监听横竖屏
  • Java IO 基础知识总结
  • Axios使用方法,axios.get、axios.post、axios.put、axios.delete
  • postman在软件测试中的应用
  • 一文读懂拟合法
  • 电脑cxcore100.dll丢失怎么办?
  • 华为ensp-BGP路由过滤
  • 【python】requests库发起HTTP请求
  • 职场常用Excel基础04-二维表转换
  • VS2015中使用boost库函数时报错问题解决error C4996 ‘std::_Copy_impl‘
  • 《探索机器人自主导航与路径规划技术的热点》