跳至主要内容

如何在本地使用 llama.cpp 运行 GLM-4.7:高性能指南

在单张 NVIDIA H100 80GB GPU 上配置 llama.cpp 运行 GLM-4.7,通过 GPU 卸载、Flash Attention、上下文优化、高效批处理与调优 CPU 线程,最高可达每秒 20 个 token。
· 10分钟 阅读

使用 AI 探索

GLM-4.7 是您的全新编程搭档,旨在在真实开发流程中表现更佳。与 GLM-4.6 相比,它在多语言与代理式编程、基于终端的任务以及工具使用方面有明显提升,并在 SWE-bench、SWE-bench Multilingual 和 Terminal Bench 2.0 上取得了出色成绩。它还支持“先思考后行动”,在现代代理框架中应对复杂任务更可靠。

在本教程中,我们将直接开始搭建 Runpod 环境、安装所有必要依赖,并克隆带有完整 CUDA 支持的 llama.cpp。随后我们将从 Hugging Face 下载 GLM-4.7 的 2-bit 模型,分别以 CLI 和服务器模式运行,并最终使用 OpenAI SDK 测试正在运行的服务。

您也可以查看我们关于本地运行 GLM 4.7 Flash 的指南。

GLM-4.7 系统要求与硬件前置条件

在本地运行 GLM-4.7 之前,请确保您的系统满足以下要求。

NVIDIA GPU 与驱动

要获得可用的性能,必须配备 NVIDIA GPU。

安装最新的 NVIDIA 驱动,并通过以下命令验证安装:

nvidia-smi

如果该命令可以运行并显示您的 GPU,则说明驱动安装正确。

CUDA 支持

运行 GLM-4.7 进行 GPU 加速需要 CUDA。如果您从源码构建 llama.cpp,必须在构建时正确检测到 CUDA。 

使用预编译的启用 CUDA 的二进制文件时,系统中必须已安装可用的 CUDA 运行时。若无 CUDA 支持,GLM-4.7 将回退到 CPU 执行,这在实际使用中会慢到不可接受。

内存要求(非常重要)

GLM-4.7 体量极大,即便量化后也是如此。模型能否运行以及运行速度如何,取决于您“总内存”,而不仅仅是 GPU 显存。

请按 GPU 显存 + 系统内存的总和 来思考。

2-bit 动态量化(UD-Q2_K_XL)

  • 约占用 135 GB 磁盘空间
  • 可在单张 24 GB 显存的 GPU 上运行,需搭配约 128 GB 系统内存
  • 依赖将 MoE 层卸载到系统内存
  • 在质量与可行性之间取得良好平衡

1-bit 量化(UD-TQ1)

  • 比 2-bit 更小更快
  • 可原生配合 Ollama 使用
  • 内存占用最低
  • 质量有明显下降

4-bit 量化

  • 至少需要一张 40 GB 显存的 GPU
  • MoE 层仍需卸载至系统内存
  • 约 165 GB 系统内存时,预计能达到约每秒 5 个 token
  • 建议显存 + 系统内存合计 205 GB,以获得稳定性能和更长上下文

要点总结

对于 GLM-4.7,仅有 H100 GPU 本身还不够。稳定而快速的推理取决于总可用内存,即 GPU 显存与系统内存的组合。

在 RunPod 上搭建 GPU 环境

本教程将使用 RunPod,因为其上手快且提供多种按需可用的 GPU。

先创建一个新 pod。选择 最新的 PyTorch 镜像,然后点击模板设置中的 Edit(编辑)。将 卷磁盘大小提高到 200 GB,因为 GLM-4.7 模型非常大,即便是 2-bit 量化形式。

接着,开放所需端口。保留 JupyterLab 的默认 8080 端口,并新增一个后续用于 llama.cpp 服务器 的端口。

设置 runpod 容器配置完成后,您的价格摘要和 pod 摘要应清晰显示默认模板已被更大的卷大小覆盖。

runpod pod 摘要

pod 启动后,点击 Jupyter Notebook 链接以启动 JupyterLab。创建一个新笔记本并运行以下设置代码。

import os

WORKDIR = "/workspace"
LLAMA_DIR = f"{WORKDIR}/llama.cpp"
MODEL_DIR = f"{WORKDIR}/models/unsloth/GLM-4.7-GGUF"

os.makedirs(MODEL_DIR, exist_ok=True)

