Подтвердить что ты не робот

Ошибка при импорте Tensorflow в Python 2.7 в Ubuntu 12.04. 'GLIBC_2.17 не найден'

Я успешно установил привязки Tensorflow с помощью python. Но когда я пытаюсь импортировать 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, но не повезло.

4b9b3361

Ответ 1

У меня была такая же проблема, поэтому я сделал следующие шаги:

$ 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 

Это работает для меня.

Ответ 2

Мне только удалось установить tenorflow 0.12rc0 на CentOS 6.5 с glibc 2.12 без привилегий root. Просто установка бинарного бинарного бинарного потока с помощью piper давала мне ошибку, связанную с версией GLIBC.

В принципе, у вас есть 4 варианта, как справиться с этим (каждый с некоторыми преимуществами и недостатками):

Вариант 1 - Обновите свою систему GLIBC глобально.

Это, вероятно, лучший вариант, если ваша система поддерживает это, у вас есть привилегии root, и вы уверены, что это обновление не сломает ничего по какой-то странной причине. В конечном итоге это связано с обновлением всего дистрибутива Linux. Здесь хороший короткий список стандартных версий GLIBC по популярным дистрибутивам.

Вариант 2 - добавьте второй GLIBC в вашу систему

Скомпилировать или загрузить двоичный файл. Самый простой и простой вариант. Особенно, если вам нужно запустить несколько простых скриптов.

  • возможно, чтобы иметь несколько версий glibc в одной системе, но нужно делать это с большой осторожностью.
  • Вы не будете уничтожать свою систему, если все ваши изменения будут ограничены виртуальной средой.
  • Многие программы, установленные или скомпилированные ранее, могут полагаться на старый GLIBC, просто сбой в вашей новой среде (например, вашей IDE python). Включая большинство основных команд bash, таких как "lc", "cd" и т.д.
  • Также возможны другие побочные эффекты, такие как значительные утечки памяти.
  • Таким образом, это очень плохая идея для добавить новый GLIBC в вашу обычную среду, например. через .bashrc.
  • С другой стороны, если вам нужен какой-то конкретный инструмент в вашей новой виртуальной среде, вы можете перекомпилировать его, связав его с новым GLIBC. Таким образом, он будет работать нормально в вашей новой среде.
  • Однако лично я быстро отказался от перекомпиляции всего, что мне нужно, в новой среде (без root и диспетчера пакетов).
  • A немного другой подход официально предлагается разработчиками GLIBC для тестирования новых GLIBC-сборок.

Вариант 3 - Патч-тензор

Это может работать для TF 0.6.0, но вам, вероятно, придется начинать снова с нуля, когда каждая новая версия tensorflow будет выпущена. Например. здесь исправление для 0.9.0.

Вариант 4 - Скомпилировать тензорный поток из источника

Если вы перекомпилируете его из источника и ссылки против существующего GLIBC, новый GLIBC больше не понадобится. Так или иначе, этот вариант не упоминался ни в одном ответе. Imho, это лучший вариант, как "в целом, так и" специально для тензорного потока".

  • Это работает нормально с r0.11 и, вероятно, будет работать в течение многих лет, но теоретически это может сломаться в некоторой новой версии tensorflow, если они решат фактически использовать некоторые новые функции GLIBC, не представленные в более старых версиях.
  • Честно говоря, создание тензорного потока из источника не является простым, особенно в устаревших системах.

Краткое описание "построения тензорного потока в устаревшей системе":

Хотя в официальном руководстве содержится раздел установка из источников", вам нужно сделать несколько трюков, чтобы создать его на устаревшей системе, Здесь я предполагаю, что у вас нет привилегий root (если вы это сделаете - вы, вероятно, сможете установить те же предварительные запросы с помощью диспетчера пакетов, а не вручную их создавать из источника).

