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.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- interpreter /ɪnˈtɜːrprɪtər/ ударение на «тёр» разбор: Ошибки терминала: permission denied, no such file, segfault
- scenario /sɪˈnɑːrioʊ/ «синАриоу» разбор: Тестирование: flaky, coverage, mock, fixture, regression
- interface /ˈɪntərfeɪs/ ударение на первый слог разбор: Немые буквы и ударение: cache, queue, suite, height