チュートリアル: ACA でAzure Functionsを使用して、サーバーレス GPU を使用して AI イメージ生成をデプロイする

このチュートリアルでは、Azure Container Appsでサーバーレス GPU を使用する安定拡散型イメージ ジェネレーターをデプロイします。 このソリューションは、ニーズに応じて、Azure Functions アプリまたは標準コンテナー アプリとしてデプロイできます。 このチュートリアルを完了すると、必要に応じて自動的にスケーリングされる AI イメージ生成サービスが動作します。

サーバーレス GPU は、インフラストラクチャ管理なしで GPU コンピューティング リソースへのオンデマンド アクセスを提供します。 使用する GPU 時間に対してのみ料金が発生し、アイドル状態の場合、ソリューションはゼロにスケーリングされます。

このチュートリアルでは、以下の内容を学習します。

  • サブスクリプションの GPU クォータを要求して確認する
  • GPU ワークロード プロファイルを使用して Container Apps 環境を作成する
  • サーバーレス GPU を使用して AI イメージ生成 API をデプロイする
  • テキストからイメージへの要求を使用してデプロイをテストする
  • GPU 使用率を監視し、パフォーマンスを最適化する
  • 継続的なコストを回避するためにリソースをクリーンアップする

[前提条件]

開始する前に、次の項目があることを確認します。

Requirement 詳細情報
Azure サブスクリプション 無料アカウント がない場合は作成します。
GPU 割り当て GPU クォータ アクセスを要求します。 通常、承認には 1 ~ 2 営業日かかります。
Azure CLI Azure CLI バージョン 2.62.0 以降をインストールします。
Azure Developer CLI (azd) 合理化されたデプロイのために Azure Developer CLI をインストールします。
Docker Desktop Docker Desktop をインストールします。 ローカル コンテナー開発に必要です。

Important

このチュートリアルを開始する前に、GPU クォータ アクセスを要求します。 承認を待っている間は読み続けることができますが、デプロイには承認済みのクォータが必要です。

ツールが正しくインストールされていることを確認します。

az --version
azd version
docker --version

アーキテクチャの概要

このソリューションでは、次の Azure サービスを使用します。

コンポーネント 目的
Azure Container Apps サーバーレス GPU サポートを使用してアプリケーションをホストします。
GPU ワークロード プロファイル AI 推論用の NVIDIA T4 GPU コンピューティングを提供します。
Azure Container Registry カスタム コンテナー イメージを格納します。
Azure ストレージ Azure Functions ランタイムに必要です (Functions のデプロイのみ)。
Application Insights 監視と診断を提供します。

クライアントが要求を送信すると、Container Apps イングレス エンドポイントに到達します。 アプリケーションが要求を処理し、GPU で実行されている安定拡散モデルに渡します。 モデルは、プロンプトに基づいて要求されたイメージを生成し、生成されたイメージを応答として返します。

コストに関する考慮事項

サーバーレス GPU では、1 秒あたりの課金が使用されます。 デプロイする前に、次の要因を確認してください。

要因 インパクト
GPU のタイプ NVIDIA T4 のコストは A100 未満です。
最小レプリカ数 開発用に 0 に設定します (アイドル状態の場合は 0 にスケーリングされます)。
コールド スタート時間 モデルがダウンロードされ (約 5 GB)、GPU メモリに読み込まれる間、最初の要求には 1 ~ 2 分かかります。
要求期間 通常、イメージの生成には、要求ごとに 5 秒から 15 秒かかります。

詳細な価格については、 Azure Container Apps の価格に関するページを参照してください。

サンプル コードを取得する

Azure Functions実装を含むサンプル リポジトリを複製します。

git clone https://github.com/Azure-Samples/function-on-aca-gpu.git
cd function-on-aca-gpu

リポジトリには、次のファイルが含まれています。

File 目的
function_app.py イメージを生成する HTTP によってトリガーされる関数。
requirements.txt diffusers ライブラリを含む Python の依存関係。
Dockerfile GPU をサポートするコンテナー イメージ定義。
host.json Azure Functions の設定。
azure.yaml Azure Developer CLI のデプロイ構成。

Azure portal を使用してデプロイする

