Azure Container Apps Serverless GPU を試す！

先日の MICROSOFT IGNITE 2024 でも発表がありました、 **Azure Container Apps Serverless GPU（パブリックプレビュー）** を試してみたので記事にします。

https://techcommunity.microsoft.com/blog/AppsonAzureBlog/introducing-serverless-gpus-on-azure-container-apps/4288571

試した内容は、公式ドキュメントのチュートリアルをベースになぞっただけですが、私の環境ではもともとサブスクリプションにAzure Container Apps Serverless GPU を利用するためのクォータがなかったため、クォータの引き上げ方法についても後半ふれています。なお、クォータ引き上げについて執筆時点でパブリックプレビューでもあることから、一部はまりポイントがありますので現時点でのワークアラウンドも踏まえて解説していきます。

:::note info
**注意**
Azure Container Apps Serverless GPU は執筆時点(2024/12/16)ではパブリックプレビューとなりますので運用環境でのご利用などご注意ください。
:::

## 0.はじめに
https://learn.microsoft.com/ja-jp/azure/container-apps/gpu-serverless-overview

Azure Container Apps Serverless GPU（パブリックプレビュー）とは、
従来はGPUを利用する場合、専用プランのプロファイルを利用する形で、利用に関わらず料金が発生する形でしたが、Serverless GPUを利用することで、利用している分だけ課金ということができるようになりました。これにより、利用していない時間はGPUノードをゼロスケールすることができるようになりGPUの利用コストをより節約できるようになりました。


## 1.前提条件
Azure Container Apps Serverless GPU（パブリックプレビュー）を利用するためには、サブスクリプションでGPU利用のクォータが必要となります。
執筆時点（パブリックプレビュー）では、`US West3` ならびに、 `Australia East` リージョンでのみ Azure Container Apps Serverless GPU を利用いただけます。
また、利用可能な GPU は以下の2種類となりますので、利用予定のリージョンにて利用種類に沿ったクォータの条件を満たしているかご確認ください。

以下の方法でクォータの条件を満たしているか事前に確認します。
もしも条件を満たしていない場合は、本記事後半クォータの申請方法を参考にしてください。

[クォータ] - [Azure Container Apps]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/2d8daf1d-83ff-3951-805a-e12fa22e2f9b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/ba1da9b9-d7a7-0448-f0e3-f87a4739ec1f.png)

リージョンにて、現在パブリックプレビューが利用可能な「Australia East」または[US WEST3]を選択してフィルタリング適用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/305919dc-60d9-05d6-e4a8-1340e69880fa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/68822d43-13a8-f144-8ff5-7cc7832f4ace.png)

さらに[Subscription Consumption]で検索し
利用したいリージョンおよびGPUの種類についてサブスクリプションにクォータが割り当てられていること確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/5ff00712-ca1e-dd7c-68c2-b0c0198fd1eb.png)

## 2.デプロイ
https://learn.microsoft.com/ja-jp/azure/container-apps/gpu-image-generation

クォータの条件を満たしている、「Australia East」リージョンにて、こちらの公式ドキュメントをベースにAzure Container Apps Serverless GPUの環境をデプロイしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/e13730b5-4991-6702-1201-98b960106277.png)

* **基本**タブ
    * リージョン：`Australia East`
    * 展開元：`コンテナイメージ`
    * Container Apps 環境：新規作成
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/0ec91ead-a05d-8ad6-3570-23fb97922a24.png)

* **Container Apps 環境**新規作成
    * 名前以外すべてデフォルト値
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/109016fa-b9f7-61d3-4ec2-e4d7766a4886.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/bbcfcd3a-c07b-6b79-7fa6-0acd4332a1f4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/401af709-8194-d719-7f9d-8b59ee69c433.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/51b94e19-d036-b9ea-911b-ba93ca7f60ec.png)

* **コンテナー**タブ
    * イメージ ソース：`Docker Hub またはその他のレジストリ`
    * 画像の種類：`パブリック`
    * レジストリ ログイン サーバー：`mcr.microsoft.com`
    * イメージとタグ：`k8se/gpu-quickstart:latest`
    * ワークロード プロファイル：`Consumption - 最大４個のvCPU、8Gibのメモリ`
    * GPU	[] チェックボックス：チェック
    * GPU の種類：`Consumption-GPU-NC8as-T4 - 最大8個のvCPU、56Gibのメモリ`
    
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/ab4cddce-51be-071c-b700-e84198c17ff3.png)

* **イングレス**タブ
    * イングレス：有効にチェック
    * イングレス トラフィック：`どこからでもトラフィックを受け入れます`
    * ターゲット ポート：`80`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/d196b8c1-8a8c-fd94-e717-612955496645.png)

* **確認と作成**タブ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/4ff2f9c5-8a6f-ed7c-b0d3-095ddd5dc03e.png)

`作成`ボタンを押下して正常にデプロイできることを確認します。
なお、「ドキュメントには最大５分かかることがあります」とありますが、短いときは数分ですが長いときは10分ほどかかりました。

