chatglm.cpp

GitHub
3k 328 较难 1 次阅读 2天前MIT语言模型
AI 解读 由 AI 自动生成,仅供参考

chatglm.cpp 是一个基于 C++ 开发的高效推理框架,专为在个人电脑(如 MacBook、Windows 或 Linux 主机)上本地运行清华智谱 AI 系列的 ChatGLM 及 GLM-4 大模型而设计。它解决了大型语言模型通常依赖昂贵 GPU 服务器、难以在普通硬件上流畅运行的痛点,让用户无需联网即可在本地实现隐私安全、低延迟的实时对话体验。

这款工具非常适合希望在本地部署大模型的开发者、研究人员,以及关注数据隐私的普通用户。其核心亮点在于纯 C++ 实现并依托 ggml 库,能够像 llama.cpp 一样高效工作。通过支持 int4/int8 量化技术,它大幅降低了内存占用并加速了 CPU 推理过程,同时优化了键值缓存与并行计算能力。此外,chatglm.cpp 还兼容 P-Tuning v2 和 LoRA 微调模型,支持打字机效果的流式输出,并提供 Python 绑定、Web 演示及 API 服务等多种扩展方式。无论是 x86/ARM 架构的 CPU,还是 NVIDIA 与 Apple Silicon 的 GPU,都能获得良好的性能支持,让大模型应用真正变得轻量且触手可及。

使用场景

一位拥有 MacBook Pro 的独立开发者,希望在本地离线环境中快速部署一个支持中文对话的智能客服原型,用于测试私有数据下的回答效果。

没有 chatglm.cpp 时

  • 硬件门槛高:运行原版 ChatGLM-6B 通常需要配备大显存 NVIDIA 显卡,普通笔记本无法承载,必须租用昂贵的云端 GPU 服务器。
  • 环境配置繁琐:需要安装庞大的 PyTorch 框架及各类依赖库,版本冲突频繁,在 macOS 上配置 CUDA 替代方案更是耗时耗力。
  • 推理速度慢:在未量化的浮点精度下,首字生成延迟高,多轮对话时显存占用迅速飙升,导致交互体验卡顿甚至崩溃。
  • 隐私与成本顾虑:数据需上传至云端或依赖外部 API,存在隐私泄露风险,且按 Token 计费的模式让高频测试成本难以控制。

使用 chatglm.cpp 后

  • 原生苹果芯片加速:直接利用 MacBook 的 Apple Silicon GPU 进行推理,无需额外显卡,纯 C++ 实现让内存占用降低 70% 以上。
  • 极简部署流程:通过一行命令即可将 Hugging Face 模型转换为 int4 量化格式,配合 Python 绑定快速启动,几分钟内完成环境搭建。
  • 流畅实时交互:得益于优化的 KV 缓存和并行计算,即使在 CPU 模式下也能实现“打字机”效果的流式输出,响应速度满足实时对话需求。
  • 完全离线安全:所有计算均在本地完成,敏感业务数据不出设备,且一次性转换后可无限次免费调用,彻底消除云端费用。

chatglm.cpp 让高性能中文大模型真正跑在了开发者的笔记本电脑上,实现了低成本、高隐私且极速的本地化 AI 应用落地。

运行环境要求

操作系统
  • Linux
  • macOS
  • Windows
GPU
  • 非必需
  • 支持 NVIDIA GPU (需开启 CUDA)、Apple Silicon GPU (需开启 Metal) 或仅使用 CPU 推理
  • 未明确指定具体显存大小要求,但建议视觉模型 (GLM-4V) 在 GPU 上运行以避免 CPU 过慢
内存

未说明 (取决于模型大小及量化等级,int4/int8 量化旨在降低内存需求)