GPU 対応コンテナー アプリを作成し、Azure portal を使用してイメージ生成ソリューションをデプロイするには、次の手順に従います。

GPU を使用して Container Apps 環境を作成する

  1. Azure ポータルを開き、Container Apps を検索します。

  2. [作成]>[コンテナー アプリ] を選びます。

  3. [基本] タブで、次の値を入力します。

    Setting 価値
    Subscription Azure のサブスクリプションを選択します。
    リソース グループ [新規作成] を選択して rg-gpu-image-gen と入力します。
    コンテナー アプリ名 ca-image-gen」と入力します。
    デプロイ ソース [コンテナー イメージ] を選択します。
    リージョン [スウェーデン中部] を選択します。
  4. Container Apps 環境で、[新規作成] を選択します。

  5. [ Container Apps 環境の作成 ] ダイアログで、環境名として「 cae-gpu-image-gen 」と入力します。

  6. [ 作成] を選択して環境を作成します。

  7. [次へ: コンテナー >] を選択します。

GPU を使用してコンテナーを構成する

  1. [ コンテナー ] タブで、次の値を入力します。

    Setting 価値
    名前 gpu-image-gen-container」と入力します。
    イメージ ソース Docker Hub またはその他のレジストリを選択します
    画像の種類 [パブリック] を選択します。
    レジストリ ログイン サーバー mcr.microsoft.com」と入力します。
    イメージとタグ k8se/gpu-quickstart:latest」と入力します。
    ワークロード プロファイル 従量課金 - 最大4 vCPU、8 GiB メモリを選択します。
    GPU チェック ボックスをオンにして GPU を有効にします。
    GPU の種類 Consumption-GPU-NC8as-T4 を選択し、リンクを選択してプロファイルを追加します。
  2. [次へ: イングレス >] を選択します。

イングレスを設定する

  1. [ イングレス ] タブで、次の値を入力します。

    Setting 価値
    イングレス [有効] を選択します
    イングレス トラフィック [どこからでもトラフィックを受け入れる] を選択します。
    ターゲット ポート 80」と入力します。
  2. [Review + create](レビュー + 作成) を選択します。

  3. 設定を確認し、 [作成] を選択します。

  4. デプロイが完了するまで待ってから (約 5 分)、[ リソースに移動] を選択します。

デプロイメントを確認する

  1. コンテナー アプリの [概要 ] ページで、 アプリケーション URL をコピーします

  2. ブラウザーで URL を開き、イメージ生成インターフェイスにアクセスします。

Azure CLI でのデプロイ

デプロイするには、Azure Developer CLI (Functions アプリに推奨) またはAzure CLI (より詳細な制御用) を使用します。

Azure Developer CLI を使用してAzure Functions アプリとしてデプロイする

Azure Developer CLI は、Azure Functions の実装に対して最速のデプロイ エクスペリエンスを提供します。

  1. 複製されたリポジトリに移動します。

    cd function-on-aca-gpu
    
  2. アプリケーションを初期化してデプロイします。

    azd up
    
  3. メッセージが表示されたら、次の値を入力します。

    Prompt 価値
    環境名 一意の名前 (たとえば、 gpufunc-dev) を入力します。
    Azure の場所 [swedencentral] を選択します。
    Azure サブスクリプション サブスクリプションを選択します。

    デプロイには約 15 ~ 20 分かかります。

  4. デプロイが完了したら、出力に表示されるエンドポイント URL を書き留めます。

azd up コマンドは次を作成します。

リソース 目的
リソースグループ すべてのリソースを格納するコンテナー。
Container Apps 環境 GPU ワークロード プロファイルを使用してアプリをホストします。
コンテナー レジストリ カスタム コンテナー イメージを格納します。
ストレージ アカウント Azure Functionsランタイムに必要です。
Application Insights 監視と診断。
Function App イメージ生成 API。

Azure CLIを使用してコンテナー アプリとしてデプロイする

