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 行程度の小さなコア実装(および 4,000 場所以上のサポート ユーティリティ)で容易に変更できることを目的としています。

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

規模の大小を問わず、コミュニティへの翻訳依頼を歓迎します。このプロジェクトは、Google のオープンソース コミュニティ ガイドラインに準拠しています。

クイックスタート

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

システム要件

始める前に、以下をインストールしておく必要があります。

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

Kaggle の gemma モデルページにアクセスして、[Model Variations] を選択します。

[Gemma C++. On this tab, theVariation] プルダウンには、以下のオプションがあります。bfloat16 の重みオプションは忠実度が高く、8 ビット切り替え浮動小数点の重みは高速な推論を可能にします。

20 億の命令調整済みモデル(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.成功すると、gemma 実行可能ファイルが build/ ディレクトリに作成されます。

ステップ 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

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