Я нашел две хорошо документированные истории успеха: # 1, # 2 и ряд полезных сообщений в официальном github (в основном о наборе библиотек для связи внутри двоичного файла): # 1, # 2, # 3, # 4. Мне пришлось комбинировать трюки, описанные там, чтобы успешно скомпилировать TF в моем случае.

  • Прежде всего, проверьте gcc --version и подтвердить, что он поддерживает С++ 11. Шахта была 4.4.7, поэтому она не сработает. Я скачал исходный код gcc-4.9.4 и скомпилировал его, Этот шаг довольно прост, но сама компиляция может занять несколько часов. В качестве обходного пути для проблемы в bazel я скомпилировал gcc с закодированными путями до as, ld и nm. Однако вы можете попробовать другие обходные пути: (1, 2).

    #!/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
    
  • Проверьте java --version. Bazel требует JDK 8, при необходимости установите его. (Они по-прежнему предоставляют некоторые загрузки, связанные с jdk7, для bazel-0.4.1, но похоже, что они считают это устаревшим)

  • Я создал отдельный файл 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
    
  • Для текущей бинарной базы (0.4.1) требуется GLIBC 2.14, поэтому мы должны скомпилировать базу из источника (с нашим новым gcc). Работает нормально, если только вы разрешено запускать очень ограниченное количество потоков на целевой машине. (В этой статье описываются некоторые дополнительные обходные пути, но в моем случае они не были нужны, возможно, из-за недавних обновлений в bazel-коде.)

  • Получите исходный код testorflow git clone https://github.com/tensorflow/tensorflow и установите необходимые необходимые условия (CUDA, cuDNN, python и т.д.). См. официальное руководство.

  • Если вы не используете систему gcc по умолчанию (например, если вам нужно было скомпилировать новую gcc, как описано выше), добавьте следующие флаги компоновщика до tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl, строка 59:

    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"
    

    Без этого шага вы, вероятно, столкнетесь с сообщениями об ошибках, например this:

    # 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)
    
  • Наконец, чтобы избежать зависимостей GLIBC, нам необходимо статически связать некоторые библиотеки, добавив флаг -lrt linker (возможно -lm). Я нашел несколько сообщений, предлагая добавить это по-другому:

    • через bazel command line (может показаться разумным, но не работает для меня в текущей версии tensorflow, так или иначе),
    • через "bazel-tensorflow/external/protobuf/BUILD" (не уверен, что он работает, но это не выглядит удобно - этот файл создается только во время самой попытки сборки)
    • через "third_party/gpus/crosstool/CROSSTOOL.tpl" (тот же самый файл, который мы только что отредактировали на предыдущем шаге, чуть ниже строк, которые мы уже добавили).

      linker_flag: "-lrt"
      linker_flag: "-lm"
      
    • через "tensorflow/tensorflow.bzl" (работает для меня, но менее удобен только потому, что вам нужно отредактировать еще один файл. Я не уверен, что он на 100% эквивалентен предыдущей точке)

    Без -lrt Я снова столкнулся с ошибкой, связанной с GLIBC-версией, пытаясь 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 вы можете столкнуться с этим (для меня это оказалось необязательным).

  • Запустите процесс сборки.

    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 script, чтобы проверить, работает ли самый основной материал:

    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))
    

Ответ 3

Я попробовал решение BR_User и все еще раздражал:

ImportError: /usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.14' not found

Я нахожусь на CentOS 6.7, ему также не хватает обновленной стандартной библиотеки c++, поэтому, чтобы построить решение BR_User, я извлек правильный пакет libstd c++, однако я не нашел необходимости в виртуальной среде.

Предположим, что вы уже установили тензор потока, он дает:

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.riken.jp/Linux/scientific/7.0/x86_64/os/Packages/libstdc++-4.8.2-16.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.2-7mgc30.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'

Если это не сработает, у меня есть другое решение, но оно вам не понравится.

Ответ 4

Итак, вот другое решение, о котором я упоминал в предыдущем ответе , это более сложно, но он должен всегда работать с системами с GLIBC >= 2.12 и GLIBCXX >= 3.4.13. В моем случае это было на CentOS 6.7, но это также отлично подходит для Ubuntu 12.04.

Нам понадобится версия gcc, которая поддерживает С++ 11, либо на другой машине, либо на изолированной установке; но не на данный момент.

