2
0

More than 1 year has passed since last update.

3700万パラメータの GPT モデルを Azure Container Apps で動かす

Last updated at Posted at 2022-10-15

フルマネージドのサーバレスコンテナサービスである 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 にアクセスし、正常に動作することを確認しておきましょう。

image.png

適当な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 は日本ならjapaneastjapanwestはまだ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」からも確認できます。

image.png

URLにブラウザでアクセスし、適当な入力をして続きが出力されたら成功です。

image.png

簡単ですね。

「コンテナーアプリ」→「メトリック」から、起動中のアプリの様子を確認できます。「Replica Count」と「Requests」を表示してみましょう。

image.png

アクセスをしなくなってから数分後、レプリカ数がゼロになっているのが確認できました。Azure Container Appsはレプリカ数がゼロにスケールインすると利用料金が発生しなくなります。そうでなくても無料枠があるので、趣味で触る程度なら非常に低価格で利用できると思います。

Azure Container Appsのスペック

今回Azure Container Appsにメモリ・CPUを指定せずにデプロイしましたが、デフォルトで 0.5コア/1GiB になっていました。

image.png

Azure Container Appsのメモリは現時点で最大4.0Giです。特定のCPU/メモリの組み合わせである必要があります。今回はrinna/japanese-gpt2-xsmallという比較的小さめなモデルを使いましたが、より大きなモデルを動かすにはちょっと心細いスペックです。
Google Cloud Runでは最大32GiBまで使えるので、これはAzureの今後のアップデートに期待です。

まとめ

GPTの言語モデルをAzure Container Appsにデプロイできました。サーバレスプラットフォームで動かせるのが、当たり前になりつつあります。今後もう少しスペックが上げられたり、GPUが割り当てられるようになれば、十分使えるようになると思います。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0