vLLM 启动 GGUF 模型踩坑记:从报错到 100% GPU 占用的原因解析

摘要: 本文记录了使用 vLLM 部署本地 GGUF 格式大模型的踩坑过程。从最初的路径格式错误,到参数解析问题,再到 NumPy 版本兼容性引发的 AttributeError,最终解决了启动问题。然而,启动后 GPU SM 占用率长时间 100%,这并非卡死,而是 vLLM 进行关键优化步骤(内存分析与 CUDA 图捕捉)的正常现象。最终成功启动服务并明确了 API Base URL。

背景: 想要使用强大的 vLLM 框架来部署一个本地的 GGUF 格式量化大模型(例如 all-hands_openhands-lm-32b-v0.1-Q4_K_M.gguf),并提供 OpenAI 风格的 API 服务。

环境: Conda 环境,vLLM 0.7.2,多 GPU(使用 tensor-parallel-size=2

踩坑一:GGUF 路径格式与 Repo ID 混淆

最初尝试使用模型所在的 目录 作为 vllm serve 的参数:

vllm serve /home/kent/_Project/hf_model/bartowski/all-hands_openhands-lm-32b-v0.1-GGUF \
    --host 0.0.0.0 --port 8000 \
    # ... 其他参数

报错:

huggingface_hub.errors.HFValidationError: Repo id must be in the form 'repo_name' or 'namespace/repo_name': '/home/kent/_Project/hf_model/bartowski/all-hands_openhands-lm-32b-v0.1-GGUF'. Use `repo_type` argument if needed.

原因: vLLM 默认将 serve 后的第一个参数视为 Hugging Face Hub 的仓库 ID 或本地包含 config.json 等文件的模型目录。直接提供 GGUF 文件所在的目录路径不符合预期。

解决: 需要提供指向 .gguf 文件本身的完整路径

踩坑二:vllm serve 的参数解析 - model_tag 的要求

修正路径后,尝试使用 --model 参数指定 GGUF 文件:

vllm serve \
    --model /path/to/your_model.gguf \
    --host 0.0.0.0 --port 8000 \
    # ... 其他参数

报错:

usage: vllm serve <model_tag> [options]
vllm serve: error: the following arguments are required: model_tag

原因: vLLM 的 serve 子命令强制要求一个位置参数 model_tag(即 serve 后面的第一个无 -- 前缀的参数)来指定模型。即使使用了 --model,这个位置参数也不能省略。

解决: 将 GGUF 文件的完整路径作为 serve 后面的第一个位置参数,并移除 --model 选项。

vllm serve \
    /home/kent/_Project/hf_model/bartowski/all-hands_openhands-lm-32b-v0.1-GGUF/all-hands_openhands-lm-32b-v0.1-Q4_K_M.gguf \
    --host 0.0.0.0 --port 8000 \
    # ... 其他参数

踩坑三:NumPy 版本兼容性问题

修正命令后再次运行,遇到新的报错:

AttributeError: `newbyteorder` was removed from the ndarray class in NumPy 2.0. Use `arr.view(arr.dtype.newbyteorder(order))` instead.

原因: 环境中安装了 NumPy 2.0 或更高版本。而 vLLM 依赖的某个库(如 transformers 或其依赖 gguf-py)内部代码使用了 NumPy 1.x 版本中存在的 .newbyteorder() 方法,该方法在 NumPy 2.0 中已被移除。

解决: 降级 NumPy 版本到 2.0 之前。推荐使用一个稳定的 1.x 版本,如 1.26.4。

# 在激活的 Conda 环境中执行
pip install "numpy<2.0"
# 或者指定版本
# pip install numpy==1.26.4

踩坑四(解惑):启动后 GPU SM 长时间 100%

在解决了上述所有报错后,vllm serve 命令终于开始正常执行。模型权重成功加载,但观察 nvidia-sminvtop 发现 GPU 的 SM 占用率长时间维持在 100%,似乎服务卡住了。

原因: 这并非卡死,而是 vLLM 在进行必要的、但非常耗时的启动优化步骤。主要包括:

  1. 内存分析 (Memory Profiling):

    • 目的: 精确计算在当前 GPU 和配置下,除了模型权重外,有多少显存可以安全地分配给 KV Cache,以最大化吞吐量和并发数。
    • 表现: 在日志中可以看到类似 Memory profiling takes XXX.XX seconds 的信息。这个过程需要模拟计算,会长时间占用 GPU。在我们的案例中,这步耗时近 4 分钟。
    INFO 04-01 22:18:59 worker.py:267] Memory profiling takes 231.99 seconds
    INFO 04-01 22:18:59 worker.py:267] ... the rest of the memory reserved for KV Cache is 7.46GiB.
    
  2. CUDA 图捕捉 (Capturing Cudagraphs):

    • 目的: 将模型推理过程中的一系列 GPU 操作预先录制成一个“图”(Graph)。后续处理请求时,可以直接重放这个图,大幅减少 CPU 到 GPU 的调度开销,提升性能。
    • 表现: 日志中会出现 Capturing cudagraphs for decoding... 和一个进度条。这个过程同样需要实际运行推理,会长时间占用 GPU。在我们的案例中,这步耗时约 1 分 12 秒。
    INFO 04-01 22:19:02 model_runner.py:1434] Capturing cudagraphs for decoding...
    Capturing CUDA graph shapes: 100%|████████████| 35/35 [01:12<00:00,  2.07s/it]
    INFO 04-01 22:20:14 model_runner.py:1562] Graph capturing finished in 72 secs...
    

