Holoscan SDK 可视化功能裁剪方案

发布时间:2026/8/4 17:23:20
Holoscan SDK 可视化功能裁剪方案 主要使用了宏HOLOSCAN_ENABLE_VIZ基于 holoscan-sdkmain分支v4.5.0commit017eb052026-07-30实测分析编写。配套补丁文件holoscan-disable-viz.patch已验证可干净应用。一、结论完全可以裁剪。对 v4.5.0 源码逐文件分析后确认Holoscan 的可视化功能是一个边界清晰的旁支模块C 核心库libholoscan.soApplication / Fragment / Operator / GXF 集成 / Tensor / UCX 网络等对可视化零依赖。可视化只通过 7 个文件耦合进构建系统全部可以用一个 CMake 开关干净地关闭。裁剪后彻底消除的依赖链依赖引入位置裁剪后X11 开发包libx11-dev 等 7 个 X 扩展cmake/deps/glfw_rapids.cmake找不到就FATAL_ERROR✅ 不再检查Wayland 开发包libwayland-dev同上✅ 不再检查GLFW 3.4CPM 拉取编译cmake/setup_dependencies.cmake✅ 不再拉取Vulkan SDKfind_package(Vulkan REQUIRED)modules/holoviz/src/CMakeLists.txt✅ 不再要求GLSL 着色器编译glslangValidator同上✅ 跳过ImGui 等 thirdpartymodules/holoviz/thirdparty/✅ 跳过二、耦合点分析为什么只需要改 7 个文件2.1 模块划分holoscan-sdk ├── src/core/ ← 核心库 libholoscan.so对 holoviz 零引用已逐文件 grep 确认 ├── src/operators/holoviz/ ← HolovizOp 算子链接 holoscan::viz GXF::multimedia ├── modules/holoviz/ ← Holoviz 渲染模块本体Vulkan GLFW ImGui ├── modules/holoinfer/ ← 推理模块与可视化无关 ├── modules/holoipc/ ← IPC 模块与可视化无关 └── python/holoscan/ ← Python 绑定含一处对 HolovizOp::InputSpec 的特判2.2 七个耦合点#文件耦合内容1CMakeLists.txt新增开关的位置2cmake/setup_dependencies.cmake无条件superbuild_depend(glfw_rapids)→ X11/Wayland 检查FATAL_ERROR的源头3modules/CMakeLists.txtFetchContent_MakeAvailable(holoviz holoinfer)无条件构建 holoviz 模块4src/operators/CMakeLists.txt无条件add_subdirectory(holoviz)5python/holoscan/operators/CMakeLists.txt无条件构建 HolovizOp 的 pybind11 绑定6python/holoscan/core/CMakeLists.txtcore_python无条件链接holoscan::ops::holoviz7python/holoscan/core/io_context.cpp#include holoscan/operators/holoviz/holoviz.hpp及handle_holoviz_op()特判Python 侧 emit 一个list[HolovizOp.InputSpec]时自动识别其余看似相关实则无害的引用python/.../subgraph_pydoc.hpp、cuda_stream_pydoc.hpp等只是文档字符串提到 HolovizOp无代码依赖examples/tests 已由现有的HOLOSCAN_BUILD_EXAMPLES/HOLOSCAN_BUILD_TESTS开关控制。三、改造方案3.1 设计新增一个开关默认 ON不改变上游默认行为补丁可安全合入自己的 fork 长期维护option(HOLOSCAN_ENABLE_VIZ Build the Holoviz visualization module and operator (requires X11/Wayland/Vulkan) ON)关闭时不拉 GLFW、不查 X11/Wayland、不编译 holoviz 模块与 HolovizOpC 和 Python 绑定都不编译、Pythonpy_emit的 Holoviz 特判编译为空操作。3.2 应用补丁cdholoscan-sdkgitapply /path/to/holoscan-disable-viz.patch3.3 推荐的无头服务器构建命令cmake-S.-Bbuild\-DHOLOSCAN_ENABLE_VIZOFF\-DHOLOSCAN_BUILD_EXAMPLESOFF\-DHOLOSCAN_BUILD_TESTSOFF\-DHOLOSCAN_BUILD_PYTHONON\-DHOLOSCAN_DOWNLOAD_DATASETSOFF\-DCMAKE_BUILD_TYPERelease cmake--buildbuild -j$(nproc)HOLOSCAN_ENABLE_VIZOFF是本次补丁新增的开关解决 X11/Wayland/Vulkan 依赖EXAMPLESOFF/TESTSOFF是上游已有开关无头场景建议一并关闭部分 examples/tests 引用 HolovizOp核心功能GXF 图执行、CUDA 流、Tensor、UCX 分布式、Holoviz 以外的全部算子、Holoscan Sensor Bridge /HOLOSCAN_BUILD_HOLOLINK均不受影响。3.4 补丁逐处说明①CMakeLists.txt— 新增开关option(HOLOSCAN_ENABLE_VIZ Build the Holoviz visualization module and operator (requires X11/Wayland/Vulkan) ON)②cmake/setup_dependencies.cmake— GLFW 依赖条件化这是消除你遇到的X11 not found报错的根本点# GLFW (and its X11/Wayland system dependencies) is only needed by the Holoviz # visualization module. Skip it entirely when visualization is disabled. if(HOLOSCAN_ENABLE_VIZ) superbuild_depend(glfw_rapids) endif()③modules/CMakeLists.txt— holoviz 模块不再强制构建holoinfer 保持无条件构建FetchContent_MakeAvailable(holoinfer) # The Holoviz module (Vulkan renderer, GLFW windowing, ImGui) is optional. if(HOLOSCAN_ENABLE_VIZ) FetchContent_MakeAvailable(holoviz) endif()④src/operators/CMakeLists.txt和⑤python/holoscan/operators/CMakeLists.txt— HolovizOp 的 C 库与 Python 绑定条件化if(HOLOSCAN_ENABLE_VIZ) add_subdirectory(holoviz) endif()⑥python/holoscan/core/CMakeLists.txt— 条件链接并传递编译宏if(HOLOSCAN_ENABLE_VIZ) target_link_libraries(core_python PRIVATE holoscan::ops::holoviz ) target_compile_definitions(core_python PRIVATE HOLOSCAN_ENABLE_VIZ) endif() target_link_libraries(core_python PRIVATE holoscan::infer::headers )⑦python/holoscan/core/io_context.cpp— 头文件包含与函数体用宏保护保留函数签名与调用点不变最小侵入#ifdefHOLOSCAN_ENABLE_VIZ#includeholoscan/operators/holoviz/holoviz.hpp#endifboolPyOutputContext::handle_holoviz_op(...){#ifdefHOLOSCAN_ENABLE_VIZ// ... 原有 HolovizOp::InputSpec 识别逻辑 ...#endifreturnfalse;}四、裁剪后的行为边界注意事项HolovizOp 不再存在任何 YAML/代码里使用holoscan::ops::HolovizOpC或holoscan.operators.HolovizOpPython的应用会在运行时/导入时报算子不存在。这正是完全去掉的语义。Pythonemit一个list[InputSpec]不再被自动识别——本来也只有 HolovizOp 会消费它无影响。头部安装的 umbrella header 不包含 holovizinclude/holoscan/holoscan.hpp本就不 include holoviz 头文件无需改动。CPack 打包cmake/modules/HoloscanCPack.cmake提到 glfw 仅用于打包第三方 license只有执行cpack时才相关常规cmake --install不受影响。保留升级路径开关默认 ON 且改动最小29/-5 行后续git merge上游新版本时冲突概率很低。五、如果完全不想打补丁纯命令行替代方案glfw_rapids.cmake在依赖解析阶段就会FATAL_ERROR早于任何子目录开关生效所以仅靠现有 CMake 选项无法跳过 X11 检查。无补丁的变通方案只有两个装齐 X11/Wayland 开发包sudo apt-get install libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev libxext-dev libxkbcommon-dev libwayland-dev让 GLFW 编过然后用HOLOSCAN_BUILD_EXAMPLESOFF不使用可视化——但 holoviz 模块本体仍会被编译仍需 Vulkan SDK只是不用它或者给 CMake 传-DCMAKE_DISABLE_FIND_PACKAGE_X11ON—— 无效因为源码里是硬性FATAL_ERROR。因此对彻底去掉可视化的诉求打补丁是唯一干净的途径。六、验证记录补丁基于 commit017eb05v4.5.0生成git apply --check在干净工作区验证通过改动统计7 个文件29/-5 行全仓库grep确认裁剪后无残留的对glfw、Vulkan、holoscan::viz、ops::holoviz的构建引用。七、编译cmake --version 要 3.267.1. 安装 protobuf 和匹配的 gRPC安装 protobuf# 1. 用 CMake 重新构建# 注意3.21.x 的 CMakeLists.txt 在 cmake/ 子目录里# v22 之后才被移到源码根目录cmake-Scmake-Bbuild-cmake-GNinja\-DCMAKE_BUILD_TYPERelease\-DCMAKE_INSTALL_PREFIX/usr/local\-Dprotobuf_BUILD_TESTSOFF\-DBUILD_SHARED_LIBSON cmake--buildbuild-cmake -j$(nproc)sudocmake--installbuild-cmakesudoldconfig# 2 . 验证这次应该有了ls/usr/local/lib/cmake/protobuf/# 期望看到protobuf-config.cmake protobuf-config-version.cmake# protobuf-targets.cmake protobuf-options.cmake 等其他不带cmake 的安装方式不要用仅供参考#1 apt 安装方式与卸载sudoapt-getupdatesudoapt-getinstallprotobuf-compiler libprotobuf-dev libprotoc-dev# 卸载当前版本可选sudoapt-getremove--purgeprotobuf-compiler libprotobuf-dev libprotoc-dev# 2. 源码的auto tool 安装方式与卸载# 下载源码选择项目需要的版本cd/tmpwgethttps://github.com/protocolbuffers/protobuf/releases/download/v21.12/protobuf-cpp-3.21.12.tar.gztar-xzfprotobuf-cpp-3.21.12.tar.gzcdprotobuf-3.21.12# 编译安装./configure--prefix/usr/localmake-j$(nproc)sudomakeinstallsudoldconfig# 验证 Config 文件存在ls/usr/local/lib/cmake/protobuf/ProtobufConfig.cmake# 卸载 autotools 安装的文件在原来的构建目录里执行cd/tmp/protobuf-3.21.12sudomakeuninstallsudoldconfig安装一个与 protobuf 3.21.12 相匹配的 gRPC# 1. 安装编译依赖sudoapt-getinstall-ybuild-essential pkg-config\libssl-dev zlib1g-dev libc-ares-dev# 2. 下载源码并编译安装gitclone --recurse-submodules-bv1.51.1--depth1--shallow-submodules\https://github.com/grpc/grpccdgrpc cmake-S.-Bcmake/build-GNinja\-DCMAKE_BUILD_TYPERelease\-DCMAKE_INSTALL_PREFIX/usr/local\-DgRPC_INSTALLON\-DgRPC_BUILD_TESTSOFF\-DgRPC_PROTOBUF_PROVIDERpackage\-DgRPC_ZLIB_PROVIDERpackage\-DgRPC_CARES_PROVIDERpackage\-DgRPC_SSL_PROVIDERpackage\-DgRPC_ABSL_PROVIDERmodule\-DgRPC_RE2_PROVIDERmodule cmake--buildcmake/build -j$(nproc)sudocmake--installcmake/buildsudoldconfig安装tensorRT本机安装了 cuda 12.8.2 toolkit追求最稳定兼容性可以直接选择 TensorRT 10.8.0。它已经过充分验证是与 CUDA 12.8 配套发布的稳定版本。希望使用新特性可以考虑 TensorRT 10.9.0。它同样基于 CUDA 12.8 构建兼容性也是有保障的。这里选用 tensorRT 用 10.9 的tar包可以兼容 Linux 各种版本例如ubuntu 20ubuntu22ubuntu24 等。断点续传:wget-chttps://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/10.9.0/tars/TensorRT-10.9.0.34.Linux.x86_64-gnu.cuda-12.8.tar.gztensorRT 的这个下载链接不需要登陆开发者账号也能下载。解药后拷贝到正确的位置配置编译holoscan-sdk库cmake-S/home/ruler/ex_holoscan/tmp01/holoscan-sdk\-B/home/ruler/ex_holoscan/tmp01/holoscan-sdk/build/\-GNinja\-DCMAKE_BUILD_TYPERelease\-DCUDAToolkit_ROOT:PATH/usr/local/cuda\-DHOLOSCAN_ENABLE_VIZOFF\-DHOLOSCAN_BUILD_EXAMPLESOFF\-DHOLOSCAN_BUILD_TESTSOFF\-DHOLOSCAN_DOWNLOAD_DATASETSOFF构建 holoscan-sdk 的流程参考# Configurecmake-S$source_dir-B$build_dir\-GNinja\-DCMAKE_BUILD_TYPERelease\-DCUDAToolkit_ROOT:PATH/usr/local/cuda# Buildcmake--build$build_dir-j# Installcmake--install$build_dir--prefix$install_dir