依赖
notes1. 该项目基于 C++ (ggml) 实现,支持纯 CPU 运行,也支持通过 CMake 编译开启 CUDA (NVIDIA) 或 Metal (Apple Silicon) 加速。 2. 运行前需使用 convert.py 将 Hugging Face 模型转换为量化的 GGML 格式 (支持 int4/int8 等)。 3. 视觉模型 (GLM-4V) 强烈建议使用 GPU 运行,因为即使在 4-bit 量化下,CPU 编码速度也非常慢。 4. 可通过 pip 直接安装 Python 绑定 (chatglm-cpp),安装时可通过环境变量开启 GPU 支持。
python3.8+ (根据 PyPI badge 推断,文中示例使用 python3)
torch
transformers
accelerate
sentencepiece
tabulate
tqdm
cmake
chatglm.cpp hero image

快速开始

ChatGLM.cpp

CMake Python package PyPI Python License: MIT

基于 ChatGLM-6BChatGLM2-6BChatGLM3GLM-4(V) 的 C++ 实现,可在您的 MacBook 上进行实时对话。

demo

特性

亮点:

  • 基于 ggml 的纯 C++ 实现,工作方式与 llama.cpp 相同。
  • 通过 int4/int8 量化、优化的 KV 缓存和并行计算,实现加速且内存高效的 CPU 推理。
  • 支持 P-Tuning v2 和 LoRA 微调模型。
  • 具有打字机效果的流式生成。
  • 提供 Python 绑定、Web 演示、API 服务器等多种可能性。

支持矩阵:

快速入门

准备工作

将 ChatGLM.cpp 仓库克隆到本地:

git clone --recursive https://github.com/li-plus/chatglm.cpp.git && cd chatglm.cpp

如果您在克隆仓库时忘记使用 --recursive 标志,请在 chatglm.cpp 文件夹中运行以下命令:

git submodule update --init --recursive

模型量化

安装加载和量化 Hugging Face 模型所需的必要包:

python3 -m pip install -U pip
python3 -m pip install torch tabulate tqdm transformers accelerate sentencepiece

使用 convert.py 将 ChatGLM-6B 转换为量化后的 GGML 格式。例如,要将 fp16 原始模型转换为 q4_0(量化为 int4)GGML 模型,运行:

python3 chatglm_cpp/convert.py -i THUDM/chatglm-6b -t q4_0 -o models/chatglm-ggml.bin

原始模型 (-i <model_name_or_path>) 可以是 Hugging Face 模型名称,也可以是你预先下载的模型的本地路径。目前支持的模型包括:

  • ChatGLM-6B:THUDM/chatglm-6bTHUDM/chatglm-6b-int8THUDM/chatglm-6b-int4
  • ChatGLM2-6B:THUDM/chatglm2-6bTHUDM/chatglm2-6b-int4THUDM/chatglm2-6b-32kTHUDM/chatglm2-6b-32k-int4
  • ChatGLM3-6B:THUDM/chatglm3-6bTHUDM/chatglm3-6b-32kTHUDM/chatglm3-6b-128kTHUDM/chatglm3-6b-base
  • ChatGLM4(V)-9B:THUDM/glm-4-9b-chatTHUDM/glm-4-9b-chat-1mTHUDM/glm-4-9bTHUDM/glm-4v-9b
  • CodeGeeX2:THUDM/codegeex2-6bTHUDM/codegeex2-6b-int4

您可以自由尝试以下任何一种量化类型,只需指定 -t <type>

类型 精度 对称
q4_0 int4 true
q4_1 int4 false
q5_0 int5 true
q5_1 int5 false
q8_0 int8 true
f16 半精度
f32 浮点数

对于 LoRA 模型,添加 -l <lora_model_name_or_path> 标志,即可将 LoRA 权重合并到基础模型中。例如,运行 python3 chatglm_cpp/convert.py -i THUDM/chatglm3-6b -t q4_0 -o models/chatglm3-ggml-lora.bin -l shibing624/chatglm3-6b-csc-chinese-lora,即可合并来自 Hugging Face 的公开 LoRA 权重。

对于使用 官方微调脚本 的 P-Tuning v2 模型,convert.py 会自动检测额外的权重。如果输出权重列表中包含 past_key_values,则表示 P-Tuning 检查点已成功转换。

构建与运行

使用 CMake 编译项目:

cmake -B build
cmake --build build -j --config Release

现在您可以通过运行以下命令与量化后的 ChatGLM-6B 模型对话:

