背景
原方案是通过移动硬盘安装linux双系统,需要使用时手动重启切换,但一是移动硬盘开机有概率识别不到,需要重新插拔,二是个人常用软件、登录账户都在window,切换麻烦,因此考虑通过wsl在window环境下搭建开发调试环境。
网上找到的资料都缺少了几个关键点导致安装不成功,因此在此梳理分享。
- 首先给出结论:vllm运行的必要条件 – vllm编译版本(pip安装的0.7.3是cu121版本)、pytorch cuda版本、系统cuda版本,三者一致,缺一不可。
软件版本
window 11 专业版
WSL 版本: 2.4.11.0
WSL 镜像: Ubuntu 22.04
CUDA版本: 12.1.1
torch 版本: 2.5.1+cu121
vllm 版本: 0.7.3
搭建流程
开启hyper-v、安装wsl、wsl载入ubuntu镜像
未踩坑,自行搜索即可,此处省略。
安装cuda toolkit
有的资料里提到需要window + wsl 均需要安装相同版本的cuda
toolkit,但是我推测window只需要安装显卡驱动即可,因为之前尝试在linux下安装docker时,系统环境和docker环境中的toolkit版本不一致,运行并没有问题,兼cuda
toolkit只是工具库,实体机与虚拟机通信应当不会主动调用,因此作此猜想,暂未验证。
我的window环境中是已经存在cuda toolkit的,因此作为复现条件在此提及。
首先检查cuda toolkit是否安装(window、wsl相同):
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Mon_Apr__3_17:36:15_Pacific_Daylight_Time_2023
Cuda compilation tools, release 12.1, V12.1.105
Build cuda_12.1.r12.1/compiler.32688072_0
如果没有安装,在以下链接安装,需要注意CUDA版本, CUDA ToolKit下载链接
如果下载很慢,可以使用这个工具并发下载 motrix
此处需要注意CUDA Toolkit版本和显卡驱动版本的关系,终端执行 nvidia-smi
,此处的CUDA Version 即为当前显卡驱动支持的最高CUDA版本。(注意,此处是支持的最高版本,而不是必须安装这个版本,vllm支持cuda 11.8、12.1,因此我安装cuda 12.1而非12.8)
Thu Feb 27 22:04:50 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 572.47 Driver Version: 572.47 CUDA Version: 12.8 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Driver-Model | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
显卡计算能力 || 计算能力与CUDA版本对应关系
此表格体现各显卡的计算能力和CUDA版本对应关系,可以以此查询目标显卡对CUDA的支持情况(计算能力并非计算性能,可以理解为硬件版本,相同数值的显卡能够支持一样的算子,对应支持CUDA版本相同)
下载安装成功后,执行 nvcc -V
应当能够显示正确的cuda版本。
如果在window环境提示找不到nvcc,需要将Cuda Toolkit安装目录下的bin目录添加到环境变量中,以我的环境为实例:
WSL下有以下异常情况:
Command 'nvcc' not found,
先确认/usr/local/cuda/bin/nvcc -V
是否执行成功,如果执行成功,则说明是环境变量的问题,执行vim ~/.bashrc
,在文件的底部插入以下行,随后:wq
退出,执行source ~/.bashrc
生效,再次执行,应当可以正确执行;
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda:$CUDA_HOME
nvcc -V
有打印,但显示的cuda版本与安装的toolkit版本不一致,这种情况是之前安装过其他版本的cuda toolkit,首先执行whereis nvcc
确认当前索引的nvcc的位置,如果找到的nvcc只有版本不一致的这个,参考情况1添加环境变量。然后ll /usr/local/
,检查cuda索引的是否为预期的版本(此处的cuda通常为一个软链接,指向/etc/alternatives/cuda,而/etc/alternatives/cuda是一个指向目标版本的软链接,最好按照这个顺序排查),如果版本不一致,则执行以下操作,将预期的cuda-12x建立软链接为cuda:(此处示例为cuda 12.1版本)
rm /etc/alternatives/cuda
rm /etc/alternatives/cuda-12
rm /etc/alternatives/cufile.json
ln -s /usr/local/cuda-12.1 /etc/alternatives/cuda
ln -s /usr/local/cuda-12.1 /etc/alternatives/cuda-12
ln -s /usr/local/cuda-12.1/gds/cufile.json /etc/alternatives/cufile.json
此处执行完毕后,nvcc的问题应当解决,显示的版本与预期一致。
安装cudnn
CUDNN下载地址 这个页面需要登录下载,注册个邮箱账户即可,支持QQ邮箱。
选择对应版本,我这里选择下载tar包:
下载后执行以下命令将包中文件复制到对应目录即可:(注意目录自己替换)
tar -xvf cudnn-linux-x86_64-8.9.7.29_cuda12-archive.tar.xz
cp cudnn-linux-x86_64-8.9.7.29_cuda12-archive/lib/* /usr/local/cuda-12.1/lib64/
cp cudnn-linux-x86_64-8.9.7.29_cuda12-archive/include/* /usr/local/cuda-12.1/include/
安装 pytorch + vllm
首先创建虚拟环境(可选),这里直接使用python自带venv创建(miniconda并非必须)
建议先执行 sudo apt-get install python3-pip python3.10-dev python3.10-venv
(我这里是python3.10,请自行替换)
python3 -m venv .venv
. .venv/bin/activate
进入虚拟环境后,执行 python3 -m pip install vllm
安装vllm,完成后尝试执行 vllm serve
;
这里需要注意,vllm默认未指定torch版本,而直接拉取的torch版本与当前环境安装的torch版本是不一致的,因此,如果到这步,直接尝试执行 vllm serve
会出现以下异常。
File "/usr/local/lib/python3.12/dist-packages/vllm/utils.py", line 2196, in run_methodreturn func(*args, **kwargs)^^^^^^^^^^^^^^^^^^^^^File "/usr/local/lib/python3.12/dist-packages/vllm/worker/worker.py", line 155, in init_devicetorch.cuda.set_device(self.device)File "/usr/local/lib/python3.12/dist-packages/torch/cuda/__init__.py", line 478, in set_devicetorch._C._cuda_setDevice(device)File "/usr/local/lib/python3.12/dist-packages/torch/cuda/__init__.py", line 319, in _lazy_inittorch._C._cuda_init()
RuntimeError: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 500: named symbol not found
Traceback (most recent call last):File "<frozen runpy>", line 198, in _run_module_as_mainFile "<frozen runpy>", line 88, in _run_codeFile "/usr/local/lib/python3.12/dist-packages/vllm/entrypoints/openai/api_server.py", line 991, in <module>uvloop.run(run_server(args))File "/usr/local/lib/python3.12/dist-packages/uvloop/__init__.py", line 109, in runreturn __asyncio.run(^^^^^^^^^^^^^^File "/usr/lib/python3.12/asyncio/runners.py", line 195, in runreturn runner.run(main)^^^^^^^^^^^^^^^^File "/usr/lib/python3.12/asyncio/runners.py", line 118, in runreturn self._loop.run_until_complete(task)^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_completeFile "/usr/local/lib/python3.12/dist-packages/uvloop/__init__.py", line 61, in wrapperreturn await main^^^^^^^^^^File "/usr/local/lib/python3.12/dist-packages/vllm/entrypoints/openai/api_server.py", line 947, in run_serverasync with build_async_engine_client(args) as engine_client:^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/usr/lib/python3.12/contextlib.py", line 210, in __aenter__return await anext(self.gen)^^^^^^^^^^^^^^^^^^^^^File "/usr/local/lib/python3.12/dist-packages/vllm/entrypoints/openai/api_server.py", line 139, in build_async_engine_client async with build_async_engine_client_from_engine_args(^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "/usr/lib/python3.12/contextlib.py", line 210, in __aenter__return await anext(self.gen)^^^^^^^^^^^^^^^^^^^^^File "/usr/local/lib/python3.12/dist-packages/vllm/entrypoints/openai/api_server.py", line 233, in build_async_engine_client_from_engine_argsraise RuntimeError(
RuntimeError: Engine process failed to start. See stack trace for the root cause.
这个问题看vllm安装的文档、教程中均未提及,不知是什么原因,我在linux、wsl中安装都出现了这个问题,即torch默认版本与当前环境cuda版本不一致导致。
解决办法:卸载torch,从pytorch重新安装指定cuda版本的pytorch (环境中cuda版本)pytorch官网
此处我们会发现,这里的cuda版本不全,没有需要的 (12.1) 版本,解决办法:手动修改此处提供下载命令中的cu118 为 cu121 即可;(实际是提供了该版本下载的,但有可能不是最新版本)
python3 -m pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
如果下载太慢,可以把pip获取的下载链接复制出来,用前面提到的下载工具,单独下载torch这个whl文件,下载后直接 python3 -m pip install torch-2.5.1+cu121-cp310-cp310-linux_x86_64.whl
即可。
安装完成后,尝试引入torch,不报异常则成功:
root@DESKTOP-FISOKG5:/mnt/f/cuda/vllm# python
Python 3.10.12 (main, Feb 4 2025, 14:57:36) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>>
此时再次执行 vllm serve
提示的就是没有正确传入参数了,正确传入模型相关配置后,vllm正常运行。
转载声明:此博文未经本人允许,不得转载,请勿爬取