TensorflowをCentOS7にオフライン環境でインストールする

https://www.tensorflow.org/install/install_sources

上記の公式ページを参考にして、すんなりいけると思っていたのですが、意外と苦戦したのでやり方を書きます。
基本的にはインターネットにつながる環境からパッケージをダウンロードしてきて
インターネットにつながらない環境に持ってくるという作業になります。

# 環境
CentOS Linux release 7.3.1611

# 事前準備
いくつか必要なパッケージがあるのでインストールします。
すでにあるものは飛ばして大丈夫です。

## JDK
後ほど出てくるbazelのインストールに必要となります。

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

公式から落としてきます。
インストール方法はググれば色々出てくるので省略します。

## Anaconda
python、jupyter、numpyなどが入ってます。

https://www.anaconda.com/download/

上記サイトからダウンロードします。

インストールはbashコマンドをたたくだけです。

    $ bash Anaconda2-5.0.1-Linux-x86_64.sh

.bashrcにインストールしたパスをexportしましょう。

```bash:.bashrc
export PATH="<インストールパス>/bin:$PATH"
```

## bazel
Tensorflowのインストールに必要になります。

https://github.com/bazelbuild/bazel/releases

上記サイトから
bazel-0.5.4-without-jdk-installer-linux-x86_64.sh
をダウンロードします。
もしかしたらJDKはインストールしなくてもこちらでjdkありのソースを落としても良かったかもしれません。
筆者はTensorflow1.4をインストールする予定だったのでbazelのバージョンは0.5.4を採用しました。
適宜バージョンはご自身の環境に合わせてインストールしてください。
どのバージョンをインストールするかは下記ページで確認できます。

https://www.tensorflow.org/install/install_sources

インストールはbashコマンドを実行するだけです。

    $ bash bazel-0.5.4-without-jdk-installer-linux-x86_64.sh

#Tensorflowのインストール
ここからが本番です。
まずは、公式にのっとって、configureします。

    $ cd tensorflow
    $ ./configure

色々聞かれますが必要に応じてyes/noを選択してください。
公式通り進むと下記コマンドを実行するように聞かれます。

    $ bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package

ここでこけます。
内部でインターネットにつなげていろいろパッケージをインストールしようとするためです。

ダウンロード先を管理しているファイルはtensorflowディレクトリの以下にあります。
```tensorflow/workspace.bzl```

ここのURLを無理やり書き換える操作を行います。

protobuf_archiveを例に記述します。
インターネットにつなげる環境からまずパッケージをダウンロードします。

https://github.com/google/protobuf/archive/b04e5cba356212e4e8c66c61bbe0c3a20537c5b9.tar.gz

適当なディレクトリにおいて、以下コマンドを実行します。

    $ python -m SimpleHTTPServer 8000

`tensorflow/workspace.bzl`の2番目以降のURLを書き換えます。
ここで1番目のURLを書き換えるとエラーになってしまいますので、必ず2番目以降を書き換えてください。

変更前

    tf_http_archive(
        name = "protobuf_archive",
        urls = [
            "https://mirror.bazel.build/github.com/google/protobuf/archive/b04e5cba356212e4e8c66c61bbe0c3a20537c5b9.tar.gz",
            "https://github.com/google/protobuf/archive/b04e5cba356212e4e8c66c61bbe0c3a20537c5b9.tar.gz",
        ],

変更後

    tf_http_archive(
        name = "protobuf_archive",
        urls = [
            "https://mirror.bazel.build/github.com/google/protobuf/archive/b04e5cba356212e4e8c66c61bbe0c3a20537c5b9.tar.gz",
            "http://localhost:8000/b04e5cba356212e4e8c66c61bbe0c3a20537c5b9.tar.gz",
        ],

これを面倒ですが全ファイル分行います。
たまに存在しないファイルもあるのでそれは無視して大丈夫です。

これで、ビルドが成功するので公式通り下記コマンドを実行します。

    $ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

最後に、インストールを行います。

    $ pip install /tmp/tensorflow_pkg/tensorflow-1.4.0-py2-none-any.whl

ファイル名はインストールした内容によって異なるので各自書き換えてください。
ここでまたしてもこけます。理由は前と同じです。

足りないライブラリは各自でダウンロードしてインストールしてください。
筆者がインストールしたのは以下です。
これもAnacondaやTensorflowのバージョンによっては異なるかもしれません。

    Markdown-2.6.10.zip
    absl-py-0.1.7.tar.gz
    backports.weakref-1.0.post1-py2.py3-none-any.whl
    bleach-1.5.0-py2.py3-none-any.whl
    html5lib-0.9999999-py2-none-any.whl
    mock-2.0.0-py2.py3-none-any.whl
    pbr-3.1.1-py2.py3-none-any.whl
    protobuf-3.5.1-py2.py3-none-any.whl
    tensorflow_tensorboard-0.4.0rc3-py2-none-any.whl

依存関係にあるライブラリもインストールしました。
.whlファイルは`pip install *.whl`でインストールできます。
`tar.gz`や`.zip`で圧縮されているファイルは解凍後、
`python setup.py install`を実行することでインストールされます。

全てインストールした後に再度`pip install`を実行すると成功です！