読者です 読者をやめる 読者になる 読者になる

どせいたんさき。

ナスダヨー

RHEL6 の環境で TensorFlow を起動させる

Python Note

目的

RHEL6 で TensorFlow を使いたい.ここでは Python 2.7 系のインストールは完了しており pyenv, virtualenv を用いてローカルに自由にパッケージをインストールできる環境が整っているとする.pip を使った TensorFlow のインストールは以下のコマンドで完了する.

# TensorFlow
pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.10.0rc0-cp27-none-linux_x86_64.whl

問題

しかしながらこのままでは TensorFlow を import できない.内部で使用している _pywrap_tensorflowglibc >2.14 を必要とするが RHEL6 では glibc-2.12 を使っているためである.

>>> import tensorflow
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home02/ohsawaru/.pyenv/versions/ml/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.Traceback (most recent call last):
so)
  File "<stdin>", line 1, in <module>
  File "/home/piyo/.pyenv/versions/ml/lib/python2.7/site-packages/tensorflow/__init__.py", line 23, in <module>
    from tensorflow.python import *
  File "/home/piyo/.pyenv/versions/ml/lib/python2.7/site-packages/tensorflow/python/__init__.py", line 48, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/home/piyo/.pyenv/versions/ml/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/home/piyo/.pyenv/versions/ml/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/piyo/.pyenv/versions/ml/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so)

解決方法

問題は libc.so.6 のバージョンが古いことである.ここでは TensorFlow を使う時だけ新しい libc.so.6 にリンクさせるようにすれば良い.

まずは Rpmfind から必要なパッケージをダウンロードしてくる.

ここでは CentOS7 のパッケージを使わせてもらった.適当なディレクトリに展開する.

mkdir ${HOME}/local
cd ${HOME}/local
rpm2cpio ${DOWNLOADS}/glibc-2.17-106.el7_2.8.x86_64.rpm | cpio -idv
rpm2cpio ${DOWNLOADS}/glibc-devel-2.17-106.el7_2.8.x86_64.rpm | cpio -idv
rpm2cpio ${DOWNLOADS}/libstdc++-4.8.5-4.el7.x86_64.rpm | cpio -idv
rpm2cpio ${DOWNLOADS}/libstdc++-devel-4.8.5-4.el7.x86_64.rpm | cpio -idv

ls local
# etc  lib64  sbin  usr  var

local/lib64 にある ld-linux-x86-64.so.2 にライブラリパスを指定しつつ python を起動する.このとき python絶対パスで指定する.例えば pyenv-virtualenv によって TensorFlow 環境を作っている場合には以下のように指定する.

LDPATH="${HOME}/local/lib64/ld-linux-x86-64.so.2"
LDLIBS="${HOME}/local/x86_64/lib64"
LDLIBS="${LDLIBS}:${HOME}/local/x86_64/usr/lib64"
PYPATH="${HOME}/.pyenv/versions/TensorFlow/bin/python"

${LDPATH} --library-path ${LDLIBS} ${PYPATH}

# ipython は以下のように起動する.
IPYPATH="${HOME}/.pyenv/versions/TensorFlow/bin/ipython"

${LDPATH} --library-path ${LDLIBS} ${PYPATH} ${IPYPATH}

それぞれエイリアスを作成しておくとよい.

alias python-tensorflow="${LDPATH} --library-path ${LDLIBS} ${PYPATH}"
alias ipython-tensoflow="${LDPATH} --library-path ${LDLIBS} ${PYPATH} ${IPYPATH}"

python-tensorflow から起動した python なら TensorFlow が問題なく起動することを確認した.

参考資料