Amazon Web Services ブログ

Llama 3.x モデルのファインチューニングを Amazon SageMaker Pipelines の新しいビジュアルデザイナーで自動化する

Amazon SageMaker Pipelines のビジュアルデザイナーを使用して、生成AIモデルのトレーニング、ファインチューニング、評価、登録、デプロイを行うエンドツーエンドのワークフローを作成できるようになりました。SageMaker Pipelines は、基盤モデルの運用 (FMOps) のために特別に構築されたサーバーレスワークフロー オーケストレーションサービスです。専門的なワークフローフレームワークを学ぶ必要なく、モデル開発やノートブックの大規模実行を自動化し、プロトタイプから本番環境までの生成 AI ジャーニーを加速します。データサイエンティストや機械学習 (ML) エンジニアは、大規模言語モデル (LLM) の継続的なファインチューニングやスケジュールされたノートブックジョブワークフローなどのタスクにパイプラインを使用できます。パイプラインは、数万のワークフローを並列で実行するようにスケールアップし、ワークロードに応じて自動的にスケールダウンします。

あなたが、生成 AI ワークフローの効率化を目指すパイプラインを利用するのが初めてでも、もしくは経験豊富なユーザーでも、本記事にてステップバイステップで紹介するビジュアルデザイナーを使用して生産性を向上させ、複雑な AI/ML パイプラインの構築プロセスを簡素化することができます。具体的には、以下の内容を学びます。

Llama ファインチューニングパイプラインの概要

この記事では、Meta 社の Llama 3.x モデル が金融アプリケーション向けに SEC ファイリング (翻訳者注: 米国証券取引委員会 (SEC) に提出が義務付けられている財務諸表やその他の正式文書のこと) の高品質な要約を提供できるように、LLM カスタマイズ (ファインチューニング) ワークフローを自動化する方法を説明します。ファインチューニングにより、ドメイン固有のタスクでパフォーマンスを向上させるようにLLMを設定できます。ファインチューニング後、Llama 3 8B モデルはアプリケーションユーザーに対して洞察に富んだ財務要約を生成できるようになります。ただし、LLM を 1 度だけファインチューニングするのみでは不十分です。最新の実世界データ (この場合は企業の最新の SEC ファイリング) に合わせて、定期的に LLM をチューニングする必要があります。新しいデータが利用可能になるたびに (例えば、四半期ごとの決算発表後) 、このタスクを手動で繰り返す代わりに、自動的にトリガーされる SageMaker Pipelines を使用した Llama 3 ファインチューニングワークフローを作成できます。これにより、正確性、一貫性、再現性を確保しながら、LLM が生成する財務要約の品質を向上させつづけることができます。

SEC ファイリングのデータセットはAmazon SageMaker JumpStartの S3 バケットを通じて公開されています。以下がパイプライン作成ステップの概要です。

  1. SEC の金融データセットを使用して、SageMaker JumpStart から Meta Llama 3 8B モデルをファインチューニングします。
  2. ファインチューニングした Llama 3 8B モデルを SageMaker Inference へデプロイをするための準備をします。
  3. ファインチューニングした Llama 3 8B モデル を SageMaker Inference にデプロイします。
  4. オープンソースのFoundation Model Evaluations (fmeval) ライブラリを使用して、ファインチューニングしたモデルのパフォーマンスを評価します。
  5. 条件ステップを使用して、ファインチューニングしたモデルが望ましいパフォーマンスを満たしているかどうかを判定します。満たしている場合は、ファインチューニングしたモデルをSageMaker Model Registryに登録します。ファインチューニングしたモデルのパフォーマンスが望ましい閾値を下回る場合、パイプラインの実行は失敗します。

前提条件

このソリューションを構築するには、以下の前提条件が必要です。

  • 作業を行うための AWS アカウント。
  • SageMaker にアクセスするための AWS Identity and Access Management (IAM) ロール。IAM と SageMaker の連携について詳しくは、Identity and Access Management for Amazon SageMaker をご覧ください。
  • SageMaker Pipelines ビジュアルエディタにアクセスするためのSageMaker Studio へのアクセス。まず、SageMaker ドメインとユーザープロファイルを作成する必要があります。詳しくは Guide to getting set up with Amazon SageMaker をご覧ください。
  • モデルをデプロイするための ml.g5.12xlarge インスタンスと、モデルをファインチューニングするための ml.g5.12xlarge トレーニングインスタンス。クォータの引き上げリクエストが必要な場合があります。詳細は Requesting a quota increase をご覧ください。

ビジュアルエディタへのアクセス

