Spot VM または予約を使用して Cloud GPU に Vertex AI Llama-3.1 エンドポイントをデプロイする

このチュートリアルでは、Vertex AI に Meta-Llama-3.1-8B モデルをデプロイする手順について説明します。エンドポイントをデプロイし、特定のニーズに合わせて最適化する方法を学びます。フォールト トレラントなワークロードの場合は、Spot VM を使用して費用を最適化できます。可用性を保証するには、Compute Engine の予約を使用します。次のものを使用するエンドポイントをデプロイする方法について学習します。

  • Spot VM: スポット プロビジョニングされたインスタンスを使用して、大幅な費用削減を実現します。
  • 予約: 特に本番環境のワークロードで、予測可能なパフォーマンスのためにリソースの可用性を保証します。このチュートリアルでは、自動(ANY_RESERVATION)と特定(SPECIFIC_RESERVATION)の予約の使用方法について説明します。

詳細については、Spot VM または Compute Engine リソースの予約をご覧ください。

前提条件

始める前に、前提条件となる次の手順を行います。

  • 課金が有効になっている Google Cloud プロジェクト。
  • Vertex AI API と Compute Engine API が有効になっている。
  • 使用するマシンタイプとアクセラレータ(NVIDIA L4 GPU など)に十分な割り当て。割り当てを確認するには、コンソールの割り当てとシステム上限 Google Cloud をご覧ください。
  • Hugging Face アカウントと、読み取りアクセス権を持つユーザー アクセス トークン
  • 共有予約を使用している場合は、プロジェクト間で IAM 権限を付与します。これらの権限はすべてノートブックで説明されています。

Spot VM にデプロイする

以降のセクションでは、プロジェクトの設定、Hugging Face 認証の構成、Spot VM または予約を使用して Llama-3.1 モデルのデプロイ、デプロイのテストを行うプロセスについて説明します。 Google Cloud

1. Google Cloud プロジェクトと共有予約を設定する

Colab Enterprise ノートブックを開きます。

最初のセクションで、Colab ノートブックで PROJECT_IDSHARED_PROJECT_ID(該当する場合)、BUCKET_URIREGION 変数を設定します。

このノートブックは、両方のプロジェクトのサービス アカウントに compute.viewer ロールを付与します。

同じ組織内の別のプロジェクトで作成された予約を使用する場合は、両方のプロジェクトの P4SA(プリンシパル サービス アカウント)に compute.viewer ロールを付与してください。ノートブック コードによって自動的に設定されますが、SHARED_PROJECT_ID が正しく設定されていることを確認してください。このプロジェクト間の権限により、プライマリ プロジェクトの Vertex AI エンドポイントは、共有プロジェクトの予約容量を表示して使用できます。

2. ハグフェイス認証を設定する

Llama-3.1 モデルをダウンロードするには、Colab ノートブックの HF_TOKEN 変数に Hugging Face ユーザー アクセス トークンを指定する必要があります。指定しなかった場合は、Cannot access gated repository for URL というエラーが発生します。

Hugging Face アクセス トークンの設定 図 1: Hugging Face アクセス トークンの設定

3. Spot VM でデプロイする

Llama モデルを Spot VM にデプロイするには、Colab ノートブックの [Spot VM Vertex AI エンドポイントのデプロイ] セクションに移動して is_spot=True を設定します。

base_model_name = "Meta-Llama-3.1-8B"
hf_model_id = "meta-llama/" + base_model_name

if "8b" in base_model_name.lower():
    accelerator_type = "NVIDIA_L4"
    machine_type = "g2-standard-12"
    accelerator_count = 1
    max_loras = 5
else:
    raise ValueError(
        f"Recommended GPU setting not found for: {accelerator_type} and {base_model_name}."
    )

common_util.check_quota(
    project_id=PROJECT_ID,
    region=REGION,
    accelerator_type=accelerator_type,
    accelerator_count=accelerator_count,
    is_for_training=False,
)

gpu_memory_utilization = 0.95
max_model_len = 8192

models["vllm_gpu_spotvm"], endpoints["vllm_gpu_spotvm"] = deploy_model_vllm(
    model_name=common_util.get_job_name_with_datetime(prefix="llama3_1-serve-spotvm"),
    model_id=hf_model_id,
    base_model_id=hf_model_id,
    service_account=SERVICE_ACCOUNT,
    machine_type=machine_type,
    accelerator_type=accelerator_type,
    accelerator_count=accelerator_count,
    gpu_memory_utilization=gpu_memory_utilization,
    max_model_len=max_model_len,
    max_loras=max_loras,
    enforce_eager=True,
    enable_lora=True,
    use_dedicated_endpoint=False,
    model_type="llama3.1",
    is_spot=True,
)

共有予約インスタンスにデプロイする

以降のセクションでは、共有予約の作成、予約設定の構成、ANY_RESERVATION または SPECIFIC_RESERVATION を使用した Llama-3.1 モデルのデプロイ、デプロイのテストについて説明します。

1. 共有予約を作成する

予約を構成するには、ノートブックの「Vertex AI 予測の予約を設定する」セクションに移動します。予約に必要な変数(RES_ZONERESERVATION_NAMERES_MACHINE_TYPERES_ACCELERATOR_TYPERES_ACCELERATOR_COUNT など)を設定します。

RES_ZONE{REGION}-{availability_zone} に設定する必要があります。

RES_ZONE = "a"
RES_ZONE = f"{REGION}-{RES_ZONE}"

