llama2.c - 垂直ドメイン向けの LLM トレーニング/推論フルスタック ツール

llama2.c は最小限の Llama 2 LLM フルスタック ツールで、市場セグメントの垂直向けの大規模な言語モデルを作成するのに非常に適しています。

ここに画像の説明を挿入

推奨事項: NSDT Designerを使用して、プログラム可能な 3D シーンを迅速に構築します。

1 はじめに

このリポジトリのコードを使用すると、PyTorch で Llama 2 LLM アーキテクチャを最初からトレーニングし、重みをバイナリ ファイルにエクスポートし、それを約 500 行の C ファイル (run.c) にロードしてモデルを推論できます。あるいは、Meta の Llama 2 をロードし、微調整し、推論することもできます (ただし、これはまだ具体化中です)。

そのため、このリポジトリは、ミニマリズムとシンプルさに重点を置いた、Llama 2 LLM の「フルスタック」トレーニング + 推論ソリューションです。何か役に立つことをするには、何十億ものパラメータを持つ LLM が必要だと思うかもしれませんが、実際には、ドメインを十分に狭くすれば、非常に小さな LLM でも驚くほど強力になる可能性があります。インスピレーションを得るため、TinyStories の論文をチェックすることをお勧めします。

これは私が最近始めた単なる楽しい週末プロジェクトであることに注意してください。私は以前の nanoGPT を使用して、GPT-2 の代わりに Llama-2 アーキテクチャを実装するように調整しました。その中核となるのは run.c で C 推論エンジンを作成することです。したがって、このプロジェクトはまだ始まったばかりで、急速に進んでいます。このプロジェクトにインスピレーションを与えた素晴らしい llama.cpp に脱帽します。私は非常にシンプルなものが欲しかったので、Llama 2 アーキテクチャをハードコーディングし、fp32 を使用し、依存関係のない純粋な C 推論ファイルを引き出すことにしました。

2. 魔法を感じてください

小さな Llama 2 モデルを C で実行してみましょう。モデルのチェックポイントが必要です。TinyStories データセットでトレーニングしたこの 15M パラメーター モデル (ダウンロード最大 58MB) をダウンロードし、デフォルトのチェックポイント ディレクトリに置きます。

wget https://karpathy.ai/llama2c/model.bin -P out

(うまくいかない場合は、Google ドライブを試してください)。C コードをコンパイルして実行します。

gcc -O3 -o run run.c -lm
./run out/model.bin

テキストフローの例が表示されます。私の M1 MacBook Air では、約 110 トークン/秒で動作します。処理を大幅に高速化できるコンパイル フラグについては、「パフォーマンス」または「Makefile」を参照してください。

出力例:

Once upon a time, there was a boy named Timmy. Timmy loved to play sports with his friends. He was very good at throwing and catching balls. One day, Timmy's mom gave him a new shirt to wear to a party. Timmy thought it was impressive and asked his mom to explain what a shirt could be for. "A shirt is like a special suit for a basketball game," his mom said. Timmy was happy to hear that and put on his new shirt. He felt like a soldier going to the army and shouting. From that day on, Timmy wore his new shirt every time he played sports with his friends at the party. Once upon a time, there was a little girl named Lily. She loved to play outside with her friends. One day, Lily and her friend Emma were playing with a ball. Emma threw the ball too hard and it hit Lily's face. Lily felt embarrassed and didn't want to play anymore. Emma asked Lily what was wrong, and Lily told her about her memory. Emma told Lily that she was embarrassed because she had thrown the ball too hard. Lily felt bad achieved tok/s: 129.146172

更新: より大きなチェックポイントをアップロードしました。これは、512 次元、8 つのレイヤー、8 つのヘッダー、1024 のコンテキスト長、および最大 44M のパラメーターを持つ Transformer です。4XA100 40GB GPU で約 8 時間、バッチ サイズ 32 で 200K の反復をトレーニングしました。

このより大きく強力なチェックポイントを次のように使用できます。

wget https://karpathy.ai/llama2c/model44m.bin -P out44m
./run out44m/model44m.bin

これは依然としてインタラクティブな速度で実行され、より一貫性のある多様なストーリーをサンプリングします。

Once upon a time, there was a little girl named Lily. She loved playing with her toys on top of her bed. One day, she decided to have a tea party with her stuffed animals. She poured some tea into a tiny teapot and put it on top of the teapot. Suddenly, her little brother Max came into the room and wanted to join the tea party too. Lily didn't want to share her tea and she told Max to go away. Max started to cry and Lily felt bad. She decided to yield her tea party to Max and they both shared the teapot. But then, something unexpected happened. The teapot started to shake and wiggle. Lily and Max were scared and didn't know what to do. Suddenly, the teapot started to fly towards the ceiling and landed on the top of the bed. Lily and Max were amazed and they hugged each other. They realized that sharing was much more fun than being selfish. From that day on, they always shared their tea parties and toys.

