Программно-аппаратная среда
- 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
Вычисление в может быть представлено в виде ориентированного графа, или вычислительного графа, в котором каждая операция будет выступать в роли узла, а связи между узлами называются ребрами. Этот граф вычислений описывает поток вычислений данных.Он также отвечает за поддержание и обновление состояния.Пользователи могут выполнять условное управление и циклические операции на ветвях графа вычислений. Каждый узел графа вычислений может иметь любое количество входов и выходов, каждый узел описывает операцию, и этот узел можно рассматривать как конкретизацию операции.
Готов к работе
Установите среду 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-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
В это время в терминале появится ряд параметров.Здесь вам нужно выбрать в соответствии с вашими потребностями.Конфигурация этой статьи выглядит следующим образом
Далее выполните команду компиляции
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
Распространенные ошибки связывания внешней библиотеки
Вы можете использовать параметр--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
параллелизм
Наконец, мы переходим к генерацииpython
требуется установкаwhl
документ
sudo ./tensorflow/tools/pip_package/build_pip_package.sh /tmp/tensorflow_pkg
здесь/tmp/tensorflow_pkg
для храненияwhl
Место файла вы можете указать произвольно, после того как он успешно сгенерируется, давайте его установим
pip install /tmp/tensorflow_pkg/tensorflow-2.2.0-cp37-cp37m-linux_x86_64.whl
проверка Python
мы открытыipython
, будьте осторожны, чтобы неtensorflow
Откройте исходный каталогipython
, иначе будет сообщено об ошибке, добавьте простойtensorflow
Протестируйте код, чтобы увидеть, будет ли сообщено об ошибке и соответствующей выходной информации.
import tensorflow as tf
tf.__version__
tf.test.is_gpu_available()
Как видно из рисунка выше, установлен номер версии 2.2.0, аgpu
также можно использовать в обычном режиме
С++ проверка
libtensorflow_cc
изtarget
После успешной компиляции вbazel-bin/tensorflow
Соответствующие заголовочные файлы будут созданы в каталоге (include
) и библиотеки динамической компоновки (libtensorflow_cc.so
иlibtensorflow_framework.so.2
, оба из которых являются файлами программных ссылок)
использоватьclion
IDE создаются на основе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/дуо…
ссылка для скачивания
Библиотека динамической компоновки и заголовочные файлы запакованы, при необходимости перейти к скачиванию