Ubuntu(CPU環境)にTensorFlowをインストールした話 (GCPを使いました)

# 1.本稿の目的

* そもそも自分用メモ
* TensorFlowで遊んでみたいから環境構築に必要な情報まとめてくれよって人の欲求を多少満足させること

# 2.作業スコープ
* Virtualenvをインストールする
* Virtualenvで作成した仮想環境にTensorFlowをインストールし動作検証する
* jupyter notebookをインストールする
* Windowsクライアントからリモデできる環境を構築する

# 3.作業に入る前に(前提事項)

### 3.1.なぜクラウドか

自己所有の持ち運べるラップトップが、ブラウジングできればいいや前提のメルカリで入手(1万円)したぬるスペックPCだったためです。試しに環境作ろうとしましたが動作が重すぎてストレスしかなかったので対策としてクラウド利用を決めました。

### 3.2.なぜGCPか

コスパが一番良いと判断したためです。

* 利用開始から1年間有効な300ドル分のクレジットがついてくる

ことが大きな理由です。

AWSもAzureも無料枠があって、無料枠の中で使う分には1年間は料金かかりません。でも無料枠のスペックなんかたかがしれているため、ちゃんと遊ぼうとした場合全く足らないです。なので現実的に無料枠内では使えません。Azureは22500円分のクレジット利用枠がもらえるのですが、一ヶ月しか使えないので長期的に遊ぶのは不向きです。その点でGCPで最初にもらえるクレジットは、コスパ観点で大きなアドバンテージです。

GPU利用まで見据えた場合のIaaSのインスタンス単価はAWS/Azureと比較して最安ではないですが、スペックが完全に横並びなわけではなく、少なくとも料金表(※1)ベースだと、特にGPUの単価が比較できないためなんとも評価しにくいところです。

余談ですが、GCPはデフォルトではGPUが使えません。「IAMと管理」から割り当てを依頼する必要があります。割り当てが済めば使えるようになります。

※1
- [AWS EC2](https://aws.amazon.com/jp/ec2/pricing/on-demand/)
- [AWS EC2 GPU](https://aws.amazon.com/jp/ec2/elastic-gpus/pricing/)
- [Azure ML (GPU)](https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/linux/)
- [GCP GCE (GPU)](https://cloud.google.com/compute/pricing#machinetype)


### 3.3.なぜCPU環境か

最初からマシンパワーをゴリゴリ要する処理は流さないので、学習を進めていく中で、必要に応じてGPU環境も作ることができるという状況さえ整えればよいと思ったからです。

### 3.4. Pythonのバージョンは？

2系と3系両方を入れることにしました。
学習サイトや本によって、2系前提だったり、3系前提だったりして、ばらつきがあったため。

# 4.作業手順

※4.1.、4.2.はほぼTensorFlow公式のやりかたです。※ [Installing TensorFlow on Ubuntu](https://www.tensorflow.org/install/install_linux)
※python2系と3系でコマンドが分かれる場合、分けて書いています。両方入れたい人は両方実行して下さい。
※Ubuntuのバージョンは18.04 LTS

### 4.1.Virtualenvをインストールする


- apt-get コマンドの更新サイトを最新化

　※これをやっておかないと、次でこける。(少なくともpython(3)-devのインストールがこけた)

```bash:
$ sudo apt-get update
```

- python(3)-pip, python(3)-dev, python-virtualenvをインストール

```bash:python3系
$ sudo apt-get install python3-pip python3-dev python-virtualenv
```

```bash:python2系
$ sudo apt-get install python-pip python-dev python-virtualenv
```

- Virtualenv環境を作る

```bash:python3系
$ virtualenv --system-site-packages -p python3 <targetDirectory>
```

```bash:python2系
$ virtualenv --system-site-packages <targetDirectory>
```

### 4.2.Virtualenvで作成した仮想環境にTensorFlowをインストールし動作検証する

- Virtualenv環境をアクティベートする(以後の作業はアクティベートしたVirtualenv環境で行う)

```bash:
$ source <targetDirectory>/bin/activate
```

　※コマンド実行後のプロンプト

```
(<targetDirectory>)$
```

　※Virtualenv環境をディアクティベートする場合

```
(<targetDirectory>)$ deactivate
```

- pipを強制的にアップグレードする(確実に8.1以上にする)

```
(<targetDirectory>)$ easy_install -U pip
```

- アクティベートされたVirtualenv環境にTensorflowをインストールする

```:python3系
(<targetDirectory>)$ pip3 install --upgrade tensorflow
```

```:python2系
(<targetDirectory>)$ pip install --upgrade tensorflow
```

　※TensorFlowをアンインストールする場合

```
$ rm -r <targetDirectory>
```

- Pythonを起動する

```
(<targetDirectory>)$ python
```

- インタラクティブシェルにて以下のコマンドを実行する（インストールの検証）

```python:
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
```
```:実行結果に含まれる出力
>>> Hello, TensorFlow!
```

- おまけ(scikit-learn, scipy, matplotlib, OpenCV, Kerasのインストール)

```
(<targetDirectory>)$ pip install scikit-learn
(<targetDirectory>)$ pip install scipy
(<targetDirectory>)$ pip install matplotlib
(<targetDirectory>)$ pip install opencv-python
(<targetDirectory>)$ pip install keras
```

- おまけ2(tkinterインストール)
※ matplotlibが使う

```bash:python3系
$ sudo apt-get install python3-tk
```

```bash:python2系
$ sudo apt-get install python-tk
```

- おまけ3(pandasインストール)

```bash:python3系
$ sudo apt-get install python3-pandas python3-pandas-lib
```

```bash:python2系
$ sudo apt-get install python-pandas python-pandas-lib
```

### 4.3.jupyter notebookをインストール・起動する

- インストール

```
(<targetDirectory>)$ pip install jupyter
```

- 起動

```
(<targetDirectory>)$ jupyter notebook
```

　※‘Copy/paste this URL into your browser when you connect for the first time, to login with a token’という表示とともに、URLが表示されるので、(サーバー内で)ブラウザにコピペしてアクセスする。

### 4.4.Windowsクライアントからリモデできる環境を構築する

　※作業理由
　jupyter notebookにアクセスするためにはインストールしたマシンにログインする必要がある(厳密には違うけど、今回はそう)ため

- デスクトップ環境をインストールする

```bash:
$ sudo apt-get -y install ubuntu-desktop
```

- 再起動する

```bash:
$ sudo shutdown -r now
```

- XRDPをインストールする

　※XRDPとは
　Linux上で動作するRDP（リモートデスクトッププロトコル）の事。要するにWindowsのリモートデスクトップのLinux版。

```bash:
$ sudo apt-get install xrdp
```

- リモデ用のユーザーを作る

```bash
$ sudo adduser <user_name>
$ sudo gpasswd -a <user_name> sudo
```
※sudo時に毎回パスワードを聞かれないようにする
https://qiita.com/inoko/items/09b9a15cb1a5c83fed34 

※初回リモデ時のキーボード設定でキー入力がうまいこといかなかった場合
https://blog.amedama.jp/entry/2017/03/10/210552

- 日本語入力できるようにする(ibus-mozcインストール～ibus再起動)

```bash:
$ sudo apt-get install ibus-mozc
$ killall ibus-daemon
$ ibus-daemon -d -x &
```

(以下デスクトップでの作業)

1. ubuntuの 「設定」>「テキスト入力」の使用する入力ソースに「日本語(Mozc)(iBus)」を追加
- デスクトップのタスクバーから言語設定(おそらく画面右上に"ja"とか"en"と表示されているはず)をクリック
- "Japanese(Mozc)"を選択