Administrator
发布于 2025-11-02 / 6 阅读
0
0

Vllm-小试牛刀

WSL 2 集成

启用 WSL 2 集成

打开 Docker Desktop确保 Docker Desktop 已启动并正常运行(任务栏中能看到 Docker 图标)。

点击 Docker Desktop 图标,选择 Settings(设置)。

在左侧菜单中找到 Resources(资源)→ WSL Integration(WSL 集成)。

勾选你正在使用的 WSL 2 发行版(例如 Ubuntu),确保 “Enable integration with additional distros” 选项已开启。

点击 Apply & Restart 保存设置,Docker 会自动重启并应用配置。

验证

验证配置重启 WSL 2 终端(如关闭 Ubuntu 窗口后重新打开),输入 docker --version。如果显示版本信息,说明集成成功,此时可以正常使用docker ps等命令了。

原理说明:Docker Desktop 通过 WSL 2 集成功能,将 Docker CLI 和守护进程与指定的 WSL 发行版关联,让你能在 Linux 环境中直接操作 Docker,无需切换到 Windows 终端。

常见问题: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Head "http://%2Fvar%2Frun%2Fdocker.sock/_ping": dial unix /var/run/docker.sock: connect: permission denied

这个错误是由于当前用户没有权限访问 Docker 守护进程的 UNIX 套接字(/var/run/docker.sock)导致的。解决方法如下:

  • 步骤 1:将用户添加到docker用户组 Docker 守护进程启动时会创建一个docker用户组,加入该组的用户可以无需sudo直接使用 Docker 命令。 在 WSL 终端中执行以下命令,将当前用户添加到docker组:

    sudo usermod -aG docker $USER

    注销并重新登录 WSL(或关闭终端后重新打开),使权限生效。

  • 步骤 2:验证权限 重新登录后,执行以下命令测试是否生效:

    docker --version
    docker ps

    如果能正常显示版本信息或容器列表,说明权限已正确配置。 原理说明:Docker 守护进程的套接字(/var/run/docker.sock)默认属于root用户和docker组,普通用户直接访问会被拒绝。 将用户加入docker组后,即可继承该组对套接字的访问权限,无需每次使用sudo。

部署过程

在 Ubuntu 上部署 vLLM(一个高效的大语言模型推理框架)可以通过源码编译或 Python 包安装,以下是详细步骤(以 Ubuntu 22.04 为例,需确保已安装 GPU 及对应驱动):

前置条件

  • 安装驱动

    GPU 及驱动:需 NVIDIA GPU(支持 CUDA Compute Capability ≥ 7.0,如 V100、A100、3090 等),并安装 NVIDIA 驱动(推荐≥510.47.03)。检查驱动:nvidia-smi(能看到 GPU 信息即为正常)。 CUDA 环境:安装 CUDA Toolkit(推荐 11.7+,需与驱动版本匹配)。安装参考:NVIDIA CUDA 安装指南

    apt
    apt install cuda-toolkit
  • 验证

    nvcc -V(显示版本信息)。 Python 环境:Python 3.8+,建议使用虚拟环境(如conda或venv)。安装 Python:sudo apt install python3 python3-pip python3-venv。

部署vllm

  • 方法 1:通过 PyPI 安装(推荐,适合快速部署) vLLM 提供了预编译的 Python 包,直接通过pip安装:

    • 创建并激活虚拟环境(可选但推荐)

      python3 -m venv vllm-env
      source vllm-env/bin/activate  # 激活环
    • 安装 vLLM:根据 CUDA 版本选择对应命令(默认支持 CUDA 11.7,其他版本需指定)

      # 支持CUDA 11.7(默认)
      pip install vllm
      # 若CUDA为12.1,需指定版本
      pip install vllm[cuda121]
      # 若CUDA为12.2
      pip install vllm[cuda122]
  • 方法 2:源码编译安装(适合开发或定制)

    • 安装依赖

      sudo apt update
      sudo apt install -y git build-essential cmake libopenmpi-dev
    • 克隆代码

      git clone https://github.com/vllm-project/vllm.git
      cd vllm
    • 安装依赖包

      pip install -e .  #  editable模式安装(支持修改源码后实时生效)
    • 若编译过程中出现 CUDA 相关错误,检查 CUDA 路径是否正确,或指定 CUDA 版本

      CUDA_HOME=/usr/local/cuda-11.7 pip install -e .

验证部署

