GCE上にkaggle Dockerを構築してGCSをマウントした


0.Intro

エラくハマりました。。。GCEもきちんと使ったことないのもありますが何というか勝手が違いますね(何との比較?)

1.GCE構築

デフォルトのus-central1(アイオワ)で構築しようと思いました。最初は最近使えるようになったと話題のA100を割り当てたりしてみたのですがそもそも、多分ビギナーだからでしょうか、割り当てしてらもえず。P100ならどうかと思ったのですがこちらもだめ。仕方なくT4×4にて妥協(?)。
皆様はMarketplaceから持ってきておられますが、何故かGPUの割り当てがないと言われます。

よって一からGCE立てて環境を作ることにしました。個人的にGPUの割り当てにハマりました。GPUの割り当てはいくつかあるのですが、どうやら

というNVIDIAA (型番) GPUs というのがいわゆるインスタンスにGPU割り当てる時に設定する項目のようです隣のVirtual Workstationは「仮想ワークステーション(NVIDIA GRID)を有効にする」を有効にした時に消費される割り当てのようです。

今回はOSはubuntu20.04にしました。ディスクは200Gとしています。(実は一回けちって50Gにしたところディスクが足りないと怒られてやり直している)

GCPのリソース不足でゾーンをus-central1-bに切り替えてやっとこさ構築完了。

GCEを構築できたら
NVIDIA Docker って今どうなってるの? (20.09 版)
を参考にNVIDIA Dockerを入れます。ホストのubuntuには CUDA Toolkit 11.1 Update 1 Downloads を入れています。もちろんインストールの仕方は上記にあるようにドライバだけです。

kaggle dockerのインストール仕方は特に変わったところはありません。あちこちにあるチュートリアルのままです。
kaggle dockerをビルド後起動

docker run --rm --gpus all -it kaggle/python-gpu-build  /bin/bash

で起動しコンテナに入れることを確認。

2.GCSマウント

GCEのローカルだけでは心許ないのでGCSをマウントしたいと思います。
こちらを参考にしました。

上記サイトに記載のシェルをコピーして作成し実行、gcsfuseをインストールします。
その後に

gcloud auth application-default login

を実行しブラウザから認証します。
その後環境変数を設定。

export GOOGLE_APPLICATION_CREDENTIALS=~/.config/gcloud/application_default_credentials.json

ここまできたらようやく目的のバケットをマウント出来ます。

gcsfuse -o allow_other {バケット名} /media/data

このときに「 -o allow_other」オプションがないとコンテナ内でpermission deniedで怒られます。
またこのオプションを使うには

/etc/fuse.conf

というファイル内の

# mount_max = 1000
user_allow_other

と「user_allow_other」のコメントを外して有効化してください。
※セキュリティ上の問題も指摘されています。ここは自己責任で。

ここまできてやっとこさ

docker run --rm --gpus all -v /media/:/media/  -it kaggle/python-gpu-build  /bin/bash

GCE上のKaggle DockerにGCSをマウントしアクセスできました。