45

Python で Tensorflow バインディングを正常にインストールしました。しかし、Tensorflow をインポートしようとすると、次のエラーが発生します。

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so)

GLIBC_2.15 を 2.17 に更新しようとしましたが、うまくいきません。

4

14 に答える 14

22

root権限なしで、glibc 2.12を使用してCentOS 6.5にtensorflow 0.12rc0をインストールできました。pip を介して tensorflow バイナリをインストールするだけで、GLIBC バージョンに関連するエラーが発生しました。

基本的に、これに対処する方法は 4 つあります (それぞれに長所と短所があります)。

オプション 1 - システム GLIBC をグローバルにアップグレードします。

システムがこれをサポートしていて、root 権限を持っていて、このアップグレードによって奇妙な理由で何かが壊れることはないと確信している場合は、おそらくこれが最適なオプションです。最終的に、これは Linux ディストリビューション全体をアップグレードすることになります。以下は、一般的なディストリビューションのデフォルトの GLIBC バージョンの短いリストです。

オプション 2 - システムに 2 番目の GLIBC を追加する

バイナリをコンパイルまたはダウンロードします。最もシンプルで簡単なオプション。特に、いくつかの単純なスクリプトを実行するだけでよい場合。

オプション 3 - tensorflow にパッチを当てる

これは TF 0.6.0 で機能する可能性がありますが、新しい tensorflow バージョンがリリースされるたびに、おそらく最初からやり直す必要があります。たとえば、これは 0.9.0 の修正です

オプション 4 - ソースからテンソルフローをコンパイルする

ソースから再コンパイルして既存の GLIBC にリンクすると、新しい GLIBC は不要になります。どういうわけか、このオプションはまだここの回答で言及されていません。私見、これは「一般的に」と「特にテンソルフロー用」の両方で最良のオプションです。

  • これは r0.11 で問題なく機能し、おそらく何年も機能しますが、理論的には、古いバージョンには存在しない新しい GLIBC 機能を実際に使用することを決定した場合、新しい tensorflow バージョンで機能しなくなる可能性があります。
  • 正直なところ、特に古いシステムでは、ソースからテンソルフローを構築するのは簡単ではありません。

「時代遅れのシステムでテンソルフローを構築する」の簡単な要約:

公式ガイドには「ソースからインストールする」セクションがありますが、古いシステムでビルドするために必要ないくつかのトリックがあります。ここでは、root 権限を持っていないと仮定します (持っている場合は、ソースから手動でビルドするのではなく、パッケージ マネージャーを使用して同じ事前要求をインストールできる可能性があります)。

