Использование модели PyTorch в приложении C++ в Windows

Следуя официальному руководству PyTorch, я создал модель на Python, преобразовал ее в Torch Script с помощью трассировки и сохранил модуль сценария в.ptфайл. Код C++, загружающий модель и CMakeLists, идентичен таковому из учебника.

Я загрузил LibTorch 1.3 (стабильный, Windows, без CUDA, выпуск) и извлек его, так что моя структура каталогов следующая:


├───артефакт
│ traced_resnet_model.pt
├───cmakeapp
│ │ CMakeLists.txt
│ │ example-app.cpp
│ │   
├───libtorch
│ │ build-hash   
│
├───бин
│
├───кмейк
│
├───включить
│
├───lib
│
├─── поделиться
│   └───тест

У меня Visual Studio 2019 с CMake установлен как компонент, поэтому я запустил командную строку разработчика для VS2019 и cd в каталог проекта (cmakeapp).

В соответствии с инструкциями я выполнил следующие команды для сборки приложения:

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=..\libtorch ..
make

CMake, похоже, преуспел, за исключением некоторых предупреждений:

CMake Warning (dev) at D:/dox/projects/AI/torchscript/libtorch/share/cmake/Caffe
2/public/utils.cmake:57 (if):
  Policy CMP0054 is not set: Only interpret if() arguments as variables or
  keywords when unquoted.  Run "cmake --help-policy CMP0054" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  Quoted variables like "MSVC" will no longer be dereferenced when the policy
  is set to NEW.  Since the policy is not set the OLD behavior will be used.
Call Stack (most recent call first):
  D:/dox/projects/AI/torchscript/libtorch/share/cmake/Caffe2/Caffe2Config.cmake:
121 (caffe2_interface_library)
  D:/dox/projects/AI/torchscript/libtorch/share/cmake/Torch/TorchConfig.cmake:40
 (find_package)
  CMakeLists.txt:4 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.

CMake Warning (dev) at D:/dox/projects/AI/torchscript/libtorch/share/cmake/Torch
/TorchConfig.cmake:90 (if):
  Policy CMP0054 is not set: Only interpret if() arguments as variables or
  keywords when unquoted.  Run "cmake --help-policy CMP0054" for policy
  details.  Use the cmake_policy command to set the policy and suppress this
  warning.

  Quoted variables like "MSVC" will no longer be dereferenced when the policy
  is set to NEW.  Since the policy is not set the OLD behavior will be used.
Call Stack (most recent call first):
  CMakeLists.txt:4 (find_package)
This warning is for project developers.  Use -Wno-dev to suppress it.

Теперь первый выпуск, ниmake ни nmake Работа:

'make' is not recognized as an internal or external command, operable program or batch file.

D:\dox\projects\AI\torchscript\cmakeapp\build>nmake

Microsoft (R) Program Maintenance Utility Version 14.23.28107.0 Copyright (C) Microsoft Corporation.  All rights reserved.

NMAKE : fatal error U1064: MAKEFILE not found and no target specified Stop.

Я что-то упускаю?

Во-вторых, я обнаружил, что сгенерированныйcustom_ops.slnфайл, поэтому открыл его в Visual Studio. Проект предлагает 4 различных конфигурации: Debug, MinSizeRel, Release и RelWithDebInfo. Не удалось построить что-либо, кроме Release:

LINK : fatal error LNK1181: cannot open input file 'torch-NOTFOUND.obj'
2>Done building project "example-app.vcxproj" -- FAILED.

Я очень удивлен этой ошибкой, так как путь к libtorch был указан, и CMake удалось его найти.

В-третьих, сборка Release прошла успешно, но проект ALL_BUILD пропускается:

3>------ Skipped Build: Project: ALL_BUILD, Configuration: Release x64 ------
3>Project not selected to build for this solution configuration 
========== Build: 2 succeeded, 0 failed, 0 up-to-date, 1 skipped ==========

Не уверен, какая конфигурация решения должна быть выбрана для создания всего этого.

Буду признателен за разъяснения по этим запутанным моментам.

2 ответа

Решение

Инструкции на связанном сайте ориентированы на Linux и, похоже, предполагают, что пользователь работает в среде Linux. В Linux последняя командаmake будет работать без каких-либо проблем, но вы, вероятно, работаете с Visual Studio, а не make. Вместо этого вы должны использовать кроссплатформенный подход и указать CMake для сборки с помощью любого инструмента сборки, который он нашел во время настройки; Попробуйте использоватьcmake build .вместо последней команды, как вы можете видеть, используется в этом другом руководстве:

mkdir build
cd build
cmake -DCMAKE_PREFIX_PATH=/absolute/path/to/libtorch ..
cmake --build .

Однако в этом руководстве упоминается следующее:

В Windows сборки отладки и выпуска не совместимы с ABI. Если вы планируете собрать свой проект в режиме отладки, мы рекомендуем собрать PyTorch из исходного кода.

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

cmake --build . --config Release

Кроме того, при сборке в Windows с помощью MSVC их руководство по установке предлагает добавить следующие строки в ваш файл CMake, чтобы избежать ошибок, обсуждаемых в этой ветке проблем, которые также могут помочь при обнаруженных вами проблемах:

if (MSVC)
  file(GLOB TORCH_DLLS "${TORCH_INSTALL_PREFIX}/lib/*.dll")
  add_custom_command(TARGET example-app
                     POST_BUILD
                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
                     ${TORCH_DLLS}
                     $<TARGET_FILE_DIR:example-app>)
endif (MSVC)

Я не могу ответить прямо на предыдущие ответы. Я не уверен, что полностью понимаю, что происходит, но я нашел способ избежать ошибки torch-NOTFOUND.obj и скомпилировать свой проект в RelWithDebugInfo. Ошибка, похоже, связана с IMPORTED_LOCATION, IMPORTED_LOCATION и -NOTFOUND. Если вы войдете в libtorch\share\cmake\Caffe2\Caffe2Targets-release.cmake ближе к концу (строки 51-53 в версии 1.5.0), вы обнаружите:

set_target_properties(torch PROPERTIES
  IMPORTED_IMPLIB_RELEASE "${_IMPORT_PREFIX}/lib/torch.lib"
  IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/torch.dll"
  )

Что я заменил на:

set_target_properties(torch PROPERTIES
  IMPORTED_IMPLIB "${_IMPORT_PREFIX}/lib/torch.lib"
  IMPORTED_LOCATION "${_IMPORT_PREFIX}/lib/torch.dll"
  )

И я смог успешно скомпилировать.

Другие вопросы по тегам