./build/bin/main -m models/chatglm-ggml.bin -p 你好
# 你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。

若要在交互模式下运行模型,请添加 -i 标志。例如:

./build/bin/main -m models/chatglm-ggml.bin -i

在交互模式下,您的聊天记录将作为下一轮对话的上下文。

运行 ./build/bin/main -h 以了解更多选项!

尝试其他模型

ChatGLM2-6B
python3 chatglm_cpp/convert.py -i THUDM/chatglm2-6b -t q4_0 -o models/chatglm2-ggml.bin
./build/bin/main -m models/chatglm2-ggml.bin -p 你好 --top_p 0.8 --temp 0.8
# 你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。
ChatGLM3-6B

ChatGLM3-6B 在对话模式的基础上进一步支持函数调用和代码解释器功能。

对话模式:

python3 chatglm_cpp/convert.py -i THUDM/chatglm3-6b -t q4_0 -o models/chatglm3-ggml.bin
./build/bin/main -m models/chatglm3-ggml.bin -p 你好 --top_p 0.8 --temp 0.8
# 你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。

设置系统提示词:

./build/bin/main -m models/chatglm3-ggml.bin -p 你好 -s "你是一个由智谱 AI 训练的大语言模型 ChatGLM3。请仔细遵循用户的指示,并以 Markdown 格式作答。"

# 你好👋!我是 ChatGLM3,有什么问题可以帮您解答吗?

函数调用:

$ ./build/bin/main -m models/chatglm3-ggml.bin --top_p 0.8 --temp 0.8 --sp examples/system/function_call.txt -i
系统   > 请尽你所能回答以下问题。你可以使用以下工具:...
提示   > 生成一个随机数
ChatGLM3 > random_number_generator
```python
tool_call(seed=42, range=(0, 100))
```
工具调用   > 请手动调用函数 `random_number_generator`,参数为 `tool_call(seed=42, range=(0, 100))`,并将结果提供在下方。
观测值 > 23
ChatGLM3 > 根据您的要求,我使用随机数生成器API生成了一个随机数。根据API返回结果,生成的随机数为23。

代码解释器:

$ ./build/bin/main -m models/chatglm3-ggml.bin --top_p 0.8 --temp 0.8 --sp examples/system/code_interpreter.txt -i
系统   > 你是一位智能AI助手,你叫ChatGLM,你连接着一台电脑,但请注意不能联网。在使用Python解决任务时,你可以运行代码并得到结果,如果运行结果有错误,你需要尽可能对代码进行改进。你可以处理用户上传到电脑上的文件,文件默认存储路径是/mnt/data/。
提示   > 列出100以内的所有质数
ChatGLM3 > 好的,我会为您列出100以内的所有质数。
```python
def is_prime(n):
   """检查一个数是否为质数。"""
   if n <= 1:
       return False
   if n <= 3:
       return True
   if n % 2 == 0 or n % 3 == 0:
       return False
   i = 5
   while i * i <= n:
       if n % i == 0 or n % (i + 2) == 0:
           return False
       i += 6
   return True

primes_upto_100 = [i for i in range(2, 101) if is_prime(i)]
primes_upto_100
```

