Ошибка при импорте 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, но не повезло.
12 ответов
У меня была та же проблема, так что, погуглив, я сделал следующие шаги:
$ 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
Это подходит для меня.
Мне только что удалось установить tenorflow 0.12rc0 на CentOS 6.5 с glibc 2.12, не имея привилегий root. Простая установка бинарного тензорного потока через pip приводила к ошибке, связанной с версией GLIBC.
Как правило, у вас есть 4 варианта, как с этим справиться (у каждого есть свои преимущества и недостатки):
Вариант 1 - Модернизация вашей системы GLIBC по всему миру.
Вероятно, это лучший вариант, если ваша система поддерживает это, у вас есть привилегии root, и вы уверены, что это обновление ничего не сломает по какой-то странной причине. В конечном счете, это приводит к обновлению всего дистрибутива Linux. Вот хороший краткий список версий GLIBC по умолчанию в популярных дистрибутивах.
Вариант 2 - Добавить второй GLIBC в вашу систему
Скомпилируйте или загрузите двоичный файл. Самый простой и понятный вариант. Особенно, если вам нужно всего лишь запустить несколько простых скриптов.
- Можно иметь несколько версий glibc в одной системе, но это следует делать с большой осторожностью.
- Вы не разрушите свою систему, если все ваши изменения будут ограничены виртуальной средой.
- Многие программы, установленные / скомпилированные ранее, могут полагаться на старый GLIBC, просто потерпят крах в вашей новой среде (например, в вашей Python IDE). Включая большинство основных команд bash, таких как "lc", "cd" и т. Д.
- Другие побочные эффекты, такие как значительные утечки памяти, также возможны.
- Таким образом, это очень плохая идея добавить новый GLIBC в вашу обычную среду, например, через
.bashrc
, - С другой стороны, если вам нужен какой-то конкретный инструмент в вашей новой виртуальной среде, вы можете перекомпилировать его, ссылаясь на новый GLIBC. Так что это будет работать нормально в вашей новой среде.
- Однако лично я перестал перекомпилировать все, что мне нужно, в новой среде (без рута и менеджера пакетов).
- Разработчики GLIBC официально предлагают несколько иной подход для тестирования новых сборок GLIBC.
Вариант 3 - Патч тензор потока
Это может работать для TF 0.6.0, но вам, вероятно, придется начинать заново с нуля, когда будет выпущена каждая новая версия тензорного потока. Например, вот исправление для 0.9.0.
Вариант 4 - компилировать тензор потока из источника
Если вы перекомпилируете его из исходного кода и создадите ссылку на существующий GLIBC, более новый GLIBC больше не понадобится. Так или иначе, этот вариант не был упомянут ни в одном ответе здесь. Имхо, это лучший вариант, как " в общем ", так и "специально для тензорного потока".
- Это работает нормально с r0.11 и, вероятно, будет работать годами, но теоретически, оно может сломаться в какой-то более новой версии tenorflow, если они решат использовать некоторые новые функциональные возможности GLIBC, которых нет в более старых версиях.
- Если честно, построение тензорного потока из источника не так просто, особенно в устаревших системах.
Краткий обзор "построения тензорного потока на устаревшей системе":
Хотя в официальном руководстве есть раздел " Установка из исходников ", для его сборки в устаревшей системе нужно сделать несколько хитростей. Здесь я предполагаю, что у вас нет привилегий root (если вы это сделаете - вы, вероятно, сможете установить те же предварительные запросы с помощью менеджера пакетов, а не их вручную, создавая их из исходного кода).
Я нашел две хорошо документированные истории успеха: # 1, # 2 и ряд полезных постов на официальном github (в основном о наборе библиотек для связи внутри двоичного файла): # 1, # 2, # 3, # 4. Мне пришлось комбинировать приемы, описанные там, чтобы успешно скомпилировать TF в моем случае.
Прежде всего, проверьте ваш
gcc --version
и убедитесь, что он поддерживает C++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
, Базель требует 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
Текущий двоичный файл bazel (0.4.1) требует GLIBC 2.14, поэтому мы должны также скомпилировать bazel из исходного кода (с нашим новым gcc). Работает нормально, если только вам не разрешено запускать очень ограниченное количество потоков на целевой машине. ( Этот пост описывает некоторые дополнительные обходные пути, но в моем случае они не были необходимы, возможно, из-за недавних обновлений в коде Bazel.)
Получить исходный код тензорного потока
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"
Без этого шага вы, скорее всего, столкнетесь с сообщениями об ошибках вроде этого:
# 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
флаг компоновщика ( возможно-lm
также). Я нашел несколько постов, предлагая добавить это по-другому:- через командную строку bazel (может показаться разумным, но, как-то, не работает для меня в текущей версии tenorflow),
- через "bazel-tenorflow / external / protobuf / BUILD" (не уверен, работает ли он, но это не выглядит удобным - этот файл создается только во время самой попытки сборки)
через "third_party / gpus / crosstool / CROSSTOOL.tpl" (тот же файл, который мы только что отредактировали на предыдущем шаге, чуть ниже уже добавленных строк).
linker_flag: "-lrt" linker_flag: "-lm"
через tenensflow / tenorflow.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
Попробуйте запустить следующий простой скрипт на 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))
Я попробовал решение BR_User и все еще раздражал:
ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
Я нахожусь на CentOS 6.7, ему также не хватает обновленной стандартной библиотеки C++, поэтому для построения решения BR_User я извлек правильный пакет libstdC++, однако не нашел необходимости в виртуальной среде.
Предположим, что вы уже установили тензор потока, он дает:
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://rpmfind.net/linux/sourceforge/m/ma/magicspecs/apt/3.0/x86_64/RPMS.lib/libstdc++-4.8.2-7mgc30.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`
Если это не сработает, у меня есть другое решение, но оно вам не понравится.
Итак, вот другое решение, о котором я упоминал в предыдущем ответе, оно более сложное, но всегда должно работать в системах с GLIBC>=2.12 и GLIBCXX>=3.4.13. В моем случае это было на CentOS 6.7, но это также хорошо для Ubuntu 12.04.
Нам понадобится версия gcc, которая поддерживает C++11, либо на другой машине, либо в изолированной установке; но не на данный момент.
Здесь мы собираемся отредактировать двоичный файл _pywrap_tensorflow.so, чтобы "ослабить" его зависимости libc и libstdC++, чтобы ld принял решение связать заглушки, которые мы собираемся создать. Затем мы сделаем эти заглушки для отсутствующих символов, и, наконец, мы собираемся предварительно загрузить все это при запуске python.
Прежде всего, я хочу поблагодарить Джеймса за его замечательную статью ( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc) и ценные советы, я не смог бы сделать это без него.
Итак, давайте начнем с ослабления зависимостей, это просто замена правильных байтов в _pywrap_tensorflow.so. Обратите внимание, что этот шаг работает только для текущей версии tenorflow (0.6.0). Поэтому, если это еще не сделано, создайте и активируйте ваш virtualenv, если он у вас есть (если вы не являетесь администратором, virtualenv - это решение, другое - добавить --user
установите флажок для команды pip) и установите тензор потока 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
И давайте ослабим все надоедливые зависимости, вот команда для версии процессора tenorflow:
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
Этот шаг необходимо выполнить на компьютере с отсутствующими зависимостями (или на компьютере с аналогичными версиями стандартных библиотек (например, в кластере)).
Теперь мы, вероятно, поменяем машину, так как нам нужен gcc, который поддерживает C++11, и, вероятно, не на машине, где отсутствуют все зависимости (или вы можете использовать изолированную установку недавнего gcc). В следующем я предполагаю, что мы все еще в ~/my_stubs
и каким-то образом вы делите свой дом между компьютерами, в противном случае вам просто нужно скопировать.so файлы, которые мы сгенерируем, когда это будет сделано.
Итак, одна заглушка, которую мы можем сделать для libstdC++, а для остальных недостающих мы собираемся скомпилировать их из исходного кода 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 tenorflow, предварительно загрузив все наши общие библиотеки (и вашу локальную libstdC++):
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
:)
Обратите внимание на "слабое" решение Тео Труйона. Это относится только к 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
Ссылка в ответе @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
Мое решение похоже на решение Тео Т; хотя хорошо настроен для 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, расположенный в каталоге tenorflow / 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 вместо site-пакетов. Кроме того, я клонирую с gcc-mirror вместо родной git-страницы для gcc. Остальное все одинаково.
Последние несколько шагов гарантируют, что при каждом запуске python или ipython он будет загружен с уменьшенными зависимостями.
Эта ошибка в основном возникает, если ваша библиотека 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 и загрузить последнюю версию. Ссылка на последнюю версию glibc находится здесь: библиотека GNU-C Загрузить На момент написания этого ответа последняя стабильная версия была 2.22.
Я попытался запустить тензор потока на Ubuntu 12.04 и 14.04. В Ubuntu 14.04 эта проблема не возникает, так как она поставляется с glibc 2.19, установленным по умолчанию.
Надеюсь, поможет.
Обратите внимание: вы должны скачать пакет 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
x64:
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.
У меня была такая же проблема, и я нашел следующее решение:
conda install tensorflow
У меня была похожая проблема при попытке установить 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.12not found (required by ...envs/test1-py37/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so
). Мне удалось установить numba
с помощью следующих шагов:
- Создать среду conda
- Внутри среды Конда, установить
glibc
отnlsec
среда - Тогда используйте
pip
установитьnumba
а такжеllvmlite
построен против недавно установленногоglibc
:
Таким образом:
conda create -n test -c nlesc glibc
conda activate test
pip install numba
Тогда импорт numba работает. Однако впоследствии следует быть осторожным, чтобы любые последующие conda install
не "обновляется" llvmlite
к версии, не совместимой с numba
, или старая проблема возвращается. Вы можете прикрепить один или оба для этого эффекта. Вам придется закрепить как сборку, так и версию. Я создал файл pinned
содержащий:
llvmlite==0.27.0-pypi
numba==0.42.0-pypi
и поместил его в моей среде conda в текстовом файле conda-meta/pinned
,
Я пробовал /questions/43744156/oshibka-pri-importe-tensorflow-v-python-27-v-ubuntu-1204-glibc217-ne-najden/43744166#43744166 решение, и оно работало отлично. Но libstdC++-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
Для меня я использую это:
Приведенные выше ответы хороши, но я все еще сталкивался с некоторыми проблемами даже после их выполнения. Я следовал, как в ответе @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, поэтому создайте скрипт, который загружает эти переменные и вызывает интерпретатор 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`
Я получил "версию`GLIBC_2.14'не найден "при импорте тензорного потока в 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