使用 vLLM 的LLM类运行一个简单示例(以开源模型facebook/opt-1.3b为例):

  1. 安装 transformers(模型加载依赖)

    pip install -U modelscope
    modelscope download --model Qwen/Qwen2.5-0.5B-Instruct --local_dir ./models/Qwen2.5-0.5B-Instruct
    
    pip install transformers
  2. 运行测试脚本(创建test_vllm.py):

    from vllm import LLM, SamplingParams
    
    # 采样参数(控制生成文本的随机性等)
    sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
    
    # 初始化LLM(指定模型,tensor_parallel_size为GPU数量)
    llm = LLM(model="facebook/opt-1.3b", tensor_parallel_size=1)
    
    # 输入提示
    prompts = ["Hello, my name is", "The capital of France is"]
    
    # 生成文本
    outputs = llm.generate(prompts, sampling_params)
    
    # 打印结果
    for output in outputs:
        prompt = output.prompt
        generated_text = output.outputs[0].text
        print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
  3. 执行脚本

    python test_vllm.py

    若成功输出生成的文本,说明 vLLM 部署正常。

启动 vLLM 服务(API 接口)

vLLM 支持通过 API 提供服务(兼容 OpenAI 接口格式),方便与其他系统集成:

# 启动API服务器(指定模型,端口8000)
python -m vllm.entrypoints.api_server --model facebook/opt-1.3b --port 8000

python -m vllm.entrypoints.api_server --model ./models/Qwen2.5-0.5B-Instruct --port 8000

启动后,可通过 HTTP 请求调用:

curl http://localhost:8000/generate \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Hello, my name is",
    "max_tokens": 50,
    "temperature": 0.8
  }'

常见问题解决

  1. CUDA 版本不匹配:确保 vLLM 安装时指定的 CUDA 版本与系统实际安装的一致。

  2. 内存不足:大模型(如 7B/13B)需要足够的 GPU 内存,若提示 OOM,可减小tensor_parallel_size或使用更小的模型。

  3. 模型下载慢:可手动下载模型到本地(如通过 Hugging Face Hub),再指定本地路径(--model /path/to/local/model)。

碰到问题

从提供的 vLLM 启动日志来看,核心问题是硬件(GPU 型号)与软件(PyTorch、vLLM)的兼容性不匹配,同时存在 CPU 内存配置不合理的次要问题。以下是具体原因分析和对应解决方案:

核心错误:GPU 硬件与 PyTorch/vLLM 不兼容

日志中多次明确提示 NVIDIA GeForce MX250 显卡无法满足运行要求,这是导致启动失败的根本原因,具体体现在 3 个层面:

1. GPU 计算能力(Compute Capability)过低

  • 错误信息

    Found GPU0 NVIDIA GeForce MX250 which is of cuda capability 6.1.
    Minimum and Maximum cuda capability supported by this version of PyTorch is (7.0) - (12.0)
    NVIDIA GeForce MX250 with CUDA capability sm_61 is not compatible with the current PyTorch installation.
  • 原因解释

    GPU 的 “计算能力(sm 版本)” 决定了它支持的 CUDA 特性。MX250 的计算能力是sm_61,而当前安装的 PyTorch 最低要求

    sm_70(对应 NVIDIA 10 系列及以后显卡,如 GTX 1080、RTX 20xx/30xx/40xx 等)。

    由于 sm_61 低于 PyTorch 支持的最低版本,PyTorch 无法为该 GPU 加载适配的 CUDA 内核(Kernel),最终触发

    torch.AcceleratorError: CUDA error: no kernel image is available for execution on the device

    (无可用的设备内核镜像)。

2. vLLM 特性依赖高版本 GPU

  • 错误信息

    Cannot use FA version 2 is not supported due to FA2 is only supported on devices with compute capability >= 8
  • 原因解释

    vLLM 依赖的FA2(FlashAttention 2,高速注意力机制)是其高性能的核心特性之一,但 FA2 明确要求 GPU 计算能力≥ sm_80(对应 RTX 30xx 及以后显卡)。

    MX250(sm_61)既不满足 PyTorch 最低要求,更无法支持 FA2,直接导致 vLLM 引擎初始化失败。

MX250 ollama能跑,vllm不能跑

你观察到的 “MX250 能运行 Ollama 但无法运行 vLLM” 的现象,本质是 两款工具的设计目标、硬件适配逻辑、底层优化策略完全不同——Ollama 为 “低配置硬件兼容性” 做了针对性优化,而 vLLM 则以 “高性能” 为核心目标,对硬件有明确门槛。具体差异如下:

一、核心差异:设计目标决定硬件适配策略

对比维度

核心目标

降低大模型使用门槛,支持 “低配置设备(含入门级 GPU、CPU)” 快速运行

追求极致推理性能(高吞吐量、低延迟),面向 “中高端 GPU 场景” 优化

GPU 计算能力适配

兼容低至 sm_52(如 GTX 900 系列)的 GPU,MX250(sm_61)自然支持

依赖高版本 GPU 特性(如 FA2 需 sm_80+),最低要求 PyTorch 支持的 sm_70+

底层框架与优化

