2024-10-21
深度学习
00

目录

1. 使用基础镜像并运行容器
2. 安装必要环境
3. 启动API服务
4. 构建API服务镜像
创建 Dockerfile
创建入口脚本 entrypoint.sh
5. 构建自定义Docker镜像
6. 运行容器
7. API访问测试代码

安装vllm并部署Qwen2VL API 重新打包CUDA12.1支持镜像

在之前的文章中

https://www.dong-blog.fun/post/1779

使用了官方提供的CUDA 12.4镜像。为了支持CUDA 12.1,我重新打包了一个镜像。以下是具体步骤。

1. 使用基础镜像并运行容器

首先,基于 pytorch/pytorch:2.4.0-cuda12.1-cudnn9-devel 镜像启动容器:

bash
docker 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

2. 安装必要环境

安装所需的Python包:

bash
pip install vllm==0.6.3.post1

3. 启动API服务

在容器中启动API服务:

bash
vllm serve /root/xiedong/Qwen2-VL-72B-Instruct-GPTQ-Int4/ --dtype auto --port 7860

API启动支持的一些参数:

bash
--host HOST 主机名 --port PORT 端口号 --api-key API_KEY 如提供该参数,服务器将要求在请求头中附带此密钥

确认服务可用后,可以将该容器提交为镜像:

bash
docker commit 28a5382d57ec kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1

4. 构建API服务镜像

为了方便使用,建议创建一个直接启动API服务的镜像。接下来,构建一个包含控制 max_pixels 参数的自定义镜像。

创建 Dockerfile

在您的项目目录中,创建一个新的 Dockerfile

Dockerfile
FROM 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服务:

bash
FROM 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

5. 构建自定义Docker镜像

使用以下命令构建新的镜像:

bash
docker build -t kevinchina/deeplearning:2.4.0-cuda12.1-cudnn9-devel-vllm0.6.3.post1-api-2 .

6. 运行容器

通过以下命令启动容器并运行API服务:

bash
docker 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

7. API访问测试代码

客户端python安装openai库后即可访问:

python
from 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")
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!