Компиляция исходного кода, версия tensorflow gpu

глубокое обучение

Программно-аппаратная среда

  • ubuntu 18.04 64bit
  • anaconda3 with python 3.7.6
  • tensorflow 2.2.0
  • bazel 2.0.0
  • cuda 10.1
  • cudnn 7.6.5
  • gcc 7
  • nvidia gtx 1070Ti

Введение в тензорный поток

tensorflowЭто платформа машинного обучения с открытым исходным кодом, запущенная Google, которая обеспечиваетc++,python,java,javascript,goравноязычныйAPI, который является быстрым, гибким и подходит для крупномасштабных приложений производственного уровня, позволяя каждому разработчику легко использовать искусственный интеллект для решения множества практических задач, поэтому он очень популярен.

tensorflowНазвание происходит от собственного принципа действия.tensor(张量)означает N-мерный массив,flow(流)означает вычисление на основе графа потока данных,tensorflowЭто процесс вычисления тензоров, перетекающих с одного конца потокового графа на другой конец.

tensorflowВычисление в может быть представлено в виде ориентированного графа, или вычислительного графа, в котором каждая операция будет выступать в роли узла, а связи между узлами называются ребрами. Этот граф вычислений описывает поток вычислений данных.Он также отвечает за поддержание и обновление состояния.Пользователи могут выполнять условное управление и циклические операции на ветвях графа вычислений. Каждый узел графа вычислений может иметь любое количество входов и выходов, каждый узел описывает операцию, и этот узел можно рассматривать как конкретизацию операции.

Готов к работе

tensorflow-gpu

Установите среду Python

Мы используемanaconda, пожалуйста, обратитесь к статье для получения подробной информации о методах установки и использования.использование анаконды.

ускоритьcondaСкорость установки ПО, использование отечественных исходников Цинхуа, редактирование файлов~/.condarc,Добавить к

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

Затем создайте отдельную чистую виртуальную среду.tfgpu

conda create -n tfgpu python=3.7
conda activate tfgpu

установить протобуф

protobufТоже продукт Google Home, это формат для обмена/хранения данных, переходимcondaДля установки текущая версия по умолчанию — 3.11.4.

conda install protobuf

когда я компилируюtensorflow-2.2.0в процессе,protobuf-3.11.4Ошибки нет, если что-то пойдет не так в вашей среде, вы можете просмотреть файлtensorflow/workspace.bzlсерединаprotobufверсия, затем установите

tensorflow-gpu

какtensorflow-2.2.0соответствующийprotobuf-3.8.0, способ установки следующий

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.8.0/protobuf-all-3.8.0.tar.gz
tar xvf protobuf-all-3.8.0.tar.gz
cd protobuf-3.8.0
./autogen.sh
./configure
make
sudo make install

Установите cuda и cuDNN

Выбираем актуальный мейнстримcuda 10.1иcudnn 7.6.5, вы можете обратиться к статьеУбунту установить CUDA

тензорная версия

В этой статье выбрана последняя официальная версия2.2.0, вы можете перейти прямо на официальный сайт, чтобы загрузить сжатый пакет и распаковать его, адрес:GitHub.com/tensorflow/…

tar xvf tensorflow-2.2.0.tar.gz

установить базель

bazelЭто набор инженерно-строительной системы, запущенный Google, и выбор его версии напрямую влияет наtensorflowСкомпилированный из исходного кода, мы можем просмотреть его, посмотрев наtensorflowфайлы в исходном каталогеconfigure.py, найдите следующее утверждение

_TF_MIN_BAZEL_VERSION = '2.0.0'
_TF_MAX_BAZEL_VERSION = '2.0.0'

можно увидетьtensorflow 2.2.0требуется версияbazelномер версии2.0.0. мы приходим прямоbazelскачать с сайта2.0.0,адрес:GitHub.com/bazel build/…, загруженный файл здесь является двоичным файломbazel-2.0.0-linux-x86_64, затем выполните

sudo mv bazel-2.0.0-linux-x86_64 /usr/bin/bazel
sudo chmod a+x /usr/bin/bazel

Установите необходимые пакеты