结论: 启动 vLLM 服务(尤其是对于大型模型、启用 Tensor Parallel 或 Prefix Caching 时)需要耐心等待。内存分析和 CUDA 图捕捉是正常的优化过程,期间 GPU 高负载是预期行为。

最终成功与 Base URL

当所有优化步骤完成后,日志会显示:

INFO 04-01 22:20:14 llm_engine.py:431] init engine (...) took 307.74 seconds
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

这表明服务已成功启动,并监听在 8000 端口。

API Base URL:

  • 如果从服务器本机访问:http://127.0.0.1:8000
  • 如果从局域网其他机器访问:http://<服务器的IP地址>:8000

常用的 OpenAI 兼容端点(例如文本补全)的完整 URL 为:http://<服务器的IP地址>:8000/v1/completions

总结: 部署 vLLM GGUF 模型需要注意命令行参数的正确格式、检查依赖库(尤其是 NumPy)的版本兼容性,并理解启动过程中的优化步骤会导致暂时的 GPU 高负载。耐心等待后,即可获得高效的推理服务。


### 关于 Docker 的安装 为了在 CentOS 上添加并安装 Docker,需要先从指定仓库地址获取 `docker-ce.repo` 文件[^1]: ```bash sudo yum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo ``` 随后执行命令完成 Docker 及其 CLI 和容器运行时组件的安装: ```bash sudo yum install -y docker-ce docker-ce-cli containerd.io ``` 启动 Docker 并设置开机自启服务: ```bash sudo systemctl start docker sudo systemctl enable docker ``` ### vLLM 框架简介及其应用 vLLM 是由伯克利大学 LMSYS 组织开发的一个 Python 库,旨在提供高效的大型语言模型 (LLM) 推理能力。该库引入了 PagedAttention 技术和其他优化措施来提升推理效率和支持分布式部署环境下的大规模数据处理需求[^2]。 对于想要利用 vLLM 进行项目构建的研究人员或开发者来说,官方文档提供了详细的 API 文档和实例指南帮助快速上手。 ### GGUF 格式的介绍与使用场景 GGUF(General Graphical User Format)并不是一个广为人知的标准术语,在当前上下文中可能指的是某种特定领域内的文件格式或者是某个具体项目的内部定义。如果是指用于保存图形界面布局或其他类型的用户交互设计的信息存储方式,则具体的实现细节会依赖于实际应用场景和技术栈的选择。然而,通常情况下提到此类概念时应有更确切的名字或者描述以便准确理解其用途范围。 由于缺乏关于 GGUF 更多的具体背景信息,建议查阅相关社区论坛或是查看是否有其他关联资源可以提供更多线索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值