GCPでGPU借りてKaggle環境構築

# はじめに
こんにちは、私は国立大学院生で、現在は研究で3Dセンサを用いた物体認識をしています。普段はありがたいことに研究室にGPUを4台積んだサーバPCがあり、ローカルで深層学習をすることができます。なのでクラウド環境を研究で使うことはないのですが、ふとクラウド環境でGPU使った学習をするときはどのように設定すればいいんだろうと思い、今回は`Google Cloud`でkaggleコンペに取り組める環境を０から構築しました。

## 本記事の流れ
1. GCP側でGPUが入ったインスタンスを作成
2. SSH接続してローカル(VSCode)で作業できるようにする。

## 参考記事
基本的にこちらの記事を参考に環境をつくらせていただきました。

https://qiita.com/kyotoman/items/af838f7adf84f8de0f3c

## GCPでGPUが入ったインスタンスを作成
ここからはGCPに登録していて、プロジェクトを作っている前提で進めていきます。まだプロジェクトを作っていない人は新規プロジェクトを作成しておいてください。

### 1. VMインスタンスを作成
左上のナビゲーションメニューから`Computer Engine` -> `VMインスタンス`に遷移し、インスタンス作成ボタンを押してください。


![スクリーンショット 2025-03-06 3.12.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/f01e628d-4815-4421-bc6a-0ffddc97f051.png)

そうすると上のような画面が開くと思います。`GPU`を選択して所望のGPUのタイプ、GPUの数を選んでください。
今回は簡単のため、一旦以下の設定にしています。ご自身のタスクに応じた設定にしてください。

| 構成要素 | 選択 |
|:-:|:-:|
| GPU  | NVIDIA T4  |
|  リージョン | 東京  |
|  VMプロヴィジョニングモデル(高度な構成) | スポット  |
|  メモリ | ハイメモリ  |

:::note warn
メモリはCPUメモリのことです。標準(1コア4GB)だとモデルのロードすらできずプロセスが強制終了します。4コア16GB以上を選択しておきましょう。
:::


続いて、左側のOSとストレージ設定を押して、インスタンスのOSとストレージを決める画面が出てきます。

![スクリーンショット 2025-03-06 3.13.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/479eef0d-c20c-4048-b5be-420cac716076.png)

今回は以下の設定です。ストレージは200GB程度にしておくと、後述のKaggle環境のDockerイメージを引っ張るのに十分です。

| 構成要素 | 選択 |
|:-:|:-:|
|  OS | Ubuntu 20.04  |
|  サイズ | 200GB  |

ここまで設定したら`作成`を押しましょう。

### GPU割当上限の設定
VMインスタンスを作成すると、以下のようなエラーマークが出ると思います。これはGPUの利用上限がデフォルトでは0なので、インスタンスを作成できないというエラーです。

![スクリーンショット 2025-03-06 3.37.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/e5f8bf3f-acd5-4f36-baf2-fa127c118e99.png)

エラーマークをクリックして割り当てリクエストを行い、自身の設定したGPU数以上をリクエストしましょう。

:::note
体感10分以内にはGoogleから承認メールが届くと思います。しかし、GCP上での反映には少し時間がかかる場合もあるので、承認されたのにインスタンスが起動されていないという場合はしばらく待って開いてみてください。
:::

## ローカル(VSCode)からGPUインスタンスに接続し、AIをフル活用
ここからは、ローカルでGPUインスタンスに接続し、VSCodeで直感的に機械学習する設定をしていきます。

### 1. ローカルでSSHキーを作成
以下のコマンドでローカルにSSHキーを作成します。

・`KEY_FILENAME` ・・・自分がわかりやすい名前
・`-C`・・・コメント、gcpに登録しているメールアドレスを入力しておく。
```shell
ssh-keygen -t ed25519 -f ~/.ssh/KEY_FILENAME -C "your_email@example.com"
```
すると、秘密鍵`KEY_FILENAME`と公開鍵`KEY_FILENAME.pub`が~/.sshの配下に作成されていると思います。


次に公開鍵をGCPに登録するので、catコマンドで公開鍵情報を確認してください。
私の場合は以下のようになっています。このssh~から最後までをコピペしておいてください。

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/ac835db9-a954-411a-b483-681a4061f11e.png)

