このプロジェクトは、GPT-2 をクリーンかつ簡潔に再実装することを目的としています。 src/model.rs
に含まれるモデル実装のコードは 300 行未満です。これは主に (私自身の) 教育目的のための楽しい演習でしたが、機械学習ドメインにおける Rust と Burn の有用性を示しています。プロジェクト全体が 1 つのバイナリにコンパイルされるため、デプロイが比較的簡単です。
現時点では、文字レベルのトークナイザーのみがサポートされているため、BPE トークナイザーを必要とする公式の重みはまだ使用できません。ただし、お楽しみとして、私がトレーニングした小さなおもちゃのモデルを試してみることもできます (推論を参照)。
このプロジェクトには、トレーニングと推論のためのシンプルな CLI も含まれています。
Usage: gpt-burn <COMMAND>
Commands:
run Generate text using a pre-trained model
train Train a new model
Nix を使用してgpt-burn
インストールできます。
nix run github:felix-andreas/gpt-burn
または、 cargo
でインストールします。
cargo install --git https://github.com/felix-andreas/gpt-burn
あるいは、リポジトリのクローンを作成し、ソースからビルドします。
nix develop # optional
cargo run --release
Nix を使用せず、Ubuntu ベースのディストリビューションを使用している場合は、次の追加の依存関係をインストールする必要があります。
apt install pkg-config libssl-dev libvulkan1 mesa-vulkan-drivers vulkan-tools
次のパラメーターを使用して、ドイツ語の Wikipedia コーパスの文字レベルのトークナイザーを使用しておもちゃのモデルを 20,000 バッチ (バッチ サイズ 128) トレーニングしました。
パラメータ | 価値 |
---|---|
パラメータ | 83M |
コンテキストの長さ | 128 |
n_layers | 12 |
n_heads | 12 |
d_model | 768 |
ここからダウンロードして、後で解凍できます。または、1 つのコマンドで両方を実行します。
curl -s ' https://drive.usercontent.google.com/download?id=1GGLaPnmPQ8Z2B9vJQoI6-K128X9LJKG0&export=download&confirm=t ' | tar xzf -
次に、モデルを実行します。
gpt-burn run ./model_83M
次のような内容が表示されるはずです。
So wurden bis 1977 679 nachhaltige Wörgler Torbauten vorgeworfen, die Einwohnerzahl Sirkes bestand 2015 bis 1998.
Sie war trotz weniger als 10.000 ausgedehnter Größen wahrscheinlich auf folgende Breitenauflagen mit 932 km.
2016 wurden rund 145 Händen nach Deutschland geladen.
その他のコマンド ライン オプションは次のとおりです。
Usage: gpt-burn run [OPTIONS] <MODEL_PATH>
Arguments:
<MODEL_PATH>
Options:
-p, --prompt <PROMPT>
-n, --n-new-tokens <N_NEW_TOKENS> [default: 1000]
-s, --seed <SEED> [default: 0]
独自のモデルをトレーニングするには、次を実行します。
gpt-burn train --context-length 128 --n-layers 12 --n-heads 12 --d-model 768 --batch-size 128 --learning-rate 0.0003 --seed 0 --text-corpus ./corpus.txt
重要
corpus.txt
が utf-8 でエンコードされたテキスト ファイルであることを確認してください。
ほとんどのハイパーパラメータはコマンドライン オプションとして渡すことができます。
Usage: gpt-burn train [OPTIONS]
Options:
-o, --output-path <PATH>
-c, --context-length <CONTEXT_LENGTH> [default: 64]
-d, --d-model <D_MODEL> [default: 64]
-l, --n-layers <N_LAYERS> [default: 2]
-h, --n-heads <N_HEADS> [default: 2]
-n, --n-steps <N_STEPS> [default: 50]
-b, --batch-size <BATCH_SIZE> [default: 32]
-r, --learning-rate <LEARNING_RATE> [default: 0.003]
-s, --seed <SEED> [default: 0]
-t, --text-corpus <TEXT_CORPUS> [default: .data/corpus.txt]
-m, --n-mega-bytes <N_MEGA_BYTES> Only use first <n> megabytes of dataset for training
-x, --no-save Don't save trained model (useful for debugging)
このモデルは、 Tokenizer
特性を介してさまざまなトークナイザーで使用できます。以下に、次の文がどのように行われるかを示します
Albert Einstein war ein schweizerisch-US-amerikanischer theoretischer Physiker deutscher Herkunft.
さまざまなトークナイザーによってエンコードされます。
CharTokenizer
すべての文字を個別のトークンに分割します。
Tokens: ["A", "l", "b", "e", "r", "t", " ", "E", "i", "n", "s", "t", "e", "i", "n", " ", "w", "a", "r", " ", "e", "i", "n", " ", "s", "c", "h", "w", "e", "i", "z", "e", "r", "i", "s", "c", "h", "-", "U", "S", "-", "a", "m", "e", "r", "i", "k", "a", "n", "i", "s", "c", "h", "e", "r", " ", "t", "h", "e", "o", "r", "e", "t", "i", "s", "c", "h", "e", "r", " ", "P", "h", "y", "s", "i", "k", "e", "r", " ", "d", "e", "u", "t", "s", "c", "h", "e", "r", " ", "H", "e", "r", "k", "u", "n", "f", "t", "."]
Values: [28, 13, 3, 6, 19, 21, 1, 32, 10, 15, 20, 21, 6, 10, 15, 1, 24, 2, 19, 1, 6, 10, 15, 1, 20, 4, 9, 24, 6, 10, 27, 6, 19, 10, 20, 4, 9, 66, 48, 46, 66, 2, 14, 6, 19, 10, 12, 2, 15, 10, 20, 4, 9, 6, 19, 1, 21, 9, 6, 16, 19, 6, 21, 10, 20, 4, 9, 6, 19, 1, 43, 9, 26, 20, 10, 12, 6, 19, 1, 5, 6, 22, 21, 20, 4, 9, 6, 19, 1, 35, 6, 19, 12, 22, 15, 7, 21, 67]
SimpleVowelTokenizer
は、チャンクが 3 文字より長い場合、次の母音の前で単語を分割し、音節に似た結果を作成します。
Tokens: ["Albert", " ", "Einst", "ein", " ", "war", " ", "ein", " ", "schw", "eizer", "isch", "-", "US", "-", "amer", "ikan", "isch", "er", " ", "theor", "etisch", "er", " ", "Phys", "iker", " ", "deutsch", "er", " ", "Herk", "unft"]
Values: [2, 0, 3, 9, 0, 19, 0, 9, 0, 16, 10, 15, 1, 6, 1, 7, 13, 15, 11, 0, 17, 12, 11, 0, 5, 14, 0, 8, 11, 0, 4, 18]