CentOS6.7にTensorFlowをインストールする

# **初投稿**
初めての投稿ですが、今回からTensorFlowを使ってみようと思っていて、
備忘録的な意味も込めて、まとめていこうと思います。

# **TensorFlow**
DeepLearningのフレームワークといえばBVLCのCaffeやChainerなどありますが、今回はGoogleの[TensorFlow](https://www.tensorflow.org/)を使ってみることにしました。



## **まずはインストール**
基本的に、[TensorFlowで Hello Worldを動かしてみた&その解説](http://dev.classmethod.jp/machine-learning/tensorflow-hello-world/)
を参考に進めていくのですが、自分の場合割と面倒だったので改めてまとめます。
### **1. pythonの更新**

```sh
$ python -V
Python 2.6.6
```

TensorFlowでは2.7以上が必要なので、まずはpythonの更新から始めます。

```sh
$ cd /usr/local/src/
$ wget https://www.python.org/ftp/python/2.7.6/Python-2.7.6.tgz
$ tar zxf Python-2.7.6.tgz
$ cd Python-2.7.6/
$ ./configure
$ make && make altinstall
$ mv /usr/bin/python /usr/bin/python2.6.6
$ cp /usr/local/src/Python-2.7.6/python /usr/bin/python
$ python -V
Python 2.7.6
```

### **2. pipのインストール**

```sh
$ wget https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py
ImportError: cannot import name HTTPSHandler
```
HTTPSHandlerがimportできないと怒られる…
これはopensslに含まれるもので、openssl-develをインストールして、再度makeします。

```sh
$ yum install openssl-devel
$ make clean
$ make && make altinstall
$ cp /usr/local/src/Python-2.7.6/python /usr/bin/python
$ python get-pip.py
$ pip --version
pip 8.0.3 from /usr/local/lib/python2.7/site-packages (python 2.7)
```

### **3. virtualenvのインストールと環境構築**

```sh
$ pip install virtualenv
$ cd ~
$ mkdir tensorflow && cd tensorflow
$ virtualenv --system-site-packages ~/tensorflow
$ source bin/activate
```

### **4. TensorFlowのインストール**

```sh
(tensorflow)$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl
```
## **テストスクリプトの実行**

```sh
$ python hello-tf.py 
```
(hello-tf.pyの詳細は上記のリンク先を参照して下さい。)
すると以下のように怒られました。

```sh
ImportError: /lib64/libc.so.6: version `GLIBC_2.17' not found
```

とりあえずglibcのバージョンを見てみます。

```sh
$ yum info glibc
名前　　　　　　　: glibc
アーキテクチャ　　: x86_64
バージョン　　　　: 2.12
```

なるほど確かに足りていない…
glibcはかなりいろいろな箇所で使われているものなので、安易に更新するというのは割と危険
だと思いますので、glibcの2.17をどっかから取ってきてLD_LIBRARY_PATHでパスを通すことを考えます。

とりあえずパッケージを取ってきて展開します。

```sh
$ wget ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/7.0/x86_64/updates/security/glibc-devel-2.17-55.el7_0.5.x86_64.rpm
$ wget ftp://mirror.switch.ch/pool/4/mirror/scientificlinux/7.0/x86_64/updates/security/glibc-2.17-55.el7_0.5.x86_64.rpm
$ mkdir libc2.17 && cd libc2.17
$ rpm2cpio ../glibc-devel-2.17-55.el7_0.5.x86_64.rpm | cpio -id
$ rpm2cpio ../glibc-2.17-55.el7_0.5.x86_64.rpm | cpio -id
```
例えば/tmpに置いておいて、パスを通して再び実行しみます。

```sh
$ LD_LIBRARY_PATH=/tmp/libc6_2.17/lib64/ /tmp/libc6_2.17/lib64/ld-2.17.so bin/python ~/tensorflow/hello-tf.py

ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
```

まぁ、そうですよね…
バージョンを見てみる

```sh
$ strings /usr/lib64/libstdc++.so.6.0.13 | grep GLIBCXX

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
```

おしい…
さっきと似たようなことをします。

```sh
$ wget http://mirrors.kernel.org/centos/7.2.1511/os/x86_64/Packages/libstdc++-devel-4.8.5-4.el7.x86_64.rpm
$ wget http://mirrors.kernel.org/centos/7.2.1511/os/x86_64/Packages/libstdc++-4.8.5-4.el7.x86_64.rpm
$ rpm2cpio libstdc++-devel-4.8.5-4.el7.x86_64.rpm | cpio -id
$ rpm2cpio libstdc++-4.8.5-4.el7.x86_64.rpm | cpio -id
```

展開したものを/tmpに置きパスを通して再び実行します。

```sh
$ LD_LIBRARY_PATH=/tmp/libc6_2.17/lib64/:/tmp/libstdc++4.8.5/usr/lib64 /tmp/libc6_2.17/lib64/ld-2.17.so bin/python ~/tensorflow/hello-tf.py

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 32
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 32
hello, tensorflow
30
```

わーいわーい

# **次回？**
さて、今回はインストールしてテストスクリプトを動かすまでをまとめました。
次回（もしあれば）は実際に何かやってみたいと思ってます。