Google Cloud で GPU をかんたんに使う方法の試行錯誤 : Batch 編
以前、GKE や Cloud Run で GPU を使う記事を書きました。
Cloud Run の記事では、実際には Vertex AI の Custom Jobs が良さそうということも書いています。
GPU を手軽に使うとき、他にもよいものがあるのか? をすこし見てみると、Batch もあることを思い出しました。あまり使ったことがなく、さらに GPU を使うとなると使い勝手はどうなのか? と気になったので、今回は実際に試してみたいと思います。
Batch にかかる費用
まずはいつもの重要なポイント、費用 をチェックします。クラウドリソースの料金について確認すると、どのようにすると低コストで運用できるかがわかるのはもちろんのこと、クラウドプロバイダー側でどのように使ってほしいかも透けて見えてきたりするので、しっかり確認しておくことをおすすめします。
Batch を使うことで追加の費用は必要ないそうですが、それを実行するのに消費するクラウドリソースぶんは課金されます。主に、compute (CPU/memory)、networking、disk などのおなじみの要素でしょう。処理に合わせて、必要最低限のものを選択するようにしていけばよさそうです。
※ 費用も大きく変更されることがあります。使用される際には公式の情報を必ず確認してください。
実行方法を調べる
試行錯誤を繰り返すには、web console での操作より gcloud
CLI を使用するのが便利です。Batch job を実行するかんたんなコマンドラインを書いてみましょう。
…と思ったのですが、command reference を見るに、なかなか複雑そうです。GCE VM の spec まで指定しようと思うと項目も多く、REST resource reference を見て書けなどと書かれていてなかなか敷居が高いです。
ということで今回は、web console の便利機能、「画面で設定している内容と同等の機能を実行する際のコマンドラインを取得できるボタン」を使ってみましょう。以下の図のこれ (赤矢印) ですね。