# Put Hugging Face cache on /workspace (big speed win on RunPod)
os.environ["HF_HOME"] = f"{WORKDIR}/.cache/huggingface"
os.environ["HUGGINGFACE_HUB_CACHE"] = f"{WORKDIR}/.cache/huggingface/hub"
os.environ["HF_HUB_CACHE"] = f"{WORKDIR}/.cache/huggingface/hub"
os.environ["HF_HUB_DISABLE_SYMLINKS_WARNING"] = "1"

# Enable HF Xet high performance (Xet backend)
os.environ["HF_XET_HIGH_PERFORMANCE"] = "1"

print("WORKDIR:", WORKDIR)
print("LLAMA_DIR:", LLAMA_DIR)
print("MODEL_DIR:", MODEL_DIR)
print("HF_HOME:", os.environ["HF_HOME"])
print("HF_HUB_CACHE:", os.environ["HF_HUB_CACHE"])
print("HF_XET_HIGH_PERFORMANCE:", os.environ["HF_XET_HIGH_PERFORMANCE"])

此代码将:

  1. 将 /workspace 设为 RunPod 上的主工作目录。
  2. 定义 llama.cpp 的克隆与构建位置。
  3. 定义 GLM-4.7 GGUF 模型文件的存放位置。
  4. 如模型目录不存在则创建。
  5. 将 Hugging Face 缓存移动到 /workspace,以加快下载并提供更多磁盘空间。
  6. 在容器环境中禁用 Hugging Face 的符号链接警告。
  7. 启用 Hugging Face 的 Xet 高性能后端以加速大文件下载。
  8. 打印所有路径与环境变量以验证设置。

您应看到类似如下的输出:

WORKDIR: /workspace
LLAMA_DIR: /workspace/llama.cpp
MODEL_DIR: /workspace/models/unsloth/GLM-4.7-GGUF
HF_HOME: /workspace/.cache/huggingface
HF_HUB_CACHE: /workspace/.cache/huggingface/hub
HF_XET_HIGH_PERFORMANCE: 1

接下来,验证 NVIDIA 驱动是否安装正确以及 GPU 是否可见。

!nvidia-smi

您应能看到一块 80 GB 显存的 H100 GPU,这表明环境已就绪并可进行 GPU 加速。

GPU 统计信息

最后,安装从源码构建 llama.cpp 所需的系统依赖。

%%capture
!apt-get update -y
!apt-get install -y build-essential cmake curl libcurl4-openssl-dev git pciutils

注意:我们使用了 %%capture 在 Jupyter 中隐藏冗长的安装日志,同时仍然执行命令。

安装带 CUDA 支持的 llama.cpp

本步骤中,我们将从源码克隆并构建启用 CUDA 的 llama.cpp,以确保最佳 GPU 性能。

首先,将官方仓库克隆到工作区。

!git clone https://github.com/ggml-org/llama.cpp /workspace/llama.cpp

接着,配置构建以启用 CUDA,并禁用共享库。

%%capture
!cmake /workspace/llama.cpp -B /workspace/llama.cpp/build -DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON

随后以 Release 模式构建所需的二进制文件。

%%capture
!cmake --build /workspace/llama.cpp/build --config Release -j --clean-first --target llama-cli llama-server

构建完成后,将二进制文件复制到主目录并验证输出。

%%capture
!cp /workspace/llama.cpp/build/bin/llama-* /workspace/llama.cpp/
!ls -la /workspace/llama.cpp | sed -n '1,60p'

至此,llama.cpp 已具备完整 CUDA 支持,可通过 CLI 或服务器运行 GLM-4.7。

使用 Xet 支持下载 GLM 4.7 模型

本步骤将安装带有 Xet 和 HF Transfer 支持的 Hugging Face 库,以显著加速大模型下载。与 Git LFS 相比,Xet 提供更快的性能,这对于高效下载 GLM-4.7 至关重要。

首先,安装所需的 Hugging Face 依赖并启用 HF Transfer。

!pip -q install -U "huggingface_hub[hf_xet]" hf-xet
!pip -q install -U hf_transfer

通过设置环境变量启用 HF Transfer。

import os
os.environ["HF_HUB_ENABLE_HF_TRANSFER"] = "1"

安装这些软件包后,请重启 Jupyter 内核以确保新设置生效。

