スクエニ ITエンジニア ブログ

Cloud Run で NVIDIA GPU 使うのめっちゃかんたん ...ん?

以前の記事 で、処理を実行している間だけ GPU を専有する (料金を支払う) ために、GKE Autopilot を使用する例を書きました。これにより、新しく job を実行するだけで自動で GPU が割り当てられ、処理が終われば開放される、スケーリングも柔軟… とよい点は多いものの、インフラの用意はじゃっかん手間であったり、cluster の維持費用 ($0.10/h = 月に一万円程度) がかかるなど、残念ながらお手軽とは言えません。

そんな折…

Cloud Run に GPU support が追加された! …けど

なんと、お手軽の代名詞のような Cloud Run で NVIDIA GPU が使えるようになった ということで、preview の現状ではありますが、仕様を確認してみました。

結果、以下の制限が (わたしには特に) 厳しそうに感じました。

  • Cloud Run の CPU always allocated option が必須
  • (当然だが) CPU 割り当て中は GPU も割り当てされる (課金される)
  • NVIDIA L4 GPU のみ (これはきっと拡大していく)

ひとつめですでにオッなるほど!という絶妙な納得感がありますが、これだと GPU を使う application を job として「必要なときだけ実行する」用途には向かなさそうです。

Pricing によると Tier-1 region で NVIDIA L4 が $0.000233 / GPU-second なので、GPU だけで一時間で $0.8388、百円ちょっとでしょうか。(記事作成時点の情報。また、その他に CPU や memory 等の費用も発生します)

ユーザーからのリクエストが絶えずかつ必要なリソース量にバラつきがなく送られてくるような用途であれば、無駄なく使用できそうです。
…が、現在は申請が必要な preview 段階ということもあり、思った使い方ができなさそうなので今回は試しておりません。

Vertex AI の Custom Jobs を試してみる

ハイ以上終わり! …ではアレですので、そしたらこういったニーズ (単発で GPU を使う job 実行) にはどう対処すればいいのか? について、本来これっぽいかなと思われる Vertex AI の Custom Jobs を試してみます。

gcloud ai custom-jobs create --display-name=test-gpu-1 --region=us-central1 \
  --worker-pool-spec=machine-type=g2-standard-4,accelerator-type=NVIDIA_L4,accelerator-count=1,replica-count=1,container-image-uri=nvidia/cuda:12.6.0-runtime-ubuntu24.04 \
  --command='nvidia-smi'

前回は nvidia/cuda:12.2.0-runtime-ubuntu22.04 を使いましたが、時間も経っていますので今回は nvidia/cuda:12.6.0-runtime-ubuntu24.04 に更新しました。

GPU は、Cloud Run で使えるものに合わせて NVIDIA L4 を使用してみます。machine type との組み合わせが限定されていて、 こちら で確認することができます。 g2-standard-4 にはひとつつけて起動できるようです。

実行する command は、芸がなく申し訳ないですがいつもの nvidia-smi です。

スペックと一時間ごとの費用は us-central1 region で以下のとおりです (記事作成時点の情報。また、その他に disk 等の費用も発生します)。

Machine type GPUs vCPUs Memory On-demand price (USD)
g2-standard-4 1 4 16 GB $0.706832

さて、上記のコマンドで Custom Job を実行し、 describe で状態を見てみます。