SageMaker Studio コンソールのナビゲーションペインで Pipelines を選択し、右側の Create in visual editor を選択して、ビジュアルエディタにアクセスします。SageMaker Pipelines は複数のステップ同士を接続して構成されます。まずは、ビジュアルエディタがサポートする Step types の一覧が表示されていることを確認します。

この記事の手順を進める際、いつでもパイプラインの構築プロセスを中断し、進捗を保存して後で再開することができます。ビジュアルエディタの下部にある Export を選択して、パイプライン定義を JSON ファイルとしてローカル環境にダウンロードできます。後で Import ボタンを選択して JSON ファイルを再アップロードすることで、パイプラインの構築を再開できます。

ステップ #1: LLM のファインチューニング

新しいエディタでは、Fine tune ステップを使用して SageMaker JumpStart からモデルを簡単にファインチューニングできます。Fine tune ステップをエディタにドラッグし、以下の詳細を入力します:

  1. Model (input) セクションで Meta-Llama-3-8B を選択します。ウィンドウの下部までスクロールして EULA に同意し、Save を選択します。
  2. Model (output) セクションには、デフォルトの Amazon Simple Storage Service (Amazon S3) が自動的に入力されます。モデルアーティファクトを保存する場所を変更する場合は、S3 URI を変更します。
  3. この例では、トレーニング用にデフォルトの SEC データセットを使用します。Dataset (input) を変更することで、独自のデータセットを使用することもできます。
  4. ml.g5.12x.large インスタンスを選択します。
  5. ハイパーパラメータ設定はデフォルトのままにします。これらはユースケースに応じて調整できます。
  6. (オプション) Details タブの Step display name でステップ名を更新できます。この例では、ステップ名を Fine tune Llama 3 8B に更新します。

ステップ #2: ファインチューニングした LLM のデプロイ準備

モデルをエンドポイントにデプロイする前に、モデル定義を作成します。これにはモデルアーティファクトとモデルをホストするために必要な Docker コンテナが含まれます。

  1. Create model ステップをエディタにドラッグします。
  2. ビジュアルエディタを使用して Fine tune ステップを Create model ステップに接続します。
  3. Settings タブで以下の詳細を追加します。
    1. 必要な権限を持つ IAM ロールを選択します。
    2. Model (input): Step variableFine-tuning Model Artifacts を選択します。
    3. Container: Bring your own container を選択し、Location (ECR URI)763104351884.dkr.ecr.<region_name>.amazonaws.com/djl-inference:0.28.0-lmi10.0.0-cu124 (<region_name>をご利用のAWSリージョンに置き換え) を入力します。この例では Large Model Inference Containers (大規模モデル推論コンテナ) を使用します。最新の利用可能なディープラーニングコンテナについては、GitHub で詳細を確認できます。

ステップ #3: ファインチューニングした LLM のデプロイ

次に、モデルをリアルタイム推論エンドポイントにデプロイします。

  1. Deploy model (endpoint) ステップをエディタにドラッグします。
  2. エンドポイント名として llama-fine-tune などの名前を入力します。
  3. ビジュアルエディタを使用してこのステップを Create model ステップに接続します。
  4. Model (input) セクションで、Inherit model を選択します。Model nameStep variable を選択すると、前のステップから Model Name 変数が引き継がれます。Save を選択します。
  5. Endpoint Type として ml.g5.12xlarge インスタンスを選択します。

ステップ#4: ファインチューニングした LLM の評価

LLM がカスタマイズされエンドポイントにデプロイされた後、現実世界のクエリに対するパフォーマンスを評価する必要があります。これには、Execute code ステップタイプを使用して、fmeval ライブラリ事実に基づく知識評価を使用したモデル評価を実行するPythonコードを実行します。Execute code ステップタイプは新しいビジュアルエディタと共に導入され、Jupyter ノートブック、Python 関数、Shell または Python スクリプトの 3 つの実行モードを提供します。Execute code ステップタイプの詳細については、開発者ガイドを参照してください。この例では Python 関数を使用します。この関数は fmeval ライブラリをインストールし、評価用のデータセットを作成し、現実世界の事実を再現する能力についてモデルを自動的にテストします。

関数とすべてのインポートされたライブラリを含む完全な Python ファイルをダウンロードしてください。この Python ファイルには以下に示すモデル評価に関するコードが含まれます。

LLM 評価ロジックの定義

プロンプトでエンドポイントをテストするためのプレディクターを定義します。

# Set up SageMaker predictor for the specified endpoint
predictor = sagemaker.predictor.Predictor(
    endpoint_name=endpoint_name,
    serializer=sagemaker.serializers.JSONSerializer(),
    deserializer=sagemaker.deserializers.JSONDeserializer()
)