Эти инструменты также компилируютtensorflowнужен в

pip install numpy six keras_preprocessing

версия GCC

ubuntu 18.04используется по умолчаниюgccНомер версии 7.5.0, и здесь проблем в процессе компиляции нет. Если есть сопутствующие проблемы, рассмотрите возможность предоставленияgccДаунгрейд версии, так как официальная не тестировалась на этой версии

sudo apt install gcc-6 g++-6

Затем сделайте переключатель версии

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-6 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/gcc-6 100

Если вы хотите переключиться обратноgcc-7Если это так, используйте аналогичную команду для увеличения последнего параметра, приоритета, например, 101.

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 101
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/gcc-7 101

процесс компиляции

Сначала настройте проект, выполнитеconfigure

cd tensorflow-2.2.0
./configure

В это время в терминале появится ряд параметров.Здесь вам нужно выбрать в соответствии с вашими потребностями.Конфигурация этой статьи выглядит следующим образом

tensorflow-gpu

tensorflow-gpu

Далее выполните команду компиляции

bazel build --verbose-failures --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

Скомпилируйте, если нужноc++Библиотека динамической компоновки, необходимая для разработки, должна использовать следующую команду

bazel build --verbose-failures --noincompatible_do_not_split_linking_cmdline --config=opt --config=cuda //tensorflow:libtensorflow_cc.so  //tensorflow:install_headers

или объединить дваtargetВы также можете написать это вместе

bazel build --verbose-failures --noincompatible_do_not_split_linking_cmdline --config=opt --config=cuda //tensorflow:libtensorflow_cc.so //tensorflow/tools/pip_package:build_pip_package

Распространенные ошибки связывания внешней библиотеки

tensorflow-gpu

tensorflow-gpu

Вы можете использовать параметр--noincompatible_do_not_split_linking_cmdlineЧтобы решить эту проблему, вы можете обратиться к этомуissue GitHub.com/tensorflow/…

Все время компиляции зависит от конфигурации вашей машины

Тест показал, что когда та же команда компиляции запускается на машине 16G, система падает, причина в том, чтоout of memory, на машине с памятью 32G проблем нет. Мы можем настроитьbazelследующие параметры для завершения компиляции

  • --local_ram_resourcesиспользоватьRAMРазмер, в единицахMB
  • --local_cpu_resourcesиспользоватьCPUколичество ядер
  • --jobsпараллелизм

tensorflow-gpu

Наконец, мы переходим к генерацииpythonтребуется установкаwhlдокумент

sudo ./tensorflow/tools/pip_package/build_pip_package.sh /tmp/tensorflow_pkg

tensorflow-gpu

здесь/tmp/tensorflow_pkgдля храненияwhlМесто файла вы можете указать произвольно, после того как он успешно сгенерируется, давайте его установим

pip install /tmp/tensorflow_pkg/tensorflow-2.2.0-cp37-cp37m-linux_x86_64.whl

tensorflow-gpu

проверка Python

мы открытыipython, будьте осторожны, чтобы неtensorflowОткройте исходный каталогipython, иначе будет сообщено об ошибке, добавьте простойtensorflowПротестируйте код, чтобы увидеть, будет ли сообщено об ошибке и соответствующей выходной информации.

import tensorflow as tf

tf.__version__
tf.test.is_gpu_available()

tensorflow-gpu

Как видно из рисунка выше, установлен номер версии 2.2.0, аgpuтакже можно использовать в обычном режиме

С++ проверка

libtensorflow_ccизtargetПосле успешной компиляции вbazel-bin/tensorflowСоответствующие заголовочные файлы будут созданы в каталоге (include) и библиотеки динамической компоновки (libtensorflow_cc.soиlibtensorflow_framework.so.2, оба из которых являются файлами программных ссылок)

tensorflow-gpu

использоватьclionIDE создаются на основеcmakeпроект, писать файлы исходного кодаmain.cpp, этот экземпляр взят из Интернета

#include <iostream>
#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"

using namespace tensorflow;
using namespace tensorflow::ops;