デプロイが完了したらリソースへ移動し、無駄にコストが発生しないように以下設定によりアクセスを制限します。
* [イングレス]メニューより
    * **IP制限**
        * IP セキュリティ制限モード： `以下で構成されたIPからのトラフィックを許可し、他のすべてのトラフィックを拒否します`を選択
        * `+追加`より、自分のPCのグローバルIPアドレス（例えば https://ifconfig.me などで確認）と名前`mypc`登録して、自分以外のアクセスを拒否する設定を追加し`保存`します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/d3ec3d71-49dc-5857-78a7-3bf693b7d501.png)

## 3.GPUの確認
コンソールより、nvidiaのコマンドを入力して、GPU の状態と出力を確認します。
* コンソールから[再接続] を選択し、[スタートアップ コマンドの選択] ウィンドウで、[/bin/bash] を選択し、[接続] を選択します。
シェルの設定が完了したら、コマンド `nvidia-smi` を入力して、GPU の状態と出力を確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/128ebac5-6421-1a9c-96d1-262d2b69f4b9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/ca38416a-6077-2671-4de3-f845305a33d0.png)

以上で Azure Container Apps Serverless GPU の利用が確認できました！
不要な場合はここでリソースを削除します。

:::note info
**ヒント**
`このリビジョンは 0 にスケーリングされています。`と表示される場合
レプリカがZeroスケールしていてコンソールより接続可能なレプリカが存在しない場合は、Container Apps のエンドポイントへブラウザよりアクセスし、レプリカを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/b94ad5de-c040-ecf9-ea43-f349affa08d8.png)
:::

## 4.クォータ申請方法
前提条件の通り Azure Container Apps Serverless GPU を利用するために、執筆時点（パブリックプレビュー）では、`US West3` または `Australia East` リージョンにて以下いずれかのクォータが必要となります。
* T4 を利用する場合
    * Consumption-GPU-NC8as-T4
        * クォータ名：Subscription Consumption T 4 Gpus
* A100 を利用する場合
    * Consumption-GPU-NC24-A100
        * クォータ名：Subscription Consumption NCA 100 Gpus

ただし、クォータの引き上げ申請について、執筆時点（パブリックプレビュー）では、以下のとおり[クォータの種類]として`Container Apps`を指定したクォータ申請画面では、まだServerless GPU用の新しいクォータの選択肢がポータルに反映されていない状況です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/e46b396a-0437-fc1d-96ca-a6e048276d49.png)

調整の要求（オペレーターアイコン）より、新しいサポートリクエスト（SR）を起票します。
* クォータの種類： `Container Apps`を選択し、次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/cc50b372-be26-0b89-d92e-91c508fa8694.png)

* 要求の詳細: `詳細を入力`より`クォータの種類`を選択しますが、執筆時点では、`Consumption-GPU`関連の新しいクォータの種類をPortalから選択することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/2f5c050a-4a05-23b2-1733-70230fa9f005.png)

そのため、Portalから`Consumption-GPU`関連の新しいクォータの種類を選択できようになるまでの一時的な対処方法として、以下の通りクォータの種類について`その他の要求`を選択して、必要情報を記載の上サポートリクエスト（SR）にて申請を行います。

:::note warn
**注意**
SRにて確認したところ、まだPortal画面が対応していないため、暫定的な対応として、以下の対応にて申請可能とのことです。ただし、あくまでワークアラウンドとなりますので、Portal画面から正規申請可能になった場合は、以下の`その他の要求`ではなく、正規の方法`Container Apps`にて申請を行ってください。 
> ContainerAppsクォータの正規申請方法は、「問題の種類」にて「サービスとサブスクリプションの制限（クォータ）」、「クォータの種類」にて「Container Apps」を選択いただく方法となりますが、新しいクォータの選択肢がまだポータルに反映されていない状況となります。（ポータルに反映された後は上記正規申請方法が正規申請方法となります。）
そのため、現段階で正規申請方法はございませんため、ご認識いただいていますようなクォータの種類：その他の要求にて、下記詳細情報を記入いただく方法が可能な申請手段になるかと存じます。
ContainerAppクォータ要求
リージョン: 
SubscriptionID: 
クォータタイプ: Consumption-GPU-NC8as-T4 or Consumption-GPU-NC24-A100
引き上げ後の上限値: NN
ご要求理由・背景情報：

:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/b8ef1cb2-a018-432b-a583-41d4e4d3f49d.png)

* **問題の詳細**
    * **説明**: 以下必要事項を記入の上、リクエスト
        * ContainerAppクォータ要求
            * リージョン: 
            * SubscriptionID: 
            * クォータタイプ: Consumption-GPU-NC8as-T4 or Consumption-GPU-NC24-A100
            * 引き上げ後の上限値: NN
            * ご要求理由・背景情報：
        
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117986/60576b6d-7ad8-dadd-090b-d78755e4586d.png)

## 5.まとめ
Azure Container Apps Serverless GPUがパブリックプレビューとなりました。
現時点では、利用可能なリージョンが限られており、クォータ申請時の注意事項等もありますが、 このServerless GPUを利用することで、利用している分だけ課金ということができるようになります。利用していない時間はGPUノードをゼロスケールすることができるようになり、GPUの利用コストをより節約できるようになりますので、みなさんもぜひ活用を検討してみてください。

以上です。

---