我正在尝试使用 WebAssembly 在浏览器中运行我的 PyTorch 模型(导出到 TorchScript)。为此,我需要使用 Emscripten 编译 libtorch。正如 PyTorch 文档建议的那样,我坚持使用 CMake 作为编译器。
我已经设法使用 CMake 编译 libtorch,没有出现此处指定的问题。其次,我还设法使用 Emscripten 和 CMake 将一个简单的测试程序编译为 WASM(为了简洁并专注于手头的问题,我没有包含其中任何一个的 CMakeLists.txt 文件)
当我尝试将两者一起编译时,问题就开始了,这是我的 CMake 文件:
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 问题能够解决我遇到的问题。