int main()
{
    Scope root = Scope::NewRootScope();

    // Matrix A = [3 2; -1 0]
    auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f} });
    // Vector b = [3 5]
    auto b = Const(root, { {3.f, 5.f} });
    // v = Ab^T
    auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));

    std::vector<Tensor> outputs;
    ClientSession session(root);

    // Run and fetch v
    TF_CHECK_OK(session.Run({v}, &outputs));
    std::cout << "tensorflow session run ok" << std::endl;
    // Expect outputs[0] == [19; -3]
    std::cout << outputs[0].matrix<float>();

    return 0;
}

Далее пишем правилаCMakeLists.txt

project(libtf)
cmake_minimum_required(VERSION 3.0)

add_definitions(-std=c++11)

set(TENSORFLOW_ROOT_DIR /home/xugaoxiang/Downloads/tensorflow-2.2.0-cc)

include_directories(
        ${TENSORFLOW_ROOT_DIR}/bazel-bin/tensorflow/include
)

aux_source_directory(./ DIR_SRCS)

link_directories(/home/xugaoxiang/Downloads/tensorflow-2.2.0-cc/bazel-bin/tensorflow)

add_executable(libtf ${DIR_SRCS})
#target_link_libraries(libtf
#        tensorflow_cc
#        tensorflow_framework
#        )

target_link_libraries(libtf /home/xugaoxiang/Downloads/tensorflow-2.2.0-cc/bazel-bin/tensorflow/libtensorflow_cc.so /home/xugaoxiang/Downloads/tensorflow-2.2.0-cc/bazel-bin/tensorflow/libtensorflow_framework.so.2)

Тут надо отметить, что названия двух библиотек разные, и тут же пишется абсолютный путь, а потом компилируется и запускается

mkdir build
cd build
cmake ..
make
./libtf

Результат выполнения следующий

(base) xugaoxiang@1070Ti:~/CLionProjects/libtf/build$ ./libtf 
2020-05-22 16:30:25.469170: I tensorflow/core/platform/profile_utils/cpu_utils.cc:102] CPU Frequency: 3092885000 Hz
2020-05-22 16:30:25.469647: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x560f48a29630 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-05-22 16:30:25.469694: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2020-05-22 16:30:25.473522: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2020-05-22 16:30:25.613992: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x560f48988550 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices:
2020-05-22 16:30:25.614051: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): GeForce GTX 1070 Ti, Compute Capability 6.1
2020-05-22 16:30:25.615325: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1561] Found device 0 with properties: 
pciBusID: 0000:03:00.0 name: GeForce GTX 1070 Ti computeCapability: 6.1
coreClock: 1.683GHz coreCount: 19 deviceMemorySize: 7.93GiB deviceMemoryBandwidth: 238.66GiB/s
2020-05-22 16:30:25.615715: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-05-22 16:30:25.619174: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10
2020-05-22 16:30:25.621307: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10
2020-05-22 16:30:25.621587: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10
2020-05-22 16:30:25.623604: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10
2020-05-22 16:30:25.625051: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10
2020-05-22 16:30:25.629452: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2020-05-22 16:30:25.630598: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1703] Adding visible gpu devices: 0
2020-05-22 16:30:25.630633: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.1
2020-05-22 16:30:25.631317: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1102] Device interconnect StreamExecutor with strength 1 edge matrix:
2020-05-22 16:30:25.631335: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1108]      0 
2020-05-22 16:30:25.631342: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1121] 0:   N 
2020-05-22 16:30:25.632489: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1247] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6477 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1070 Ti, pci bus id: 0000:03:00.0, compute capability: 6.1)
tensorflow session run ok
19

уведомлениеgpuПравильно идентифицировано и использовано, как и ожидалось, идеально

Распространенные ошибки

Официальный представитель дал список распространенных ошибок и соответствующие решения, и это здорово, поэтому, если вы столкнетесь с проблемами в процессе компиляции, вы можете перейти сюда, чтобы посмотреть в первый раз, Адрес:woohoo.tensorflow.org/install/дуо…

ссылка для скачивания

Библиотека динамической компоновки и заголовочные файлы запакованы, при необходимости перейти к скачиванию

CSDN-ссылка

использованная литература