В последнее время проходил аналогичный процесс со статическим c связыванием PyTorch, и, честно говоря, это было не слишком красиво.
Я обрисую шаги, которые я предпринял (точный исходный код вы можете найти в torchlambda , здесь равно CMakeLists.txt
(также включает AWS SDK и AWS лямбда-стати c сборок), здесь представляет собой сценарий pytorch
из исходного кода (клонирование и сборка с помощью /scripts/build_mobile.sh
только с поддержкой ЦП)), хотя это только с поддержкой ЦП (хотя подобные шаги должны быть хороши, если вам нужна CUDA, это как минимум поможет вам начать работу).
Pytorch stati c library
Предварительно скомпонованные stati c PyTorch
Прежде всего, вам нужны предварительно скомпилированные файлы stati c library ( all из них нужно указать c, следовательно, .so
, только те с расширением .a
подходят).
Tbh Я искал те, которые предоставлены PyTorch
на страница установки , пока есть только shared
версия. В одном выпуске GitHub я нашел способ загрузить их следующим образом:
Вместо загрузки (здесь через wget
) общих библиотек:
$ wget https://download.pytorch.org/libtorch/cu101/libtorch-shared-with-deps-1.4.0.zip
вы переименовываете shared
в static
(как описано в этом выпуске ), поэтому оно будет выглядеть так:
$ wget https://download.pytorch.org/libtorch/cu101/libtorch-static-with-deps-1.4.0.zip
Тем не менее, при загрузке его нет libtorch.a
в папке lib
(didn не могу найти libcaffe2.a
, как указано этой проблемой ), так что я остался с явной сборкой из исходного кода.
Если у вас есть эти файлы каким-либо образом (если да, пожалуйста, предоставьте откуда вы их взяли), вы можете пропустить следующий шаг.
Сборка из источника
Для версии процессора я использовал / pytorch / scripts / build_mobile. sh, вы можете основывать свою версию на этом, если требуется поддержка графического процессора (возможно, вам нужно только передать -DUSE_CUDA=ON
в этот скрипт, хотя не уверен).
Наиболее важными являются cmake
-DBUILD_SHARED_LIBS=OFF
, чтобы собрать все как библиотеку static
. Вы также можете проверить скрипт из моего инструмента , который также передает аргументы в build_mobile.sh
.
Запуск выше даст вам * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * по умолчанию. вам нужно.
CMake
Теперь вы можете скопировать файлы сборки выше в /usr/local
(лучше, если вы не используете Docker
в качестве torchlambda
) или указать путь к нему изнутри ваш CMakeLists.txt
как этот:
set(LIBTORCH "/path/to/pytorch/build_mobile/install")
# Below will append libtorch to path so CMake can see files
set(CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH};${LIBTORCH}")
Теперь все остальное в порядке за исключением target_link_libraries
, что должно быть (как указано эта проблема , см. связанные вопросы, перечисленные там для дополнительной справки), используемые с -Wl,--whole-archive
флагом компоновщика, что привело меня к этому:
target_link_libraries(example-app PRIVATE -lm
-Wl,--whole-archive "${TORCH_LIBRARIES}"
-Wl,--no-whole-archive
-lpthread
${CMAKE_DL_LIBS})
Вам может не понадобиться ни -lm
, -lpthread
, ни ${CMAKE_DL_LIBS}
, хотя я он понадобился при сборке Amazon Linux AMI .
Building
Теперь вы готовы создавать приложение. Стандартный libtorch
способ должен быть в порядке, но вот еще одна команда, которую я использовал:
mkdir build && \
cd build && \
cmake .. && \
cmake --build . --config Release
Выше создастся папка build
, в которой example-app
бинарный файл теперь должен быть безопасно расположен.
Наконец используйте ld build/example-app
, чтобы проверить, что все из PyTorch
статически связано, см. вышеупомянутую проблему точка 5.
, ваш вывод должен выглядеть аналогично.