このレポの目標は、生産アプリケーションに使用できるGPTモデルの簡単な実装を提供することです。現在、コードは次のユースケースをサポートしています。
このレポをフォークして、独自のGPTアプリケーションを開発するためのテンプレートとして使用してください。
最終的には、RLベースのCHATGPTの微調整を含めたいと思います。一般に、これは根本的な知識モデルを変更しませんが、モデルとの相互作用をより人間のようにします。
コードのセットアップはかなり最小限であり、ローカルまたはクラウドVM環境で簡単に再現できます。*
conda create -n python38 python=3.8
conda activate python38
conda install --file requirements.txt
*将来、このセットアップのDockerバージョンを提供しようとします。
トレーニングと微調整のために、小さなシェークスピアデータセットをダウンロードおよび前処理するサンプルコードを提供します。このコードをテンプレートとして使用して、独自のデータに合わせてデータを処理するデータを作成します。
python src/data_io/fetch_shakespeare.py
前のステップで作成された小さなシェークスピアデータセットで、非常に小さなGPTモデルをゼロからトレーニングします。結果のモデルは、かなり小さく、非常に小さなデータセットでトレーニングされているため、あまり一般化できませんが、シェークスピアのような引用を生成できます。
構成ファイルを変更し、モデルを独自のデータでゼロからトレーニングします。この時点で、データのサイズとリソースに応じて、技術的に非常に大きなモデルサイズにスケーリングできます。*
python src/training/train_main.py --config_file config/train_shakespeare_small.yml
*このステップでは、おそらく1つまたは複数のGPUが必要になります。
独自のデータでオープンソースGPT2モデルを微調整します。オープンソースのGPT様モデル(GPT2-MEDIUM、GPT2-XLなど)を使用することができます。これは、より少ないデータとリソースが必要であるため、より一般的なオプションです(CPUでもこれを実行することは可能です)。ゼロからトレーニングよりもはるかに高速です。
python src/training/train_main.py --config_file config/finetune_shakespeare.yml
入力プロンプトが与えられたトレーニングモデルからの多くの出力をサンプリングします。これは、バッチ推論に使用できます。
python src/inference/sample_main.py --config_file config/sample_shakespeare.yml
REST APIで訓練されたモデルを提供する軽量サーバー。
uvicorn src.inference.service_main:app --reload --reload-include config/sample_gpt2.yml
サーバーが実行されたら、プロンプト(POSTリクエストとして)でエンドポイントをクエリすることができます。クエリの詳細の詳細については、次のテストスクリプトをご覧ください。
サーバーが実行されたら、次のスクリプトを使用してエンドポイントをテストできます。
python src/inference/test_query.py
このレポは、生産アプリケーションを念頭に置いて展開されており、ユニットと統合テストが含まれています。
*テシングは広範囲にわたるATMではありませんが、将来的にはカバレッジを増やすようにします。
主要な機能をカバーするために、単体テストが含まれています。次のコマンドで完全なユニットテストスイートを実行できます。
pytest test/unit/
ユニットテストに加えて、トレーニング、微調整、サンプリングワークフローのための統合テストがいくつか含まれています。
pytest test/integration/
*統合テストでは現在、データが機能する必要があります(上記を参照)。
一般に、リポジトリを使用するときに、コミット前のフックを有効にすることをお勧めします。現在、いくつかの基本的なフォーマットチェックを実行し、ユニットテストスイートを実行します(ただし、統合テストではありません)。
conda install -c conda-forge pre-commit
pre-commit install
このリポジトリのGPT実装は、Andrej KarpathyのNanogpt Repoに触発されています。私たちの目標は、再実装、再構築、およびモジュールを使用してそれを拡張し、その上にさまざまな種類の生産アプリケーションを簡単に構築できるようにすることでした。