Google Colab の使いかた

# Google Colab とは？
[Google Colaboratory (Google Colab)](https://colab.research.google.com/) はブラウザで Python のコードを書いたり実行したり共有したりできる Google のサービスです。
内部的には Jupyter というプロジェクトの Jupyter Notebook を使っているんですが、このあたりの話をちゃんとすると IPython やらなんやらと微妙にややこしいのでとりあえず Jupyter Notebook というアプリを簡単に使えるようにしてくれているのが Google Colab…… くらいの認識でよいとおもいます。

Google Colab は Google が独自にカスタマイズしてくれているので素の Jupyter Notebook とはちょっと違っています。たとえば Google Drive との連携が簡単にできたり、GPUやTPUを**無料で**使うことができます。

# 早速使ってみる

とりあえず使ってみましょう。[Google Colaboratory (Google Colab)](https://colab.research.google.com/) にアクセスします。Googleのアカウントが必要なので持っていない人はアカウントを作ってログインしてください。

「*ファイル*」メニューから「*新規作成*」を選択します。

![スクリーンショット 2020-10-06 17.42.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/7c1b84a3-97f8-b13a-6d36-1b04c27abb48.png)

するとこんな画面になります。灰色の1と書かれているところがコードを書く場所です。**Cell(セル)** と呼びます。

![スクリーンショット 2020-10-06 17.45.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/86e4387d-444b-855f-4d19-87d9d16cfeb4.png)

このセルに適当なコードを書いてから、左の再生ボタン(実行ボタン)を押すか、Ctrl+Enter(Macは⌘+Enter)で実行できます。

![スクリーンショット 2020-10-06 17.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/3408d1a0-1fcf-73e1-82be-c4956cc49bba.png)

簡単ですね。

「*+ コード*」を押すとセルを増やすことができます(「*+ テキスト*」を押すとMarkdown形式でドキュメントが書けます)。

![スクリーンショット 2020-10-06 17.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/37cb0b7a-86cb-2292-0415-3ea60bdfef71.png)
![スクリーンショット 2020-10-06 17.48.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/0f30df16-6758-076b-cd9c-725e4d5bf3ec.png)

セルが多いときにまとめてすべて実行したいときはメニューの「*ランタイム*」→「*すべてのセルを実行*」が簡単です。

# Google Colab の注意点

これは Google Colab というより IPython, Jupyter の注意点ですが、変数の状態が保持されるので直感的にわかりにくい場合があります(プログラミングに慣れている方や、対話的な環境を知っている人は読み飛ばしても問題ありません)。

たとえば以下のようなコードを書いたとします。


```python
a = 1
b = 2
print(a + b)
```

当然3が表示されますが、コードを書き換えて以下のようにしてから実行すると

```python
b = 2
print(a + b)
```

やはり3が表示されます。 今まで`.py`ファイルにコードを書いて `$python ファイル名` と実行していた人からすれば、 `NameError: name 'a' is not defined` と表示されると予想したかもしれません。
Google Colab では対話的に動いているので一度 `a = 1` と書けばその記述を消しても a は 1 のままになるのです。
また、普通のプログラムは上から順に実行されますが、Google Colabは好きなセルを任意の順番に実行できるため、


```python
# このセルは後で実行する
print(x + y)
```

```python
# このセルを最初に実行する
x = 1
y = 2
```

のような構成にしてしまうことも可能です。この「上から順番に実行するとうまくいかない」Notebookは開発中はつい作ってしまいがちですが、**非常に嫌われるので避けましょう**(そもそも自分自身でも途中から分けわからなくなってしまうはずです)。もしきちんと書けているかを確認したいときは、メニューの「*ランタイム*」→「*再起動してすべてのセルを実行*」を選べば状態をリセットしたうえで上から順に実行してくれるので、最終確認のときには役立ちます。

# GPUを使う

メニューの「*ランタイム*」→「*ランタイムのタイプを変更*」から「*ハードウェアクセラレータ*」を「GPU」に設定するとGPUが有効になります。2020年10月現在では、おそらく「NVIDIA Tesla K80」か「NVIDIA Tesla T4」のどちらかが割り当てられると思います。T4のほうが高性能なのですが、これは自分では選択できません。

```
! nvidia-smi
```

と実行すると自分に割り当てられているGPUの状態がわかります。

```python
import tensorflow as tf
tf.test.gpu_device_name()
```

で実際に Tensorflow がGPUを認識しているかの確認もできます( `'/device:GPU-0'` などと表示されていればOK)。

# 便利な使い方

Google Colab(Jupyter Notebook) では**システムコマンド**と**マジックコマンド**が使えます。

## システムコマンド

先頭に `!` をつけるとシェルコマンドを実行できます。たとえば ls コマンドを実行したりできます。
先程の `nvidia-smi` もシステムコマンドとして実行していたわけです。

```
! ls /
```

![スクリーンショット 2020-10-06 18.08.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/bcff9a37-16b5-dea9-775a-0889a8212ecd.png)

`wget`, `curl` で外部からファイルをダウンロードしてきたり、中身はUbuntuなので、 `apt` でソフトウェアをインストールしたりすることもできます。

## マジックコマンド

マジックコマンドは特殊で、 先頭に `%` をつける**ラインマジック**と `%%`をつける **セルマジック**があります。
たとえば `%time` をつけるとそれに続くコードの実行時間を測定して結果を表示してくれたり、 `%history` で実行ログを表示したりできます。
セルマジックでは、たとえば `%%time` ならセルの実行時間を計測してくれたり、 `%%bash` を使うとそのセルはPythonではなくてBashが書けるようになります。他にも色々なマジックコマンドがあるので興味のある方は調べてみてください。ちなみに `%lsmagic` を実行するとその環境で実行可能なマジックコマンドの一覧が表示されます。

# Notebook のアップロード、ダウンロード

## アップロード

ローカルの Notebook を Google Colab で開きたいときは、メニューの「*ファイル*」→「*ノートブックをアップロード*」からできます。

## ダウンロード
出来上がった Notebook は自動的に Google Drive に保存されていきますが、手元にダウンロードしたいときはメニューの「*ファイル*」→「*.ipynbをダウンロード*」からできます。

# Google Colab にファイルをアップロードする

## GUIでのやりかた

たとえば手元にある学習データをアップロードしたいときはどうすればよいでしょうか？色々なやり方がありますが、比較的簡単な方法としては一時的にインスタンスにアップロードしてしまうのも手です。

画面左端にフォルダのようなアイコンがあるのでこれをクリックするとファイルビューアが開きます。

![スクリーンショット 2020-10-06 18.19.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/7e5ecdb6-18d8-6f1b-2d1e-dd35a4992aa4.png)

![スクリーンショット 2020-10-06 18.21.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11852/c08af3ab-da54-4830-1177-75e417fda72c.png)

ここにファイルをドラッグ・アンド・ドロップするとファイルアップロードができます。ただしランタイム（インスタンス）が立ち上がっている間しかファイルは保持されず、再起動や停止によってファイルは削除されることに注意してください。
また、ファイルを右クリックして表示されるメニューからはファイルのダウンロードも可能です。

## Pythonでのやりかた

マウスでの操作ではなく、プログラム上からもファイルのやり取りがしたいこともあります。たとえば学習が終わったら自動的にモデルをダウンロードしてくれたら楽そうです。

このときは

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

でアップロードフォームが表示され、

```python
from google.colab import files
files.download('test.txt')
```

でファイルのダウンロードができます。

## Google Driveを使ったやりかた

Google Driveをマウントすることもできます。認証キーが要求されるので表示されるURLから認証キーを取得してコピー＆ペーストします。

```python
from google.colab import drive
drive.mount('/content/drive')
```

この場合だと `/content/drive` にGoogle Driveがマウントされているので、以下のように `ls` コマンドで確認すると自分のGoogle Driveのファイルが見られるはずです。

```
! ls "/content/drive/My Drive"
```


# Google Colab の制限

基本的には無料で使えるのですが無制限に使えるわけではありません。
色々条件が複雑なのですが、ざっくり言うと12時間以上連続では動かせません(実行中であってもコネクションが切断される)。
一般には12時間以上かかる処理はしない……と思うかもしれませんが、実際にはDeep Learningでは数日かかることもあるのでたまに問題になります。他にも90分間操作をしないとセッションが切れるという仕様もありますがとりあえず気にしないで大丈夫です。
このようなときはモデルを途中で保存して、再度学習するような工夫が必要になります。

このあたりの制限はだんだん厳しくなってきているので、同時に複数のセッションを使ってるときにも制限がかかったりしますが、まあ無料なので仕方ないですね。[Google Colab Pro](https://colab.research.google.com/signup) という有償のプランもありますが、まだ日本からは使えません。