Gemma C++ 教程 (gemma.cpp)

gemma.cpp 是 Gemma 模型的轻量级纯 C++ 推断运行时实现。

如需详细了解 Gemma,请参阅模型卡片Kaggle 上提供了模型权重,包括特定于 gemma.cpp 的工件。

此项目的适用对象

现代 LLM 推理引擎是一个复杂的系统,通常具有超出传统神经网络运行时的定制功能。因此,通过协同设计高级别算法和低级别计算,有机会开展研究和创新。然而,面向部署的 C++ 推理运行时(并非为实验而设计)与以 Python 为中心的机器学习研究框架之间存在差距,后者通过编译来抽象化低级别计算。

gemma.cpp 提供 Gemma 2B 和 7B 模型的极简实现,其侧重于简单性和直接性,而不是全面的通用。这深受垂直集成的 C++ 模型实现(例如 ggmlllama.cllama.rs)的启发。

gemma.cpp 适合实验和研究用例,尤其是通过 Google Highway 库使用便携式 SIMD 来探索 CPU 推断和推断算法的设计空间。它能够直接嵌入到具有最少依赖项的其他项目中,还可以通过约 2K 的小型 LoC 核心实现(以及约 4K 个支持实用程序的 LoC)轻松修改。

对于面向生产的边缘部署,我们建议使用使用成熟的 Python 框架(如 JAX、Keras、PyTorch 和 Transformer)的标准部署路径(点击此处可查看所有模型变体)。

我们欢迎社区成员贡献各种规模的内容。此项目遵循 Google 的开源社区准则

快速入门

要完成本快速入门,您必须克隆或下载 gemma.cpp

系统要求

在开始之前,您应该先安装:

第 1 步:从 Kaggle 获取模型权重和标记生成器

访问 Kaggle 上的 gemma 模型页面,然后选择“Model variants”

“Gemma C++. On this tab, thevariant”下拉列表包含以下选项。请注意,bfloat16 权重选项的保真度更高,而 8 位开关浮点权重选项可以实现更快的推断。

2B 指令调优 (it) 模型和预训练 (pt) 模型:

模型名称 说明
2b-it 20 亿个参数指令调优模型 (bfloat16)
2b-it-sfp 20 亿个参数指令调优模型,8 位交换浮点数
2b-pt 20 亿个参数预训练模型,bfloat16
2b-pt-sfp 20 亿个参数预训练模型,8 位交换浮点数

70 亿个指令调优 (it) 模型和预训练 (pt) 模型:

模型名称 说明
7b-it 70 亿个参数指令调优模型 bfloat16
7b-it-sfp 70 亿个参数指令调优模型,8 位交换浮点数
7b-pt 70 亿个参数预训练模型,bfloat16
7b-pt-sfp 70 亿个参数预训练模型,8 位交换浮点数

注意:我们建议从 2b-it-sfp 开始启动并运行。

第 2 步:提取文件

填写用户意见征求表单后,下载应该会继续检索 tar 归档文件 archive.tar.gz。从 archive.tar.gz 解压文件(这可能需要几分钟时间):

tar -xf archive.tar.gz

这应该会生成一个包含模型权重的文件(例如 2b-it-sfp.sbs)和一个令牌生成器文件 (tokenizer.spm)。建议您将这些文件移至一个合适的目录位置(例如此代码库中的 build/ 目录)。

第 3 步:构建

构建系统使用 CMake。如需构建 gemma 推理运行时,请创建一个 build 目录,然后使用顶级项目目录中的 cmake 生成 build 文件:

(cd build && cmake ..)

然后,运行 make 以构建 ./gemma 可执行文件:

cd build make -j [number of parallel threads to use] gemma

例如,make -j 8 gemma。如果成功,build/ 目录中现在应包含 gemma 可执行文件。

第 4 步:运行

您现在可以从 build/ 目录内部运行 gemma

gemma 具有以下必需实参:

参数名 说明 示例值
--model 模型类型。 2b-it2b-pt7b-it7b-pt...(参见上文)
--compressed_weights 压缩的权重文件。 2b-it-sfp.sbs...(参见上文)
--tokenizer 分词器文件名。 tokenizer.spm

按以下方式调用 gemma

./gemma \
--tokenizer [tokenizer file] \
--compressed_weights [compressed weights file] \
--model [2b-it or 2b-pt or 7b-it or 7b-pt]

调用以下配置的示例:

  • 压缩的权重文件 2b-it-sfp.sbs(2B 指令调优模型,8 位交换浮点数)。
  • 分词器文件 tokenizer.spm
