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

文章目录

一、安装vLLM

前置条件

OS: Linux

Python: 3.8 -- 3.11

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

安装

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

bash 复制代码
mkdir -p /apprun/vllm
cd /apprun/vllm

2、创建虚拟环境

bash 复制代码
conda create -y -n vllm python==3.10

3、激活虚拟环境

bash 复制代码
conda activate vllm

4、安装 vLLM

bash 复制代码
pip install vllm

注意

vLLM的二进制文件默认是使用CUDA 12.1编译的。

如果你的CUDA版本不同,也可以通过命令来更改vLLM的版本。以下命令为安装基于CUDA 11.8版本的vLLM:

1、首先更改 torch

bash 复制代码
pip install torch xformers --upgrade --index-url https://download.pytorch.org/whl/cu118

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

bash 复制代码
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 包的详细信息,包括版本号。

bash 复制代码
pip show vllm

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

bash 复制代码
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、创建模型存储文件夹

bash 复制代码
mkdir -p /apprun/internVl2-2B
cd /apprun/internVl2-2B/

2、激活vLLM虚拟环境

bash 复制代码
conda activate vllm

3、设置临时环境变量

bash 复制代码
#设置模型加载路径
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命令检查变量是否设置成功。

bash 复制代码
echo $HF_HOME
echo $HF_ENDPOINT
echo $LD_PRELOAD

三、启动模型

运行模型

1、控制台运行:

bash 复制代码
vllm serve "OpenGVLab/InternVL2-2B" --trust-remote-code --dtype half 

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

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

2、后台运行:

bash 复制代码
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 聊天接口请求模型:

bash 复制代码
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、运行模型时报错:

bash 复制代码
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 版本:

bash 复制代码
nvidia-smi
nvcc --version

(2)检查 cuSPARSE 版本:

bash 复制代码
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文件中是否包含报错的符号

bash 复制代码
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 版本

bash 复制代码
ls /root/miniconda3/lib/python3.10/site-packages/nvidia/nvjitlink/lib/

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

bash 复制代码
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文件中是否包含报错的符号

bash 复制代码
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文件路径:

bash 复制代码
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

相关推荐
volcanical36 分钟前
Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena
人工智能·自然语言处理·机器翻译
大知闲闲哟38 分钟前
深度学习J6周 ResNeXt-50实战解析
人工智能·深度学习
静静AI学堂1 小时前
Yolo11改策略:卷积改进|SAC,提升模型对小目标和遮挡目标的检测性能|即插即用
人工智能·深度学习·目标跟踪
martian6652 小时前
【人工智能离散数学基础】——深入详解数理逻辑:理解基础逻辑概念,支持推理和决策系统
人工智能·数理逻辑·推理·决策系统
Schwertlilien2 小时前
图像处理-Ch7-图像金字塔和其他变换
图像处理·人工智能
凡人的AI工具箱2 小时前
每天40分玩转Django:Django类视图
数据库·人工智能·后端·python·django·sqlite
千天夜2 小时前
深度学习中的残差网络、加权残差连接(WRC)与跨阶段部分连接(CSP)详解
网络·人工智能·深度学习·神经网络·yolo·机器学习
凡人的AI工具箱2 小时前
每天40分玩转Django:实操图片分享社区
数据库·人工智能·后端·python·django
小军军军军军军2 小时前
MLU运行Stable Diffusion WebUI Forge【flux】
人工智能·python·语言模型·stable diffusion
诚威_lol_中大努力中2 小时前
关于VQ-GAN利用滑动窗口生成 高清图像
人工智能·神经网络·生成对抗网络