【CUDA10化でGPUもOK!】TensorFlow 2.0 Previewを最速で試す on Colaboratory

> **19/2/8更新** ColaboratoryのCUDAが10.0に上がったため、GPU版も動くようになりました

# TL;DR

- 待ちに待ったTensorFlow 2.0 PreviewがPyPIに公開された。インストール方法は - 
    - GPUなし: `pip install tf-nightly-2.0-preview`
    - GPUあり: `pip install tf-nightly-gpu-2.0-preview`
        - ~~ただし現状CUDA 10.0前提なのでGPUなし版のみ動く(ColabはCUDA 9.2)~~ ColabはCUDA 10.0
    - 付属 `tf_upgrade_v2` ツールで1.x系コードを2.0系に変換できる
    - TFHub他、まだ2.0対応していないプロジェクトあり。alphaで対応する
- Colabでどこまでできるかやってみよう
    - 2.0系対応の公式チュートルアルも揃いつつある([tensorflow/docs/site/en/r2](https://github.com/tensorflow/docs/tree/master/site/en/r2))
        - Transfer LearningでGPUあり/なし両方の動作が試せた
    - 非公式チュートリアル([ageron/tf2_course](https://github.com/ageron/tf2_course))のipynbを試せた
    - SEEDBANKのFashionMNISTで、1.x系->2.0系のコード変換と動作が試せた
    

# はじめに - TensorFlow 2.0とは

経緯や利点は、下記の記事に詳しく紹介されています。
2018年内とアナウンスされていましたが、少し遅れ、このほどPreview版が公開されました。Colaboratory上で動作を確認してみます。(Colaboratoryの詳しい使い方は[こちら](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935))

- [TensorFlow2.0 Preview版が出ました！ - HELLO CYBERNETICS](https://www.hellocybernetics.tech/entry/2019/01/12/155900)
- [tensorflow 2.0 の紹介（日本語訳） - Qiita](https://qiita.com/halhorn/items/09a64e98a02022e6ccc2) 
- [Design Documentから見たTensorFlow 2.0の変更点 - Qiita](https://qiita.com/AtuNuka/items/6966efeddceb96012819)

# 本記事の構成

1. ColabでTensorFlow 2.0を使うには
2. 2.0系 公式チュートリアルを試す
3. 2.0系 非公式チュートリアル(Deep Learning with TensorFlow 2 and Keras course)を試す
4. TensorFlow 2.0で、1.x系のコードを使うには

# 1. ColabでTensorFlow 2.0を使うには
## 新しいColaboratoryノートブックを開く

https://colab.research.google.com/ を開き、 `Python 3の新しいノートブック` を選択。

## TensorFlow 2.0 Previewをインストール

新しいコードセルで、下記を実行すると、最新のTensorFlow 2.0 Preview版がインストールされます。

```
!pip install  tf-nightly-2.0-preview
```

GPUなしでは動作する。

> 注: GPUインスタンスに `!pip install tf-nightly-gpu-2.0-preview` を試したがエラーで動かない(Colabは現状CUDA 9.2。tf2.0 previewはCUDA 10.0前提?)


## コード変換(1.x系->2.0系)のユーティリティについて

1.x系のコードを2.0環境で使うには `tf_upgrade_v2` を使い、ソースコードを変換します。

```
!tf_upgrade_v2
```

で、Usageが表示されます。

- 1ファイルだけ変換する場合 `--infile` で入力.py、 `--outfile` で出力.pyを指定
- ディレクトリ全体を変換する場合 `--intree` で入力ディレクトリ、 `--outtree` で出力ディレクトリを指定
- 入力ディレクトリの.py以外を、出力ディレクトリにコピーしたくなければ `--copyotherfiles False` を付加
- 変換すると、結果が `report.txt` として保存

あたりを押さえておくとよいでしょう。実際の変換方法は後述します。また詳細は、 https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/compatibility に実コードや `README.md` があります。


# 2. TensorFlow 2.0公式チュートリアル

[tensorflow/docs/site/en/r2](https://github.com/tensorflow/docs/tree/master/site/en/r2) に公式の2.0系チュートリアルipynbがあります。下記のリンクから、すぐにColab notebookが開きます。

ノートブックに含まれていない場合は `!pip install  tf-nightly-2.0-preview` を実行し、TensorFlow Preview 2.0をインストールしてから始めます。

- ガイド
    - [
tf.function and AutoGraph in TensorFlow 2.0](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/autograph.ipynb)
    - [Training checkpoints](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/checkpoints.ipynb)
    - [Distributed Training in TensorFlow](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/distribute_strategy.ipynb)
    - [
Eager Execution](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/eager.ipynb)
    - [Effective TensorFlow 2.0](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/effective_tf2.ipynb)
    - [Keras](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/guide/keras.ipynb)
- チュートリアル
    - ビギナー
        - [TensorFlow 2.0: Train and save a model](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/beginner/tf2_overview.ipynb)
    - Eager
        - [Automatic differentiation and gradient tape](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/eager/automatic_differentiation.ipynb)
        - [Custom layers](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/eager/custom_layers.ipynb)
        - [Custom training: basics](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/eager/custom_training.ipynb)
        - [Custom training: walkthrough](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/eager/custom_training_walkthrough.ipynb)
        - [Eager execution basics](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/eager/eager_basics.ipynb)
    - Keras
        - [
Train your first neural network: basic classification](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/keras/basic_classification.ipynb)
        - [
Predict fuel efficiency: regression](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/keras/basic_regression.ipynb)
        - [
Text classification with movie reviews](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/keras/basic_text_classification.ipynb)
        - [
Explore overfitting and underfitting](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/keras/overfit_and_underfit.ipynb)
        - [
Save and restore models](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/keras/save_and_restore_models.ipynb)
    - Distribute
        - [Distribution Strategy with Training Loops](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/distribute/training_loops.ipynb)
    - Generative
        - [Convolutional VAE: An example with tf.keras and eager](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/generative/cvae.ipynb)
        - [Generating Handwritten Digits with DCGAN](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/generative/dcgan.ipynb)
        - [Image Captioning with Attention](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/generative/image_captioning.ipynb)
        - [Pix2Pix: An example with tf.keras and eager](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/generative/pix2pix.ipynb)
    - Images
        - [Transfer Learning Using Pretrained ConvNets](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/images/transfer_learning.ipynb)
    - Load data
        - [Load images with tf.data](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/load_data/images.ipynb)
        - [Using TFRecords and tf.Example](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/load_data/tf_records.ipynb)
    - Sequences
        - [Neural Machine Translation with Attention](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/sequences/nmt_with_attention.ipynb)
        - [Text classification with an RNN](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/sequences/text_classification_rnn.ipynb)
        - [Text generation with an RNN](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/sequences/text_generation.ipynb)

## 2.1 Transfer LearningのチュートリアルでGPUあり/なしを試す

上記から、[Transfer Learning Using Pretrained ConvNets](https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/r2/tutorials/images/transfer_learning.ipynb)で、CUDA 10.0化後のGPU動作を確認してみました。20倍程度速く学習が進んでいるのがわかります。

**GPUあり**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64608/eae407a9-40f1-b6db-0bce-4ad34a605beb.png)


**GPUなし**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64608/6e844521-4f82-a510-ff41-c59c44069233.png)




# 3. TensorFlow 2.0の非公式チュートリアルを試す

早速公開された[Deep Learning with TensorFlow 2 and Keras course](https://github.com/ageron/tf2_course)のipynbを試してみましょう。下記のリンクから、すぐにColab notebookが開きます。

最初のセルで忘れず `!pip install  tf-nightly-2.0-preview` を実行し、TensorFlow Preview 2.0をインストールしてから始めます。


20190111現在、TensorFlow 2.0ベースで、すでに3つの講座が準備されています。

- [1. Neural nets with Keras - Kerasでニューラルネットを使う] (https://colab.research.google.com/github/ageron/tf2_course/blob/master/01_neural_nets_with_keras.ipynb)
- [2. Low level TensorFlow API -  TensorFlowの低レベルAPI](https://colab.research.google.com/github/ageron/tf2_course/blob/master/02_low_level_tensorflow_api.ipynb)
- [3. Loading and preprocessing data - データのロードと前処理](https://colab.research.google.com/github/ageron/tf2_course/blob/master/03_loading_and_preprocessing_data.ipynb)

それぞれ対話型で進められます。途中演習問題があり、詰まったら、後の解答を参照することができます。

# 4. TensorFlow 2.0で、1.x系のコードを使うには

SEEDBANK tf.keras Fashion MNISTで、1.x系から2.0系へのコード変換と実行を試してみます。

## .pyの取得

[Seedbank: "Fashion MNIST with tf.keras"](https://research.google.com/seedbank/seed/5648554290839552) このColaboratoryノートブックを`.py` 形式で取得し、それを2.0用コードに変換し、動作するか試す。

- 上記で開いたノートブック(以下、元ノートブック)とは別に、[Seedbank: "Fashion MNIST with tf.keras"](https://research.google.com/seedbank/seed/5648554290839552)から、 `Run seed in Colab` を押し、ノートブックをColab上で開く
- `ファイル> .pyをダウンロード` で、ローカル上に `basic_classification.py` を保存
- 元ノートブックのファイルブラウザ(左ペイン)から、 `basic_classification.py` をアップロード

## 2.0系対応コードへの変換

- 元ノートブックで下記を実行

```
!tf_upgrade_v2 --infile basic_classification.py --outfile basic_classification_upgraded.py
```

すると、変換が成功した。

```
Line 240:24: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer'
TensorFlow 2.0 Upgrade Script
-----------------------------
Converted 1 files

Detected 0 errors that require attention
--------------------------------------------------------------------------------


Make sure to read the detailed log 'report.txt'
```

`report.txt` に結果が出ているので見てみる。Adam optimizerが、1.x系互換性のための `tf.compat.v1.*` 配下に変換されたようだ。

```
--------------------------------------------------------------------------------
Processing file 'basic_classification.py'
 outputting to 'basic_classification_upgraded.py'
--------------------------------------------------------------------------------

Line 240:24: Renamed 'tf.train.AdamOptimizer' to 'tf.compat.v1.train.AdamOptimizer'
--------------------------------------------------------------------------------
```

## 逐次実行してみる

変更されたのはoptimizerだけですが、動きました。

```py
# TensorFlow and tf.keras
import tensorflow as tf
from tensorflow import keras

# Helper libraries
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)
```

`2.0` ではなく、 `1.13.0-dev20190110` と表示されているが、それでよい。

```py
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
train_images = train_images / 255.0
test_images = test_images / 255.0

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

# ここのOptimizerが変換されている
model.compile(optimizer=tf.compat.v1.train.AdamOptimizer(), 
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5)
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test accuracy:', test_acc)
predictions = model.predict(test_images)
```

とりあえず動きました。




# まとめ (20190111初稿、20190208更新)

- 待ちに待ったTensorFlow 2.0 PreviewがPyPIに公開された。インストール方法は - 
    - GPUなし: `pip install tf-nightly-2.0-preview`
    - GPUあり: `pip tf-nightly-gpu-2.0-preview`
        - ~~ただし現状CUDA 10.0前提なのでGPUなし版のみ動く(ColabはCUDA 9.2)~~ ColabはCUDA 10.0
    - 付属 `tf_upgrade_v2` ツールで1.x系コードを2.0系に変換できる
    - TFHub他、まだ2.0対応していないプロジェクトあり。alphaで対応する
- Colabでどこまでできるかやってみよう
    - 2.0系対応の公式チュートルアルも揃いつつある([tensorflow/docs/site/en/r2](https://github.com/tensorflow/docs/tree/master/site/en/r2))
        - Transfer LearningでGPUあり/なし両方の動作が試せた
    - 非公式チュートリアル([ageron/tf2_course](https://github.com/ageron/tf2_course))のipynbを試せた
    - SEEDBANKのFashionMNISTで、1.x系->2.0系のコード変換と動作が試せた