概要
- kaggle公式dockerイメージを使ってGoogle Compute EngineにGPU分析環境を構築
- 外部IPなしでインターネットに接続可能で、権限をもつGoogleアカウントのみインスタンスに接続可能になるように設定
- VSCodeからインスタンス内のコンテナに接続
アカウント設定
Google Cloud SDKのインストール
ローカルにGoogle Cloud SDKをインストールしていない場合は、下記の手順に従ってインストールします。
インストール完了後、ローカルで下記を実行しGoogleカウントでログインすることで認証します。
gcloud init
Compute Engine APIの有効化
インスタンスを作成するプロジェクトでコンソールからCompute Engine APIを有効化していない場合は有効にします。
有料の請求先アカウントにアップグレード
有料の請求先アカウントにアップグレードしていないとGPUを割り当てることができないため、無料トライアル中で請求先未設定の場合はアップグレードしておきます。
GPU割り当て上限の変更
GPUの割り当ての上限設定をしていない場合は「IAMと管理」>「割り当て」からGPUの割り当て数を変更します。
「指標: compute.googleapis.com/gpus_all_regions」でフィルタを掛けて、GPUs(all regions)の上限を割り当てるGPU数以上に変更します。
1以上の任意の数に設定し、使用目的を記載します。1分ほどで承認完了のメールがくるはずです。
ネットワーク設定
VPCネットワークとサブネットの作成
「VPCネットワーク」>「VPCネットワーク」>「VPCネットワークを作成」からVPCネットワークを作成します。
リージョン
リージョンはインスタンスを作成するリージョンと一致している必要があります。
IPアドレス範囲
内部IPの割り当て範囲を「192.168.1.0/24」に設定します。
ファイアウォールルールの作成
「VPCネットワーク」>「ファイアウォール」>「ファイアウォールルールを作成」からファイアウォールルールを作成します。
ネットワーク
先ほど作成したVPCネットワークを指定します。
トラフィックの方向
「上り」に設定します。
一致したときのアクション
「許可」に設定します。
ターゲット
「ネットワーク上のすべてのインスタンス」に設定します。
IPアドレス範囲
「35.235.240.0/20」に設定することで、Cloud IAP経由のアクセスのみ許可します。
プロトコルとポート
「TCP」にチェックを入れ、「22」番ポートを指定します。
Cloud Routerを使用したNAT構成の作成
「ネットワークサービス」>「Cloud NAT」からCloud Routerを作成します。
ネットワーク
先ほど作成したVPCネットワークを指定します。
リージョン
リージョンはインスタンスを作成するリージョンと一致している必要があります。
Cloud Router
新規のCloud-routerを作成して指定します。
(補足)インスタンスのIAP SSH権限の設定
「セキュリティ」>「Identity-Aware Proxy」>(プロジェクトを選択)>「SSH と TCP のリソース」からインスタンスを選択、「プリンシパルを追加」からCloud IAPの「IAP-secured Tunnel User」のロールを付与することで、権限を設定することができます。
インスタンス設定
インスタンスの作成
「Compute Engine」>「Marketplace」の「Deep Learning VM」からインスタンスを作成します。
Deployment name
{Deployment name}-vmがインスタンス名となります。
ここではkaggle-gpuという名称にします。
Zone
Zoneによって使用できるGPUや料金が異なります。
デフォルト値のus-west1-bが最も安価なZoneの1つであるため、ここではus-west1-bを指定します。
Machine Type
必要に合わせてCPU, メモリ, GPUの設定を変更してください。
インスタンス作成後も一度停止すれば編集画面から変更可能です。
Framework
tensorflow等のパッケージを含めない形でインストールするために「Intel(R) optimized Base」を指定します。
最新のkaggle公式のGPUイメージのCUDAのバージョンに合わせて設定します。
GPU
NVIDIAのGPUドライバーの自動インストール設定です。「ON」に設定します。
Networking
先ほど作成したVPCネットワーク、サブネットワークを指定します。
外部IPは「なし」に設定します。
ローカルからインスタンスに接続
.sshフォルダとconfigファイルの作成
ローカルでSSH接続をしたことがなければ、.sshフォルダとconfigファイルをユーザーフォルダ配下に作成します。
ssh鍵の作成
ローカルで下記を実行し、GCE接続用のssh鍵を作成します。
gcloud compute config-ssh
接続情報をconfigファイルに追記
configファイルに下記を追記します。
Host kaggle-gpu-vm
HostName 127.0.0.1
IdentityFile {秘密鍵google_compute_engineへのパス}
IdentitiesOnly=yes
Port 22
ローカルからインスタンスにSSH接続
ローカルで下記を実行し、トンネルを作成します。
gcloud compute start-iap-tunnel "kaggle-gpu-vm" 22 --local-host-port=localhost:22 --zone us-west1-b
上記を実行している状態のとき別のターミナルから下記を実行すればSSH接続可能です。
ssh kaggle-gpu-vm
インターネット接続の確認
インスタンスに接続した状態で下記を実行し、外部IPなしでインターネットに接続できるか確認します。
curl example.com
HTMLソースコードが表示されればインターネット接続に成功しています。
環境構築
kaggle公式dockerイメージのビルド
インスタンスに接続した状態で下記を実行し、kaggle公式のGPUイメージをビルドします。
docker pull gcr.io/kaggle-gpu-images/python:latest
インスタンスに接続した状態で下記を実行し、dockerイメージが作成されているか確認します。
docker images
コンテナの作成
インスタンスに接続した状態で下記を実行し、作成したイメージからコンテナを作成します。
ホストのホーム配下にprojectフォルダを作成し、コンテナ側の/root/user/projectにマウントしています。
mkdir project
docker run --runtime=nvidia -d -v ~/project:/root/user/project --name kaggle-gpu-container gcr.io/kaggle-gpu-images/python /sbin/init
インスタンスに接続した状態で下記を実行し、作成したコンテナを確認できます。
docker container ls -a
VSCode設定
VSCodeのインストール
VSCodeをインストールしていない場合は、下記からインストールします。
https://code.visualstudio.com/
拡張機能「Remote Development」のインストール
VSCodeの拡張機能「Remote Development」をインストールします。
VSCodeからインスタンスに接続
先ほどのトンネルが通っている状態で「REMOTE EXPLORER」>「Remote」からインスタンスに接続します。
VSCodeからインスタンス内のコンテナに接続
VSCodeでインスタンスに接続した後、同様に先ほどのトンネルが通っている状態で「REMOTE EXPLORER」>「Containers」から作成したコンテナを選択し、「Attach to Container」ボタンを選択します。
以上で完了です。最後までお読み頂きありがとうございました。
参考
今回の記事作成にあたって参考にさせて頂いたサイトです。