更新 2: 110M パラメータ モデルも利用できるようになりました。「モデル」を参照してください。

3.メタのラマ2モデル

ニューラルネットワークのアーキテクチャは同じなので、Meta が公開している Llama 2 モデルを推論に使用することもできます。悲しいことに、ライセンスの問題により、ここで多少の摩擦が生じています (チェックポイントを直接アップロードできないと思います)。したがって、ステップ 1、Meta の指示に従って Llama 2 チェックポイントを取得します。これらのチェックポイントを取得したら、それらを llama2.c 形式に変換する必要があります。

このために、たとえば 7B モデルの場合は、export_meta_llama_bin.py ファイルを使用します。

python export_meta_llama_bin.py path/to/llama/model/7B llama2_7b.bin

エクスポートには約 10 分ほどかかり、現在のディレクトリに llama2_7b.bin (float32 の 7B モデルの重み) という名前の 26GB ファイルが生成されます。努力にもかかわらず、13B エクスポートは現在不明な理由で機能していないと報告されています (PR は修正を受け入れました)。モデルを通常どおり実行できます。

./run llama2_7b.bin

クラウド上の私の CPU Linux マシンでは、OpenMP を使用して 96 スレッドでコンパイルされ、約 4 トークン/秒で実行されます。(私の MacBook Air M1 では、make runfast だけでビルドすると、トークンあたりの時間は現在 30 秒近くになります。) 出力例:

The purpose of this document is to highlight the state-of-the-art of CoO generation technologies, both recent developments and those in commercial use. The focus is on the technologies with the highest merit to become the dominating processes of the future and therefore to be technologies of interest to S&T ... R&D. As such, CoO generation technologies developed in Russia, Japan and Europe are described in some depth. The document starts with an introduction to cobalt oxides as complex products and a short view on cobalt as an essential material. The document continues with the discussion of the available CoO generation processes with respect to energy and capital consumption as well as to environmental damage.

ベースモデル... ^(ツ)/^。基礎となるモデルを推論できるため、チャット モデルを推論して会話することも簡単になるはずです。7B をより効率的に実行する方法を見つけることができれば、リポジトリ内ですべての微調整を行って、トレーニング スクリプトに LoRA を追加し始めることができます。

4.モデル

より小規模な最初からのモデルの例を取得するために、TinyStories で複数のモデルをトレーニングし、次のように分類しました。これらはすべて、私の環境 (4 つの A100 40GB GPU) で数時間トレーニングされました。110Mは約24時間かかりました。

モデル 寸法 レイヤー 頭数 コンテキストの最大長 パラメータ 検証損失 ダウンロード
288 6 6 256 15M モデル.bin
44M 512 8 8 1024 44M モデル44m.bin
110M 768 12 12 1024 110M 0.7601 モデル110m.bin

110M モデルは GPT-1 とほぼ同じサイズであることがわかります。あるいは、これは GPT-2 ファミリの最小モデルでもあります (GPT-2 は小さい)。ただし、コンテキストの最大長が 2048 ではなく 1024 のみである点が異なります。GPT-1/2 アーキテクチャと比較した唯一の注目すべき変更は、Llama が絶対/学習位置埋め込みの代わりに RoPE 相対位置埋め込みを使用すること、MLP でのよりエキゾチックな SwiGLU 非線形性、LayerNorm の代わりに RMSNorm、すべての線形層のバイアス =False、複数のクエリを選択できます (ただし、llama2.c ではまだサポートされていません)。

5. トレーニング

このリポジトリのコードを使用して、小さな Llama 2 を最初からトレーニングする方法を見てみましょう。まず、いくつかのソース データセットをダウンロードして事前にラベル付けしましょう。たとえば、私は TinyStories が好きなので、これがこのリポジトリで現在利用可能な唯一の例です。ただし、データセットの追加は簡単です。コードを参照してください。

python tinystories.py download
python tinystories.py pretokenize

次に、モデルをトレーニングします。

python train.py

6. 短いトレーニングガイド

より高度な起動とハイパーパラメータのオーバーライドについては、train.py スクリプトを参照してください。以下に、パラメータの設定方法に関する簡単なガイドを示します。

Transformer パラメータ (dim、n_layers、n_heads) がどのように一緒に拡大または縮小するかを確認するには、Chinchilla ペーパーの最後にある表を参照してください。より大きなトランスまたはより小さなトランスに対して、このパターンを外挿/内挿します。

問題に応じて、最大コンテキスト長を設定します。これは、次のトークンを予測するためのトークンの最大数でなければなりません。例えば。Llama 2 は 2048 を使用します。

次に、中規模のアプリケーションの場合、更新ごとの合計バッチ サイズ (スクリプトによって「反復ごとのトークン数:」として出力される) を約 100K トークンにする必要があります。小規模なアプリケーションの場合はこれより低い場合がありますが、大規模なトレーニング (GPT/LLamas など) の場合は通常約 0.5M、またはそれ以上になります。