各リソースをより詳細に制御するには、Azure CLIを使用してリソースを個別に作成します。

  1. 環境変数を設定します。

    RESOURCE_GROUP="rg-gpu-image-gen"
    ENVIRONMENT_NAME="cae-gpu-image-gen"
    LOCATION="swedencentral"
    CONTAINER_APP_NAME="ca-image-gen"
    CONTAINER_IMAGE="mcr.microsoft.com/k8se/gpu-quickstart:latest"
    WORKLOAD_PROFILE_NAME="NC8as-T4"
    WORKLOAD_PROFILE_TYPE="Consumption-GPU-NC8as-T4"
    

    これらの変数は、デプロイ全体で使用される構成値を定義します。 WORKLOAD_PROFILE_TYPEは、NVIDIA T4 GPU 構成を指定します。

  2. リソース グループを作成します。

    az group create \
      --name $RESOURCE_GROUP \
      --location $LOCATION \
      --query "properties.provisioningState" \
      --output tsv
    

    このコマンドは、GPU ワークロード プロファイルをサポートするスウェーデン中部にリソース グループを作成します。 出力には、Succeeded が表示されます。

  3. Container Apps 環境を作成します。

    az containerapp env create \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --location $LOCATION \
      --query "properties.provisioningState" \
      --output tsv
    

    このコマンドにより、コンテナー アプリをホストするマネージド環境が作成されます。 出力には、Succeeded が表示されます。

  4. GPU ワークロード プロファイルを環境に追加します。

    az containerapp env workload-profile add \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --workload-profile-type $WORKLOAD_PROFILE_TYPE
    

    このコマンドは、NVIDIA T4 GPU ワークロード プロファイルを環境に追加し、それを使用するコンテナーの GPU コンピューティングを有効にします。

  5. GPU をサポートするコンテナー アプリを作成します。

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_IMAGE \
      --target-port 80 \
      --ingress external \
      --cpu 8.0 \
      --memory 56.0Gi \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --query properties.configuration.ingress.fqdn \
      --output tsv
    

    このコマンドは、コンテナー アプリを作成し、GPU ワークロード プロファイルに割り当てます。 --cpu--memoryの値は、T4 プロファイルの要件と一致します。 このコマンドは、アプリケーションの URL を出力します。

  6. 次のセクションでテスト用の出力 URL をコピーします。 --location $LOCATION
    --query "properties.provisioningState"
    --output tsv

    
    This command creates the managed environment that hosts your container apps. The output should display `Succeeded`.
    
    
  7. GPU ワークロード プロファイルを環境に追加します。

    az containerapp env workload-profile add \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --workload-profile-type $WORKLOAD_PROFILE_TYPE
    

    このコマンドは、NVIDIA T4 GPU ワークロード プロファイルを環境に追加します。 このプロファイルでは、必要なコンテナーに対して GPU コンピューティングが有効になります。

  8. GPU をサポートするコンテナー アプリを作成します。

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $ENVIRONMENT_NAME \
      --image $CONTAINER_IMAGE \
      --target-port 80 \
      --ingress external \
      --cpu 8.0 \
      --memory 56.0Gi \
      --workload-profile-name $WORKLOAD_PROFILE_NAME \
      --query properties.configuration.ingress.fqdn \
      --output tsv
    

    このコマンドは、コンテナー アプリを作成し、GPU ワークロード プロファイルに割り当てます。 --cpu--memoryの値は、T4 プロファイルの要件と一致します。 このコマンドは、アプリケーションの URL を出力します。

  9. 次のセクションでテスト用の出力 URL をコピーします。

イメージ生成 API をテストする

最初の要求は、モデルがダウンロードされ (約 5 GB)、GPU メモリに読み込まれる間に 1 ~ 2 分かかります。 後続の要求は、5 ~ 15 秒で完了します。

アプリケーションが実行されていることを確認する

ブラウザーでアプリケーション URL を開きます。 イメージ生成インターフェイスが表示されます。

UI を使用してイメージを生成する

  1. テキスト フィールドに、次のようなプロンプトを入力します。

    A friendly robot chef cooking pasta in a cozy kitchen, digital art style
    
  2. [ イメージの生成] を選択します

  3. イメージが表示されるまで待ちます。 第 1 世代は、モデルの読み込みのために時間がかかります。

API を使用してイメージを生成する (Functions デプロイ)