よく文書化された 2 つのサクセス ストーリーを見つけました: #1#2と、公式の github の多数の有用な投稿 (主に、バイナリ内でリンクする一連のライブラリに関するもの): #1#2#3#4。私の場合、TFを正常にコンパイルするには、そこに記載されているトリックを組み合わせる必要がありました。

  1. まず、あなたの をチェックgcc --versionして、それが c++11 をサポートしていることを確認してください。私のは4.4.7だったので、動作しません。gcc-4.9.4 のソースコードをダウンロードしてコンパイルました。この手順は非常に簡単ですが、コンパイル自体には数時間かかる場合があります。bazel の問題の回避策として、ハードコードされたパスを使用して gcc をコンパイルしましasた。ただし、別の回避策を試すこともできます: ( 1 , 2 )。ldnm

    #!/bin/sh
    
    unset LIBRARY_PATH CPATH C_INCLUDE_PATH 
    unset PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH
    
    cd gcc-4.9.4
    ./contrib/download_prerequisites
    
    mkdir objdir
    cd objdir
    
    
    # I've added --disable-multilib to fix the following error:
    # /usr/bin/ld: crt1.o: No such file: No such file or directory
    # collect2: ld returned 1 exit status
    # configure: error: I suspect your system does not have 32-bit 
    # developement libraries (libc and headers). If you have them,
    # rerun configure with --enable-multilib. If you do not have them, 
    # and want to build a 64-bit-only compiler, rerun configure 
    # with --disable-multilib.           
    
    ../configure --prefix=$HOME/opt/gcc-4.9.4 \
                 --disable-multilib \
                 --disable-nls \
                 --enable-languages=c,c++ \
                 --with-ld=/usr/bin/ld \
                 --with-nm=/usr/bin/nm \
                 --with-as=/usr/bin/as
    
    make        
    make install
    
  2. を確認してくださいjava --version。Bazel には JDK 8 が必要です。必要に応じてインストールしてください。( bazel-0.4.1用のjdk7関連のダウンロードをまだ提供していますが、非推奨と見なしているようです)

  3. use_gcc_4.9.4.sh必要な環境変数を含む別のファイルを作成しました。source ./use_gcc_4.9.4.shこの新しいコンパイラに関連する何かが必要なときに使用します。

    #!/bin/sh
    this=$HOME/opt/gcc-4.9.4
    export PATH=$this/bin:$PATH
    export CPATH=$this/include:$CPATH
    export LIBRARY_PATH=$this/lib:$LIBRARY_PATH
    export LIBRARY_PATH=$this/lib64:$LIBRARY_PATH
    export LD_LIBRARY_PATH=$this/lib:$LD_LIBRARY_PATH
    export LD_LIBRARY_PATH=$this/lib64:$LD_LIBRARY_PATH
    
  4. 現在の bazel バイナリ (0.4.1)には GLIBC 2.14 が必要なため、bazel もソースから(新しい gcc を使用して) コンパイルする必要があります。ターゲット マシンで非常に限られた数のスレッドしか実行できない場合を除き、問題なく動作します。(この投稿では、いくつかの追加の回避策について説明していますが、私の場合は、bazel コードの最近の更新が原因で、それらは必要ありませんでした。)

  5. tensorflow ソース コードgit clone https://github.com/tensorflow/tensorflowを取得し、必要な前提条件 (CUDA、cuDNN、python など) をインストールします。公式ガイドを参照してください。

  6. デフォルトのシステム gcc を使用していない場合 (たとえば、上記のように新しい gcc をコンパイルする必要がある場合)、次のリンカー フラグ59 行tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl目に追加します。

    linker_flag: "-L/home/username/localinst/opt/gcc-4.9.4/lib64"
    linker_flag: "-Wl,-rpath,/home/username/localinst/opt/gcc-4.9.4/lib64"
    

    この手順を行わないと、次のようなエラー メッセージが表示される可能性があります。

    # ERROR: /home/username/localdistr/src/tensorflow/tensorflow/tensorflow/core/debug/BUILD:33:1: null failed: protoc failed: error executing command bazel-out/host/bin/external/protobuf/protoc '--cpp_out=bazel-out/local_linux-py3-opt/genfiles/' '--plugin=protoc-gen-grpc=bazel-out/host/bin/external/grpc/grpc_cpp_plugin' ... (remaining 8 argument(s) skipped): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 1.
    # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by bazel-out/host/bin/external/protobuf/protoc)
    # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by bazel-out/host/bin/external/protobuf/protoc)
    # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by bazel-out/host/bin/external/protobuf/protoc)
    
  7. 最後に、GLIBC の依存関係を回避するために、-lrtリンカー フラグを追加して (おそらく -lm同様に)、いくつかのライブラリを静的にリンクする必要があります。これを別の方法で追加することを提案する複数の投稿を見つけました。

    • bazelコマンドライン経由(合理的に聞こえるかもしれませんが、現在のテンソルフローバージョンでは何とか機能しません)、
    • 「bazel-tensorflow/external/protobuf/BUILD」経由(機能しているかどうかはわかりませんが、これは便利に見えません - このファイルはビルド試行中にのみ作成されます)
    • 「hird_party/gpus/crosstool/CROSSTOOL.tpl」経由(前の手順で編集した同じファイル、既に追加した行のすぐ下)。

      linker_flag: "-lrt"
      linker_flag: "-lm"
      
    • 「tensorflow/tensorflow.bzl」経由(私にとっては機能しますが、もう1つのファイルを編集する必要があるため、あまり便利ではありません。前のポイントと100%同等かどうかはわかりません)

    GLIBC-lrtバージョン固有のエラーが再び発生することなく、次のことを試みましたimport tensorflow

    # ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/username/anaconda3/envs/myenvname/lib/python3.5/site-packages/tensorflow/python/_pywrap_tensorflow.so)
    

    これがなければ、これ-lmに遭遇する可能性があります(私にとっては、必要ではないことが判明しました)。

  8. ビルド プロセスを実行します。

    source ./use_gcc_4.9.4.sh
    ./configure
    bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
    bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
    pip install --upgrade /tmp/tensorflow_pkg/tensorflow-0.12.0rc0-cp35-cp35m-linux_x86_64.whl
  1. 次の簡単な python スクリプトを実行して、最も基本的な機能が機能しているかどうかをテストしてみてください。

    import tensorflow as tf
    hello = tf.constant('Hello, TensorFlow!')
    sess = tf.Session()
    print(sess.run(hello))
    
    a = tf.constant(10)
    b = tf.constant(32)
    print(sess.run(a + b))
    