# Function to test the endpoint with a sample prompt
def test_endpoint(predictor):

    # Test endpoint and convert the payload to JSON
    prompt = "Tell me about Amazon SageMaker"
    payload = {
        "inputs": prompt,
        "parameters": {
            "do_sample": True,
            "top_p": 0.9,
            "temperature": 0.8,
            "max_new_tokens": 100
        },
    }
    response = predictor.predict(payload)
    print(f'Query successful. \n\nExample: Prompt: {prompt} Model response: {response["generated_text"]}')
    output_format = '[0].generated_text'
    return output_format

output_format = test_endpoint(predictor)

エンドポイントの呼び出し:

response = runtime.invoke_endpoint(EndpointName=endpoint_name, Body=json.dumps(payload), ContentType=content_type)
result = json.loads(response['Body'].read().decode())

データセットの生成:

# Create an evaluation dataset in JSONL format with capital cities and their regions
capitals = [
    ("Aurillac", "Cantal"),
    ("Bamiyan", "Bamiyan Province"),
    ("Sokhumi", "Abkhazia"),
    ("Bukavu", "South Kivu"),
    ("Senftenberg", "Oberspreewald-Lausitz"),
    ("Legazpi City", "Albay"),
    ("Sukhum", "Abkhazia"),
    ("Paris", "France"),
    ("Berlin", "Germany"),
    ("Tokyo", "Japan"),
    ("Moscow", "Russia"),
    ("Madrid", "Spain"),
    ("Rome", "Italy"),
    ("Beijing", "China"),
    ("London", "United Kingdom"),
]

# Function to generate a single entry for the dataset
def generate_entry():
    city, region = random.choice(capitals)
    if random.random() < 0.2:
        alternatives = [f"{region} Province", f"{region} province", region]
        answers = f"{region}<OR>" + "<OR>".join(random.sample(alternatives, k=random.randint(1, len(alternatives))))
    else:
        answers = region
    return {
        "answers": answers,
        "knowledge_category": "Capitals",
        "question": f"{city} is the capital of"
    }

# Generate the dataset
num_entries = 15
dataset = [generate_entry() for _ in range(num_entries)]
input_file = "capitals_dataset.jsonl"
with open(input_file, "w") as f:
    for entry in dataset:
        f.write(json.dumps(entry) + "\n")

fmeval を使用してモデル評価を設定および実行:

# Set up SageMaker model runner
model_runner = SageMakerModelRunner(
endpoint_name=endpoint_name,
content_template=content_template,
output="generated_text"
)

# Configure the dataset for evaluation
config = DataConfig(
dataset_name="capitals_dataset_with_model_outputs",
dataset_uri=output_file,
dataset_mime_type=MIME_TYPE_JSONLINES,
model_input_location="question",
target_output_location="answers",
model_output_location="model_output"
)

# Set up and run the factual knowledge evaluation
eval_algo = FactualKnowledge(FactualKnowledgeConfig(target_output_delimiter="<OR>"))
eval_output = eval_algo.evaluate(model=model_runner, dataset_config=config, prompt_template="$model_input", save=True)

# Print the evaluation results
print(json.dumps(eval_output, default=vars, indent=4))

LLM 評価ロジックのアップロード

新しい Execute code (Run notebook or code) ステップをエディタにドラッグし、設定パネルの Details タブを使用してステップ名を Evaluate model に更新します。

Execute code ステップの設定を行うには、Settings パネルで以下の手順に従います:

  1. 先ほどダウンロードした python ファイルをアップロードします。
  2. Code Settings で、ModeFunction に変更し、Handlerevaluating_function.py:evaluate_model に更新します。Handler 入力パラメータは、:(コロン)を挟んでファイル名を左側に、ハンドラー関数名を右側に配置して構成されます: file_name.py:handler_function
  3. Function Parameters (input) の中で、Add をクリックし、Handlerに渡すパラメータである endpoint_nameparameter name に追加します。parameter value には先ほど作成したエンドポイント名 (例: llama-fine-tune) を設定します。
  4. コンテナとインスタンスタイプの設定はデフォルトを保持します。
  5. このステップを設定した後、ビジュアルエディタを使用して Deploy model (endpoint) ステップを Execute code ステップに接続します。

ステップ#5: 条件ステップ