Azure Functions バージョンをデプロイした場合は、API を直接呼び出します。

curl -X POST "https://<YOUR-FUNCTION-URL>/api/generate" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A friendly robot chef cooking pasta in a cozy kitchen",
    "num_steps": 25
  }'

<YOUR-FUNCTION-URL> を実際の関数アプリの URL に置き換えます。 num_steps パラメーターは、画質を制御します (値が大きいほど、結果は向上しますが、時間がかかります)。

想定される応答形式:

{
  "success": true,
  "image": "iVBORw0KGgoAAAANSUhEUgAA...(base64 PNG data)..."
}

応答には、デコードして保存できる base64 でエンコードされた PNG イメージが含まれています。

GPU 使用率の監視

監視は、GPU 使用率を理解し、コストを最適化するのに役立ちます。

コンソールで GPU の状態を表示する

  1. Azure portal でコンテナー アプリに移動します。

  2. [ 監視] で、[コンソール] を選択 します

  3. レプリカとコンテナーを選択します。

  4. [ 再接続] を選択し、スタートアップ コマンドとして /bin/bash を選択します。

  5. GPU の状態を表示するには、次のコマンドを実行します。

    nvidia-smi
    

    出力には、GPU メモリ使用量、使用率、実行中のプロセスが表示されます。

Azure Monitor でメトリックを表示する

  1. Azure portal でコンテナー アプリに移動します。

  2. [監視][メトリック] を選びます。

  3. 次のメトリックを追加します。

    • CPU 使用率
    • メモリ使用量
    • レプリカ数

監視の詳細なオプションについては、「 Azure Container Apps の監視」を参照してください。

コールド スタートのパフォーマンスを最適化する

運用ワークロードのコールド スタート時間を短縮するには:

  1. 成果物ストリーミングを有効にして、コンテナー イメージのプルを高速化します。

  2. インスタンスをウォーム状態に保つために、最小レプリカを 1 に設定します。

    az containerapp update \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --min-replicas 1
    

    このコマンドにより、1 つのインスタンスが常に実行され続け、コールド スタートの遅延はなくなりますが、継続的なコストが発生します。

その他の最適化手法については、「 サーバーレス GPU のコールド スタートの向上」を参照してください。

トラブルシューティング

問題点 原因 解決策
"GPU クォータを超えました" エラー GPU クォータが承認されていません。 GPU クォータを要求 し、承認を待ちます。
コンテナーの起動に失敗する イメージの取得がタイムアウトしました。 アーティファクト ストリーミングを有効にするか、より小さい基本イメージを使用します。
最初のリクエストがタイムアウトしました モデルのダウンロードが進行中です。 2 ~ 3 分待ってから再試行します。 この遅延が予想されます。
"CUDA メモリ不足" エラー モデルが GPU メモリを超えています。 バッチ サイズを小さくするか、より小さいモデルバリアントを使用します。
502 無効なゲートウェイ コンテナーの準備ができていません。 コンテナーのログを確認し、正常性プローブが設定されていることを確認してください。
イメージの生成が遅い 推論手順が不十分です。 パラメーター num_steps 大きくします (値が大きいほど品質が向上し、速度が遅くなります)。

デバッグ用のコンテナー ログを表示するには:

az containerapp logs show \
  --name $CONTAINER_APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --follow

このコマンドは、コンテナーからリアルタイム ログをストリーム配信し、スタートアップの問題やランタイム エラーを特定するのに役立ちます。

リソースをクリーンアップする

リソースの使用が完了したら、継続的な料金を回避するためにリソースを削除します。

  1. Azure portal で、 リソース グループを検索します。

  2. 作成したリソース グループ (たとえば、 rg-gpu-image-gen) を選択します。

  3. [リソース グループの削除] を選択します。

  4. 削除を確認するには、リソース グループ名を入力します。

  5. を選択して、を削除します。

Azure Developer CLI を使用してデプロイした場合:

azd down

Azure CLIを使用してデプロイした場合:

az group delete --name $RESOURCE_GROUP --yes --no-wait

削除がバックグラウンドで続行されている間、 --no-wait フラグは直ちに返されます。

次のステップ

GPU 最適化の詳細については、以下を参照してください。