代码解释器 > 请手动运行代码,并将结果提供在下方。
观测值      > [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
ChatGLM3 > 100以内的所有质数为:

$$
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 
$$
ChatGLM4-9B

聊天模式:

python3 chatglm_cpp/convert.py -i THUDM/glm-4-9b-chat -t q4_0 -o models/chatglm4-ggml.bin
./build/bin/main -m models/chatglm4-ggml.bin -p 你好 --top_p 0.8 --temp 0.8
# 你好👋!有什么可以帮助你的吗?
ChatGLM4V-9B

03-Confusing-Pictures

你可以使用 -vt <vision_type> 来设置视觉编码器的量化类型。建议在GPU上运行GLM4V,因为即使采用4位量化,视觉编码在CPU上也会非常缓慢。

python3 chatglm_cpp/convert.py -i THUDM/glm-4v-9b -t q4_0 -vt q4_0 -o models/chatglm4v-ggml.bin
./build/bin/main -m models/chatglm4v-ggml.bin --image https://oss.gittoolsai.com/images/li-plus_chatglm.cpp_readme_f52c51021b38.jpg -p "这张图片有什么不寻常的地方" --temp 0
# 这张图片中不寻常的地方在于,男子正在一辆黄色出租车后面熨衣服。通常情况下,熨衣是在家中或洗衣店进行的,而不是在车辆上。此外,出租车在行驶中,男子却能够稳定地熨衣,这增加了场景的荒诞感。
CodeGeeX2
$ python3 chatglm_cpp/convert.py -i THUDM/codegeex2-6b -t q4_0 -o models/codegeex2-ggml.bin
$ ./build/bin/main -m models/codegeex2-ggml.bin --temp 0 --mode generate -p "\
# language: Python
# write a bubble sort function
"


def bubble_sort(lst):
    for i in range(len(lst) - 1):
        for j in range(len(lst) - 1 - i):
            if lst[j] > lst[j + 1]:
                lst[j], lst[j + 1] = lst[j + 1], lst[j]
    return lst


print(bubble_sort([5, 4, 3, 2, 1]))

使用BLAS

BLAS库可以集成进来进一步加速矩阵乘法。然而,在某些情况下,使用BLAS可能会导致性能下降。是否启用BLAS应取决于基准测试的结果。

Accelerate框架

Accelerate框架在macOS上会自动启用。若要禁用它,需添加CMake标志 -DGGML_NO_ACCELERATE=ON

OpenBLAS

OpenBLAS可以在CPU上提供加速。添加CMake标志 -DGGML_OPENBLAS=ON 即可启用。

cmake -B build -DGGML_OPENBLAS=ON && cmake --build build -j

CUDA

CUDA可以在NVIDIA GPU上加速模型推理。添加CMake标志 -DGGML_CUDA=ON 即可启用。

cmake -B build -DGGML_CUDA=ON && cmake --build build -j

默认情况下,所有内核都会针对所有可能的CUDA架构进行编译,这需要一些时间。若要在特定类型的设备上运行,可以指定 CMAKE_CUDA_ARCHITECTURES 来加快nvcc编译速度。例如:

cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="80"       # 用于A100
cmake -B build -DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES="70;75"    # 兼容V100和T4

要了解你的GPU设备的CUDA架构,可以查看NVIDIA GPU计算能力

Metal

MPS(Metal性能着色器)允许计算在强大的Apple Silicon GPU上运行。添加CMake标志 -DGGML_METAL=ON 即可启用。

cmake -B build -DGGML_METAL=ON && cmake --build build -j

Python绑定

Python绑定提供了与原始Hugging Face ChatGLM(2)-6B类似的高级chatstream_chat接口。

安装

推荐从PyPI安装:这将在你的平台上触发编译。

pip install -U chatglm-cpp

若要在NVIDIA GPU上启用CUDA:

CMAKE_ARGS="-DGGML_CUDA=ON" pip install -U chatglm-cpp

若要在Apple硅芯片设备上启用Metal:

CMAKE_ARGS="-DGGML_METAL=ON" pip install -U chatglm-cpp

你也可以从源码安装。为获得加速效果,需添加相应的CMAKE_ARGS

# 从GitHub上托管的最新源码安装
pip install git+https://github.com/li-plus/chatglm.cpp.git@main

# 或者在 Git 克隆仓库后,从本地源安装
pip install .

适用于 Linux / MacOS / Windows 的 CPU 后端预编译轮子已在 release 中发布。对于 CUDA / Metal 后端,请从源代码或源码分发包进行编译。

使用预先转换的 GGML 模型

以下是一个简单的示例,使用 chatglm_cpp.Pipeline 加载 GGML 模型并与之对话。首先进入 examples 文件夹(cd examples),然后启动 Python 交互式 shell:

>>> import chatglm_cpp
>>> 
>>> pipeline = chatglm_cpp.Pipeline("../models/chatglm-ggml.bin")
>>> pipeline.chat([chatglm_cpp.ChatMessage(role="user", content="你好")])
ChatMessage(role="assistant", content="你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。", tool_calls=[])

若需以流式方式对话,请运行以下 Python 示例:

python3 cli_demo.py -m ../models/chatglm-ggml.bin -i

在浏览器中启动 Web 演示以进行对话:

python3 web_demo.py -m ../models/chatglm-ggml.bin

web_demo

其他模型:

ChatGLM2-6B
python3 cli_demo.py -m ../models/chatglm2-ggml.bin -p 你好 --temp 0.8 --top_p 0.8  # CLI 演示
python3 web_demo.py -m ../models/chatglm2-ggml.bin --temp 0.8 --top_p 0.8  # Web 演示
ChatGLM3-6B

CLI 演示

聊天模式:

python3 cli_demo.py -m ../models/chatglm3-ggml.bin -p 你好 --temp 0.8 --top_p 0.8

函数调用:

python3 cli_demo.py -m ../models/chatglm3-ggml.bin --temp 0.8 --top_p 0.8 --sp system/function_call.txt -i

代码解释器:

python3 cli_demo.py -m ../models/chatglm3-ggml.bin --temp 0.8 --top_p 0.8 --sp system/code_interpreter.txt -i

Web 演示

安装 Python 依赖项及用于代码解释器的 IPython 内核。

pip install streamlit jupyter_client ipython ipykernel
ipython kernel install --name chatglm3-demo --user

启动 Web 演示:

streamlit run chatglm3_demo.py
函数调用 代码解释器
ChatGLM4-9B

聊天模式:

python3 cli_demo.py -m ../models/chatglm4-ggml.bin -p 你好 --temp 0.8 --top_p 0.8
ChatGLM4V-9B

聊天模式:

python3 cli_demo.py -m ../models/chatglm4v-ggml.bin --image 03-Confusing-Pictures.jpg -p "这张图片有什么不寻常之处" --temp 0
CodeGeeX2
# CLI 演示
python3 cli_demo.py -m ../models/codegeex2-ggml.bin --temp 0 --mode generate -p "\
# language: Python
# write a bubble sort function
"
# Web 演示
python3 web_demo.py -m ../models/codegeex2-ggml.bin --temp 0 --max_length 512 --mode generate --plain

在运行时转换 Hugging Face LLMs

有时提前转换并保存中间 GGML 模型可能不太方便。这里提供一种直接从原始 Hugging Face 模型加载、在一分钟内将其量化为 GGML 模型并开始服务的方法。您只需将 GGML 模型路径替换为 Hugging Face 模型名称或路径即可。

>>> import chatglm_cpp
>>> 
>>> pipeline = chatglm_cpp.Pipeline("THUDM/chatglm-6b", dtype="q4_0")
Loading checkpoint shards: 100%|██████████████████████████████████| 8/8 [00:10<00:00,  1.27s/it]
Processing model states: 100%|████████████████████████████████| 339/339 [00:23<00:00, 14.73it/s]
...
>>> pipeline.chat([chatglm_cpp.ChatMessage(role="user", content="你好")])
ChatMessage(role="assistant", content="你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。", tool_calls=[])

同样地,在任何示例脚本中将 GGML 模型路径替换为 Hugging Face 模型,即可正常工作。例如:

python3 cli_demo.py -m THUDM/chatglm-6b -p 你好 -i

API 服务器

我们支持多种类型的 API 服务器,以便与流行的前端集成。可通过以下命令安装额外依赖:

pip install 'chatglm-cpp[api]'

请记得添加相应的 CMAKE_ARGS 以启用加速。

LangChain API

启动 LangChain 的 API 服务器:

MODEL=./models/chatglm2-ggml.bin uvicorn chatglm_cpp.langchain_api:app --host 127.0.0.1 --port 8000

使用 curl 测试 API 端点:

curl http://127.0.0.1:8000 -H 'Content-Type: application/json' -d '{"prompt": "你好"}'

结合 LangChain 使用:

>>> from langchain.llms import ChatGLM
>>> 
>>> llm = ChatGLM(endpoint_url="http://127.0.0.1:8000")
>>> llm.predict("你好")
'你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。'

更多选项请参阅 examples/langchain_client.pyLangChain ChatGLM 集成

OpenAI API

启动兼容 OpenAI 聊天完成协议的 API 服务器:

MODEL=./models/chatglm3-ggml.bin uvicorn chatglm_cpp.openai_api:app --host 127.0.0.1 --port 8000

使用 curl 测试您的端点:

curl http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' \
    -d '{"messages": [{"role": "user", "content": "你好"}]}'

使用 OpenAI 客户端与您的模型对话:

>>> from openai import OpenAI
>>> 
>>> client = OpenAI(base_url="http://127.0.0.1:8000/v1")
>>> response = client.chat.completions.create(model="default-model", messages=[{"role": "user", "content": "你好"}])
>>> response.choices[0].message.content
'你好👋!我是人工智能助手 ChatGLM3-6B,很高兴见到你,欢迎问我任何问题。'

如需流式响应,请查看示例客户端脚本:

python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --stream --prompt 你好

工具调用也同样支持:

python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --tool_call --prompt 上海天气怎么样

请求 GLM4V 并附带图像输入:

# 使用本地图像文件请求
python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --prompt "描述这张图片" \
    --image https://oss.gittoolsai.com/images/li-plus_chatglm.cpp_readme_f52c51021b38.jpg --temp 0
# 使用图像 URL 请求
python3 examples/openai_client.py --base_url http://127.0.0.1:8000/v1 --prompt "描述这张图片" \
    --image https://www.barnorama.com/wp-content/uploads/2016/12/03-Confusing-Pictures.jpg --temp 0

借助此 API 服务器作为后端,ChatGLM.cpp 模型可以无缝集成到任何使用 OpenAI 风格 API 的前端中,包括 mckaywrigley/chatbot-uifuergaosi233/wechat-chatgptYidadaa/ChatGPT-Next-Web 等。

使用 Docker

选项 1:本地构建

在本地构建 Docker 镜像,并启动容器以在 CPU 上运行推理:

docker build . --network=host -t chatglm.cpp

# C++ 示例
docker run -it --rm -v $PWD/models:/chatglm.cpp/models chatglm.cpp ./build/bin/main -m models/chatglm-ggml.bin -p "你好"
# Python 示例
docker run -it --rm -v $PWD/models:/chatglm.cpp/models chatglm.cpp python3 examples/cli_demo.py -m models/chatglm-ggml.bin -p "你好"
# LangChain API 服务器
docker run -it --rm -v $PWD/models:/chatglm.cpp/models -p 8000:8000 -e MODEL=models/chatglm-ggml.bin chatglm.cpp \
    uvicorn chatglm_cpp.langchain_api:app --host 0.0.0.0 --port 8000
# OpenAI API 服务器
docker run -it --rm -v $PWD/models:/chatglm.cpp/models -p 8000:8000 -e MODEL=models/chatglm-ggml.bin chatglm.cpp \
    uvicorn chatglm_cpp.openai_api:app --host 0.0.0.0 --port 8000

若需支持 CUDA,请确保已安装 nvidia-docker。然后运行以下命令:

docker build . --network=host -t chatglm.cpp-cuda \
    --build-arg BASE_IMAGE=nvidia/cuda:12.2.0-devel-ubuntu20.04 \
    --build-arg CMAKE_ARGS="-DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=80"
docker run -it --rm --gpus all -v $PWD/models:/chatglm.cpp/models chatglm.cpp-cuda \
    ./build/bin/main -m models/chatglm-ggml.bin -p "你好"

选项 2:使用预构建镜像

用于 CPU 推理的预构建镜像已发布在 Docker HubGitHub Container Registry (GHCR) 上。

从 Docker Hub 拉取并运行示例:

docker run -it --rm -v $PWD/models:/chatglm.cpp/models liplusx/chatglm.cpp:main \
    ./build/bin/main -m models/chatglm-ggml.bin -p "你好"

从 GHCR 拉取并运行示例:

docker run -it --rm -v $PWD/models:/chatglm.cpp/models ghcr.io/li-plus/chatglm.cpp:main \
    ./build/bin/main -m models/chatglm-ggml.bin -p "你好"

预构建镜像也支持 Python 示例和 API 服务器,使用方法与 选项 1 相同。

性能

环境:

  • CPU 后端性能是在一台配备 Intel(R) Xeon(R) Platinum 8260 CPU @ 2.40GHz 的 Linux 服务器上,使用 16 个线程进行测量。
  • CUDA 后端性能是在一块 V100-SXM2-32GB GPU 上,使用 1 个线程进行测量。
  • MPS 后端性能是在 Apple M2 Ultra 设备上,使用 1 个线程进行测量。

ChatGLM-6B:

Q4_0 Q4_1 Q5_0 Q5_1 Q8_0 F16
ms/标记(CPU @ Platinum 8260) 74 77 86 89 114 189
ms/标记(CUDA @ V100 SXM2) 8.1 8.7 9.4 9.5 12.0 19.1
ms/标记(MPS @ M2 Ultra) 11.5 12.3 N/A N/A 16.1 24.4
文件大小 3.3G 3.7G 4.0G 4.4G 6.2G 12G
内存占用 4.0G 4.4G 4.7G 5.1G 6.9G 13G

ChatGLM2-6B / ChatGLM3-6B / CodeGeeX2:

Q4_0 Q4_1 Q5_0 Q5_1 Q8_0 F16
ms/标记(CPU @ Platinum 8260) 64 71 79 83 106 189
ms/标记(CUDA @ V100 SXM2) 7.9 8.3 9.2 9.2 11.7 18.5
ms/标记(MPS @ M2 Ultra) 10.0 10.8 N/A N/A 14.5 22.2
文件大小 3.3G 3.7G 4.0G 4.4G 6.2G 12G
内存占用 3.4G 3.8G 4.1G 4.5G 6.2G 12G

ChatGLM4-9B:

Q4_0 Q4_1 Q5_0 Q5_1 Q8_0 F16
ms/标记(CPU @ Platinum 8260) 105 105 122 134 158 279
ms/标记(CUDA @ V100 SXM2) 12.1 12.5 13.8 13.9 17.7 27.7
ms/标记(MPS @ M2 Ultra) 14.4 15.3 19.6 20.1 20.7 32.4
文件大小 5.0G 5.5G 6.1G 6.6G 9.4G 18G

模型质量

我们通过在 WikiText-2 测试数据集上评估困惑度来衡量模型质量,采用 https://huggingface.co/docs/transformers/perplexity 中的滑动窗口策略。较低的困惑度通常表示模型表现更好。

链接 下载并解压数据集。使用步长为 512、最大输入长度为 2048 的方式计算困惑度:

./build/bin/perplexity -m models/chatglm3-base-ggml.bin -f wikitext-2-raw/wiki.test.raw -s 512 -l 2048
Q4_0 Q4_1 Q5_0 Q5_1 Q8_0 F16
ChatGLM3-6B-Base 6.215 6.188 6.006 6.022 5.971 5.972
ChatGLM4-9B-Base 6.834 6.780 6.645 6.624 6.576 6.577

开发

单元测试与基准测试

要执行单元测试,需添加 CMake 标志 -DCHATGLM_ENABLE_TESTING=ON 以启用测试功能。重新编译并运行单元测试(包括基准测试):

mkdir -p build && cd build
cmake .. -DCHATGLM_ENABLE_TESTING=ON && make -j
./bin/chatglm_test

仅进行基准测试:

./bin/chatglm_test --gtest_filter='Benchmark.*'

代码格式化

要在 build 文件夹内格式化代码,运行 make lint。请确保已预先安装 clang-formatblackisort

性能分析

要检测性能瓶颈,可添加 CMake 标志 -DGGML_PERF=ON

cmake .. -DGGML_PERF=ON && make -j

这将在运行模型时打印每次图操作的耗时信息。

致谢

版本历史

v0.4.22024/07/31
v0.4.12024/07/25
v0.4.02024/06/21
v0.3.42024/06/14
v0.3.32024/06/13
v0.3.22024/04/24
v0.3.12024/01/20
v0.3.02023/11/22
v0.2.102023/10/30
v0.2.92023/10/22
v0.2.82023/10/10
v0.2.72023/09/28
v0.2.62023/08/31
v0.2.52023/08/22
v0.2.42023/08/11
v0.2.32023/08/07
v0.2.22023/07/30
v0.2.12023/07/22
v0.2.02023/07/08

常见问题

相似工具推荐

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

151.3k|★★☆☆☆|今天
开发框架Agent语言模型

LLMs-from-scratch

LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

90.1k|★★★☆☆|6天前
语言模型图像Agent

NextChat

NextChat 是一款轻量且极速的 AI 助手,旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性,以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发,NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。 这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言,它也提供了便捷的自托管方案,支持一键部署到 Vercel 或 Zeabur 等平台。 NextChat 的核心亮点在于其广泛的模型兼容性,原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型,让用户在一个界面即可自由切换不同 AI 能力。此外,它还率先支持 MCP(Model Context Protocol)协议,增强了上下文处理能力。针对企业用户,NextChat 提供专业版解决方案,具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能,满足公司对数据隐私和个性化管理的高标准要求。

87.6k|★★☆☆☆|1周前
开发框架语言模型

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85.1k|★★☆☆☆|2天前
图像数据工具视频

funNLP

funNLP 是一个专为中文自然语言处理(NLP)打造的超级资源库,被誉为"NLP 民工的乐园”。它并非单一的软件工具,而是一个汇集了海量开源项目、数据集、预训练模型和实用代码的综合性平台。 面对中文 NLP 领域资源分散、入门门槛高以及特定场景数据匮乏的痛点,funNLP 提供了“一站式”解决方案。这里不仅涵盖了分词、命名实体识别、情感分析、文本摘要等基础任务的标准工具,还独特地收录了丰富的垂直领域资源,如法律、医疗、金融行业的专用词库与数据集,甚至包含古诗词生成、歌词创作等趣味应用。其核心亮点在于极高的全面性与实用性,从基础的字典词典到前沿的 BERT、GPT-2 模型代码,再到高质量的标注数据和竞赛方案,应有尽有。 无论是刚刚踏入 NLP 领域的学生、需要快速验证想法的算法工程师,还是从事人工智能研究的学者,都能在这里找到急需的“武器弹药”。对于开发者而言,它能大幅减少寻找数据和复现模型的时间;对于研究者,它提供了丰富的基准测试资源和前沿技术参考。funNLP 以开放共享的精神,极大地降低了中文自然语言处理的开发与研究成本,是中文 AI 社区不可或缺的宝藏仓库。

79.9k|★☆☆☆☆|3天前
语言模型数据工具其他

gpt4all

GPT4All 是一款让普通电脑也能轻松运行大型语言模型(LLM)的开源工具。它的核心目标是打破算力壁垒,让用户无需依赖昂贵的显卡(GPU)或云端 API,即可在普通的笔记本电脑和台式机上私密、离线地部署和使用大模型。 对于担心数据隐私、希望完全掌控本地数据的企业用户、研究人员以及技术爱好者来说,GPT4All 提供了理想的解决方案。它解决了传统大模型必须联网调用或需要高端硬件才能运行的痛点,让日常设备也能成为强大的 AI 助手。无论是希望构建本地知识库的开发者,还是单纯想体验私有化 AI 聊天的普通用户,都能从中受益。 技术上,GPT4All 基于高效的 `llama.cpp` 后端,支持多种主流模型架构(包括最新的 DeepSeek R1 蒸馏模型),并采用 GGUF 格式优化推理速度。它不仅提供界面友好的桌面客户端,支持 Windows、macOS 和 Linux 等多平台一键安装,还为开发者提供了便捷的 Python 库,可轻松集成到 LangChain 等生态中。通过简单的下载和配置,用户即可立即开始探索本地大模型的无限可能。

77.3k|★☆☆☆☆|昨天
语言模型开发框架