Google Colaboratory で Google Drive の特定のフォルダをマウントする方法

Google Colaboratory ( 以下、Colab ) は便利だが、データや画像などのファイルを扱うには一手間必要になる。

いくつか方法はあるが、結論としては **Google Drive の特定のフォルダにデータを詰めてマウントする** のが、個人的な今のベストという事。

以下、ざっと各方法をまとめる。

# ファイルのアップロード

以下コードによって、任意のファイルをアップロードすることができる。

```python
from google.colab import files
uploaded = files.upload()
```

これを実行すると、以下のようなボタンが表示する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20198/74415b98-0ff1-2bdd-40da-48bd5d3d3c41.png)

`ファイル選択` をクリックするとファイルダイヤログが開き、ファイルを選択するとアップロードが始まり、完了すると `upload()` がファイルの **Stream** を返す。

- Pros
    - コードが少なくシンプル
- Cons
    - Stream として取得するため、利用するのに一手間必要になる
        - i.e. pickle 読み込み: `data = pickle.load(io.BytesIO(uploaded['data.bin']))`
    - 大量データに向かない
    - チームメンバー間でデータ共有をする場合に面倒

# HTTP, Git で取得

`curl` や `git` を使ってデータを取得することもできる。

```sh
!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](https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d)

まずは、必要なパッケージを取得しておく。

```sh
!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
```

以下を実行すると、認証情報を取得するための許可を求められるので、許可してトークンを発行し、テキストボックスに貼り付ける。

```python
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/20198/59a98f9c-82be-da3f-9edb-e2d59122f6b4.png" width=680px>

<img src="https://qiita-image-store.s3.amazonaws.com/0/20198/f5019b14-659f-53c8-0b87-7be974b88e52.png" width=240px>

<img src="https://qiita-image-store.s3.amazonaws.com/0/20198/f23850c4-74e0-c895-9c93-9f2faa6f2423.png" width=400px>


以下実行により、今度は `google-drive-ocamlfuse` によるアクセスの許可を聞かれる。これも許可する。

```python
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}
```

上記が正常に終われば、ようやくマウントが可能となる。

```sh
!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](https://github.com/astrada/google-drive-ocamlfuse/wiki/Configuration)

マウント部分を以下のように書き換える。
`GOOGLE_DRIVE_FOLDER_ID` は、マウントしたい任意のフォルダの ID に変更する。

```sh
!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 のサービス同士なんだから、もう少し上手いことやって欲しい。

# 参考

- [Google Colab Free GPU Tutorial - Medium](https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d)
- [google Colaboratoryでファイルを読み込む方法 - Qiita](https://qiita.com/uni-3/items/201aaa2708260cc790b8)
- [Google Colaboratory内で画像やCSVファイルにアクセスするのが一苦労だった話 - Qiita](https://qiita.com/yoshizaki_kkgk/items/bf01842d1a80c0f9e56c)
- [Google Colaboratory事始め - Qiita](https://qiita.com/kouki_outstand/items/cd24dccbaa92274be39e)
- [Google Colaboratoryでファイルを読み込む - uepon日々の備忘録](http://uepon.hatenadiary.com/entry/2018/03/21/180329)