Google Colaboratory ( 以下、Colab ) は便利だが、データや画像などのファイルを扱うには一手間必要になる。
いくつか方法はあるが、結論としては Google Drive の特定のフォルダにデータを詰めてマウントする のが、個人的な今のベストという事。
以下、ざっと各方法をまとめる。
ファイルのアップロード
以下コードによって、任意のファイルをアップロードすることができる。
from google.colab import files
uploaded = files.upload()
これを実行すると、以下のようなボタンが表示する。
ファイル選択
をクリックするとファイルダイヤログが開き、ファイルを選択するとアップロードが始まり、完了すると upload()
がファイルの Stream を返す。
- Pros
- コードが少なくシンプル
- Cons
- Stream として取得するため、利用するのに一手間必要になる
- i.e. pickle 読み込み:
data = pickle.load(io.BytesIO(uploaded['data.bin']))
- i.e. pickle 読み込み:
- 大量データに向かない
- チームメンバー間でデータ共有をする場合に面倒
- Stream として取得するため、利用するのに一手間必要になる
HTTP, Git で取得
curl
や git
を使ってデータを取得することもできる。
!curl http://www.dropbox.com/path/to/data
or
!git clone http://github.com/you/data.git
- Pros
- 通常のファイルとして利用できる
- チームメンバー間でのデータ共有が容易
- Cons
- 大量データに向かない
- Http の場合、Dropbox や S3 で公開する必要がある
- アクセス制限は別途管理が必要
Google Drive をマウント
Google Colab 自体も Google Drive 上のただの Jupyter ファイルみたいなものなので、データもそこで管理できるのであれば管理が統一されて便利。
参考にしたのはこちら
Google Colab Free GPU Tutorial - Medium
まずは、必要なパッケージを取得しておく。
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
以下を実行すると、認証情報を取得するための許可を求められるので、許可してトークンを発行し、テキストボックスに貼り付ける。
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
以下実行により、今度は google-drive-ocamlfuse
によるアクセスの許可を聞かれる。これも許可する。
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
上記が正常に終われば、ようやくマウントが可能となる。
!mkdir -p drive
!google-drive-ocamlfuse drive
!ls drive
drive
以下に マイドライブ以下のファイル/フォルダ全て がマウントされる。
- Pros
- 通常のファイルとして利用できる
- チームメンバー間でデータ管理・共有が容易
- Colab ファイルと一緒に権限管理が可能
- 大量データも扱いやすい
- 無料でも 15 GB
- Cons
- マイドライブ以下全部にアクセスできる不安
- 削除も可能
- read-only でのマウントも可能だが、書き込みたい時もある
- 利用者によってマイドライブ以下の構成が違うため、コードの再現性に乏しくなる
- 毎度トークンを取得するのが面倒
- マイドライブ以下全部にアクセスできる不安
特定フォルダ以下のみマウント
Google Drive は全てのフォルダに一意な ID が振られており、google-drive-ocamlfuse はその ID を指定してマウントする設定もできる。
これを利用し、チームで共有するデータ管理フォルダをマウントするようにする。
Configuration - Wiki - google-drive-ocamlfuse
マウント部分を以下のように書き換える。
GOOGLE_DRIVE_FOLDER_ID
は、マウントしたい任意のフォルダの ID に変更する。
!cp -f ~/.gdfuse/default/config config
!sed -i -e "s/^root_folder=$/root_folder=GOOGLE_DRIVE_FOLDER_ID/" config
!mkdir -p drive
!google-drive-ocamlfuse -config ./config -cc drive
!ls drive
Note : Google Drive のフォルダ ID は、フォルダを開いた時のhttps://drive.google.com/drive/folders/XXXXXXXXX の XXXXXXXXX の部分の事
雑感
毎度のトークン取得が面倒だなぁというのはあるが、そこはもうしょうがないかなぁ。
Google のサービス同士なんだから、もう少し上手いことやって欲しい。