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