まず、batch_size をシステムで許可されている最大値に設定します (たとえば、後で GPU メモリを使い果たしたため、最近の実行では 16 でした)。次に、合計約 100K バッチに達するまで gradient_accumulation_steps を必要なだけ増やしてください。サイズ。最後に、学習率 (LR) を調整します。

学習率はトレーニングが許す限り高くなります。非常に小規模なネットワークでは、大きな LR (例: 1e-3 またはそれ以上) を使用できます。大規模なネットワークでは、より低い LR が必要になります。ほとんどの中規模アプリケーションでは 3e-4 が安全な選択ですが、小規模ネットワークでは低すぎる可能性があるため、値を大きくしてみてください。

最後に、max_iters はトレーニングの長さです。別の設定を使用してください。基本的にこれらのパラメーターのみを調整し、他のパラメーターのほとんどは変更しないままにしました。

これは、110M モデルをトレーニングした方法の例です。これは最適とは程遠いですが、私にとっては合理的であるように見えます: dim 768、n_layers 12、n_heads 12 (つまり、各ヘッドのサイズは 768 / 12 = 64 チャネルです)、seq len of 1024、バッチ サイズ 16 (A100 40GB GPU に最適)、gradient_accumulation_steps = 8 では、合計トークン バッチ サイズを 16 バッチ サイズ * 1024 シーケンス トークン * 8 grad_accum = 131,072 個のトークンが更新されるたびに作成する必要があります。OK 学習率 4e-4 (おそらく少し低すぎる)。max_iters 200K (おそらく少し高すぎる)。Dropout 0.1。通常、これは中型サイズに役立ちます。それでおしまい。クラウド コンピューター上の 4 つの GPU で分散データ並列処理 (DDP) を使用して実行していますが、トレーニングには約 1 日ほどかかります。

モデルのトレーニングをスキップしたい場合は十分に理解してください。単純なデモの場合は、事前トレーニングされたモデルをダウンロードしてディレクトリに保存するだけです。

wget https://karpathy.ai/llama2c/model.bin -P out

model.bin ファイルを取得したら、C で推論を実行できます。まず C コードをコンパイルします。

gcc -O3 -o run run.c -lm

これで、簡単に実行できるようになりました。

./run out/model.bin

トークンの流れを見るのは面白いですね!比較のために PyTorch 推論スクリプトを実行することもできます (まだ実行していない場合は、model.ckpt を /out に追加します)。

python sample.py

これでも同じ結果が得られます。より詳細なテストは test_all.py で行われ、次のように実行されます。

$ pytest

現在、テストまたはサンプリングには 2 つのファイルが必要です。1 つは、以前に実行した PyTorch トレーニングの model.bin ファイルと、model.ckpt ファイルです。200MB のデータをダウンロードせずにテストを実行することを考えなければなりません。

7. パフォーマンス

注: 私は個人的に Python の世界に多くの時間を費やしており、C コンパイルの多くの機能やフラグについて特に深く理解していないため、このガイドはあまり優れたものではありません。

システムに応じて、このコードを高速化するさまざまな方法があります。ここでは、それらのいくつかを文書化するとともに、その使用方法に関する高レベルのガイドを示します。これもデフォルトのコンパイル方法ですが、-O3 を使用します。

gcc -O3 -o run run.c -lm

-O3 には、コンパイル時間とメモリ使用量の点でコストのかかる最適化が含まれています。ベクトル化、ループ展開、予測分岐が含まれます。さらにいくつか試してみましょう。

-Ofast -O3 に加えて、C/IEEE 仕様に違反する可能性のある他の最適化を実行します。詳細については、GCC のドキュメントを参照してください。

-march=native より汎用的な CPU ではなく、コンパイルされるマシンのアーキテクチャを使用するようにプログラムをコンパイルします。これにより、追加の最適化や、ベクトル命令/幅の改善などのハードウェア固有の調整が可能になります。

私がこれまでに確認した中で、MacBook Air (M1) で最速のスループットは次のとおりです。

gcc -Ofast -o run run.c -lm

gcc を Clang に置き換えることもできます。

OpenMP #pragma omp 並列処理内の matmul とアテンションを「アクティブ化」する OpenMP コンパイルを使用することによっても、大幅な改善を達成できます。たとえば次のようにコンパイルできます。

clang -Ofast -fopenmp -march=native run.c  -lm  -o run

Clang/gcc を交換してみることもできますし、-march=native を省略してみることもできます。ただし、推論を実行するときは、次のように OpenMP フラグを使用してスレッド数を設定するようにしてください。

OMP_NUM_THREADS=4 ./run out/model.bin

システム リソースによっては、これらのハイパーパラメータを調整する必要がある場合があります。


原文へのリンク:垂直フィールドでの DIY LLM 大型モデル — BimAnt

おすすめ

転載: blog.csdn.net/shebao3333/article/details/131997826