./gemma \
--tokenizer tokenizer.spm \
--compressed_weights 2b-it-sfp.sbs \
--model 2b-it

用法

gemma 具有不同的使用模式,由详细程度标志控制。

所有使用模式都是交互式的,在输入换行符时触发文本生成。

详细程度 使用模式 具体说明
--verbosity 0 最低 仅输出生成的输出。适合用作 CLI 工具。
--verbosity 1 默认 面向用户的标准终端界面。
--verbosity 2 明细 显示更多开发者和调试信息。

交互式终端应用

默认情况下,详细程度设置为 1,在使用必需的参数调用 gemma 时,将调出基于终端的交互式界面:

$ ./gemma [...]
  __ _  ___ _ __ ___  _ __ ___   __ _   ___ _ __  _ __
 / _` |/ _ \ '_ ` _ \| '_ ` _ \ / _` | / __| '_ \| '_ \
| (_| |  __/ | | | | | | | | | | (_| || (__| |_) | |_) |
 \__, |\___|_| |_| |_|_| |_| |_|\__,_(_)___| .__/| .__/
  __/ |                                    | |   | |
 |___/                                     |_|   |_|

tokenizer                     : tokenizer.spm
compressed_weights            : 2b-it-sfp.sbs
model                         : 2b-it
weights                       : [no path specified]
max_tokens                    : 3072
max_generated_tokens          : 2048

*Usage*
  Enter an instruction and press enter (%Q quits).

*Examples*

-   Write an email to grandma thanking her for the cookies.
-   What are some historical attractions to visit around Massachusetts?
-   Compute the nth fibonacci number in javascript.
-   Write a standup comedy bit about WebGPU programming.

> What are some outdoorsy places to visit around Boston?

[ Reading prompt ] .....................

**Boston Harbor and Islands:**

*   **Boston Harbor Islands National and State Park:** Explore pristine beaches, wildlife, and maritime history.
*   **Charles River Esplanade:** Enjoy scenic views of the harbor and city skyline.
*   **Boston Harbor Cruise Company:** Take a relaxing harbor cruise and admire the city from a different perspective.
*   **Seaport Village:** Visit a charming waterfront area with shops, restaurants, and a seaport museum.

**Forest and Nature:**

*   **Forest Park:** Hike through a scenic forest with diverse wildlife.
*   **Quabbin Reservoir:** Enjoy boating, fishing, and hiking in a scenic setting.
*   **Mount Forest:** Explore a mountain with breathtaking views of the city and surrounding landscape.

...

用作命令行工具

如需将 gemma 可执行文件用作命令行工具,使用完全指定的参数为 gemma.cpp 创建别名可能会很有用:

alias gemma2b="~/gemma.cpp/build/gemma -- --tokenizer ~/gemma.cpp/build/tokenizer.spm --compressed_weights ~/gemma.cpp/build/2b-it-sfp.sbs --model 2b-it --verbosity 0"

将上述路径替换为下载中您自己的模型路径和标记生成器路径。

以下示例展示了如何使用截断的输入(使用上文定义的 gemma2b 别名)提示 gemma

cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b

注意:在 CLI 中使用 gemma.cpp 尚处于实验阶段,应该考虑上下文长度限制。

上述命令的输出应如下所示:

$ cat configs.h | tail -35 | tr '\n' ' ' | xargs -0 echo "What does this C++ code do: " | gemma2b
[ Reading prompt ] ......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
The code defines two C++ structs, `ConfigGemma7B` and `ConfigGemma2B`, which are used for configuring a deep learning model.

**ConfigGemma7B**:

*   `seq_len`: Stores the length of the sequence to be processed. It's set to 7168.
*   `vocab_size`: Stores the size of the vocabulary, which is 256128.
*   `n_layers`: Number of layers in the deep learning model. It's set to 28.
*   `dim_model`: Dimension of the model's internal representation. It's set to 3072.
*   `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 3072 / 2.

**ConfigGemma2B**:

*   `seq_len`: Stores the length of the sequence to be processed. It's also set to 7168.
*   `vocab_size`: Size of the vocabulary, which is 256128.
*   `n_layers`: Number of layers in the deep learning model. It's set to 18.
*   `dim_model`: Dimension of the model's internal representation. It's set to 2048.
*   `dim_ffw_hidden`: Dimension of the feedforward and recurrent layers' hidden representations. It's set to 16 * 2048 / 2.

These structs are used to configure a deep learning model with specific parameters for either Gemma7B or Gemma2B architecture.