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

gemma.cpp は、Gemma モデルの軽量な純粋な C++ 推論ランタイム実装です。

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

このプロジェクトの対象

最新の LLM 推論エンジンは洗練されたシステムであり、多くの場合、従来のニューラル ネットワーク ランタイムを超えるカスタム機能が備わっています。これにより、高レベルのアルゴリズムと低レベルのコンピューティングを共同設計することで、研究とイノベーションの機会が生まれます。ただし、テスト用に設計されていないデプロイ指向の C++ 推論ランタイムと、コンパイルによって低レベルの計算を抽象化する Python 中心の ML 研究フレームワークの間にはギャップがあります。

gemma.cpp は、Gemma 2B モデルと 7B モデルのミニマリスト実装を提供します。完全な汎用性よりもシンプルさと直接性に重点を置いています。これは、ggmlllama.cllama.rs などの垂直統合された C++ モデル実装に触発されています。

gemma.cpp は、テストと研究のユースケースを対象としています。特に、Google Highway ライブラリを介してポータブル SIMD を使用して、CPU 推論と推論アルゴリズムの設計空間を探索します。他のプロジェクトに簡単に埋め込むことができ、最小限の依存関係で、小さな 2,000 LoC のコア実装(および 4,000 LoC のサポート ユーティリティ)で簡単に変更できるように設計されています。

本番環境向けのエッジ デプロイでは、JAX、Keras、PyTorch、Transformers などの成熟した Python フレームワークを使用する標準のデプロイ パスウェイをおすすめします(すべてのモデルのバリエーションはこちら)。

大小さまざまなコミュニティの貢献を歓迎します。このプロジェクトは、Google のオープンソース コミュニティ ガイドラインに準拠しています。

クイックスタート

このクイックスタートを完了するには、gemma.cpp のクローンを作成するか、ダウンロードする必要があります。

システム要件

開始する前に、次のものをインストールしておく必要があります。

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

Kaggle の Gemma モデル ページにアクセスし、[Model Variations

Gemma C++ の [. On this tab, theVariation] プルダウンには、次のオプションがあります。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 推論ランタイムをビルドするには、ビルド ディレクトリを作成し、最上位のプロジェクト ディレクトリの 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 フラグによって制御されるさまざまな使用モードがあります。

すべての使用モードはインタラクティブで、改行入力時にテキスト生成がトリガーされます。

詳細度 使用モード 詳細
--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.