InternVL2模型部署实践(通过vLLM方式)

时间:2024-10-16 06:56:30

文章目录

    • 一、安装vLLM
      • 前置条件
      • 安装
      • 注意
    • 二、部署InternVL2模型
      • 前置条件
      • 安装
    • 三、启动模型
      • 运行模型
      • 与模型对话
    • 四、报错解决过程

一、安装vLLM

前置条件

OS: Linux
Python: 3.8 – 3.11
GPU: 显卡计算能力在 7.0 及其以上(例如:V100、T4、TRX20XX、A100、L4、H100 等)

安装

1、创建目录,后续用于放置 vLLM 源码

mkdir -p /apprun/vllm
cd /apprun/vllm

2、创建虚拟环境

conda create -y -n vllm python==3.10

3、激活虚拟环境

conda activate vllm

4、安装 vLLM

pip install vllm

注意

vLLM的二进制文件默认是使用CUDA 12.1编译的。
如果你的CUDA版本不同,也可以通过命令来更改vLLM的版本。以下命令为安装基于CUDA 11.8版本的vLLM:

1、首先更改 torch

pip install torch xformers --upgrade --index-url https://download.pytorch.org/whl/cu118

2、直接从官方发版安装 vLLM

pip install https://github.com/vllm-project/vllm/releases/download/v0.2.6/vllm-0.2.6+cu118-cp310-cp310-manylinux1_x86_64.whl

二、部署InternVL2模型

这里我们选择部署InternVl2-2B模型。

前置条件

确保上一步vLLM已正确安装
使用 pip show 命令可以查看已安装的 vllm 包的详细信息,包括版本号。

pip show vllm

这个命令会显示类似下面的输出:

Name: vllm
Version: 0.1.0
Summary: A library for efficient large language model serving.
Home-page: https://github.com/vllm-project/vllm
Author: vLLM Team
Author-email: team@vllm.org
License: MIT
Location: /usr/local/lib/python3.10/dist-packages
Requires: 
Required-by: 

在上面的输出中,Version 字段显示了 vllm 的版本号。

安装

1、创建模型存储文件夹

mkdir -p /apprun/internVl2-2B
cd /apprun/internVl2-2B/

2、激活vLLM虚拟环境

conda activate vllm

3、设置临时环境变量

#设置模型加载路径
export HF_HOME=/apprun/internVl2-2B
#设置huggingface网站镜像
export HF_ENDPOINT=https://hf-mirror.com
#设置libnvJitLink.so.12库文件路径,这里需要修改成自己的路径
export LD_PRELOAD="/apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12"

自己服务器的LD_PRELOAD变量的路径如何查找,见下bug解决记录。

设置后可通过echo命令检查变量是否设置成功。

echo $HF_HOME
echo $HF_ENDPOINT
echo $LD_PRELOAD

三、启动模型

运行模型

1、控制台运行:

vllm serve "OpenGVLab/InternVL2-2B" --trust-remote-code --dtype half 

–trust-remote-code : 加载模型时允许执行远程模型库中的自定义代码,必须要加

–dtype half :将模型的数据类型设置为 float16,以减少内存占用并加速推理过程。可先不加看是否报错,若不报错说明GPU算力可以支撑该模型。

2、后台运行:

vllm serve "OpenGVLab/InternVL2-2B" --trust-remote-code --dtype half > /apprun/log/service.log 2>&1 &

“> /apprun/log/service.log”:将标准输出重定向到 /apprun/log/service.log 文件。

“2>&1”: 将标准错误输出重定向到与标准输出相同的地方,即 /apprun/log/service.log 文件。

“&”:将整个命令放入后台运行。

与模型对话

vLLM 服务器设计可支持 OpenAI 对话接口,允许你与模型进行动态对话。所以我们使用 OpenAI 聊天接口请求模型:

curl -X POST "http://localhost:8000/v1/chat/completions" -H "Content-Type: application/json" --data '{"model": "OpenGVLab/InternVL2-2B","messages": [{"role": "user", "content": "Hello!"}]}'

四、报错解决过程

1、运行模型时报错:

ImportError: /apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkAddData_12_1, version libnvJitLink.so.12

2、错误说明:
这个错误表明 torch 库在加载 libcusparse.so.12 时找不到所需的符号:__nvJitLinkAddData_12_1
这通常是由于 libnvJitLink.so.12 和 libcusparse.so.12 之间的版本不匹配导致的。

3、解决过程
3.1 确保你的 CUDA 和 cuSPARSE 版本一致
(1)检查 CUDA 版本:

nvidia-smi
nvcc --version

(2)检查 cuSPARSE 版本:

ldd /apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12
linux-vdso.so.1 (0x00007ffcd65cc000)
libnvJitLink.so.12 => /usr/local/cuda-12.0/lib64/libnvJitLink.so.12 (0x00007f48a4e00000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f48b7e5e000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f48b7e59000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f48b7e54000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f48b7d6b000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f48b7d4b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f48a4bd7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f48b7e6d000)

(3)检查libcusparse.so.12文件中是否包含报错的符号

nm -D /apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12 | grep __nvJitLinkAddData_12_1
             U __nvJitLinkAddData_12_1@libnvJitLink.so.12

3.2 确保 nvJitLink 版本与 CUDA 版本匹配

查找 nvJitLink 版本

ls /root/miniconda3/lib/python3.10/site-packages/nvidia/nvjitlink/lib/

发现该路径不存在,查找libnvJitLink.so.12文件所在路径:

find /apprun/miniconda3/envs/vllm -name libnvJitLink.so.12

查到路径:
/apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12

3.3 检查libnvJitLink.so.12文件中是否包含报错的符号

nm -D /apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12 | grep __nvJitLinkAddData_12_1
0000000000264320 T __nvJitLinkAddData_12_1@@libnvJitLink.so.12

3.4 解决方法:
发现找不到符号是因为libnvJitLink.so.12文件不在默认路径,在临时变量中指定libnvJitLink.so.12文件路径:

export LD_PRELOAD="/apprun/miniconda3/envs/vllm/lib/python3.10/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12"

参考文档:
https://zhuanlan.zhihu.com/p/675771138
https://hf-mirror.com/OpenGVLab/InternVL2-2B
https://modelscope.cn/models/OpenGVLab/InternVL2-2B/files
https://internvl.opengvlab.com/chat/c984c808-514c-47d5-ad6e-de7581446a14/0