Python
CentOS
機械学習
DeepLearning
TensorFlow

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しましょう。

.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を実行すると成功です!