window基于wsl部署vllm流程及踩坑经历(包含cuda toolkit、nvcc版本问题)

背景

原方案是通过移动硬盘安装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相同):

shell 复制代码
$ 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)

shell 复制代码
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下有以下异常情况:

  1. Command 'nvcc' not found, 先确认/usr/local/cuda/bin/nvcc -V 是否执行成功,如果执行成功,则说明是环境变量的问题,执行 vim ~/.bashrc ,在文件的底部插入以下行,随后:wq 退出,执行 source ~/.bashrc 生效,再次执行,应当可以正确执行;
bash 复制代码
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
  1. 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版本)
shell 复制代码
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包: 下载后执行以下命令将包中文件复制到对应目录即可:(注意目录自己替换)

bash 复制代码
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,请自行替换)

shell 复制代码
python3 -m venv .venv
. .venv/bin/activate

进入虚拟环境后,执行 python3 -m pip install vllm 安装vllm,完成后尝试执行 vllm serve ; 这里需要注意,vllm默认未指定torch版本,而直接拉取的torch版本与当前环境安装的torch版本是不一致的,因此,如果到这步,直接尝试执行 vllm serve 会出现以下异常。

shell 复制代码
  File "/usr/local/lib/python3.12/dist-packages/vllm/utils.py", line 2196, in run_method
    return func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.12/dist-packages/vllm/worker/worker.py", line 155, in init_device
    torch.cuda.set_device(self.device)
  File "/usr/local/lib/python3.12/dist-packages/torch/cuda/__init__.py", line 478, in set_device
    torch._C._cuda_setDevice(device)
  File "/usr/local/lib/python3.12/dist-packages/torch/cuda/__init__.py", line 319, in _lazy_init
    torch._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_main
  File "<frozen runpy>", line 88, in _run_code
  File "/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 run
    return __asyncio.run(
           ^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 195, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "uvloop/loop.pyx", line 1518, in uvloop.loop.Loop.run_until_complete
  File "/usr/local/lib/python3.12/dist-packages/uvloop/__init__.py", line 61, in wrapper
    return await main
           ^^^^^^^^^^
  File "/usr/local/lib/python3.12/dist-packages/vllm/entrypoints/openai/api_server.py", line 947, in run_server
    async 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_args
    raise 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) 版本,解决办法:手动修改此处提供下载命令中的cu118cu121 即可;(实际是提供了该版本下载的,但有可能不是最新版本)

shell 复制代码
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,不报异常则成功:

shell 复制代码
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正常运行。


转载声明:此博文未经本人允许,不得转载,请勿爬取

相关推荐
uncle_ll1 小时前
大模型落地选型GGUF 量化与 Ollama 部署指南
人工智能·大模型·llm·ollama·gguf
Esaka_Forever10 小时前
Skills安全要点总结
安全·llm
TechEdu20260619 小时前
[人工智能]Claude、GPT、Gemini、Copilot与Llama:概念、架构、应用与评估
人工智能·ai·llm
长谷深风11119 小时前
为什么你的 Tool 总被模型选错?
java·大数据·ai·llm·ai agent·工具设计·agent设计
boooooooom20 小时前
尝尝咸淡:从朴素 RAG 到 Graph RAG——一个烹饪问答系统的三层检索升级之路
前端·后端·llm
武子康1 天前
33B 音画模型塞进 Apple Silicon,h3.c 重写了哪些 Runtime 职责
人工智能·llm·agent
知几蜗牛1 天前
一张图看懂AI、机器学习、深度学习和生成式AI之间的关系
llm
XLYcmy1 天前
小红书 算法一面 十一
google·meta·llm·负载均衡·token·moe·glam
谢白羽1 天前
Mooncake在LLM的kv cache offload
人工智能·llm·论文·agent·mooncake
牧艺2 天前
DeepSeek Harness 上手:一切皆插件的 Agent 运行时,核心流程怎么走
llm·agent·deepseek