Raspbian に公式対応した TensorFlow を入れてみたら警告が出たのでどうにかしてみたって話

# TL;DR

[公式から Raspbian 向けに TensorFlow のバイナリが提供された](https://medium.com/tensorflow/tensorflow-1-9-officially-supports-the-raspberry-pi-b91669b0aa0) らしいので、試しに家の Raspberry pi にインストールしてみたよ。
[Installing TensorFlow on Raspbian  |  TensorFlow](https://www.tensorflow.org/install/install_raspbian) の手順通り、 `pip` ですんなり入ったけど `import tensorflow` したらなんか RuntimeWarning を吐いたのが気分わるかったよ。
なんだか悔しかったので `venv` を使って RuntimeWarning を吐かない環境を作ってみたよ。

# 背景

もともと [TensorFlow](https://www.tensorflow.org/) を含む ML には興味があったのですが、 Clustering や Container 周りの技術や CI/CD Pipeline にも興味があったり、 Smart Speaker の調査をしていたりで ML には全く手を付けることができていませんでした。
そんな中、 [TensorFlow 1.9 Officially Supports the Raspberry Pi](https://medium.com/tensorflow/tensorflow-1-9-officially-supports-the-raspberry-pi-b91669b0aa0) という話を見かけ、それなら家で眠ってる Raspberry pi を使えばサクッと試せそうだなーと思ったのが発端です。

# 前提条件

## 利用環境

*   [Raspberry pi 3 Model B](https://amzn.to/2Ouzi0i) (プラスではない方...)
*   [Raspbian GNU/Linux 9.4 (stretch)](https://www.raspberrypi.org/downloads/raspbian/)
*   Python 3.5 (もともと入っているバージョン)
*   Python 3.4 (本稿のセットアップ手順で導入する)  
    ※ Python 2.7 は `pip install tensorflow` 実行時に `MemoryError` とか言われたので早々に止めました。私の環境の問題？

## 対象となる読者

*   Raspberry pi 上で Python 3 系を使って TensorFlow を触ってみようとしている人
*   問題なさそうな RuntimeWarning でも気になって仕方がない人
*   でも TensorFlow を自分で時間をかけて(24時間くらい？)までコンパイルしたくない人

# 結論

Python 3.4 をインストールして `venv` で環境を分けたらうまいこと RuntimeWarning が出なくなりました。

## RuntimeWarning が表示されないセットアップ手順

```shell-session
$ sudo apt update
$ sudo apt install libatlas-base-dev
$ sudo apt install python3.4
$ mkdir ~/venv
$ cd ~/venv/
$ python3.4 -m venv tensorflow_py34 --without-pip
$ source tensorflow_py34/bin/activate
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py
$ pip install numpy\<1.15
$ pip install tensorflow
```
以上。

## RuntimeWarning が表示されないことを確認

```shell-session
$ source ~/venv/tensorflow_py34/bin/activate
$ python
Python 3.4.4 (default, Apr 17 2016, 16:02:33)
[GCC 5.3.1 20160409] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
試しに `import` してみます。

```python
>>> import tensorflow as tf
>>>
```
RuntimeWarning が表示されなくなりました！

```python
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>>
```

もちろんこの通り Hello world も問題ありません。

# RuntimeWarning が表示されるセットアップ手順(公式の手順)

まずは [Installing TensorFlow on Raspbian  |  TensorFlow](https://www.tensorflow.org/install/install_raspbian) の通りにインストールしてみます。

`libatlas-base-dev` をインストールします。

```shell-session
$ sudo apt update
$ sudo apt install libatlas-base-dev
```

そして `tensorflow` を `pip3` でインストールします。

```shell-session
$ pip3 install tensorflow
```

何事もなくインストールできるのですが、実際に `import` してみると。。。

```shell-session
$ python3
Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170124] on linux
Type "help", "copyright", "credits" or "license" for more information.
```
```python
>>> import tensorflow as tf
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: compiletime version 3.4 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.5
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: builtins.type size changed, may indicate binary incompatibility. Expected 432, got 412
  return f(*args, **kwds)
/usr/lib/python3.5/importlib/_bootstrap.py:222: RuntimeWarning: numpy.dtype size changed, may indicate binary incompatibility. Expected 56, got 52
  return f(*args, **kwds)
>>>
```

と、 `RuntimeWarning` が3つ表示されてしまいます。
どうも Python 3.4 でコンパイルされていたり `builtins`, `numpy` モジュール辺りで気に入らないところがあるようです。

ただ、これで動かないのかというとそういうわけでもなさそうで、とりあえず Hello world は下記の通りしっかり動作します。

```python
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>>
```

というわけで、 RuntimeWarning が気になる人は [RuntimeWarning が表示されないセットアップ手順](#runtimewarning-が表示されないセットアップ手順) を試してみましょう！

# 最後に

そもそも RuntimeWarning が出力される原因は、 TensorFlow 1.9 の要件に

*   Raspberry Pi devices running Raspbian 9.0 or higher
*   Python 2.7
*   Python 3.4+

とあることから、配布されているバイナリは少し古いバージョンでビルドされているのではないかと思うのですよね。
そのうち Raspbian 9.4 + Python 3.5 でもきれいに入るようになると思いますが、それまでのワークアラウンドという事で。

おしまい。