于 2016-12-06T19:10:59.920 に答える
17

私は同じ問題を抱えていたので、グーグルで次の手順を実行しました。

$ sudo pip install --upgrade virtualenv
$ virtualenv --system-site-packages ~/tensorflow
$ cd ~/tensorflow
$ source bin/activate
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
$ cd /tmp
$ wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb
$ wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb
$ mkdir libc6_2.17
$ cd libc6_2.17
$ ar p ../libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx
$ ar p ../libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx
$ cd -
$ LD_LIBRARY_PATH=/tmp/libc6_2.17/lib/x86_64-linux-gnu/ /tmp/libc6_2.17/lib/x86_64-linux-gnu/ld-2.17.so bin/python local/lib/python2.7/site-packages/tensorflow/models/image/mnist/convolutional.py

そして終了するには:

$ deactivate 

それは私にとってはうまくいきます。

于 2015-11-13T18:03:05.210 に答える
10

わかりましたので、以前の回答で言及した別の解決策を次に示します。これはよりトリッキーですが、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 つは--userpip コマンドにフラグを追加することです)、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

:)

于 2016-01-20T12:45:41.107 に答える
2

Theo Trouillon の「弱体化」ソリューションに注意してください。Tensorflow 0.6.0 にのみ適用されます。Tensorflow 0.9.0 に適用する場合は、さらにトリッキーになります。私の場合は CPU モード、GLIBC 2.12 GLIBCXX 3.4.13 の Centos 6.7 でした。

テンソルフローのインストール:

pip uninstall protobuf 
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

「弱体化」コードを変更する必要があります:

TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module('tensorflow')[1])"`
for addr in 0x376e34 0x376e94 0x376ef4 0x376f14 0x376f24 0x376f44 0x376f54 ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done
for addr in 0x93aa4 0x93b04 ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_bucketization_op.so bs=1 seek=$((addr)) ; done
for addr in 0x95bec 0x95c4c ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_sparse_feature_cross_op.so bs=1 seek=$((addr)) ; done
for addr in 0x9ffec 0x9fffc 0xa005c ; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/metrics/python/ops/_set_ops.so bs=1 seek=$((addr)) ; done
for addr in 0x96aa4 0x96b04 0x96b24; do printf '\x02' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/linear_optimizer/python/ops/_sdca_ops.so bs=1 seek=$((addr)) ; done

また、次のコードは、新しいマシンのスタブ生成コードに追加する必要があります。