Что мы будем делать здесь, это отредактировать двоичный файл _pywrap_tensorflow.so, чтобы "ослабить" его зависимости libc и libstdС++, чтобы ld согласился связать заглушки, которые мы собираемся сделать. Затем мы сделаем эти заглушки для отсутствующих символов, и, наконец, мы собираемся предварительно загрузить все это при запуске python.

Прежде всего, я хочу поблагодарить Джеймса за его замечательную статью (http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc) и драгоценные советы, я не мог бы сделал его без него.

Итак, давайте начнем с ослабления зависимостей, а просто заменим правильные байты в _pywrap_tensorflow.so. Обратите внимание, что этот шаг работает только для текущей версии tensorflow (0.6.0). Так что если его еще не сделано, создайте и активируйте virtualenv, если он у вас есть (если вы не админ virtualenv, это решение, другое состоит в том, чтобы добавить флаг --user в команду pip) и установить fiforflow 0.6.0 (замените cpu на gpu в URL-адресе, если вы хотите версию gpu):

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

И пусть слабят все раздражающие зависимости, вот команда для версии процессора 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 one (запустите только правильный или вы испортите двоичный файл):

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

Вам нужно выполнить этот шаг на машине с отсутствующими зависимостями (или машиной с аналогичными версиями стандартных библиотек (например, в кластере)).

Теперь мы, скорее всего, сменим машину, так как нам нужен gcc, который поддерживает С++ 11, и, вероятно, это не на машине, которая не имеет всех зависимостей (или вы можете использовать изолированную установку последнего gcc), В следующем я предполагаю, что мы все еще находимся в ~/my_stubs и как-то вы делитесь своим домом на машинах, иначе вам просто нужно будет скопировать файлы .so, которые мы собираемся создать, когда это будет сделано.

Итак, один заглушка, который мы можем сделать для libstdС++, а для оставшихся недостающих мы собираемся скомпилировать их из 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

И это! Теперь вы можете запустить python с тензором script, предварительно загрузив все наши общие библиотеки (и ваш локальный libstdС++):

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

:)

Ответ 5

Примечание к "ослабляющему" решению Тео Труйона. Он применяется только для Tensorflow 0.6.0. Если вы хотите применить его для Tensorflow 0.9.0, это становится сложнее. Моим случаем был режим CPU, Centos 6.7, где GLIBC 2.12 GLIBCXX 3.4.13.

Установка тензорного потока:

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

Ответ 6

Эта ошибка возникает главным образом, если ваша библиотека GNU не обновляется. Вы можете проверить, какую версию вы используете, используя простой

$ 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 и загрузить последнюю версию. Ссылка на последний glibc находится здесь: Библиотека GNU-C Загрузить На момент написания этого ответа последняя стабильная версия была 2.22.

Я попробовал работать с тензорным потоком как на Ubuntu 12.04, так и на 14.04. Ubuntu 14.04 не бросает эту проблему, поскольку поставляется с установленным по умолчанию glibc 2.19.

Надеюсь, это поможет.

Ответ 7

Мое решение аналогично решению Тео Т; хотя точно настроен для 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

Следующие два шага запускают файл convolution.py script, расположенный в каталоге tensorflow/models/image/mnist:

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

В основном, я обновил его до установки python, выполняемой в dist_packages вместо пакетов сайта. Кроме того, я клонировал из gcc-mirror вместо собственной git страницы для gcc. Остальное все одинаково.

Последние несколько шагов гарантируют, что каждый раз, когда вы запускаете python или ipython, он загружается с уменьшенными зависимостями.

Ответ 8

Ссылка в ответе @Thoo 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

Ответ 9

Я попробовал fooobar.com/questions/161401/... решение, и он работал отлично. Но ссылку на скачивание libstdС++ - 4.8.2-7 больше нельзя получить, попробуйте найти новую с этой страницы: http://rpm.pbone.net/index.php3/stat/4/idpl/31981489/dir/centos_7/com/libstdc++-4.8.5-4.el7.x86_64.rpm.html