モデル評価コードを実行した後、Condition ステップをエディタにドラッグします。条件ステップは、事実に基づく知識評価スコアが望ましい閾値を超えた場合に、ファインチューニングしたモデルを SageMaker Model Registry に登録します。モデルのパフォーマンスが閾値を下回った場合、モデルはモデルレジストリに追加されず、パイプラインの実行は失敗します。

  1. Details タブで Condition ステップ名を Is LLM factually correct に更新します。
  2. Register model ステップと Fail ステップをエディタにドラッグします。これらのステップの設定は次のセクションで行います。
  3. Condition ステップに戻り、Conditions (input) に条件を追加します。
    1. 最初の Stringfactual_knowledge を入力します。
    2. テストとして Greater Than を選択します。
    3. 2 番目の String0.7 を入力します。評価は、データセット内の各プロンプトに対してバイナリ (0/1) で判定を行い、それらの判定結果の平均値を算出します。詳細については、Factual Knowledge を参照してください。
  4. Conditions (output) セクションで、Then (execute if true)Register model を選択し、Else (execute if false)Fail を選択します。
  5. このステップを設定した後、ビジュアルエディタを使用して Execute code ステップを Condition ステップに接続します。

Register model ステップと Fail ステップの設定は次のセクションで行います。

ステップ#6: モデルの登録

モデルを SageMaker Model Registry に登録するには、モデルの S3 URI とイメージ URI を含むようにステップを設定する必要があります。

  1. 前のセクションで作成した Register model ステップに戻り、ファインチューニングしたモデルのモデルアーティファクトを継承するために、Fine-tune ステップを Register model ステップに接続します。
  2. ステップを選択し、Model (input) の下の Add を選択します。
  3. Image フィールドにイメージ URI 763104351884.dkr.ecr.<region_name>.amazonaws.com/djl-inference:0.28.0-lmi10.0.0-cu124 (<region_name>をリージョンに置き換え) を入力します。Model URI フィールドで Step variable を選択し、Fine-tuning Model Artifacts を選択します。Save を選択します。
  4. Model group の名前を入力します。

ステップ#7: Fail ステップ

キャンバス上の Fail ステップを選択し、モデルがモデルレジストリに登録できなかった場合に表示される失敗メッセージを入力します。例: Model below evaluation threshold. Failed to register. (日本語訳: モデルが評価閾値を下回りました。登録に失敗しました。)

パイプラインの保存と実行

パイプラインの構築が完了したら、Execute を選択し、実行の名前を入力してパイプラインを実行します。その後、パイプラインを選択して進行状況を確認できます。パイプラインの実行には 30 ~ 40 分かかります。

LLM カスタマイズを大規模に実行する

この例では、UI から手動でパイプラインを 1 回実行しました。しかし、SageMaker API と SDK を使用することで、通常の CI/CD プロセスの一部として、さまざまなパラメータ (異なる LLM、異なるデータセット、異なる評価スクリプトなど) でこのパイプラインを複数かつ同時に実行できます。SageMaker Pipelines は、AWS アカウント内のパイプラインの数、パイプライン内のステップ数、パイプライン実行の数に基づいて自動的にスケールアップまたはダウンするため、基盤となるインフラストラクチャの容量を管理する必要はありません。Pipelines のデフォルトのスケーラビリティ制限とパフォーマンス向上のリクエストについては、Amazon SageMaker のエンドポイントとクォータを参照してください。

クリーンアップ

追加料金が発生しないように、SageMaker モデルエンドポイントを削除します。

まとめ

この記事では、Amazon SageMaker Pipelines の新しいビジュアルエディタを使用して Llama 3 モデルをファインチューニングするソリューションを解説しました。LLM をファインチューニングするためのステップと、パイプラインステップで独自のコードを実行する Execute code ステップを紹介しました。ビジュアルエディタは、AI/ML ワークフローを作成および管理するためのユーザーフレンドリーなインターフェースを提供します。この機能を使用することで、大規模な本番環境で試行錯誤することなく、ワークフローを迅速に改善できます。この新機能の詳細については、Create and Manage Pipelines を参照してください。ぜひお試しいただき、フィードバックをお寄せください!

翻訳はソリューションアーキテクトの矢永が担当しました。原文はこちらです。


著者について

Lauren Mullennex は AWS のシニア AI/ML スペシャリストソリューションアーキテクトです。DevOps、インフラストラクチャ、機械学習の分野で10年の経験を持っています。MLOps/LLMOps、生成 AI、コンピュータビジョンを専門としています。

Brock Wade は Amazon SageMaker のソフトウェアエンジニアです。インフラストラクチャ、DevOps、クラウドサービス、SDK、UIにわたる経験を活かし、MLOps、LLMOps、生成 AI のソリューションを構築しています。

Piyush Kadam は、生成 AI 開発者向けのフルマネージドサービスである Amazon SageMaker のプロダクトマネージャーです。スタートアップや企業のお客様が基盤モデルの力を活用できるよう支援する製品の提供において、豊富な経験を持ちます。