Python/R

kaggle公式dockerイメージでGCEにGPU分析環境を構築し、VSCodeでインスタンス内のコンテナに外部IPなしで接続する

概要

  • kaggle公式dockerイメージを使ってGoogle Compute EngineにGPU分析環境を構築
  • 外部IPなしでインターネットに接続可能で、権限をもつGoogleアカウントのみインスタンスに接続可能になるように設定
  • VSCodeからインスタンス内のコンテナに接続

アカウント設定

Google Cloud SDKのインストール

ローカルにGoogle Cloud SDKをインストールしていない場合は、下記の手順に従ってインストールします。

Google Cloud CLIをインストールする

インストール完了後、ローカルで下記を実行し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」ボタンを選択します。

以上で完了です。最後までお読み頂きありがとうございました。

参考

今回の記事作成にあたって参考にさせて頂いたサイトです。

  • この記事を書いた人

Mira

広告系データアナリストの備忘録

-Python/R
-, , , , , ,