### 2. GCPインスタンスに公開鍵を設定
先ほどの公開鍵を作成したインスタンスに登録します。VMインスタンス -> 編集 -> SSH認証鍵で、項目を追加します。設定は
```sh
ssh-ed25519 AA**************K USERNAME
```
です。追加したら設定を反映させてください。`USERNAME`の部分は登録しているGmailアドレスの@の前まででいいはずです。
[(参考)VMにSSH認証鍵を追加](https://cloud.google.com/compute/docs/connect/add-ssh-keys?hl=ja)

### 3. ローカルのSSH-設定
ローカルの`~/.ssh/config`に以下を追加しましょう。Hostの名前は個人で分かりやすいように変更してください。

・`HostName` ・・・VMインスタンスの外部IP
・`User`・・・VMインスタンスのユーザ名。基本的に登録メールアドレスの@前までだと思います。
・`IdentityFile`・・・先ほど作成した秘密鍵のパス

```config
Host gcp-gpu
    HostName xxx.xxx.xx.xx
    User hoge
    Port 22
    IdentityFile ~/.ssh/[秘密鍵ファイル名]
```

ここまでできたらターミナルで
```sh
ssh gcp-gpu
```
を実行すると、GCPインスタンスに接続できるはずです。

### 4. VSCodeの設定

VSCodeにはssh接続やコンテナ接続に便利な拡張機能があります。
それがこちらです。

![スクリーンショット 2025-03-06 16.35.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/fe318a73-8b14-4829-8141-38d860bdb62b.png)

これをインストールするとサイドバーにPCウィンドウのようなものが現れます。開くと、自身が設定したホストが表示されます。(私は趣味で色々いじっているのでたくさんあります。。。)


![スクリーンショット 2025-03-06 16.43.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/b4eee99f-49fa-4ee3-a37b-e55b11134a6e.png)

GCPのホストを選択して起動し、ウィンドウ左下が画像のようになっていればVSCodeからの接続完了です。
最後は、Dockerを使って最速でGPUを使えるようにしましょう。

![スクリーンショット 2025-03-06 17.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/9a78faa7-62c0-44b7-a10a-55813aa5fb6d.png)

## Kaggle環境をDocker構築

最後にKaggle環境の構築です。せっかくGPUを借りたのでGPUを使えるようにする必要はありますが、ドライバインストールしてCUDAとcudnnインストールしてと、普通はかなり手間がかかります。Dockerを使うと幾分かマシになるので今回はその方法を説明します。

### 1. NVIDIAドライバーのインストール

今回はこちらのコマンドでインストールしました。

```sh
sudo apt update
sudo apt install -y nvidia-driver-535
```
`nvidia-smi`を実行して、GPU情報が表示されたらOKです。

### 2. Dockerのインストール

```sh
curl https://get.docker.com | sh
systemctl start docker && sudo systemctl enable docker
```

### 3. NVIDIA Container Toolkitのインストール

NVIDIA Container Toolkitのインストール方法は以下に記載されています。
InstallationとConfigurationまで手順に従ってください。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

ここまででDockerでGPUを使える準備が整いました！次にKaggle公式のDocker ImageをPullします。

### 4. Kaggleイメージのビルド

```sh
docker pull gcr.io/kaggle-gpu-images/python:latest
```

少し時間がかかります。Pullできたら、コンテナを起動しましょう。
`ENV_NAME`はわかりやすい名前に適宜してください。私は` kaggle-gpu-container`としました。

```sh
docker run --gpus all -itd --rm -v /home:/home --name ENV_NAME gcr.io/kaggle-gpu-images/python /bin/bash
```

問題なく立ち上がれば、あとはVSCodeからコンテナに接続するだけです！

### 5. VSCodeからコンテナ接続

前項で説明したように、VSCodeでVMインスタンスに接続した状態では以下のような画面になっていると思われます。
この状態で黄色い部分をクリックしてください。

![スクリーンショット 2025-03-06 17.22.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/9a78faa7-62c0-44b7-a10a-55813aa5fb6d.png)

そうすると`実行中のコンテナにアタッチ`というメニューがあります。そこをクリックすると、先ほど起動したコンテナを選択できるはずなので、そちらを選択すると、VSCodeからコンテナ環境に接続できます。
VSCodeのGUIでファイルを作ったり、スクリプト編集ができ、かつKaggleのPython環境が備わっているので、インタプリタを設定すればちゃんとハイライトもつきます。

:::note warn
VSCodeで接続したコンテナには当然ローカルの拡張機能は存在しません。PythonやJupyter、フォーマッタ系の拡張機能は適宜インストールしてください。
:::

![スクリーンショット 2025-03-06 17.54.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629034/47857a91-6e88-40c1-ba0e-4d570b6112eb.png)

cudaもしっかり認識しているので問題なさそうですね！

## おわりに
今回はGCPでGPUインスタンスを借りてKaggle環境構築するやり方を説明しました。
GCPは$300程度の無料クレジットがあるので、これからなるべく使い回していこうと思います。参考にされる方は、くれぐれも高額請求にならないように支払いアラートを設定しておいてください。