文章目录
一、安装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