libtorch: PyTorch из C++

Тема дорожной карты · Modern C++ Developer

libtorch — официальный C++-интерфейс PyTorch. Он даёт тот же тензорный движок, автоматическое дифференцирование и обученные модели, что и Python-версия, но без интерпретатора и GIL. Для C++-разработчика это способ встроить нейросеть в игровой движок, робота, торговую систему или сервер, где Python недопустим по задержке, памяти или политике безопасности. Модель обучают в Python, экспортируют, а исполняют в C++ — такой разрыв между исследованием и продакшеном сегодня стандартен.

Как это работает

Ядро libtorch — класс torch::Tensor, многомерный массив с поддержкой CPU и CUDA, тот же объект, что и в Python, реализованный в библиотеке ATen. Операции над тензорами записываются почти дословно: torch::matmul(a, b), x.relu(), t.to(torch::kCUDA). Автоград работает так же: тензор, созданный с requires_grad(true), накапливает граф вычислений, а loss.backward() заполняет градиенты. Модули объявляются наследованием от torch::nn::Module и регистрацией слоёв через register_module, поэтому на C++ можно не только исполнять, но и обучать сети.

Основной сценарий — инференс сохранённой модели. Python-код оборачивает модель через torch.jit.script или torch.jit.trace в формат TorchScript, а C++ загружает файл вызовом torch::jit::load("model.pt") и выполняет module.forward({input}). С PyTorch 2 появился альтернативный путь через torch.export и AOTInductor, который компилирует модель в разделяемую библиотеку без интерпретатора TorchScript. Сборка проекта идёт через CMake: find_package(Torch REQUIRED) подтягивает заголовки и библиотеки из распакованного архива libtorch, важно совпадение версии CUDA и ABI-флага _GLIBCXX_USE_CXX11_ABI.

Когда применять

libtorch выбирают, когда нужна вся гибкость PyTorch внутри C++-приложения: динамические формы входа, кастомные операции, дообучение на устройстве. Если требуется только быстрый инференс фиксированной модели, часто выгоднее ONNX Runtime или TensorRT — они легче по размеру и быстрее на целевом железе. libtorch незаменим, когда модель использует операции, которых нет в ONNX, или когда команда хочет единый код обучения и исполнения без конвертации.

Типичные ошибки

Первая ошибка — несовпадение ABI: libtorch с сайта собран с _GLIBCXX_USE_CXX11_ABI=0, и линковка с проектом, собранным по умолчанию с новым ABI, даёт загадочные ошибки undefined reference. Вторая — забытый torch::NoGradGuard при инференсе, из-за которого граф автограда растёт и память утекает. Третья — копирование данных между хостом и GPU на каждом вызове вместо удержания тензоров на устройстве. Четвёртая — трассировка модели с ветвлениями через trace: она зафиксирует одну ветку, и модель начнёт молча выдавать неверные результаты на других входах; такие модели нужно экспортировать через script.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →