Google Colaboratory概要と使用手順(TensorFlowもGPUも使える)

以前から噂に聞いていたGoogle Colaboratoryを使ってみました。まだ深くは使ってませんが、非常に便利です。Pythonが手軽にクラウド上で実行できます。Jupyter Notebookのクラウド版だと思ってください。
今までAnaconda/Minicondaなどを使ってローカル環境を作っていましたが、それすら不要になるとは・・・敷居の低さに驚きです:scream:
記事[「TensorFlowをWindowsにインストール Python初心者でも簡単だった件」](https://qiita.com/FukuharaYohei/items/d8f82c827e0bae70096a)や[「WindowsでMinicondaを使ってTensorFlow環境構築(2018年)」](https://qiita.com/FukuharaYohei/items/9462e080fe913a435271)で書いた内容よりも遥かにお手軽です。
Windowsでの環境比較は、記事[「Windows PCで機械学習環境を作る方法まとめ」](https://qiita.com/FukuharaYohei/items/8fb34107dda208f79bca)に書きました。

#感想
##良い点
- 環境構築しなくていいのが楽！condaやpipコマンドしないですぐに使えるのが最高です。
- デバイス・人をまたいだ共有ができる。クラウド上にあるので共有に強いです
- **GPUが使える!**:sparkles:
- 記事[「【Keras入門(3)】TensorBoardで見える化」](https://qiita.com/FukuharaYohei/items/fe73cdb63ee82a7ea318)のように保存したTensorBoardログをそのまま見ることができ、便利！


##改善点
- 少し遅い。ローカル環境ではないので、単純なコマンド実行に通信が必要でそのオーバーヘッドの分だけ遅く感じます
- 細かい環境調整に手間がかかる。TesnforFlowの古いバージョン指定などです。セル上でpipを使ってインストールもできますが、毎回実行するのが面倒です。
- ~~ローカルファイルの入出力が面倒。Google Drive上のファイルを参照・書き込みするのが、Jupyter Notebookに比べると手間がかかります。~~ **Google Driveから容易にファイルアクセスできる**ようになっていました！詳しくは[公式](https://colab.research.google.com/notebooks/io.ipynb#)参照(2019/4/10追加)

```python
# こうするだけで、マウントできちゃう
from google.colab import drive
drive.mount('/content/gdrive')

# で、ファイル書き込み
with open('/content/gdrive/My Drive/foo.txt', 'w') as f:
    f.write('Hello Google Drive!')
!cat /content/gdrive/My\ Drive/foo.txt
```

#手順
##1. Google Driveセットアップ
Google Driveで任意のフォルダに対してアプリを追加します。
![10.AddAppToGDrive01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/823dc92b-a52f-2e99-2174-383f2a1b147b.jpeg)

Colaboratoryを探して選択します。
![10.AddAppToGDrive02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/5f448528-a051-0375-2d24-e952627ac9b7.jpeg)
![10.AddAppToGDrive03.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/d6be5d85-c9e0-b872-0f3d-51f17369aee9.jpeg)

##2. Colaboratoryファイル作成
Colaboratoryファイル(Jupyter Notebookっぽいやつ)を作成します。
![20.CreateColabFile01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/54dfc885-b71a-e3e4-58f9-c0a33b2c753d.jpeg)

あとはファイル名を適当に変えてコードを書いて実行するだけです。コマンド書いてShift + Enter で実行はJupyter Notebookと同じです。

```python
x = 1 + 2
print(x)
print x
```

![20.CreateColabFile02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/cf7528bc-33d2-11c3-4394-36054f06a958.jpeg)

こうすればパッケージ一覧が確認できます。

```
!pip freeze
```

Pythonで出すにはこんな書き方です。

```Python
import pkg_resources
for package in pkg_resources.working_set:
    print(package)
```

#ランタイムに関して
デフォルトはPython2.7です。そのため"print x"と書いても動きます。
メニューの「編集 -> ノートブックの設定」でPython3系に変更できます(2018/6/15時点でPython3.6のようです)。
![30.OptionColab01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/863e9a2c-5958-788b-a6e6-6ff1adc432a5.jpeg)

記事[「【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory」](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)に詳しい内容があるので、細かく見たい場合は、非常に参考になります。

# ファイル入出力
## Google Driveから
下記のコードを実行すると認証ページへのリンクが出力されるので、認証を許可して、取得したAuthorization Codeを入力します。

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

```python
# ファイル書き込み
with open('/content/gdrive/My Drive/foo.txt', 'w') as f:
    f.write('Hello Google Drive!')
!cat /content/gdrive/My\ Drive/foo.txt
```



## ローカルPCから

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

上記コードで、ローカルファイルのアップロードをします。
アップロードされたファイル名を次のコードに埋め込んで読み込みます。

```python
with open("アップロードされたファイル名") as f:
    print(f.read())
```

# おまけ: 便利機能
### スクラッチコードセル
- メニュー: 挿入 -> スクラッチコードセル
- 使い方: ちょっとしたコードを試すのに使用。コードは保存されない。

### コードスニペット
- メニュー: 挿入 -> コードスニペット
- 使い方: Webカメラ起動などのコードスニペットを選んで挿入可能

### フォーム項目の追加
- メニュー: 挿入 -> フォーム項目の追加
- 使い方: 入力できる項目の追加。数値型、日付型などデータ型も指定可能。コードを隠すことも可能。

# おまけ：2019/4/12時点でのライブラリ一覧

```
!pip freeze
absl-py==0.7.1
alabaster==0.7.12
albumentations==0.1.12
altair==2.4.1
astor==0.7.1
astropy==3.0.5
atari-py==0.1.7
atomicwrites==1.3.0
attrs==19.1.0
audioread==2.1.6
autograd==1.2
Babel==2.6.0
backcall==0.1.0
backports.tempfile==1.0
backports.weakref==1.0.post1
beautifulsoup4==4.6.3
bleach==3.1.0
bokeh==1.0.4
boto==2.49.0
boto3==1.9.130
botocore==1.12.130
Bottleneck==1.2.1
branca==0.3.1
bs4==0.0.1
bz2file==0.98
cachetools==3.1.0
certifi==2019.3.9
cffi==1.12.2
chainer==5.0.0
chardet==3.0.4
Click==7.0
cloudpickle==0.6.1
cmake==3.12.0
colorlover==0.3.0
community==1.0.0b1
contextlib2==0.5.5
convertdate==2.1.3
coverage==3.7.1
coveralls==0.5
crcmod==1.7
cufflinks==0.14.6
cupy-cuda100==5.2.0
cvxopt==1.2.3
cvxpy==1.0.15
cycler==0.10.0
cymem==2.0.2
Cython==0.29.6
cytoolz==0.9.0.1
daft==0.0.4
dask==0.20.2
dataclasses==0.6
datascience==0.10.6
decorator==4.4.0
defusedxml==0.5.0
dill==0.2.9
distributed==1.25.3
Django==2.2
dlib==19.16.0
dm-sonnet==1.23
docopt==0.6.2
docutils==0.14
dopamine-rl==1.0.5
easydict==1.9
ecos==2.0.7.post1
editdistance==0.5.3
en-core-web-sm==2.0.0
entrypoints==0.3
enum34==1.1.6
ephem==3.7.6.0
et-xmlfile==1.0.1
fa2==0.3.5
fancyimpute==0.4.2
fastai==1.0.51
fastcache==1.0.2
fastdtw==0.3.2
fastprogress==0.1.21
fastrlock==0.4
fbprophet==0.4.post2
featuretools==0.4.1
filelock==3.0.10
fix-yahoo-finance==0.0.22
Flask==1.0.2
folium==0.8.3
future==0.16.0
gast==0.2.2
GDAL==2.2.2
gdown==3.6.4
gensim==3.6.0
geographiclib==1.49
geopy==1.17.0
gevent==1.4.0
gin-config==0.1.4
glob2==0.6
google==2.0.2
google-api-core==1.9.0
google-api-python-client==1.6.7
google-auth==1.4.2
google-auth-httplib2==0.0.3
google-auth-oauthlib==0.3.0
google-cloud-bigquery==1.8.1
google-cloud-core==0.29.1
google-cloud-language==1.0.2
google-cloud-storage==1.13.2
google-cloud-translate==1.3.3
google-colab==1.0.0
google-resumable-media==0.3.2
googleapis-common-protos==1.5.9
googledrivedownloader==0.3
graph-nets==1.0.3
graphviz==0.10.1
greenlet==0.4.15
grpcio==1.15.0
gspread==3.0.1
gspread-dataframe==3.0.2
gunicorn==19.9.0
gym==0.10.11
h5py==2.8.0
HeapDict==1.0.0
holidays==0.9.10
html5lib==1.0.1
httpimport==0.5.16
httplib2==0.11.3
humanize==0.5.1
hyperopt==0.1.2
ideep4py==2.0.0.post3
idna==2.6
image==1.5.27
imageio==2.4.1
imagesize==1.1.0
imbalanced-learn==0.4.3
imblearn==0.0
imgaug==0.2.8
imutils==0.5.2
inflect==2.1.0
intel-openmp==2019.0
intervaltree==2.1.0
ipykernel==4.6.1
ipython==5.5.0
ipython-genutils==0.2.0
ipython-sql==0.3.9
ipywidgets==7.4.2
itsdangerous==1.1.0
jdcal==1.4
jedi==0.13.3
jieba==0.39
Jinja2==2.10.1
jmespath==0.9.4
joblib==0.12.5
jpeg4py==0.1.4
jsonschema==2.6.0
jupyter==1.0.0
jupyter-client==5.2.4
jupyter-console==6.0.0
jupyter-core==4.4.0
kaggle==1.5.3
kapre==0.1.3.1
Keras==2.2.4
Keras-Applications==1.0.7
Keras-Preprocessing==1.0.9
keras-vis==0.4.1
kiwisolver==1.0.1
knnimpute==0.1.0
librosa==0.6.3
lightgbm==2.2.3
llvmlite==0.28.0
lmdb==0.94
lucid==0.3.8
lunardate==0.2.0
lxml==4.2.6
magenta==0.3.19
Markdown==3.1
MarkupSafe==1.1.1
matplotlib==3.0.3
matplotlib-venn==0.11.5
mesh-tensorflow==0.0.5
mido==1.2.6
mir-eval==0.5
missingno==0.4.1
mistune==0.8.4
mkl==2019.0
mlxtend==0.14.0
mock==2.0.0
more-itertools==7.0.0
moviepy==0.2.3.5
mpi4py==3.0.1
mpmath==1.1.0
msgpack==0.5.6
msgpack-numpy==0.4.3.2
multiprocess==0.70.7
multitasking==0.0.7
murmurhash==1.0.2
music21==5.5.0
natsort==5.5.0
nbconvert==5.4.1
nbformat==4.4.0
networkx==2.2
nibabel==2.3.3
nltk==3.2.5
nose==1.3.7
notebook==5.2.2
np-utils==0.5.10.0
numba==0.40.1
numexpr==2.6.9
numpy==1.14.6
nvidia-ml-py3==7.352.0
oauth2client==4.1.3
oauthlib==3.0.1
okgrade==0.4.3
olefile==0.46
opencv-contrib-python==3.4.3.18
opencv-python==3.4.5.20
openpyxl==2.5.9
osqp==0.5.0
packaging==19.0
pandas==0.22.0
pandas-datareader==0.7.0
pandas-gbq==0.4.1
pandas-profiling==1.4.1
pandocfilters==1.4.2
parso==0.4.0
pathlib==1.0.1
patsy==0.5.1
pbr==5.1.3
pexpect==4.7.0
pickleshare==0.7.5
Pillow==4.1.1
pip-tools==3.4.0
plac==0.9.6
plotly==3.6.1
pluggy==0.7.1
portpicker==1.2.0
prefetch-generator==1.0.1
preshed==2.0.1
pretty-midi==0.2.8
prettytable==0.7.2
progressbar2==3.38.0
prometheus-client==0.6.0
promise==2.2.1
prompt-toolkit==1.0.15
protobuf==3.7.1
psutil==5.4.8
psycopg2==2.7.6.1
ptyprocess==0.6.0
py==1.8.0
pyasn1==0.4.5
pyasn1-modules==0.2.4
pycocotools==2.0.0
pycparser==2.19
pydot==1.3.0
pydot-ng==2.0.0
pydotplus==2.0.2
pyemd==0.5.1
pyglet==1.3.2
Pygments==2.1.3
pygobject==3.26.1
pymc3==3.6
pymongo==3.7.2
pymystem3==0.2.0
PyOpenGL==3.1.0
pyparsing==2.4.0
pyrsistent==0.14.11
pysndfile==1.3.2
PySocks==1.6.8
pystan==2.19.0.0
pytest==3.6.4
python-apt==1.6.3+ubuntu1
python-chess==0.23.11
python-dateutil==2.5.3
python-louvain==0.13
python-rtmidi==1.2.1
python-slugify==3.0.2
python-utils==2.3.0
pytz==2018.9
PyWavelets==1.0.3
PyYAML==3.13
pyzmq==17.0.0
qtconsole==4.4.3
regex==2018.1.10
requests==2.18.4
requests-oauthlib==1.2.0
resampy==0.2.1
retrying==1.3.3
rpy2==2.9.5
rsa==4.0
s3fs==0.2.0
s3transfer==0.2.0
scikit-image==0.13.1
scikit-learn==0.20.3
scipy==1.1.0
screen-resolution-extra==0.0.0
scs==2.1.0
seaborn==0.7.1
Send2Trash==1.5.0
setuptools-git==1.2
Shapely==1.6.4.post2
simplegeneric==0.8.1
six==1.11.0
sklearn==0.0
smart-open==1.8.1
snowballstemmer==1.2.1
sortedcontainers==2.1.0
spacy==2.0.18
Sphinx==1.8.5
sphinxcontrib-websupport==1.1.0
SQLAlchemy==1.3.2
sqlparse==0.3.0
stable-baselines==2.2.1
statsmodels==0.8.0
sympy==1.1.1
tables==3.4.4
tabulate==0.8.3
tblib==1.3.2
tensor2tensor==1.11.0
tensorboard==1.13.1
tensorboardcolab==0.0.22
tensorflow==1.13.1
tensorflow-estimator==1.13.0
tensorflow-hub==0.4.0
tensorflow-metadata==0.13.0
tensorflow-probability==0.6.0
termcolor==1.1.0
terminado==0.8.2
testpath==0.4.2
text-unidecode==1.2
textblob==0.15.3
textgenrnn==1.4.1
tfds-nightly==1.0.2.dev201904090105
tflearn==0.3.2
Theano==1.0.4
thinc==6.12.1
toolz==0.9.0
torch==1.0.1.post2
torchsummary==1.5.1
torchtext==0.3.1
torchvision==0.2.2.post3
tornado==4.5.3
tqdm==4.28.1
traitlets==4.3.2
tweepy==3.6.0
typing==3.6.6
tzlocal==1.5.1
ujson==1.35
umap-learn==0.3.8
uritemplate==3.0.0
urllib3==1.22
vega-datasets==0.7.0
wcwidth==0.1.7
webencodings==0.5.1
Werkzeug==0.15.2
widgetsnbextension==3.4.2
wordcloud==1.5.0
wrapt==1.10.11
xarray==0.11.3
xgboost==0.82
xkit==0.0.0
xlrd==1.1.0
xlwt==1.3.0
yellowbrick==0.9.1
zict==0.1.4
zmq==0.0.0
```