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 との連携で複雑な処理にも対応できそうですので、用途に合いそうなときには積極的に検討したいと思います。
参考
- Cloud RunでGPUを使用する | G-gen Tech Blog
- 条件や費用について詳しく説明されています。
- Run your AI inference applications on Cloud Run with NVIDIA GPUs
- 機能の概要から、Ollama を使ったサンプルアプリケーションの deploy も紹介されています。
- GKE で GPU 使うのめっちゃ簡単
- 以前の記事 でも引用しました。GKE Autopilot で GPU を使うのも引き続きおすすめです。