ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了するときに、これらの値をクラウド環境に固有の値に置き換えます。
dstackを使用したOracle Cloud Infrastructureでの大規模な言語モデルの微調整と提供
イントロダクション
dstack
は、人工知能(AI)コンテナのオーケストレーションを簡素化し、大規模言語モデル(LLM)の分散トレーニングおよびデプロイメントをよりアクセス可能にするオープンソース・ツールです。dstack
とOracle Cloud Infrastructure(OCI)を組み合わせることで、分散トレーニングとスケーラブルなモデル導入のためのクラウド・インフラストラクチャを設定するための合理化されたプロセスが実現します。
dstack
の仕組み
dstack
は、あらゆるクラウドまたはデータ・センターにまたがるAIモデルの開発、トレーニングおよびデプロイメントのための統合インタフェースを提供します。たとえば、デプロイするトレーニング・タスクまたはモデルの構成を指定できます。dstack
は、必要なインフラストラクチャの設定およびコンテナの編成を処理します。dstack
が提供する利点の1つは、ハードウェア、フレームワークおよびスクリプトを使用できることです。
目的
-
OCIで
dstack
を使用してLLMモデルを微調整し、Hugging Face Alignment Handbookのベストプラクティスを取り入れ、Hugging Face Text Generation Inference (TGI)を使用してモデルをデプロイします。ノート:チュートリアルで説明する実験では、3つのノードのOCIクラスタ(それぞれ2つのA10 GPU)を使用して、Gemma 7Bモデルを微調整します。
前提条件
-
OCIテナンシへのアクセス。
-
A10 GPUなどのNVIDIA GPUを使用したシェイプへのアクセス(
VM.GPU.A10.2
など)。制限拡大のリクエストの詳細は、サービス制限を参照してください。 -
Gemma 7Bモデルをダウンロードするように構成されたアクセス・トークンを持つHugging Faceアカウント。
タスク1: OCIでのdstack
の設定
-
次のコマンドを使用して、
dstack
Pythonパッケージをインストールします。dstack
は複数のクラウド・プロバイダをサポートしているため、範囲をOCIに絞り込むことができます。pip install dstack[oci]
-
~/.dstack/server/config.yml
ファイル内のOCI固有の資格証明を構成します。次のコードは、OCIコマンドライン・インタフェース(CLI)の資格証明が構成されていることを前提としています。その他の構成オプションについては、dstackのドキュメントを参照してください。projects: - name: main backends: - type: oci creds: type: default
-
次のコマンドを使用して、
dstack
サーバーを実行します。dstack server INFO Applying ~/.dstack/server/config.yml... INFO Configured the main project in ~/.dstack/config.yml INFO The admin token is ab6e8759-9cd9-4e84-8d47-5b94ac877ebf INFO The dstack server 0.18.4 is running at http://127.0.0.1:3000
-
プロジェクト・スクリプトを使用してフォルダに切り替え、次のコマンドを使用して
dstack
を初期化します。dstack init
タスク2: dstack
を使用したOCIでのジョブの微調整
Gemma 7Bモデルを微調整するには、Hugging Face Alignment Handbookを使用して、最適なファインチューニング・プラクティスを組み込む必要があります。このチュートリアルのソースコードは、GitHubから入手できます。LLMを微調整するための実践的なステップについて説明します。
プロジェクト・フォルダに切り替えたら、次のコマンドを使用して、dstack
を使用してOCIでファインチューニング・ジョブを開始します。
ACCEL_CONFIG_PATH=fsdp_qlora_full_shard.yaml \
FT_MODEL_CONFIG_PATH=qlora_finetune_config.yaml \
HUGGING_FACE_HUB_TOKEN=xxxx \
WANDB_API_KEY=xxxx \
dstack run . -f ft.task.dstack.yml
FT_MODEL_CONFIG_PATH
、ACCEL_CONFIG_PATH
、HUGGING_FACE_HUB_TOKEN
およびWANDB_API_KEY
環境変数は、ft.task.dstack.yml
タスク構成内に定義されます。dstack run
は、OCIのft.task.dstack.yml
に定義されているタスクを送信します。
ノート:
dstack
は、タスクの実行時に現在のディレクトリ・コンテンツを自動的にコピーします。
各YAMLファイルの主要な部分を確認します(完全な内容については、リポジトリを確認してください)。
qlora_finetune_config.yaml
ファイルは、大きい言語モデル(LLM)を微調整する方法を理解するために連携ハンドブックで使用されるレシピ構成です。
# Model arguments
model_name_or_path: google/gemma-7b
tokenizer_name_or_path: philschmid/gemma-tokenizer-chatml
torch_dtype: bfloat16
bnb_4bit_quant_storage: bfloat16
# LoRA arguments
load_in_4bit: true
use_peft: true
lora_r: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target_modules:
- q_proj
- k_proj
# ...
# Data training arguments
dataset_mixer:
chansung/mental_health_counseling_conversations: 1.0
dataset_splits:
- train
- test
# ...
-
モデル引数:
model_name_or_path
: GoogleのGemma 7Bがベース・モデルとして選択されます。tokenizer_name_or_path
:整列ハンドブックは、選択したトークナイザのapply_chat_template()
メソッドを使用します。このチュートリアルでは、Gemma 7Bの標準会話テンプレートのかわりにChatMLテンプレートを使用します。torch_dtype
およびbnb_4bit_quant_storage
: FSDP+QLoRAファインチューニング・メソッドを利用する場合は、これら2つの値を同じ値に定義する必要があります。Gemma 7Bは単一のA10 GPUに収まるのが難しいため、このチュートリアルでは、FSDP+QLoRAを使用して、QLoRA技術を活用しながら、モデルを2つのA10 GPUにシャードします。
-
LoRA引数: LoRA固有の構成。このチュートリアルの投稿ではFSDP+QLoRA手法を利用しているため、
load_in_4bit
はtrue
に設定されています。その他の構成は、実験ごとに異なる場合があります。 -
データ・トレーニング引数: Amodのメンタル・ヘルス・カウンセリング会話のデータセットに基づくデータセットを準備しました。整列ハンドブックは、トークン化者の
apply_chat_template()
メソッドで解釈できる[{"role": "user", "content": "..."}, {"role": "assistant", "content": "..."}, ...]
の形式のデータのみを理解するため、準備されたデータセットは基本的に、元のデータセットをapply_chat_template()
互換形式に変換することです。
fsdp_qlora_full_shard.yaml
ファイルによって、基礎となるインフラストラクチャを使用してLLMを微調整する方法が高速化されます。
compute_environment: LOCAL_MACHINE
distributed_type: FSDP # Use Fully Sharded Data Parallelism
fsdp_config:
fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP
fsdp_backward_prefetch: BACKWARD_PRE
fsdp_cpu_ram_efficient_loading: true
fsdp_use_orig_params: false
fsdp_offload_params: true
fsdp_sharding_strategy: FULL_SHARD
# ... (other FSDP configurations)
# ... (other configurations)
distributed_type
:FSDP
は、完全シャード・データ・パラレル(FSDP)の使用を示します。これは、単一のGPUに収まらない大規模なモデルのトレーニングを可能にする手法です。fsdp_config
:モデルをシャードする方法(fsdp_sharding_strategy
)やパラメータをCPUにオフロードするかどうか(fsdp_offload_params
)など、FSDPの動作を設定します。
fsdp_config
のfsdp_sharding_strategy
のdistributed_type
およびFULL_SHARD
のFSDP
を使用すると、モデルは単一のマシン内の複数のGPU間でシャードされます。複数の計算ノードを処理する場合、各ノードはモデルの同一のコピーをホストし、それ自体はそのノード内の複数のGPUに分割されます。つまり、各ノードのパーティション化された各モデル・インスタンスは、データセットの異なるセクションまたはバッチを処理します。複数のノードにまたがる複数のGPUに1つのモデルを分散するには、パラメータfsdp_sharding_strategy
をHYBRID_SHARD
として構成します。
調整には、machine_rank
、num_machines
、num_processes
などの追加パラメータが重要です。ただし、これらの値は実行時に動的に設定することをお薦めします。これにより、異なるインフラストラクチャの設定を切り替える際の柔軟性が得られます。
タスク3: インフラストラクチャをプロビジョニングするための簡易構成を使用したdstack
の指示
すべてをまとめたfsdp_qlora_full_shard.yaml
構成を確認し、インフラストラクチャのプロビジョニング方法とタスクの実行方法をdstack
に指示します。
type: task
nodes: 3
python: "3.11"
env:
- ACCEL_CONFIG_PATH
- FT_MODEL_CONFIG_PATH
- HUGGING_FACE_HUB_TOKEN
- WANDB_API_KEY
commands:
# ... (setup steps, cloning repo, installing requirements)
- ACCELERATE_LOG_LEVEL=info accelerate launch \
--config_file recipes/custom/accel_config.yaml \
--main_process_ip=$DSTACK_MASTER_NODE_IP \
--main_process_port=8008 \
--machine_rank=$DSTACK_NODE_RANK \
--num_processes=$DSTACK_GPUS_NUM \
--num_machines=$DSTACK_NODES_NUM \
scripts/run_sft.py recipes/custom/config.yaml
ports:
- 6006
resources:
gpu: 1..2
shm_size: 24GB
ハイライトする要点::
- シームレスな統合:
dstack
は、Hugging Faceオープン・ソース・エコシステムと簡単に統合できます。特に、fsdp_qlora_full_shard.yaml
で定義した構成を通常どおりに高速化ライブラリを使用できます。 - 自動構成:
DSTACK_MASTER_NODE_IP
、DSTACK_NODE_RANK
、DSTACK_GPUS_NUM
およびDSTACK_NODES_NUM
変数は、dstack
によって自動的に管理され、手動設定が削減されます。 - リソース割当て:
dstack
を使用すると、ファインチューニング・ジョブのノードおよびGPU (gpu: 1..2)の数を簡単に指定できます。したがって、このチュートリアルでは、3つのノードがあり、それぞれに2つのA10(24GB)のGPUが装備されています。
タスク4: dstack
を使用したファインチューニング・モデルの提供
モデルがファインチューニングされると、dstack
では、Hugging Face Text Generation Inference (TGI)フレームワークを使用してOCIに簡単にデプロイできます。
次に、dstack
でサービスを定義する方法の例を示します。
type: service
image: ghcr.io/huggingface/text-generation-inference:latest
env:
- HUGGING_FACE_HUB_TOKEN
- MODEL_ID=chansung/mental_health_counseling_merged_v0.1
commands:
- text-generation-launcher \
--max-input-tokens 512 --max-total-tokens 1024 \
--max-batch-prefill-tokens 512 --port 8000
port: 8000
resources:
gpu:
memory: 48GB
# (Optional) Enable the OpenAI-compatible endpoint
model:
format: tgi
type: chat
name: chansung/mental_health_counseling_merged_v0.1
このアプローチの主な利点:
- セキュアなHTTPSゲートウェイ:
dstack
は、本番レベルのモデル提供の重要な側面であるゲートウェイを介してセキュアなHTTPS接続を設定するプロセスを簡素化します。 - 推論用に最適化: TGIフレームワークは、効率的なテキスト生成推論のために設計されており、モデルが応答性と信頼性の高い結果を提供できるようになっています。
- 自動スケーリング:
dstack
では、モデル・レプリカの最小数および最大数を含む自動スケーリング・ポリシーを指定できます。
この時点で、標準のcurl
コマンドおよびPythonリクエスト、OpenAI SDKおよびHugging Faceの推論クライアント・ライブラリを使用して、サービスと対話できます。たとえば、次のコード・スニペットはcurlの例を示しています。
curl -X POST https://black-octopus-1.mycustomdomain.com/generate \
-H "Authorization: Bearer <dstack-token>" \
-H 'Content-Type: application/json' \
-d '{"inputs": "I feel bad...", "parameters": {"max_new_tokens": 128}}'
また、デプロイ済モデルの場合、dstack
は、モデルと直接対話するためのユーザー・インタフェースを自動的に提供します。
次のステップ
このチュートリアルで概説したステップに従うことで、dstack
、OCIおよびHugging Faceエコシステムの複合機能を使用してLLMを微調整およびデプロイするための強力なアプローチを解き放ちました。dstack
のユーザーフレンドリなインターフェイスを活用してOCIリソースを効果的に管理できるようになり、LLMプロジェクトに分散トレーニング環境を設定するプロセスが合理化されました。
さらに、Hugging FaceのAlignment HandbookとTGIフレームワークとの統合により、モデルを微調整してシームレスに提供できるため、パフォーマンスに最適化され、実際のアプリケーションに対応できるようになります。可能性をさらに探求し、さまざまなモデルや構成を試して、自然言語処理の世界で望ましい結果を達成することをお勧めします。
承認
- 著者 - Chansung Park (HuggingFace fellow - AI研究者)、Yann Caniou (AI Infra/GPUスペシャリスト)、Bruno Garbaccio (AI Infra/GPUスペシャリスト)
その他の学習リソース
docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Fine-Tune and Serve Large Language Models on Oracle Cloud Infrastructure with dstack
G11977-01
July 2024