安装vllm并部署Qwen2VL API 重新打包CUDA12.1支持镜像
在之前的文章中
https://www.dong-blog.fun/post/1779
使用了官方提供的CUDA 12.4镜像。为了支持CUDA 12.1,我重新打包了一个镜像。以下是具体步骤。
首先,基于 pytorch/pytorch:2.4.0-cuda12.1-cudnn9-devel
镜像启动容器:
bashdocker run --rm --net host -it --gpus all --shm-size 16g -v /root/xiedong:/root/xiedong pytorch/pytorch:2.4.0-cuda12.1-cudnn9-devel bash
安装所需的Python包:
bashpip install vllm==0.6.3.post1
在容器中启动API服务:
bashvllm serve /root/xiedong/Qwen2-VL-72B-Instruct-GPTQ-Int4/ --dtype auto --port 7860
API启动支持的一些参数:
bash--host HOST 主机名 --port PORT 端口号 --api-key API_KEY 如提供该参数,服务器将要求在请求头中附带此密钥
确认服务可用后,可以将该容器提交为镜像:
bashdocker commit 28a5382d57ec kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1
为了方便使用,建议创建一个直接启动API服务的镜像。接下来,构建一个包含控制 max_pixels
参数的自定义镜像。
在您的项目目录中,创建一个新的 Dockerfile
:
DockerfileFROM kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1 # 将自定义的入口脚本复制到镜像中 COPY entrypoint.sh /entrypoint.sh # 赋予入口脚本执行权限 RUN chmod +x /entrypoint.sh # 暴露API端口 EXPOSE 7860 # 设置容器启动时执行的入口脚本 ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
该脚本将配置 max_pixels
参数,并启动API服务:
bashFROM kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1
# 安装必要的依赖(如果需要)
# 例如,如果您的 Python 脚本需要额外的库,可以在这里安装
# RUN pip install --no-cache-dir <your-required-packages>
# 将自定义的入口脚本复制到镜像中
COPY entrypoint.sh /entrypoint.sh
# 赋予入口脚本可执行权限
RUN chmod +x /entrypoint.sh
EXPOSE 7860
# 设置容器启动时运行的入口脚本
ENTRYPOINT ["/entrypoint.sh"]
创建入口脚本 entrypoint.sh
bash#!/bin/bash
set -e
# 设置默认值
DEFAULT_MAX_PIXELS=802816
DEFAULT_TENSOR_PARALLEL_SIZE=3 # tensor-parallel-size 默认值
DEFAULT_PORT=7860 # port 默认值
# 获取环境变量中的 MAX_PIXELS, TENSOR_PARALLEL_SIZE 和 PORT,如果未设置则使用默认值
MAX_PIXELS=${MAX_PIXELS:-$DEFAULT_MAX_PIXELS}
TENSOR_PARALLEL_SIZE=${TENSOR_PARALLEL_SIZE:-$DEFAULT_TENSOR_PARALLEL_SIZE}
PORT=${PORT:-$DEFAULT_PORT}
# 配置文件路径
CONFIG_FILE=/Qwen2-VL-Any/preprocessor_config.json
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "配置文件 $CONFIG_FILE 不存在!"
exit 1
fi
# 使用 Python 修改配置文件中的 max_pixels 值
python3 - <<EOF
import json
config_path = "$CONFIG_FILE"
# 读取现有配置
with open(config_path, 'r') as f:
config = json.load(f)
# 修改 max_pixels 值
config['max_pixels'] = $MAX_PIXELS
# 写回配置文件
with open(config_path, 'w') as f:
json.dump(config, f, indent=4)
# 打印最终使用的值
print(f"使用的 max_pixels 值: {config['max_pixels']}")
EOF
# 启动 API 服务器,并根据环境变量设置端口和 tensor-parallel-size
# vllm serve /Qwen2-VL-Any --dtype auto --port $PORT --pipeline-parallel-size $TENSOR_PARALLEL_SIZE
# 来源于这里:https://github.com/QwenLM/Qwen2-VL/issues/236
VLLM_WORKER_MULTIPROC_METHOD=spawn python -m vllm.entrypoints.openai.api_server \
--served-model-name qwen2vl \
--model /Qwen2-VL-Any \
--tensor-parallel-size $TENSOR_PARALLEL_SIZE \
--max_num_seqs 16 --port $PORT --dtype auto
显卡的张量并行:https://docs.vllm.ai/en/stable/serving/distributed_serving.html
使用以下命令构建新的镜像:
bashdocker build -t kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1-api-2 .
通过以下命令启动容器并运行API服务:
bashdocker run -d --runtime nvidia --gpus all \ -p 7860:7860 --shm-size 16g \ -e TENSOR_PARALLEL_SIZE=2 \ -e PORT=7860 \ -v /root/xiedong/Qwen2-VL-72B-Instruct-GPTQ-Int4:/Qwen2-VL-Any \ -e MAX_PIXELS=802816 \ kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1-api-2
客户端python安装openai库后即可访问:
pythonfrom openai import OpenAI
# 替换成你自己的 API Key 和 URL
client = OpenAI(api_key='YOUR_API_KEY', base_url='http://101.136.22.140:7860/v1')
model_name = client.models.list().data[0].id
# 图片描述 prompt
promptx = r"""
Describe this image.
"""
# 单张图片 URL
image_file = 'http://101.136.22.140:8007/demo1024.jpeg'
# 发送请求
response = client.chat.completions.create(
model=model_name,
messages=[{
'role': 'user',
'content': [{
'type': 'text',
'text': promptx,
}, {
'type': 'image_url',
'image_url': {
'url': image_file,
},
}],
}],
temperature=0.8,
top_p=0.8
)
# 输出返回的图片描述
print(f"Image: {image_file}\nDescription: {response.choices[0].message.content}\n")
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!