Список серий уроков:
LibtorchдаPytorchизC++интерфейс,Реализованы функции сетевого обучения и сетевого рассуждения на C++.
Кроме того, поскольку большинство интерфейсов в Libtorch совместимы с Pytorch, Libtorch также является очень мощной тензорной библиотекой с понятным интерфейсом, похожим на Pytorch, что редко встречается в C++. Если вы использовали библиотеку C++ Tensor, вы обнаружите, что метод написания более сложен, а стоимость обучения высока. Из-за ограничений строгой типизации и отсутствия универсальных типов контейнеров C++, естественно, более сложен, чем Python. Из-за особенностей использования языка, производительности и других факторов интерфейсы, разработанные разработчиками библиотек, обычно эффективны, но сложны в использовании. Libtorch использует функциональный интерфейс, аналогичный Pytorch. Если вы использовали Pytorch, стоимость обучения использованию Libtorch очень низкая. Конкретные примеры вы увидите позже.
Другой вопрос:,Многие базовые операции в библиотеках Python,Напримерnumpy.einsum
функция,В C++ нет подходящей замены.,взгляниЭтиИщите и узнаете。Libtorchрешил проблему,В Пайторче есть все,Итак, вC++можно просто использовать вtorch::einsum
использоватьeinsumфункция,Это просто хорошая новость для разработчиков C++.
Кроме того, Libtorch поддерживает графический процессор и в основном используется для процесса вывода модели. Однако я предполагаю, что если используется графический процессор, операция Libtorch Tensor может иметь преимущество в скорости по сравнению с другими тензорными библиотеками C++. тестироваться и сравниваться. Конечно, если вы используете код C++, скорость не является узким местом. Сам код ЦП достаточно быстр.
Еще одним преимуществом Libtorch является простота компиляции. Пока вы устанавливаете Pytorch, Libtorch можно использовать напрямую, что исключает сложную установку и настройку. Простой пример программы можно запустить за одну минуту.
Подводя итог, Libtorch имеет следующие привлекательные особенности:
Поскольку команда разработчиков Pytorch разрабатывает Pytorch, ориентируясь на Python, я чувствую, что к Libtorch не относятся серьезно. Документов и руководств относительно мало, а на официальном сайте почти нет примеров. Поэтому написание относительно полного руководства является задачей. Более значимо.
В этой серии статей я представлю Tensor-библиотеку Libtorch и процесс нейронной сети вывода, поскольку это содержимое будет пропущено при фактическом использовании Libtorch для обучения сети, поскольку сценариев использования этой части не так много (обучение с помощью Python). Интернет гораздо ароматнее C++).
В этой статье в качестве примера используется работа на Mac, чтобы познакомить вас с установкой и простым использованием Libtorch. Последующий контент будет обновлен в ближайшем будущем, поэтому следите за обновлениями.
Если вы уже установили Pytorch, нет необходимости устанавливать дополнительно Libtorch, поскольку Pytorch поставляется с Libtorch CMake. config документ,использоватьtorch.utils.cmake_prefix_path
Заявление можно распечатать,Может использоваться непосредственно CMake.,Добавьте следующие параметры при компиляции:
-DCMAKE_PREFIX_PATH=`python -c 'import torch;print(torch.utils.cmake_prefix_path)'
Если у вас нет Pytorch,Тогда иди прямоОфициальный сайт ПиторчаскачатьLibtorch Сожмите пакет, просто разархивируйте его в локальный каталог и следуйте инструкциям ниже. CMake来指向这里из路径就行。Если распаковать вLIBTORCH_ROOT
Оглавление,Добавьте следующие параметры при компиляции:
-DCMAKE_PREFIX_PATH=<LIBTORCH_ROOT>
Напишите здесь простой пример Libtorch.,Создайте матрицу 5x5,а потом позвониeinsum
функция来Вычислить след матрицы(对角线元素из和):
// Представьте заголовочный файл Torch. Класс Tensor находится в этом заголовочном файле, а другие классы будут в других заголовочных файлах.
#include <torch/torch.h>
#include <iostream>
int main() {
// Используйте диапазон, чтобы построить одномерный вектор, а затем используйте изменение формы, чтобы преобразовать его в матрицу 5x5.
torch::Tensor foo = torch::arange(25).reshape({5, 5});
// Вычислить след матрицы
torch::Tensor bar = torch::einsum("ii", foo);
// Выходная матрица и соответствующая трасса
std::cout << "==> matrix is:\n " << foo << std::endl;
std::cout << "==> trace of it is:\n " << bar << std::endl;
}
Обратите внимание, что при изменении формы требуются фигурные скобки.,Поскольку в C++ нет типа кортежа.,Python中из(5,5)
нужно быть внутриC++переписано как{5, 5}
。кроме,Очень ли это похоже на код Python?
记得保存上面из代码为libtorch_trace.cpp
,Потому что имя файла нужно прописать в конфигурации CMake.
然后在同级Оглавление编写CMakeLists.txt
документ:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(libtorch_trace)
# Нужно найти Либторха
find_package(Torch REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS}")
add_executable(${PROJECT_NAME} libtorch_trace.cpp)
target_link_libraries(${PROJECT_NAME} "${TORCH_LIBRARIES}")
# Libtorch реализован на основе C++14.
set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14)
Затем выполните следующую команду для компиляции:
mkdir build
cd build
# Если это через Pytorch
cmake -DCMAKE_PREFIX_PATH=`python -c 'import torch;print(torch.utils.cmake_prefix_path)'` ..
#Скачал отдельную Libtorch
# cmake -DCMAKE_PREFIX_PATH=<LIBTORCH_ROOT> ..
make -j8
После компиляции используйте следующую команду для выполнения исполняемого файла:
./libtorch_trace
Результат следующий:
==> matrix is:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
[ CPULongType{5,5} ]
==> trace of it is:
60
[ CPULongType{} ]
Итак, наш первый пример завершен.