❯ gcloud ai custom-jobs describe projects/<project-id>/locations/us-central1/customJobs/<job-id>
Using endpoint [https://us-central1-aiplatform.googleapis.com/]
createTime: '2024-08-29T08:30:00.060820Z'
displayName: test-gpu-1
jobSpec:
  workerPoolSpecs:
  - containerSpec:
      command:
      - nvidia-smi
      imageUri: nvidia/cuda:12.6.0-runtime-ubuntu24.04
    diskSpec:
      bootDiskSizeGb: 100
      bootDiskType: pd-ssd
    machineSpec:
      acceleratorCount: 1
      acceleratorType: NVIDIA_L4
      machineType: g2-standard-4
    replicaCount: '1'
name: projects/<project-id>/locations/us-central1/customJobs/<job-id>
startTime: '2024-08-29T08:30:16.603843Z'
state: JOB_STATE_PENDING
updateTime: '2024-08-29T08:31:25.275337Z'

stream-logs で log を流しながら見ることができます。便利。

❯ gcloud ai custom-jobs stream-logs projects/<project-id>/locations/us-central1/customJobs/<job-id>
Using endpoint [https://us-central1-aiplatform.googleapis.com/]
INFO	2024-08-29 17:30:16 +0900	service	Waiting for job to be provisioned.
INFO	2024-08-29 17:36:52 +0900	service	Waiting for training program to start.
INFO	2024-08-29 17:36:57 +0900	service	Job is preparing.
INFO	2024-08-29 17:38:49 +0900	service	Job is running.
INFO	2024-08-29 17:38:50 +0900	service	Tearing down training program.
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	Thu Aug 29 08:38:45 2024
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	+-----------------------------------------------------------------------------------------+
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	| NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4     |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|-----------------------------------------+------------------------+----------------------+
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|                                         |                        |               MIG M. |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|=========================================+========================+======================|
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|   0  NVIDIA L4                      Off |   00000000:00:03.0 Off |                    0 |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	| N/A   49C    P8             12W /   72W |       1MiB /  23034MiB |      0%      Default |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|                                         |                        |                  N/A |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	+-----------------------------------------+------------------------+----------------------+
INFO	2024-08-29 17:39:24 +0900	workerpool0-0
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	+-----------------------------------------------------------------------------------------+
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	| Processes:                                                                              |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|        ID   ID                                                               Usage      |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|=========================================================================================|
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	|  No running processes found                                                             |
INFO	2024-08-29 17:39:24 +0900	workerpool0-0	+-----------------------------------------------------------------------------------------+

Pending の時間が長く、 Finished になるまで 10 分近くかかりました。使用した container image も大きい (Docker Hub の compressed size 表記で 1.37 GB) ですが、どこに最も時間がかかっているのか・何度試してもおなじくらいかかるか等は見れていません。一応二回だけ試しましたが、二度目もおなじような時間がかかりました。
しかし、これはお手軽です。外からの接続が不要でただ処理を実行したいだけならいちばん便利かもしれません。

以下のようにして job の一覧を表示したり、実行中の job の cancel ができるようです。

gcloud ai custom-jobs list --region=us-central1
gcloud ai custom-jobs cancel <job-id> --region=us-central1

web console では Vertex AI > Training > Custom Jobs と進むと同様の情報が得られます。

一応、次の日に確認した billing の情報 (抜粋) を載せておきます。費用がかかっていませんが、このような項目で課金されるらしいというご参考までに。Pricing のページの説明通りですね。

SKU Service SKU ID Usage Cost
Vertex AI: Training/Pipelines on Nvidia L4 GPU running in Americas Vertex AI 37AD-572D-B2EC 0 GPU hours $0.00
Vertex AI: Training/Pipelines on G2 Instance Core running in Americas Vertex AI 976E-BCA3-15EF 0 Core hours $0.00
Vertex AI: Training/Pipelines on G2 Instance Ram running in Americas Vertex AI 74D0-9075-AB7B 0 GB hours $0.00
Vertex AI: Training/Pipelines on SSD backed PD Capacity Vertex AI A005-98FE-36CC 0 GB months $0.00

他クラウドではどうなのか?

Google Cloud 以外の cloud service provider で、かんたんに使いたいぶんだけ GPU を使える container app サービスが有るかを調べたところ、Azure の Container Apps では可能そう でした。しかし、A100 GPU しか書いてなくて選択肢は少なさそうです。スケーリングにより使用していないときはインスタンス数をゼロにもできるようですが、詳しい条件は調べられませんでした。

他も少し見て回りましたがこれといったものは見つけられていません。今後もこのあたりは機能が拡充されていくと思うので、時々調べつつできれば試したりしてみたいと思います。

まとめ

Cloud Run でお手軽に、とはいきませんでしたが、代わりに Vertex AI の Custom Jobs がお手軽に GPU を扱うのに便利ということが確認できました。運用してみたときの利便性までは確認できていませんが、Vertex AI Pipelines との連携で複雑な処理にも対応できそうですので、用途に合いそうなときには積極的に検討したいと思います。

参考

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!