自定义运行时,针对性裁剪 / 适配低配置硬件,甚至支持 “CPU+GPU 混合推理”

基于 PyTorch 构建,深度依赖 CUDA 高阶特性(如 Tensor Cores、CUDA Graph),对低配置 GPU 无适配

模型加载逻辑

支持 “模型分片加载”“显存动态调度”,小模型可在 MX250(2GB 显存)上运行

为性能优先,默认加载全量模型到 GPU,且依赖高版本 CUDA 内核,低配置 GPU 无法初始化

二、具体原因拆解:为什么 Ollama 能跑,vLLM 不能跑?

1. Ollama:为 “兼容性” 妥协性能,适配低配置 GPU

Ollama 的设计初衷是让普通用户在电脑上快速跑模型,因此做了大量 “向下兼容” 优化:

  • 不依赖 PyTorch 的 CUDA 版本限制:Ollama 没有使用 PyTorch 作为底层框架(而是自定义运行时),因此不受 PyTorch 对 “sm_70+” 的强制要求 ——MX250(sm_61)的 CUDA 内核能被 Ollama 直接调用;

  • 轻量化模型适配:Ollama 官方提供的模型(如 Llama 3 8B-Instruct 的 “量化版”)会针对低显存 GPU 做优化(如 4-bit 量化),MX250(2GB 显存)也能装下;

  • 混合推理支持:即使 GPU 显存不足,Ollama 会自动将部分模型参数放到 CPU 内存,虽然会变慢,但能保证 “能跑起来”。

2. vLLM:为 “性能” 放弃低配置,低 GPU 直接卡初始化

vLLM 的核心价值是 “比普通 PyTorch 推理快 10~100 倍”,这种性能依赖高配置 GPU 的特性,因此对低配置 GPU 直接 “不兼容”:

  • 绑定 PyTorch 的 CUDA 限制:vLLM 基于 PyTorch 构建,而当前版本 PyTorch 已放弃对 sm_70 以下 GPU 的支持 ——MX250(sm_61)连 PyTorch 的 CUDA 环境都无法初始化(日志中 torch.zeros(1, device=device) 报错),更别提加载 vLLM 引擎;

  • 依赖高版本 GPU 特性:vLLM 的核心优化(如 FlashAttention 2、CUDA Graph、Tensor Parallelism)都需要 sm_80+ 的 GPU 支持(如 RTX 30 系列及以上),MX250 根本没有这些硬件特性,自然无法运行;

  • 无 “低配置兼容模式”:vLLM 默认假设用户有中高端 GPU,因此没有做 “CPU+GPU 混合推理”“低显存分片” 等兼容逻辑 —— 一旦 GPU 不满足要求,直接报错退出,不会尝试降级到 CPU 或兼容模式。

三、延伸:MX250 上的替代方案(想跑大模型,除了 Ollama 还能选什么?)

如果你的需求是在 MX250 上 “能跑模型”(而非追求 vLLM 的高性能),除了 Ollama,还可以考虑这些更轻量的工具,兼容性比 vLLM 好得多:

1.llama.cpp

  • 纯 C/C++ 编写,支持 CPU/GPU(含入门级 GPU),兼容 sm_50+ 的 GPU,MX250 完美支持;

  • 支持多种量化格式(如 2-bit、4-bit),小模型(如 Qwen 0.5B、Llama 3 8B 4-bit)可在 MX250 上运行;

  • 启动命令示例(运行 Qwen 0.5B):

    ./main -m qwen2.5-0.5b-instruct.Q4_K_M.gguf -p "Hello!" --n-gpu-layers 20  # 分配部分层到 GPU,提升速度

2.Hugging Face Transformers(CPU 模式)

  • 虽然性能不如 Ollama/llama.cpp,但胜在生态丰富,支持几乎所有开源模型;

  • 启动命令示例(Qwen 0.5B CPU 推理):

    from transformers import AutoModelForCausalLM, AutoTokenizer
    tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
    model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct").to("cpu")
    inputs = tokenizer("Hello!", return_tensors="pt")
    outputs = model.generate(**inputs, max_new_tokens=10)
    print(tokenizer.decode(outputs[0], skip_special_tokens=True))

总结

简单来说:Ollama 是 “能跑就行”,vLLM 是 “要跑就跑最快”—— 两者的定位不同,导致对硬件的要求天差地别。MX250 作为入门级 GPU,刚好落在 Ollama 的 “兼容范围” 内,但完全不在 vLLM 的 “目标硬件范围” 内,因此会出现 “Ollama 能玩,vLLM 玩不了” 的情况。

如果你的核心需求是 “快速跑模型”,继续用 Ollama 或 llama.cpp 即可;如果需要 vLLM 的高性能,最终还是得升级到 sm_70+ 的 GPU(如 RTX 2060 及以上)。


评论