在 本地部署Qwen2大模型之二:vLLM方式部署 中,我详细记录了以vLLM方式在本地部署Qwen2大模型的经过,但是最后还是没能运行起来,坑是踩遍了,路熟了,这是其积极意义。但事情还得继续整!
仔细回顾一下,首先vLLM是很容易安装的,vLLM框架,包括它所依赖的PyTorch都默认采用NVIDIA的GPU加速,要依赖CUDA库,而且都会自动的安装上。我开始遇到的是路径问题,如果pypi镜像源、Qwen2大模型发布源的路径都先行解决了的话,接下来遇到的问题只是启动测试用例时LLM引擎初始化失败。失败的原因是"RuntimeError: Failed to infer device type",即无法推断实际的设备类型,也就是无法确定是在CPU上运行,还是在GPU上运行,如果在GPU运行,是加载CUDA包还是加载ROCM包?如此说来,是否我在运行测试用例时,先传入一个参数VLLM_TARGET_DEVICE=cpu,明确是不用GPU加速,即按下面的方式运行:
VLLM_TARGET_DEVICE=cpu python test.py
软件框架可以有CUDA包,但是运行的时候我明确告诉你不用GPU,你用CPU就行了,这样应该也能够运行吧?如果说得通,那就没有必要再强求CPU版本的vLLM,也不需要在本地进行源码编译,也不需要下载和安装不同版本的PyTorch了。实际这样运行会怎么样呢?嗯,至少试试看吧!
新的环境
前面利用周末两天的时间,在家里的个人笔记本上弄的;上班就没得基础环境了,不能在公司的电脑和服务器上乱整吧? 虽然也有Docker、Conda、VirtualBox等隔离环境的工具,但毕竟是公司资源,不能随便动,还是用个人的设备练手吧。想起我还有个阿里云的服务器可以用,不受地点的限制,只要有网就行,于是赶紧去看了下它的配置。这一看,很尴尬啊!
$ sudo lshw -c display
*-display
description: VGA compatible controller
product: GD 5446
vendor: Cirrus Logic
physical id: 2
bus info: pci@0000:00:02.0
logical name: /dev/fb0
version: 00
width: 32 bits
clock: 33MHz
capabilities: vga_controller rom fb
configuration: depth=16 driver=cirrus latency=0 resolution=1024,768
resources: irq:0 memory:fc000000-fdffffff memory:febf0000-febf0fff memory:c0000-dffff
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel(R) Xeon(R) Platinum
stepping : 4
microcode : 0x1
cpu MHz : 2500.026
cache size : 33792 KB
physical id : 0
siblings : 2
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl xtopology nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch invpcid_single pti fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx avx512f avx512dq rdseed adx smap clflushopt clwb avx512cd avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs taa itlb_multihit mmio_stale_data retbleed gds
bogomips : 5000.05
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel(R) Xeon(R) Platinum
stepping : 4
microcode : 0x1
cpu MHz : 2500.026
cache size : 33792 KB
physical id : 0
siblings : 2
$ cat /proc/meminfo
MemTotal: 3662684 kB
MemFree: 438000 kB
MemAvailable: 2352820 kB
Buffers: 37864 kB
Cached: 2014196 kB
SwapCached: 0 kB
Active: 1265412 kB
Inactive: 1594620 kB
Active(anon): 1216 kB
Inactive(anon): 818760 kB
Active(file): 1264196 kB
Inactive(file): 775860 kB
Unevictable: 29152 kB
Mlocked: 27616 kB
SwapTotal: 0 kB
SwapFree: 0 kB
$ df -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 358M 1.1M 357M 1% /run
/dev/vda3 99G 5.9G 88G 7% /
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/vda2 197M 6.1M 191M 4% /boot/efi
tmpfs 358M 4.0K 358M 1% /run/user/1000
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.5 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.5 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
虚拟的Intel Xeon双核CPU,2.5GHz;
4GB的内存;
100GB的SSD硬盘,还有88GB可用;
VGA显卡,没得GPU。
平时当个文件中转站,跑个Web服务器也还行,想跑AI大模型,是不是感觉有点像做梦?!
但它终究是台云服务器啊,也对吧?反正能跑程序,不管最后AI大模型能不能跑得起来,先跑一把试试看呗~
走捷径
路是已经熟了,先把镜像源给配置起来,包括pypi镜像源,hf-mirror镜像源,具体方法参阅 上一篇文章。然后就安装vllm,最简单的方式,直接执行pip install vllm指令,等安装完成后检查结果:
$ vllm -h
usage: vllm [-h] [-v] {
serve,complete,chat} ...
vLLM CLI
positional arguments:
{
serve,complete,chat}
serve Start the vLLM OpenAI Compatible API server
complete Generate text completions based on the given prompt via the running API server
chat Generate chat completions via the running API server
options:
-h, --help show this help message and exit
-v, --version show program's version number and exit
$ vllm -v
0.6.5
$ pip show torch
Name: torch
Version: 2.5.1
Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Home-page: https://pytorch.org/
Author: PyTorch Team
Author-email: packages@pytorch.org
License: BSD-3-Clause
Location: /home/zhangsan/.local/lib/python3.10/site-packages
Requires: filelock, fsspec, jinja2, networkx, nvidia-cublas-cu12, nvidia-cuda-cupti-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-runtime-cu12, nvidia-cudnn-cu12, nvidia-cufft-cu12, nvidia-curand-cu12, nvidia-cusolver-cu12, nvidia-cusparse-cu12, nvidia-nccl-cu12, nvidia-nvjitlink-cu12, nvidia-nvtx-cu12, sympy, triton, typing-extensions
Required-by: compressed-tensors, outlines, torchvision, vllm, xformers, xgrammar
$ sudo find / -name *cuda*.so* 2>/dev/null
/usr/lib/x86_64-linux-gnu/libicudata.so.70.1
/usr/lib/x86_64-linux-gnu/libicudata.so.70
/home/zhangsan/.local/lib/python3.10/site-packages/nvidia/cuda_runtime/lib/libcudart.so.12
/home/zhangsan/.local/lib/python3.10/site-packages/torch/lib/libc10_cuda.so
/home/zhangsan/.local/lib/python3.10/site-packages/torch/lib/libtorch_cuda_linalg.so
/home/zhangsan/.local/lib/python3.10/site-packages/torch/lib/libtorch_cuda.so
/home/zhangsan/.local/lib/python3.10/site-packages/torchvision.libs/libcudart.41118559.so.12
vllm有了,torch有了,cuda库也有了。下面就直接运行测试程序,在命令行传入cpu参数:
$ VLLM_TARGET_DEVICE=cpu python test.py
tokenizer_config.json: 1.29kB [00:00, 2.67MB/s]
vocab.json: 2.78MB [00:01, 1.67MB/s]
merges.txt: 1.67MB [00:01, 1.03MB/s]
tokenizer.json: 7.03MB [00:04, 1.70MB/s]
Traceback (most recent call last):
File "/usr/work/llm/vllm/test.py", line 12, in <module>
llm = LLM(model="Qwen/Qwen2-7B-Instruct")
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/utils.py", line 990, in inner
return fn(*args, **kwargs)
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/entrypoints/llm.py", line 230, in __init__
self.llm_engine = self.engine_class.from_engine_args(
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/engine/llm_engine.py", line 529, in from_engine_args
engine_config = engine_args.create_engine_config(usage_context)
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/engine/arg_utils.py", line 1026, in create_engine_config
device_config = DeviceConfig(device=self.device)
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/config.py", line 1433, in __init__
raise RuntimeError("Failed to infer device type")
RuntimeError: Failed to infer device type
Exception ignored in: <function LLM.__del__ at 0x7f6c41214430>
Traceback (most recent call last):
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/entrypoints/llm.py", line 236, in __del__
if self.llm_engine and hasattr(self.llm_engine, "shutdown"):
AttributeError: 'LLM' object has no attribute 'llm_engine'
好吧,问题还是一样,熟悉的"RuntimeError: Failed to infer device type"错误!
令人欣喜的是,运行并不慢啊,很快就有输出了,也可能是因为大模型还没加载起来吧。这次没有报告说找不到"Qwen/Qwen2-7B-Instruct"大模型,也没有报告说连接不上"https://huggingface.co",证实了前面的镜像源设置生效了。
死磕到底
我们再来解决这个"RuntimeError: Failed to infer device type"的错误。
用豆包查,回答很明确
问题分析
设备类型推断失败:从报错信息 RuntimeError: Failed to infer device type 来看,在 vLLM 的初始化过程中,程序无法推断出要使用的设备类型(比如是 GPU 还是 CPU 等)。这可能是因为相关的配置参数没有正确设置或者缺失,导致系统不知道该将模型加载到何种设备上去运行。
对象属性异常:后续出现的 AttributeError: ‘LLM’ object has no attribute ‘llm_engine’ 是由于前面初始化 LLM 实例时已经出现错误,没能正确创建 llm_engine 属性,而在 del 方法中尝试访问这个不存在的属性时就引发了该错误。
解决方案
明确指定设备类型:
使用参数指定(推荐):在创建 LLM 实例时,可以通过合适的参数明确指定设备类型。如果想使用 GPU(假设你已经正确安装配置好 GPU 相关环境,比如 CUDA 等),可以这样写:
python
from vllm import LLM
llm = LLM(model=“Qwen/Qwen2-7B-Instruct”, device=“cuda”)
要是希望使用 CPU 来运行,按照如下方式指定:
python
llm = LLM(model=“Qwen/Qwen2-7B-Instruct”, device=“cpu”)
检查环境变量(若适用):
有些情况下,vLLM 可能会读取环境变量来确定设备类型。确保环境变量中关于设备相关的设置是正确的,例如,如果环境变量中设置了错误的 VLLM_TARGET_DEVICE 值(假设 vLLM 会参考这个变量来判断设备),可能会导致设备类型推断出错。可以在终端中通过 echo $VLLM_TARGET_DEVICE (Linux 或 Mac 系统下)这样的命令来查看其值,若值不正确,进行相应修改,或者根据需要添加正确的环境变量设置。例如在 Linux 系统中,若要设置为使用 CPU,可在终端执行 export VLLM_TARGET_DEVICE=“cpu”,然后再运行你的 Python 代码。
检查依赖和配置完整性:
CUDA 及 GPU 驱动(针对 GPU 使用):如果打算使用 GPU,确认 CUDA 已正确安装(可以通过 nvcc --version 命令查看 CUDA 版本来验证安装情况),并且 GPU 驱动是最新且与 CUDA 版本适配的。
vLLM 版本兼容性:检查所使用的 vLLM 版本是否存在已知的与设备类型推断相关的问题或特殊配置要求。若版本较旧,尝试升级到最新版本,通过 pip install --upgrade vllM 命令来升级,看能否解决问题。
查看更多日志和调试信息(可选):
可以尝试在代码中添加更多的打印语句,比如在涉及设备类型推断的相关函数内部(例如 vLLM/config.py 中 DeviceConfig 类的初始化部分等位置),打印出一些关键变量的值,来帮助进一步确定为何无法推断出设备类型,以便更精准地定位和解决问题。不过这需要对代码有一定的熟悉程度以及遵循相应的代码规范来进行调试操作。
可以设置环境变量,我刚刚是通过命令行参数传递的,跟设置环境变量的作用应该差不多,昨天也试过了;另外就是在代码里面传递’device=“cpu” '这个参数,昨天试的是"target-device"参数,结果vllm不认识,今天这个是"device"参数,再试试。改了之后重新执行,还是报错,但错误跟上面的不一样了,跟昨天的也不一样:
$ python test.py
config.json: 663B [00:00, 2.35MB/s]
INFO 12-23 06:47:23 config.py:478] This model supports multiple tasks: {
'classify', 'reward', 'generate', 'embed', 'score'}. Defaulting to 'generate'.
Traceback (most recent call last):
File "/usr/work/llm/vllm/test.py", line 12, in <module>
llm = LLM(model="Qwen/Qwen2-7B-Instruct", device="cpu")
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/utils.py", line 990, in inner
return fn(*args, **kwargs)
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/entrypoints/llm.py", line 230, in __init__
self.llm_engine = self.engine_class.from_engine_args(
File "/home/zhangsan/.local/lib/python3.10/site-packages/vllm/engine/llm_engine.py", line 529, in from_engine_args
engine_config =</