Для меня я использую это:

wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/libstdc++-4.8.5-4.el7.x86_64.rpm

Ответ 10

Обратите внимание: вы должны скачать deb-пакет своей платформой:

x86:

https://launchpad.net/ubuntu/raring/i386/libc6/2.17-0ubuntu5.1

wget http://launchpadlibrarian.net/151932048/libc6_2.17-0ubuntu5.1_i386.deb

sudo dpkg -i libc6_2.17-0ubuntu5.1_i386.deb

64:

https://launchpad.net/ubuntu/raring/amd64/libc6/2.17-0ubuntu5.1

wget http://launchpadlibrarian.net/151925896/libc6_2.17-0ubuntu5.1_amd64.deb

sudo dpkg -i libc6_2.17-0ubuntu5.1_amd64.deb

Тест на моем 12.04 Ubuntu x64.

Ответ 11

Выше ответов хорошо, но я все еще сталкивался с некоторыми проблемами даже после их выполнения. Я следовал так же, как в @Theo ответ на rhel, и я пытался экспортировать LD_LIBRARY_PATH, который вызвал некоторые ошибки, наряду с LD_LIBRARY_PATH также включает LD_PRELOAD в качестве

mkdir libstdc
cd libstdc
rpm2cpio ../libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv
LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`

вы должны всегда делать это во время запуска python, поэтому создайте script, который загружает эти переменные и вызывает интерпретатор python

vim tmp.sh

LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`

Ответ 12

Я получил "версию" GLIBC_2.14 "не найден" при импорте shadoworflow в python. Управляемый для импорта тензор потока в python3.5 на Centos6.6 с использованием virtualenv:

mkdir ~/tensorflow
cd ~/tensorflow
virtualenv --system-site-packages -p python3.5 ~/tensorflow
source bin/activate
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://195.220.108.108/linux/mageia/distrib/4/x86_64/media/core/updates/libstdc++6-4.8.2-3.2.mga4.x86_64.rpm
wget https://rpmfind.net/linux/centos/7.4.1708/updates/x86_64/Packages/glibc-2.17-196.el7_4.2.i686.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++6-4.8.2-3.2.mga4.x86_64.rpm | cpio -idmv
rpm2cpio glibc-2.17-196.el7_4.2.i686.rpm | cpio -idmv
pip3.5 install --upgrade tensorflow
export PYTHONPATH="$HOME/tensorflow/lib/python3.5/site-packages/"
alias tfpython='LD_LIBRARY_PATH="$HOME/tensorflow/lib/x86_64-linux-gnu/:$HOME/tensorflow/usr/lib64/" $HOME/tensorflow/lib/x86_64-linux-gnu/ld-2.17.so /usr/local/bin/python3.5'
tfpython

Ответ 13

У меня была похожая проблема при попытке установить numba в старой системе HPC Linux, работающей под управлением SUSE Linux Enterprise Server 11, которая имеет glibc 2.11.3 (согласно ldd --version). У меня нет прав суперпользователя, и любая обычная установка conda (из каналов по defaults, conda-forge или numba) завершится с OSError: /lib64/libpthread.so.0: version GLIBC_2.12 not found (required by...envs/test1-py37/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so). Мне удалось установить numba, выполнив следующие действия:

  1. Создать среду conda
  2. В среде nlsec установите glibc из среды nlsec
  3. Затем используйте pip для установки numba и llvmlite созданных для недавно установленного glibc:

Таким образом:

conda create -n test -c nlesc glibc
conda activate test
pip install numba

Тогда импорт numba работает. Однако впоследствии следует быть осторожным, чтобы любая последующая conda install llvmlite не " llvmlite " llvmlite до версии, несовместимой с numba, или возвращалась старая проблема. Вы можете прикрепить один или оба для этого эффекта. Вам придется закрепить как сборку, так и версию. Я создал pinned файл, содержащий:

llvmlite==0.27.0-pypi
numba==0.42.0-pypi

и поместил его в моей среде conda в текстовом файле conda-meta/pinned.