RESERVATION_NAME = "shared-reservation-1"
RESERVATION_NAME = f"{PROJECT_ID}-{RESERVATION_NAME}"
RES_MACHINE_TYPE = "g2-standard-12"
RES_ACCELERATOR_TYPE = "nvidia-l4"
RES_ACCELERATOR_COUNT = 1
rev_names.append(RESERVATION_NAME)

create_reservation(
    res_project_id=PROJECT_ID,
    res_zone=RES_ZONE,
    res_name=RESERVATION_NAME,
    res_machine_type=RES_MACHINE_TYPE,
    res_accelerator_type=RES_ACCELERATOR_TYPE,
    res_accelerator_count=RES_ACCELERATOR_COUNT,
    shared_project_id=SHARED_PROJECT_ID,
)

2. 予約を共有する

予約には、単一プロジェクトの予約(デフォルト)と共有予約の 2 種類があります。単一プロジェクトの予約は、予約自体と同じプロジェクト内の VM でのみ使用できます。一方、共有予約は、予約が存在するプロジェクト内の VM と、予約を共有している他のプロジェクト内の VM で使用できます。共有予約を使用すると、予約済みリソースの使用率を改善し、作成および管理する必要がある予約の総数を減らすことができます。このチュートリアルでは、共有予約に焦点を当てます。詳細については、共有予約の仕組みをご覧ください。

続行する前に、図のようにコンソールから [他の Google サービスと共有] をオンにします。 Google Cloud

他の Google サービスと予約を共有する 図 2: 他の Google サービスと予約を共有する

3. ANY_RESERVATION でデプロイする

ANY_RESERVATION を使用してエンドポイントをデプロイするには、ノートブックの「ANY_RESERVATION を使用して Llama-3.1 エンドポイントをデプロイする」セクションに進みます。デプロイ設定を指定して、reservation_affinity_type="ANY_RESERVATION" を設定します。次に、セルを実行してエンドポイントをデプロイします。

hf_model_id = "meta-llama/Meta-Llama-3.1-8B"

models["vllm_gpu_any_reserve"], endpoints["vllm_gpu_any_reserve"] = deploy_model_vllm(
    model_name=common_util.get_job_name_with_datetime(
        prefix=f"llama3_1-serve-any-{RESERVATION_NAME}"
    ),
    model_id=hf_model_id,
    base_model_id=hf_model_id,
    service_account=SERVICE_ACCOUNT,
    machine_type=MACHINE_TYPE,
    accelerator_type=ACCELERATOR_TYPE,
    accelerator_count=ACCELERATOR_COUNT,
    model_type="llama3.1",
    reservation_affinity_type="ANY_RESERVATION",
)

4. ANY_RESERVATION エンドポイントをテストする

エンドポイントがデプロイされたら、いくつかのプロンプトをテストして、正しくデプロイされていることを確認します。

5. SPECIFIC_RESERVATION でデプロイする

SPECIFIC_RESERVATION を使用してエンドポイントをデプロイするには、ノートブックの「SPECIFIC_RESERVATION を使用して Llama-3.1 エンドポイントをデプロイする」セクションに進みます。次のパラメータ(reservation_namereservation_affinity_type="SPECIFIC_RESERVATION"reservation_projectreservation_zone)を指定します。次に、セルを実行してエンドポイントをデプロイします。

hf_model_id = "meta-llama/Meta-Llama-3.1-8B"

MACHINE_TYPE = "g2-standard-12"
ACCELERATOR_TYPE = "NVIDIA_L4"
ACCELERATOR_COUNT = 1

(
    models["vllm_gpu_specific_reserve"],
    endpoints["vllm_gpu_specific_reserve"],
) = deploy_model_vllm(
    model_name=common_util.get_job_name_with_datetime(
        prefix=f"llama3_1-serve-specific-{RESERVATION_NAME}"
    ),
    model_id=hf_model_id,
    base_model_id=hf_model_id,
    service_account=SERVICE_ACCOUNT,
    machine_type=MACHINE_TYPE,
    accelerator_type=ACCELERATOR_TYPE,
    accelerator_count=ACCELERATOR_COUNT,
    model_type="llama3.1",
    reservation_name=RESERVATION_NAME,
    reservation_affinity_type="SPECIFIC_RESERVATION",
    reservation_project=PROJECT_ID,
    reservation_zone=RES_ZONE,
)

6. SPECIFIC_RESERVATION エンドポイントをテストする

エンドポイントがデプロイされたら、Vertex AI オンライン予測で予約が使用されていることを確認します。また、いくつかのプロンプトをテストして、適切にデプロイされていることを確認します。

Vertex オンライン予測で予約が使用されていることを確認する 図 3: Vertex オンライン予測で予約が使用されていることを確認する

7. クリーンアップ

課金され続けることがないように、このチュートリアルで作成したモデル、エンドポイント、予約を削除します。Colab ノートブックの [クリーンアップ] セクションには、このクリーンアップ プロセスを自動化するコードが用意されています。

トラブルシューティング

  • Hugging Face トークンエラー: Hugging Face トークンに read 権限があり、ノートブックで正しく設定されていることを再確認します。
  • 割り当てエラー: デプロイ先のリージョンに十分な GPU 割り当てがあることを確認します。必要に応じて、割り当ての増加をリクエストします。
  • 予約の競合: エンドポイントのデプロイのマシンタイプとアクセラレータ構成が予約の設定と一致していることを確認します。予約が Google サービスと共有されるように有効になっていることを確認する

次のステップ