フルマネージドのサーバレスコンテナサービスである Azure Container Apps で、Transformersの言語モデルを動かしてみました。
なお本稿は以前Google Cloud Runを使って書いた記事のAzure版です。Cloud Runに似たサービスであるAzure Container Appsで、同様のことをしてみました。
環境
- Docker version 20.10.17, build dea9396
- Docker Compose version v2.6.1
- Azure CLI 2.40.0
2022年10月15日時点の情報に基づいています。
ローカルでアプリケーションの構築
Cloud Runの時と同様に、適当なPromptを入れたらGPTで続きを書いてくれるアプリケーションを構築します。モデルには3700万パラメータの言語モデルであるrinna/japanese-gpt2-xsmallを使います。
実際に使ったソースコードは下記になります。
これはCloud Run用に開発したものとソースコードは全く同一のままで、一行も書き換えていません。Cloud Run特有の設定が少しだけ入っていますが、そのままにしておいてもAzure Container Appsで動作します。
cloneしたら$ docker compose up
して localhost:8000 にアクセスし、正常に動作することを確認しておきましょう。
適当なpromptを入れると、無事に続きが出力されます。
Azure Container Appsへのデプロイ
Azure Container Appsへデプロイしてみます。
コンテナレジストリ
今回は、Docker Hub のプライベートリポジトリに予めイメージを登録しておいて、Azure Container Appsにデプロイしてみます。
Azureには Azure Container Registry があります。
これを使うとよりシンプルにデプロイできますが、価格が1日24円~とちょっと趣味で使うには高額な印象です。
今回は別のレジストリとしてDocker Hubを利用します。パスワード認証でpullできるコンテナレジストリであればおそらく何でも使えると思います。
先程のアプリケーションをDocker Hubのプライベートリポジトリにビルドして上げておきます。
Azureへのデプロイ
Azure CLIを使って構築していきます。Azure CLIが使えて$ az login
しているならどこでもいいですが、今回はAzureポータルのCloud Shellを使います。
だいたい下記の手順に沿ってデプロイします。
まずは変数を登録しておきます。
LOCATION="japaneast"
RESOURCE_GROUP="sample-gpt-container"
CONTAINERAPPS_ENVIRONMENT="sample-gpt-container-environment"
CONTAINERAPPS_NAME="sample-gpt-container-app"
CONTAINER_IMAGE_NAME=registry.hub.docker.com/s2terminal/gpt-container
REGISTRY_SERVER=registry.hub.docker.com
REGISTRY_USERNAME=<REGISTRY_USERNAME>
REGISTRY_PASSWORD=<REGISTRY_PASSWORD>
-
LOCATION
は日本ならjapaneast
(japanwest
はまだContainer Appsが非対応) -
RESOURCE_GROUP
,CONTAINERAPPS_ENVIRONMENT
,CONTAINERAPPS_NAME
は好きな名前をつける -
CONTAINER_IMAGE_NAME
,REGISTRY_SERVER
は登録してあるコンテナレジストリに応じて変更
まずAzureのリソースグループを構築します。
$ az group create \
--name $RESOURCE_GROUP \
--location $LOCATION
Azure Container Apps 環境を構築します。
$ az containerapp env create \
--name $CONTAINERAPPS_ENVIRONMENT \
--resource-group $RESOURCE_GROUP \
--location $LOCATION
Azure Container Apps を構築します。
$ az containerapp create \
--name $CONTAINERAPPS_NAME \
--resource-group $RESOURCE_GROUP \
--image $CONTAINER_IMAGE_NAME \
--environment $CONTAINERAPPS_ENVIRONMENT \
--registry-server $REGISTRY_SERVER \
--registry-username $REGISTRY_USERNAME \
--registry-password $REGISTRY_PASSWORD \
--ingress external \
--target-port 8000 \
--min-replicas 0 \
--max-replicas 1 \
--env-vars PORT=8000
今回構築したアプリケーションはGoogle Cloud Run用にPORT
環境変数を受け取ったポートを受け付ける設定になっていますので、ここでは--env-vars PORT=8000
で設定しています。
無事に構築完了すると、latestRevisionFqdn
に構築されたアプリケーションにアクセスできるドメインが出力されます。Azureポータルの「コンテナーアプリ」→「概要」→「アプリケーションURL」からも確認できます。
URLにブラウザでアクセスし、適当な入力をして続きが出力されたら成功です。
簡単ですね。
「コンテナーアプリ」→「メトリック」から、起動中のアプリの様子を確認できます。「Replica Count」と「Requests」を表示してみましょう。
アクセスをしなくなってから数分後、レプリカ数がゼロになっているのが確認できました。Azure Container Appsはレプリカ数がゼロにスケールインすると利用料金が発生しなくなります。そうでなくても無料枠があるので、趣味で触る程度なら非常に低価格で利用できると思います。
Azure Container Appsのスペック
今回Azure Container Appsにメモリ・CPUを指定せずにデプロイしましたが、デフォルトで 0.5コア/1GiB になっていました。
Azure Container Appsのメモリは現時点で最大4.0Giです。特定のCPU/メモリの組み合わせである必要があります。今回はrinna/japanese-gpt2-xsmallという比較的小さめなモデルを使いましたが、より大きなモデルを動かすにはちょっと心細いスペックです。
Google Cloud Runでは最大32GiBまで使えるので、これはAzureの今後のアップデートに期待です。
まとめ
GPTの言語モデルをAzure Container Appsにデプロイできました。サーバレスプラットフォームで動かせるのが、当たり前になりつつあります。今後もう少しスペックが上げられたり、GPUが割り当てられるようになれば、十分使えるようになると思います。