Gemma C++ チュートリアル(gemma.cpp)

gemma.cpp: 軽量のピュア C++ Gemma モデルの推論ランタイム実装。

Gemma の詳細については、モデルカードをご覧ください。 gemma.cpp 固有のアーティファクトを含むモデルの重みは、 Kaggle をご覧ください。

このプロジェクトの対象者

最新の LLM 推論エンジンは洗練されたシステムであり、多くの場合はカスタムメイド 従来のニューラル ネットワーク ランタイムを超える機能も備えています。こちらの 研究とイノベーションの機会をもたらす 低レベルの計算です。しかし、この分野には デプロイ指向の C++ 推論ランタイムを使用できます。このランタイムは という、Python を中心とした ML 研究フレームワークという、 低レベルの計算を実行できます。

gemma.cpp は、Gemma 2B および 7B モデルの最小限の実装を提供します。 完全な一般性ではなくシンプルさと率直さを重視します。これは、 次のような垂直統合された C++ モデルの実装にヒントを得ています。 ggml, llama.cllama.rs

gemma.cpp は、実験や研究のユースケース、特に CPU 推論および推論アルゴリズムの設計空間について Google Highway 経由のポータブル SIMD ライブラリです。他のプロジェクトに簡単に埋め込むことができることを意図しており、 依存関係が最小限で、2,000 以下の小規模な LoC コアで簡単に変更可能 (およびサポート ユーティリティの約 4,000 の LoC とともに)。

本番環境指向のエッジデプロイには、標準デプロイをおすすめします。 JAX、Keras、PyTorch、 Transformer(すべてのモデル バリエーション こちらをご覧ください)。

コミュニティへの貢献は、規模にかかわらず大歓迎です。このプロジェクトは、 Google のオープンソース コミュニティ ガイドライン

クイックスタート

このクイックスタートを完了するには、このアプリケーションのクローンを作成するか、 gemma.cpp.

システム要件

始める前に、以下がインストールされている必要があります。

ステップ 1: Kaggle からモデルの重みとトークナイザを取得する

Gema モデルのページを Kaggle に移動して、[Model Variations] を選択します。

[Gemma C++. On this tab, theバリエーション] プルダウンには以下が含まれます 下で説明しますbfloat16 の重みオプションは忠実度が高く、8 ビットは 浮動小数点数の重みにより、推論を高速化できます。

2B の指示用調整モデル(it)と事前トレーニング済みモデル(pt):

モデル名 説明
2b-it 20 億パラメータの指示用にチューニングされたモデル、bfloat16
2b-it-sfp 20 億パラメータの命令チューニング済みモデル、8 ビット切り替え浮動小数点
2b-pt 20 億パラメータの事前トレーニング済みモデル、bfloat16
2b-pt-sfp 20 億パラメータの事前トレーニング済みモデル、8 ビット切り替え浮動小数点

7B の指示用調整モデル(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.gzarchive.tar.gz からファイルを抽出( 数分程度かかる場合があります)。

tar -xf archive.tar.gz

これにより、2b-it-sfp.sbs や トークナイザ ファイル(tokenizer.spm)。これらのファイルは、 ディレクトリに配置します(たとえば、このリポジトリの build/ ディレクトリ)。

ステップ 3: ビルド

ビルドシステムは CMake を使用します。gema 推論を構築するには、 ランタイム、cmake を使用してビルド ディレクトリを作成し、ビルドファイルを生成します 最上位レベルのプロジェクト ディレクトリから削除します。

(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 デフォルト 標準のユーザー向けターミナル UI。
--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"

上記のパスを、モデルとトークナイザのパスへの独自のパスに置き換えます。 表示されます。

これは、入力を省略して gemma と表示する例です( 上で定義した gemma2b エイリアス):

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

: gemma.cpp の CLI の使用は試験運用版であり、コンテキストの長さが必要です 考慮する必要があります。

上記のコマンドの出力は、次のようになります。

$ 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.