わかりましたので、以前の回答で言及した別の解決策を次に示します。これはよりトリッキーですが、GLIBC>=2.12 および GLIBCXX>=3.4.13 のシステムで常に機能するはずです。私の場合は CentOS 6.7 でしたが、Ubuntu 12.04 でも問題ありません。
別のマシンまたは分離インストールのいずれかで、c++11 をサポートする gcc のバージョンが必要になります。しかし、今のところではありません。
ここで行うことは、_pywrap_tensorflow.so バイナリを編集して、libc と libstdc++ の依存関係を「弱体化」し、ld がこれから作成するスタブのリンクを受け入れるようにすることです。次に、不足しているシンボルのスタブを作成し、最後に Python の実行時にこれらすべてを事前にロードします。
まず、すばらしい記事 ( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc ) と貴重なアドバイスをくれた James に感謝したいと思います。
それでは、依存関係を弱体化することから始めましょう。それは、_pywrap_tensorflow.so の正しいバイトを置き換えるだけです。この手順は、テンソルフローの現在のバージョン (0.6.0) でのみ機能することに注意してください。したがって、まだ行われていない場合は、virtualenvがある場合は作成してアクティブ化し(管理者でない場合は virtualenv が解決策であり、もう 1 つは--user
pip コマンドにフラグを追加することです)、tensorflow 0.6.0 をインストールします (cpu を gpu に置き換えますgpu バージョンが必要な場合は url) :
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl
そして、迷惑な依存関係をすべて弱体化しましょう。これが tensorflow の cpu バージョンのコマンドです。
TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"`
for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done
そして、これがgpuのものです(正しいものだけを実行しないと、バイナリが破損します):
TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"`
for addr in 0xDC5EA4 0xDC5F04 0xDC5F54 0xDC5F74 0xDC5F84 0xDC5FA4; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done
次の方法で確認できます。
readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so
ここで何が起こっているのかを理解したい場合は、記事をご覧ください。
不足している libc シンボルのスタブを作成します。
mkdir ~/my_stubs
cd ~/my_stubs
MYSTUBS=~/my_stubs
printf "#include <time.h>\n#include <string.h>\nvoid* memcpy(void *dest, const void *src, size_t n) {\nreturn memmove(dest, src, n);\n}\nint clock_gettime(clockid_t clk_id, struct timespec *tp) {\nreturn clock_gettime(clk_id, tp);\n}" > mylibc.c
gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c
そのステップは、依存関係が欠落しているマシン (または類似したバージョンの標準ライブラリー (クラスター内など) を持つマシン) で実行する必要があります。
c++11 をサポートする gcc が必要なため、おそらくマシンを変更するつもりですが、すべての依存関係を欠いているマシンにはおそらくないでしょう (または、最近の gcc の分離インストールを使用できます)。以下では、私たちはまだ家にいて~/my_stubs
、どういうわけかあなたの家を複数のマシンで共有していると仮定しています。
そのため、libstdc++ に対して実行できる 1 つのスタブと、残りの不足しているスタブについては、gcc ソースからコンパイルします (リポジトリのクローンを作成するのに時間がかかる場合があります)。
printf "#include <functional>\nvoid std::__throw_bad_function_call(void) {\nexit(1);\n}" > bad_function.cc
gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc
git clone https://github.com/gcc-mirror/gcc.git
cd gcc
mkdir my_include
mkdir my_include/ext
cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext
gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc
gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc
gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc
gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc
以上です!すべての共有ライブラリ (およびローカルの libstdc++) をプリロードすることで、tensorflow python スクリプトを実行できるようになりました。
LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4` #For 64bit machines
LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py
:)