Jetson Nano でTensorFlow を使えるようにする

## 【目的】
Jetson NanoでTensorflowを使えるようにします。

## 【内容】
下記記事の続きです。
[【Jetson Nano はじめました】](https://qiita.com/rhene/items/6b6f78ef477002af3e27)

Jetson NanoできちんとGPUが利用できるようにTensorflowのセットアップを行います。


## 【手順】
基本的には以下の手順を踏襲します。
[【nvidia - DEEP LEARNING FRAMEWORKS DOCUMENTATION】](https://docs.nvidia.com/deeplearning/frameworks/install-tf-jetson-platform/index.html)

大雑把に分けると以下の手順になります。

1. 必要なライブラリの追加
1. pip3のインストールとアップデート
1. Python3ライブラリの追加
1. Tensorflowのインストール
1. インストール確認

## 【0. システムアップデート】
作業を行う前に、下記コマンドでシステムのアップデートを行っておきましょう。

```bash:システムアップデート
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade  # <- 必要に応じて
```


## 【1. 必要なライブラリの追加】
以下のコマンドを実行して、ライブラリを追加します。

```bash:ライブラリインストール
sudo apt install libhdf5-serial-dev hdf5-tools libhdf5-dev zlib1g-dev zip libjpeg8-dev
```


## 【2. pip3のインストールとアップデート】
以下のコマンドを実行して、pip3のインストールとアップデートを行います。

```bash:pip3インストール
sudo apt install python3-pip
sudo pip3 install -U pip
```


## 【3. Python3ライブラリの追加】
以下のコマンドを実行して、Python3のライブラリをインストールします。
hdf5(h5py)のビルドに時間がかかるので、動きが止まってもしばらく待ちましょう。

```bash:Python3ライブラリインストール
sudo pip3 install -U numpy grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta
```


## 【4. Tensorflowのインストール】
本手順の肝になります。
通常TensorflowのGPUをインストールする場合は `pip3 install tensorflow-gpu` としますが、ここでは少し異なる手順を行います。
Jetson用に最適化されたtensorflowをインストールするために、以下のコマンドのようにパッケージの参照先を指定してインストール操作を行います。

```bash:TensorFlowインストール
sudo pip3 install --pre --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v42 tensorflow-gpu
```


## 【5. インストール確認】
下記コマンドを実行し、エラーが発生せず正常にバージョン番号が表示されればインストールは完了しています。

```bash:TenrorFlowバージョン確認
python3

>>> import tensorflow
>>> tensorflow.__version__
'1.13.1'
```

```bash:TenrorFlowデバイス確認
python3 -c "from tensorflow.python.client import device_lib;print(device_lib.list_local_devices())"

2019-07-29 13:14:58.190442: W tensorflow/core/platform/profile_utils/cpu_utils.cc:98] Failed to find bogomips in /proc/cpuinfo; cannot determine CPU frequency
2019-07-29 13:14:58.235141: I tensorflow/compiler/xla/service/service.cc:161] XLA service 0xb3cd0c0 executing computations on platform Host. Devices:
2019-07-29 13:14:58.235246: I tensorflow/compiler/xla/service/service.cc:168]   StreamExecutor device (0): <undefined>, <undefined>
2019-07-29 13:14:58.612721: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:965] ARM64 does not support NUMA - returning NUMA node zero
2019-07-29 13:14:58.613451: I tensorflow/compiler/xla/service/service.cc:161] XLA service 0x937e7c0 executing computations on platform CUDA. Devices:
2019-07-29 13:14:58.613523: I tensorflow/compiler/xla/service/service.cc:168]   StreamExecutor device (0): NVIDIA Tegra X1, Compute Capability 5.3
2019-07-29 13:14:58.635780: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties: 
name: NVIDIA Tegra X1 major: 5 minor: 3 memoryClockRate(GHz): 0.9216
pciBusID: 0000:00:00.0
totalMemory: 3.87GiB freeMemory: 400.53MiB
2019-07-29 13:14:58.635908: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0
2019-07-29 13:15:11.521625: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-07-29 13:15:11.566313: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]      0 
2019-07-29 13:15:11.566375: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0:   N 
2019-07-29 13:15:11.617237: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/device:GPU:0 with 182 MB memory) -> physical GPU (device: 0, name: NVIDIA Tegra X1, pci bus id: 0000:00:00.0, compute capability: 5.3)
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 5129210299603277623
, name: "/device:XLA_CPU:0"
device_type: "XLA_CPU"
memory_limit: 17179869184
locality {
}
incarnation: 5782956840367099111
physical_device_desc: "device: XLA_CPU device"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184
locality {
}
incarnation: 16654519161776921911
physical_device_desc: "device: XLA_GPU device"
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 191168512
locality {
  bus_id: 1
  links {
  }
}
incarnation: 11282338340052839306
physical_device_desc: "device: 0, name: NVIDIA Tegra X1, pci bus id: 0000:00:00.0, compute capability: 5.3"
]
```

GPUもきちんと認識しているようです。
以上でTensorflowを使えるようになりました。