接着,使用 snapshot_download 从 Hugging Face 下载 GLM-4.7 GGUF 模型。我们将下载限制在推荐的 动态 2-bit 量化,以降低存储与内存占用。

from huggingface_hub import snapshot_download

snapshot_download(
    repo_id="unsloth/GLM-4.7-GGUF",
    local_dir=MODEL_DIR,
    allow_patterns=["*UD-Q2_K_XL*"],  # recommended dynamic 2-bit
)
print("Downloaded into:", MODEL_DIR)

启用 Xet 与 HF Transfer 后,下载速度可达 每秒 726 MB,随后可提升至 每秒 1.2 GB。若不进行此设置,下载速度通常约为 每秒 50 MB,下载此规模的模型可能需要接近整整一天。

从 Hugging Face Hub 下载模型

下载完成后,GLM-4.7 模型将保存在工作区的模型目录中,可通过 llama.cpp 进行推理。

已从 Hugging Face Hub 下载 GLM-4.7 2-bit 模型

以交互模式运行 GLM 4.7

我们现在将使用 llama.cpp CLI 以交互模式运行 GLM-4.7。

先在 JupyterLab 内打开一个终端。点击 加号(+)按钮,下拉并选择 Terminal(终端)。这将在 RunPod 环境中打开一个新的 shell 会话。

在终端中运行以下命令以启动交互式 CLI。

 /workspace/llama.cpp/llama-cli \
  --model "/workspace/models/unsloth/GLM-4.7-GGUF/UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf" \
  --jinja \
  --threads -1 \
  --ctx-size 16384 \
  --temp 1.0 \
  --top-p 0.95 \
  --seed 3407 \
  --fit on

该命令会加载 GLM-4.7 的动态 2-bit 模型并启动交互式对话。 --fit on 标志允许 llama.cpp 尽可能多地将模型层与 KV 缓存块自动卸载到 GPU,同时将剩余部分安全地溢出至系统内存。这样无需手动调节层数,并有助于避免内存不足错误。

通过 llama-cli 运行 GLM 4.7

模型加载完成后,您会看到 llama.cpp 的横幅以及交互式提示符。此时您可以输入消息(例如简单问候),模型将开始生成回复。

终端中的 llama.cpp CLI 界面

在每个回复的末尾,llama.cpp 会打印性能统计信息,包括 token 生成速度。此阶段模型约为 每秒 2.2 个 token,这表明模型在单张 H100 GPU 上运行正常。

使用 llama.cpp CLI 生成 GLM 4.7 回复

接下来我们将应用更多优化,以提升吞吐量并逐步接近 每秒 20 个 token 的目标。

运行 GLM 4.7 推理服务器

本步骤中,我们使用 llama.cpp 将 GLM-4.7 作为持久化推理服务器运行,并针对单张 H100 PCIe GPU 进行了优化。这些设置旨在提升吞吐、稳定性与内存效率。

为获得稳定高效的性能,我们采用以下优化:

  1. GPU 卸载(--fit on):尽可能将模型与 KV 缓存卸载至 GPU 内存,剩余部分安全溢出至系统内存。避免手动调层并防止内存不足错误。
  2. Flash Attention(--flash-attn auto):在 H100 等受支持 GPU 上启用优化的注意力内核,显著提升 token 生成速度并降低内存开销。
  3. 上下文大小调优(--ctx-size 8192):大上下文窗口会随时间拖慢解码。将 16k 降至 8k,可为多数负载带来更稳定的 token 吞吐。
  4. 批处理(--batch-size、--ubatch-size):通过更大、更高效的批量处理提升 GPU 利用率与整体吞吐。
  5. CPU 线程控制(--threads 32):防止 CPU 过度订阅并减少 RunPod 等云环境中的调度开销。

在终端中运行以下命令以启动 GLM-4.7 推理服务器。

/workspace/llama.cpp/llama-server \
  --model "/workspace/models/unsloth/GLM-4.7-GGUF/UD-Q2_K_XL/GLM-4.7-UD-Q2_K_XL-00001-of-00003.gguf" \
  --alias "GLM-4.7" \
  --threads 32 \
  --host 0.0.0.0 \
  --ctx-size 8192 \
  --temp 1.0 \
  --top-p 0.95 \
  --port 8080 \
  --fit on \
  --prio 3 \
  --jinja \
  --flash-attn auto \
  --batch-size 1024 \
  --ubatch-size 256