mkdir my_include/bits
cp libstdc++-v3/include/bits/shared_ptr_atomic.h my_include/bits/
cp libstdc++-v3/include/std/memory my_include/
gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/shared_ptr.so -fPIC -fno-builtin ./libstdc++-v3/src/c++11/shared_ptr.cc
gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/list.so -fPIC -fno-builtin ./libstdc++-v3/src/c++98/list.cc
echo "
#include <unistd.h>
#include <stdlib.h>
char * secure_getenv (const char *name) {
          if ((getuid () == geteuid ()) && (getgid () == getegid ())) return getenv (name); else  return NULL;
}" > getenv.cc
gcc -I$PWD/my_include  -std=c++11 -fpermissive -s -shared -o    ${MYSTUBS}/getenv.so -fPIC -fno-builtin getenv.cc

もちろん、最終的な実行コードを変更して、追加のスタブを含める必要があります。

LD_PRELOAD="$MYSTUBS/list.so:$MYSTUBS/mylibc.so:$MYSTUBS/shared_ptr.so:$MYSTUBS/getenv.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
于 2016-06-30T06:23:09.110 に答える
1

このエラーは主に、GNU C ライブラリが最新でない場合に発生します。簡単な方法で実行中のバージョンを確認できます

$ ldd --version

出力は次のようになります。

ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

2.19 が GLIBC のバージョンです。アップグレードするには、GNU-C ライブラリ プロジェクトの Web サイトにアクセスして、最新バージョンをダウンロードします。最新の glibc へのリンクは次のとおりです: GNU-C ライブラリのダウンロード この回答を書いている時点で、最新の安定バージョンは 2.22でした。

Ubuntu 12.04 と 14.04 の両方で tensorflow を実行してみました。Ubuntu 14.04 では、デフォルトで glibc 2.19 がインストールされているため、この問題は発生しません。

それが役に立てば幸い。

于 2016-01-15T09:42:32.703 に答える
1

@Théo Tの回答のリンクが機能しなくなったため、最終的に機能するものを見つけるためにいくつかの代替手段を試す必要がありました.

mkdir ~/my_libc_env
cd ~/my_libc_env
wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb
wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb
wget ftp://ftp.icm.edu.pl/vol/rzm5/linux-slc/centos/7.0.1406/cr/x86_64/Packages/libstdc++-4.8.3-9.el7.x86_64.rpm
ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx
ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx
rpm2cpio libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv

テンソルフローで Python コードを実行する

LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python` your_program.py
于 2016-04-01T05:25:02.367 に答える
1

私の解決策は Theo T の解決策と似ています。Xubuntu 12.04 (CAELinux 2013) 用に微調整されていますが

sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl
sudo su
# prompt for password
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

readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so
exit

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

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

次の 2 つの手順では、tensorflow/models/image/mnist ディレクトリにある convolution.py スクリプトを実行します。

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

これらの縮小された依存関係で python を常にロードする場合は、以下の手順でこれを .bashrc ファイルに追加するだけです。

echo "LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4`" >> ~/.bashrc
echo alias python="'"LD_PRELOAD='"''$'MYSTUBS/mylibc.so:'$'MYSTUBS/random.so:'$'MYSTUBS/hash_bytes.so:'$'MYSTUBS/chrono.so:'$'MYSTUBS/hashtable.so:'$'MYSTUBS/bad_function.so:'$'LIBSTDCPP'"' python"'" >> ~/.bashrc

ipython がある場合:

echo alias ipython="'"LD_PRELOAD='"''$'MYSTUBS/mylibc.so:'$'MYSTUBS/random.so:'$'MYSTUBS/hash_bytes.so:'$'MYSTUBS/chrono.so:'$'MYSTUBS/hashtable.so:'$'MYSTUBS/bad_function.so:'$'LIBSTDCPP'"' ipython"'" >> ~/.bashrc

基本的に、site-packages の代わりに dist_packages で行われる python インストールに更新しました。また、gccのネイティブ git ページではなく、 gcc ミラーからクローンを作成します。残りはすべて同じです。

最後のいくつかの手順により、python または ipython を実行するたびに、依存関係が削減された状態で読み込まれるようになります。

于 2016-01-25T12:51:27.380 に答える
0

私は同じ問題を抱えていて、次の解決策を見つけました

conda install tensorflow
于 2019-08-25T02:25:50.027 に答える