ノート:

dstackを使用したOracle Cloud Infrastructureでの大規模な言語モデルの微調整と提供

イントロダクション

dstackは、人工知能(AI)コンテナのオーケストレーションを簡素化し、大規模言語モデル(LLM)の分散トレーニングおよびデプロイメントをよりアクセス可能にするオープンソース・ツールです。dstackとOracle Cloud Infrastructure(OCI)を組み合わせることで、分散トレーニングとスケーラブルなモデル導入のためのクラウド・インフラストラクチャを設定するための合理化されたプロセスが実現します。

dstackの仕組み

dstackは、あらゆるクラウドまたはデータ・センターにまたがるAIモデルの開発、トレーニングおよびデプロイメントのための統合インタフェースを提供します。たとえば、デプロイするトレーニング・タスクまたはモデルの構成を指定できます。dstackは、必要なインフラストラクチャの設定およびコンテナの編成を処理します。dstackが提供する利点の1つは、ハードウェア、フレームワークおよびスクリプトを使用できることです。

目的

前提条件

タスク1: OCIでのdstackの設定

  1. 次のコマンドを使用して、dstack Pythonパッケージをインストールします。dstackは複数のクラウド・プロバイダをサポートしているため、範囲をOCIに絞り込むことができます。

    pip install dstack[oci]
    
  2. ~/.dstack/server/config.ymlファイル内のOCI固有の資格証明を構成します。次のコードは、OCIコマンドライン・インタフェース(CLI)の資格証明が構成されていることを前提としています。その他の構成オプションについては、dstackのドキュメントを参照してください。

    projects:
    - name: main
      backends:
      - type: oci
        creds:
          type: default
    
  3. 次のコマンドを使用して、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
    
  4. プロジェクト・スクリプトを使用してフォルダに切り替え、次のコマンドを使用して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_PATHACCEL_CONFIG_PATHHUGGING_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
# ...

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)

ハイブリッド・シャード

fsdp_configfsdp_sharding_strategydistributed_typeおよびFULL_SHARDFSDPを使用すると、モデルは単一のマシン内の複数のGPU間でシャードされます。複数の計算ノードを処理する場合、各ノードはモデルの同一のコピーをホストし、それ自体はそのノード内の複数のGPUに分割されます。つまり、各ノードのパーティション化された各モデル・インスタンスは、データセットの異なるセクションまたはバッチを処理します。複数のノードにまたがる複数のGPUに1つのモデルを分散するには、パラメータfsdp_sharding_strategyHYBRID_SHARDとして構成します。

調整には、machine_ranknum_machinesnum_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

ハイライトする要点::

タスク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

このアプローチの主な利点:

この時点で、標準の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フレームワークとの統合により、モデルを微調整してシームレスに提供できるため、パフォーマンスに最適化され、実際のアプリケーションに対応できるようになります。可能性をさらに探求し、さまざまなモデルや構成を試して、自然言語処理の世界で望ましい結果を達成することをお勧めします。

承認

その他の学習リソース

docs.oracle.com/learnの他のラボを確認するか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントは、Oracle Help Centerを参照してください。