模型加载完成后,服务器开始监听 8080 端口,即可接收推理请求。此时,GLM-4.7 已作为高性能推理服务在单张 H100 GPU 上运行。

GLM 4.7 llama.cpp 服务器正在运行

下一步,我们将使用 内置 Web UI 测试该服务器(llama.cpp 自带)。

使用 llama.cpp Web UI 测试 GLM 4.7

要测试正在运行的推理服务器,打开您的 RunPod 控制台,找到已开放的 8080 端口的 HTTP 服务。点击链接,即可在浏览器中打开 llama.cpp Web UI。

当前运行 pod 的 Runpod 控制台

llama.cpp Web UI 类似于 ChatGPT。它允许您输入提示、附加文件、调整设置,并在界面中选择可用模型。

llama.cpp WebUI 网页应用

选择 GLM-4.7 模型后,您将看到关于已加载模型的详细信息,包括文件路径、上下文大小、模型尺寸、参数数量、嵌入维度以及其他运行时细节。这表明正确的模型与配置已生效。

GLM 4.7 2-bit 模型信息

现在输入您的第一个提示。几乎在一瞬间,模型就会在 Web UI 中开始生成回复。

在 llama.cpp WebUI 中使用 GLM 4.7 模型

借助先前应用的优化服务器设置,模型可达到 约每秒 19 个 token,这表明推理管线运行高效。生成的回复准确连贯。

查看单张 H100 上运行的 GLM 4.7 2-bit 模型统计

随后您可以继续提问,例如常识问题。测试中,GLM-4.7 持续达到 约每秒 20 个 token(包含推理与回答 token),展现出在单张 H100 GPU 上的稳定高性能。

在 llama.cpp WebUI 中生成回复并达到每秒 20 个 token

使用 OpenAI Python SDK 测试 GLM 4.7

本节将使用 llama.cpp 推理服务器 与 兼容 OpenAI 的 Python SDK 进行测试。这将确认服务器可通过编程方式正常工作,并可集成到真实应用中。

首先回到 Jupyter Notebook。确保 llama-server 进程仍在终端中运行,请勿停止或重启。

为验证服务器处于激活状态并监听 8080 端口,运行以下命令:

!ss -lntp | grep 8080 || true

您应看到类似如下的输出,确认 llama-server 正在监听:

LISTEN 0      512          0.0.0.0:8080       0.0.0.0:*    users:(("llama-server",pid=1108,fd=15))

接着安装 OpenAI Python SDK,我们将用它向本地服务器发送请求。

!pip -q install openai

现在创建一个指向本地 llama.cpp 服务器的 OpenAI 客户端。API Key 值并非必需,但为兼容性需要提供。

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8080/v1",
    api_key="sk-no-key-required",
)

发送一个简单的对话补全请求以测试多语言能力。

resp = client.chat.completions.create(
    model="GLM-4.7",
    messages=[{"role": "user", "content": "Say hello in Urdu and explain what you said."}],
    temperature=0.7,
)

print(resp.choices[0].message.content)

模型将用乌尔都语进行问候,并清晰解释每个词语,展现其多语言理解与推理能力。

GLM 4.7 生成的回复

接着测试流式推理,这对聊天等实时应用至关重要。

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8080/v1",
    api_key="sk-no-key-required",
)

stream = client.chat.completions.create(
    model="GLM-4.7",
    messages=[
        {
            "role": "user",
            "content": "What makes ChatGPT so successful and popular, given that it's "just" a chatbot?"
        }
    ],
    temperature=0.7,
    stream=True,
)

for event in stream:
    choice = event.choices[0]
    if getattr(choice, "delta", None) and getattr(choice.delta, "content", None):
        text = choice.delta.content
        print(text, end="", flush=True)
        full_text.append(text)

回复将以 token 为单位平滑流式输出,确认 llama.cpp 的流式能力运行稳定,与 GLM-4.7 配合良好。生成的答案结构清晰、内容准确,适用于接近生产的工作负载。

GLM 4.7 生成的回复

至此,GLM-4.7 已可通过 Web UI 与 兼容 OpenAI 的 API 全面运转,并在优化设置下高效运行于单张 H100 GPU。

结语

过去几个月里,llama.cpp 快速成熟,已达到可完全替代 Ollama 及其他本地聊天应用来运行大语言模型的水平。 

