使用CMake build使用Emscripten将libtorch编译为WebAssembly
我正在尝试使用WebAssembly在浏览器中运行我的PyTorch模型(导出到TorchScript)。为此,我需要使用Emscripten编译libtorch。正如PyTorch文档建议使用CMake作为编译器一样,我坚持使用它 我已经成功地使用CMake编译了libtorch,没有出现指定的问题。其次,我还使用Emscripten和CMake为WASM编译了一个简单的测试程序(为了简洁和关注手头的问题,我没有包含这两个文件的CMakeLists.txt文件) 当我试图同时编译这两个文件时,问题就开始了,下面是我的CMake文件:使用CMake build使用Emscripten将libtorch编译为WebAssembly,cmake,static-linking,webassembly,emscripten,libtorch,Cmake,Static Linking,Webassembly,Emscripten,Libtorch,我正在尝试使用WebAssembly在浏览器中运行我的PyTorch模型(导出到TorchScript)。为此,我需要使用Emscripten编译libtorch。正如PyTorch文档建议使用CMake作为编译器一样,我坚持使用它 我已经成功地使用CMake编译了libtorch,没有出现指定的问题。其次,我还使用Emscripten和CMake为WASM编译了一个简单的测试程序(为了简洁和关注手头的问题,我没有包含这两个文件的CMakeLists.txt文件) 当我试图同时编译这两个文件时,
set(project "wasm-example")
cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR)
set(CMAKE_TOOLCHAIN_FILE $HOME/.local/share/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake)
set(CMAKE_BUILD_TYPE Debug)
project(${project})
SET_PROPERTY(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS TRUE)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_PREFIX_PATH $PWD/libtorch)
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Using prefix path: ${CMAKE_PREFIX_PATH}")
message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}")
include(CTest)
enable_testing()
set(SOURCE_FILES main.cpp)
# process exported functions
set(exports_string "")
list(JOIN exports "," exports_string)
# set compiler and flags
set(CMAKE_C_COMPILER emcc)
set(CMAKE_CPP_COMPILER em++)
set(CMAKE_CXX_FLAGS "-s WASM=1 -s EXIT_RUNTIME=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=\"[\"cwrap\", \"getValue\", \"setValue\"]\" ${TORCH_CXX_FLAGS}")
message(STATUS "Set CMAKE_CXX_FLAGS to: ${CMAKE_CXX_FLAGS}")
# find external target_link_libraries
find_package(Torch REQUIRED)
# specify the project
add_executable(${project} ${SOURCE_FILES})
target_link_libraries(${project} "${TORCH_LIBRARIES}")
set_property(TARGET ${project} PROPERTY CXX_STANDARD 14)
请注意,我使用的是libtorch的纯CPU发行版,启用CUDA的版本会导致更多问题,因为CUDA仅为动态版本
cmake..src
通过,但是make
抛出几个错误:
wasm-ld: error: unknown argument: --no-as-needed
wasm-ld: error: unknown argument: --as-needed
wasm-ld: error: unknown argument: --no-as-needed
wasm-ld: error: unknown argument: --as-needed
wasm-ld: error: unknown file type: /home/max/repos/sandbox/cpp/wasm-example/libtorch/lib/libtorch_cpu.so
wasm-ld: error: unknown file type: /home/max/repos/sandbox/cpp/wasm-example/libtorch/lib/libtorch.so
显然,Emscripten在libtorch的动态特性方面遇到了一些问题,所以我的第一个问题是,是否可以使用Emscripten编译动态库?如果这是可能的,那么尝试使用Emscripten编译支持GPU的libtorch将是一件有趣的事情
更新
我尝试使用libtorch的静态纯CPU发行版进行编译,但这会导致完全相同的错误。然而,Pytorch GitHub上的一个旧GitHub刚刚恢复,声明我不是唯一一个有这个问题的人。希望这个GitHub问题能够解决我遇到的问题。您可以在
CMakeLists.txt
中设置CMAKE\u FIND\u ROOT\u PATH\u MODE\u包中的,在project()
之后,这样它将重新定义工具链的设置。但是请注意,这将是您(作为项目构建者)的责任,以确保CMAKE_PREFIX_路径中的包适用于目标平台。是的,这是一种比编辑Emscripten.CMAKE更好的方法-谢谢。然而,在本例中,我仍然停留在第2部分,我看到您正在手动将emcc设置为工具链和编译器。你试过使用吗?像这样使用:emcmakecmake../src
然后emmake make
您可以在CMakeLists.txt
中设置cmake\u FIND\u ROOT\u PATH\u MODE\u包中,在project()
之后,它将重新定义工具链的设置。但是请注意,这将是您(作为项目构建者)的责任,以确保CMAKE_PREFIX_路径中的包适用于目标平台。是的,这是一种比编辑Emscripten.CMAKE更好的方法-谢谢。然而,在本例中,我仍然停留在第2部分,我看到您正在手动将emcc设置为工具链和编译器。你试过使用吗?像这样使用:emcmakecmake../src
然后emmake make