ちなみに上記は新しく job を作成する画面なのですが、project において Batch の API が enable されていないと、一部の項目選択でおかしな状態になってしまう (選択の操作ができない) ようです。こちら でも報告されているように、まだであれば API を enable しておきましょう。
また、gcloud beta
command group を使用するので、以下のようにして install しておきます。(時期によっては必要なくなっているかもしれません)
さて準備ができたので、web console で新しい job を作成する手順に進んでみましょう。適当にこうかなという設定で入力値を埋め、上記した “EQUIVALENT COMMAND LINE” ボタンを押すと、 gcloud
CLI で実行可能なコマンドが得られます。
web console では GPU の指定ができなさそうに見えたので、その部分だけ reference を見て埋めてみます。
以下のように、allocationPolicy.instances[0].policy
に accelerators
を追加すればよいようです。
CPU は最小では e2-micro
から選択できますが、今回は GPU 利用を試したいので、それに対応した N1 シリーズから選択します。
また、VPC network default
をセキュリティなどの理由で削除しているかたもおられると思います。その場合は --network
と --subnetwork
で使用するものを指定する必要があります。
(GPU 使用も network 指定も、web UI ではできなさそうな気がしますが…)
結果、以下のようになりました。
gcloud beta batch jobs submit job-test-2 --location us-central1 \
--network=global/networks/xxxx --subnetwork=regions/us-central1/subnetworks/xxxx-sub1 \
--config - <<EOD
{
"name": "projects/<project_id>/locations/us-central1/jobs/job-m1fven53",
"taskGroups": [
{
"taskCount": "1",
"parallelism": "1",
"taskSpec": {
"computeResource": {
"cpuMilli": "1000",
"memoryMib": "512"
},
"runnables": [
{
"container": {
"imageUri": "docker.io/nvidia/cuda:12.6.1-runtime-ubuntu24.04",
"entrypoint": "nvidia-smi",
"volumes": []
}
}
],
"volumes": []
}
}
],
"allocationPolicy": {
"instances": [
{
"policy": {
"provisioningModel": "SPOT",
"machineType": "n1-standard-1",
"accelerators": [
{
"type": "nvidia-tesla-t4",
"count": 1
}
]
},
"installGpuDrivers": true
}
]
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
EOD
config 部分を heredoc 形式で指定するようになっています。これを file に保存してその path を指定して実行するようにもできます。決まった内容を繰り返し実行するときはそのほうが便利かもしれませんね。また、おなじ内容で yaml 形式でも受け付けるそうです。
ひとつ注意点として、imageUri
への指定は Docker Hub で認証無しで公開されている image であっても、ubuntu:latest
のような簡易的な形式ではエラー (unauthorized: authentication required) になりました。上にあるように、docker.io/
を付与しておく必要があるようです。
実行してみる
上記コマンドを実行すると、以下のような出力が得られます。(長いのでところどころ省略しています)
Job job-test-2-eb87a972-c566-4063-9cb5-870 was successfully submitted.
allocationPolicy:
instances:
- policy:
machineType: n1-standard-1
provisioningModel: SPOT
...
status:
runDuration: 0s
state: QUEUED
...
この時点では queue された状態で、しばらくすると実行が開始されます。以下のように list も取得できます。
❯ gcloud beta batch jobs list
NAME LOCATION STATE
projects/<project_id>/locations/us-central1/jobs/job-test-1 us-central1 FAILED
projects/<project_id>/locations/us-central1/jobs/job-test-2 us-central1 SUCCEEDED
もちろん、web console でも確認できます。log をぱっと確認するにも web のほうが便利かもしれません。
log は以下のようにしても出力できます。(filter 条件はもっとよい方法があるかも…)
❯ gcloud logging read "resource.type=batch.googleapis.com/Job AND resource.labels.job_id=job-test-5-1dc700ef-a929-4c0f-81a0-a30 AND timestamp>2024-09-25" --format="value(textPayload)" --order=asc
[BATCH Docker Installation]: Checking for existing docker installation.
[BATCH Docker Installation]: Found docker with version Docker version 24.0.9, build 3a73fa1f1e4674f08d34ad62a661632641a7d056.
12.6.1-runtime-ubuntu24.04: Pulling from nvidia/cuda
...
GPU drivers successfully installed.
Making the GPU driver installation path executable by re-mounting it.
Enabling NVIDIA persistence mode.
Wed Sep 25 01:05:08 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.90.07 Driver Version: 550.90.07 CUDA Version: 12.4 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 Tesla T4 On | 00000000:00:04.0 Off | 0 |
| N/A 70C P0 29W / 70W | 1MiB / 15360MiB | 9% Default |
| | | N/A |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
...
正常に GPU を認識できていそうです。今回は実際にこれを利用する機械学習タスクなどの実行はしていませんが、ここまで来ていれば後は実行する処理用のプログラムを container image に含めるかまたは GCS を使用したり (GCE) disk を mount するなりして入出力も問題なくできそうに思われます。job が queue されてから実行されるまで 2-3 分待たされる感じはしますが、spot instance も利用可能なようですし、後片付けなどの手間がほとんど無いことを考えると使い勝手はよさそうに感じます。
まとめ
ちょっとコマンドラインの仕様にクセを感じましたが、Batch 自体はこういった単発の実行にとても使い勝手良く、GPU も問題なく利用できそうです。費用やメンテナンス工数など考えて、積極的に選択できそうに感じました。かんたんな処理を定常的に行うなら、Cloud Scheduler などと連携して運用するとお手軽でよさそうですね。
かたや、もうすこし本格的・定常的な機械学習業務となるとモデルなどの周辺連携やフロー管理などを考えて Vertex AI の機能が合いやすくなりそうです。
Troubleshooting
default では default
network が必要
network を指定をしない場合は default
を使用しようとするようで、それが存在しない場合は以下のようなエラーになります。上でも書きましたが、--network
などを指定して実行してください。
❯ gcloud beta batch jobs describe --location=us-central1 job-test-1
...
status:
runDuration: 0s
state: FAILED
statusEvents:
- description: Job state is set from QUEUED to SCHEDULED for job projects/<project_no>/locations/us-central1/jobs/job-test-1.
eventTime: '2024-09-24T08:05:19.327845515Z'
type: STATUS_CHANGED
- description: "Job gets no longer retryable information Batch Error: code - CODE_GCE_RESOURCE_NOT_FOUND,\
\ description - googleapi: Error 404: The resource 'projects/<project_id>/global/networks/default'\
\ was not found, notFound, already retried 3 times, errors record CODE_GCE_RESOURCE_NOT_FOUND."
eventTime: '2024-09-24T08:08:29.117060861Z'
type: OPERATIONAL_INFO
- description: Job state is set from SCHEDULED to SCHEDULED_PENDING_FAILED for job
projects/<project_no>/locations/us-central1/jobs/job-test-1.
eventTime: '2024-09-24T08:08:29.725829320Z'
type: STATUS_CHANGED
- description: Job state is set from SCHEDULED_PENDING_FAILED to FAILED for job
projects/<project_no>/locations/us-central1/jobs/job-test-1.
eventTime: '2024-09-24T08:08:30.141455698Z'
type: STATUS_CHANGED
...