它提供高度可配置且高速的推理引擎、面向交互的终端 CLI,以及与 ChatGPT 体验高度相近的内置 Web UI。 

您还可以通过运行时标志与 UI 设置对模型行为进行精细控制,依据硬件在性能与质量之间进行调优。

一个重要结论是,您并不需要企业级硬件来运行 GLM-4.7。只要具备足够的系统内存以及如 RTX 3090 之类的 GPU,就可以通过 --fit on 并配合合适的 llama.cpp 优化,在本地运行 2-bit 的 GLM-4.7 模型。 

llama.cpp 生态拥有庞大而活跃的社区,便于在为特定 GPU 或工作负载调优时找到优化配置与帮助。

在本教程中,我们搭建了 RunPod 环境,构建了带 CUDA 支持的 llama.cpp,使用高速 Hugging Face 传输下载了 GLM-4.7 模型,并以交互模式运行。随后我们启动了优化的推理服务器,通过 Web UI 进行测试,并使用兼容 OpenAI 的 API 以编程方式完成验证。

最终成果是一个完全本地化的高性能 GLM-4.7 部署,在单张 GPU 上即可提供高准确度与接近实时的推理。该方案非常适合用于试验、研究,乃至注重可控性、性能与透明度的类生产工作负载。

GLM-4.7 常见问题

GLM-4.7 是什么?

GLM-4.7 是一款体量巨大的下一代开源权重语言模型,专为充当编程搭档与代理式推理者而设计。 它采用专家混合(MoE)架构,在真实开发流程中表现优异:在多语言编码、基于终端的任务以及复杂工具使用方面胜过前代(GLM-4.6)。 与标准聊天模型不同,GLM-4.7 支持“先思考后行动”,在 SWE-bench 与 Terminal Bench 2.0 等基准中的自主任务上非常可靠。

在本地运行 GLM-4.7 的最低硬件要求是什么?

完整的 GLM-4.7 模型规模庞大(355B 参数,32B 处于激活状态)。若要高效运行其2-bit 量化版本,您需要至少135GB 的总内存(显存 + 系统内存)。单张 NVIDIA H100(80GB)足以进行处理,但必须大量卸载至系统内存。若要获得未量化 FP16 性能,则需要由多张 H100 或 A100 组成的集群。

我可以将 GLM-4.7 用于商业应用吗?

可以。GLM-4.7 以开源权重形式发布,采用宽松许可(通常为 MIT 或 Apache 2.0,具体取决于发布仓库),允许商业使用、修改与分发。这使其成为构建内部编码代理或数据处理流水线时,替代 GPT-4 或 Claude 3.5 Sonnet 等专有 API 的高性价比选择。

为何我的机器上 GLM-4.7 运行很慢,尽管我有 GPU?

如果速度低于每秒 5 个 token,很可能是系统将过多层卸载到了 CPU 内存。虽然llama.cpp 允许在 GPU 显存不足时运行更大的模型,但 CPU 与 GPU 之间(经由 PCIe)的数据传输会造成瓶颈。要提速,可尝试提高 --fit 的卸载激进度,或缩小上下文窗口大小(--ctx-size),从而为模型层释放显存。

GLM-4.7 与 GLM-4.7 Flash 有何区别?

GLM-4.7 是“前沿”全尺寸模型,具备最强的推理能力,但需要庞大硬件。GLM-4.7 Flash 是其蒸馏的轻量版本,面向速度和更低延迟。如果您的硬件受限(如单张 24GB 显存的 RTX 3090 或 4090),GLM-4.7 Flash 更合适,因为它可以完全在 GPU 上运行,而无需 CPU 卸载所带来的性能损失。

Abid Ali Awan

作者

Abid Ali Awan

作为一名持证的数据科学家,我热衷于利用前沿技术打造创新的机器学习应用。凭借在语音识别、数据分析与报告、MLOps、对话式人工智能以及自然语言处理方面的扎实背景,我不断打磨构建智能系统的能力,力求带来切实影响。除技术专长外,我也擅长沟通,能够将复杂概念提炼为清晰、简明的表述。因此,我成为数据科学领域备受关注的博主,与不断壮大的数据专业人士社区分享洞见与实践经验。目前,我专注于内容创作与编辑,借助大语言模型打造有力且吸引人的内容,帮助企业与个人更好地发挥数据价值。

主题