
使用 ncnn CMake 选项裁剪出最小化推理库完整瘦身指南【免费下载链接】ncnnncnn is a high-performance neural network inference framework optimized for the mobile platform项目地址: https://gitcode.com/gh_mirrors/nc/ncnn如果你的目标是让 ncnn 库体积尽可能小这份速查手册cheatsheet会一步步告诉你哪些 CMake 开关可以关、哪些能力会随之失去以及如何在功能保留与二进制体积之间找到平衡。读完本文你将掌握从编译期选项、指令集裁剪、图层裁剪到源码级删减的全套 ncnn 瘦身方法并能针对具体部署机型组合出属于自己的最小构建命令。ncnn 是一款面向移动端与嵌入式平台的高性能神经网络推理框架其默认构建会包含大量通用功能与各平台优化内核。当 APK、固件或 ROM 空间紧张时可以通过一组NCNN_*CMake 选项关闭不需要的能力从而显著缩小库体积。以下所有开关均以当前仓库根目录 CMakeLists.txt 中的实际定义为准逐一说明其作用、影响与适用场景。一、关掉语言运行时特性RTTI 与异常ncnn 默认在非 Android/iOS/simplestl环境下开启 RTTI 与异常CMakeLists.txt在 Android、iOS 或启用NCNN_SIMPLESTL时默认关闭。若你的平台编译器不支持或不想引入这两项运行时开销可显式关闭cmake -DNCNN_DISABLE_RTTION -DNCNN_DISABLE_EXCEPTIONON ..代价调用 ncnn 的函数时不能再依赖 RTTI如dynamic_cast和异常机制如try/catch。这是最直接的体积削减手段也是后续进一步裁剪如启用simplestl的前提之一。二、按能力维度逐项关闭1. 关闭 Vulkan GPU 加速-DNCNN_VULKANOFFVulkan 计算支持默认关闭CMakeLists.txt若你不需要 GPU 推理保持 OFF 即可显式声明更清晰cmake -DNCNN_VULKANOFF ..代价无法使用 GPU 加速仅保留 CPU 推理路径。开启 Vulkan 时构建系统还会额外编译layer/vulkan/下的着色器与 Vulkan 层实现见 cmake/ncnn_add_layer.cmake体积增长明显因此最小构建几乎总是与NCNN_VULKANOFF相伴。2. 关闭文件 IO-DNCNN_STDIOOFFNCNN_STDIO控制是否支持从外部文件加载模型默认开启CMakeLists.txtcmake -DNCNN_STDIOOFF ..代价无法通过load_param(xxx.param)/load_model(xxx.bin)从文件加载模型但仍可从内存加载或从 Android Assets 资源加载。具体加载方式可参考 use-ncnn-with-alexnet.md 的 load model 一节把模型转换成alexnet.mem.h静态数组后通过net.load_param(alexnet_param_bin); net.load_model(alexnet_bin);加载整个模型硬编码进程序无需外部资源文件。3. 关闭字符串支持-DNCNN_STRINGOFFNCNN_STRING默认开启CMakeLists.txtcmake -DNCNN_STRINGOFF ..代价无法加载带可见字符串的人类可读 param 文件但可以加载二进制的param.bin文件调用Extractor::input / extract时无法用 blob 名字符串定位输入输出必须改用id.h中的枚举值如alexnet_param_id::BLOB_data见 use-ncnn-with-alexnet.md 的 input and output 一节。二进制 param 可通过ncnn2mem工具生成ncnn2mem alexnet.param alexnet.bin alexnet.id.h alexnet.mem.h详见 use-ncnn-with-alexnet.md 的 strip visible string 一节。联动提醒当NCNN_STDIO或NCNN_STRING任一被关闭时CMake 会自动把NCNN_BUILD_TOOLS、NCNN_BUILD_EXAMPLES、NCNN_BUILD_BENCHMARK、NCNN_BUILD_TESTS强制置为 OFF 并给出警告CMakeLists.txt因为这些工具与示例依赖字符串/文件 IO。4. 关闭模型校验-DNCNN_VALIDATIONOFFNCNN_VALIDATION默认开启CMakeLists.txt用于校验参数 ID、数组长度、数值范围、层参数与图结构一致性包括环检测。若你的模型参数与计算图已经过充分验证可以关闭cmake -DNCNN_VALIDATIONOFF ..代价省略上述各种校验无效参数不再保证返回错误保留参数解析与数值转换、默认值、分配与读取失败处理、特性可用性检查、资源清理等逻辑对合法模型开启与关闭时行为完全一致。该开关与NCNN_STDIO、NCNN_STRING、NCNN_BUILD_TESTS相互独立开启时校验测试会运行关闭时推理与转换测试仍会运行。从源码看校验逻辑大量以#if NCNN_VALIDATION形式内联在 src/paramdict.cpp 的参数解析代码中L105 起关闭后这部分分支被整体裁剪。5. 关闭 bf16 支持-DNCNN_BF16OFFNCNN_BF16默认开启CMakeLists.txtcmake -DNCNN_BF16OFF ..代价无法在推理中使用 bf16 存储类型。6. 关闭 int8 量化推理-DNCNN_INT8OFFNCNN_INT8默认开启CMakeLists.txtcmake -DNCNN_INT8OFF ..代价无法使用量化后的 int8 推理。若你的模型未做 int8 量化关闭可省去Quantize/Dequantize等相关内核与打包路径。7. 关闭权重量化推理-DNCNN_WEIGHT_QUANTOFFNCNN_WEIGHT_QUANT默认开启CMakeLists.txtcmake -DNCNN_WEIGHT_QUANTOFF ..代价无法使用权重量化weight quantized推理。它与 int8 是两条独立的量化能力按需关闭。三、裁剪图像像素处理功能像素处理在Mat层面积累了不少代码ncnn 提供了四级粒度开关默认全部开启见 CMakeLists.txt1. 去掉绘制功能-DNCNN_PIXEL_DRAWINGOFFcmake -DNCNN_PIXEL_DRAWINGOFF ..代价无法使用ncnn::draw_rectangle_xx / draw_circle_xx / draw_text_xx等绘制基础图形与文字的函数但Mat::from_pixels / from_pixels_resize等像素转换函数仍然可用。2. 去掉旋转与仿射变换-DNCNN_PIXEL_ROTATEOFF -DNCNN_PIXEL_AFFINEOFFcmake -DNCNN_PIXEL_ROTATEOFF -DNCNN_PIXEL_AFFINEOFF ..代价无法使用ncnn::kanna_rotate_xx / warpaffine_bilinear_xx等旋转与仿射变换函数Mat::from_pixels / from_pixels_resize依然可用。3. 整体去掉像素功能-DNCNN_PIXELOFFcmake -DNCNN_PIXELOFF ..代价无法使用Mat::from_pixels / from_pixels_resize / to_pixels / to_pixels_resize等图像像素转换函数需要手动创建Mat并逐元素填充数据。这一档砍得最狠适合纯张量输入输出的场景。四、关闭多线程与指令集扩展1. 关闭 OpenMP-DNCNN_OPENMPOFFNCNN_OPENMP默认开启CMakeLists.txtcmake -DNCNN_OPENMPOFF ..代价无法使用 OpenMP 多线程加速。若你的目标机器计划单线程运行模型官方文档明确建议关闭此选项——省掉的不仅是运行时开销还有链接进库的 OpenMP 运行库体积。2. 关闭 avx2 / arm82 优化内核-DNCNN_AVX2OFF -DNCNN_ARM82OFFx86 与 ARM 平台默认分别开启 avx2CMakeLists.txt与 armv8.2 fp16 优化CMakeLists.txtcmake -DNCNN_AVX2OFF -DNCNN_ARM82OFF ..代价不编译使用 avx2 / armv8.2 指令集扩展的优化内核。若目标机器不支持这些指令集官方建议关闭对应选项避免在运行时无法利用这些内核。3. 关闭运行时 CPU 指令分发-DNCNN_RUNTIME_CPUOFFNCNN_RUNTIME_CPU默认开启CMakeLists.txtcmake -DNCNN_RUNTIME_CPUOFF ..代价无法在运行时检测 CPU 支持的指令集扩展并使用对应优化内核如果你确切知道目标机器的指令集如 avx2 / arm82可以手工打开-DNCNN_AVX2ON / -DNCNN_ARM82ON此时 sse2 / arm8 版本内核将不再编译进一步瘦身。从 cmake/ncnn_add_layer.cmake 可见所有 ISA 优化源文件avx2、avx512、fma、asimdhp、rvv、lasx、msa 等的编译都受NCNN_RUNTIME_CPU门控——运行时分发关闭后这些多版本内核大多不再被编入库中体积收益显著。五、按需剔除用不到的图层1. 用WITH_LAYER_xxx开关裁层ncnn 每个图层都有对应的 CMake 开关默认开启cmake/ncnn_add_layer.cmake关闭后该层的通用实现、架构优化实现如 arm/x86 版本以及 Vulkan 实现都不会被编译cmake/ncnn_add_layer.cmake并且会从 layer registry 中摘除。示例cmake -DWITH_LAYER_absvalOFF -DWITH_LAYER_bnllOFF ..注意事项若你的模型不包含某些层以上面的 absval / bnll 为例可以放心丢弃关键与依赖层不应丢弃如convolution/innerproduct等算子层其依赖的padding/flatten等以及relu/clip等激活层一旦缺失会导致模型无法解析或推理出错。全部层的默认开关可在 src/CMakeLists.txt 中查看例如ncnn_add_layer(AbsVal)、ncnn_add_layer(ArgMax OFF)部分层默认即关闭如 ArgMax、SPP见 src/CMakeLists.txt。2. 删掉不用的优化内核除了 CMake 开关还可以直接修改src/layer/arm/目录下的源码删除不需要的优化内核或用空函数替换。同样地用上文-DWITH_LAYER_xxxOFF也会连带剔除相关优化内核cmake/ncnn_add_layer.cmake。3. 从 BinaryOp / UnaryOp 中删除算子如果模型只用到了二元/一元算子全集中的少数几个可以手工修改 src/layer/binaryop.cpp、src/layer/unaryop.cpp 以及 src/layer/arm/binaryop_arm.cpp、src/layer/arm/unaryop_arm.cpp仓库中 arm 目录下存在对应实现x86 目录同理删除不需要的算子分支代码。六、终极瘦身启用NCNN_SIMPLESTL脱离编译器 STL这是 ncnn 为最小化场景提供的特殊模式cmake -DNCNN_SIMPLESTLON ..作用不再依赖编译器自带的 STL改用 ncnn 自带的simplestl实现对应NCNN_SIMPLEOCV / NCNN_SIMPLEOMP / NCNN_SIMPLEMATH等 minimal 系列开关见 CMakeLists.txt。调用 ncnn 函数时用户也只能使用simplestl提供的容器与工具。配套要求编译参数通常搭配-nodefaultlibs -fno-builtin -nostdinc -lcAndroid 交叉编译时需要指定cmake -DCMAKE_TOOLCHAIN_FILE$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_STLsystem以避免与 STL 冲突。启用NCNN_SIMPLESTL时NCNN_DISABLE_RTTI与NCNN_DISABLE_EXCEPTION默认会被置为 ONCMakeLists.txtNCNN_BUILD_TOOLS、NCNN_BUILD_EXAMPLES默认 OFFCMakeLists.txt与最小化目标完全一致。七、组合示例一条命令构建最小 ncnn综合以上选项一个面向仅 CPU 单线程、内存加载模型、无像素处理场景的最小构建命令形如cmake -DCMAKE_BUILD_TYPERelease \ -DNCNN_VULKANOFF \ -DNCNN_STDIOOFF \ -DNCNN_STRINGOFF \ -DNCNN_VALIDATIONOFF \ -DNCNN_BF16OFF \ -DNCNN_INT8OFF \ -DNCNN_WEIGHT_QUANTOFF \ -DNCNN_PIXELOFF \ -DNCNN_PIXEL_ROTATEOFF \ -DNCNN_PIXEL_AFFINEOFF \ -DNCNN_PIXEL_DRAWINGOFF \ -DNCNN_OPENMPOFF \ -DNCNN_RUNTIME_CPUOFF \ -DNCNN_DISABLE_RTTION \ -DNCNN_DISABLE_EXCEPTIONON \ -DWITH_LAYER_absvalOFF -DWITH_LAYER_bnllOFF \ ..实际使用时应结合目标模型与部署平台微调若目标机支持 avx2 / armv8.2保留-DNCNN_AVX2ON -DNCNN_ARM82ON换取推理性能同时接受相应内核的体积若目标机不支持则关闭以获得更小体积若需要 GPU 推理、图像像素处理或量化推理切勿关闭对应选项若追求极致体积且能接受 STL 限制再加-DNCNN_SIMPLESTLON并配置配套编译参数。八、瘦身决策速查表CMake 选项默认值关闭后的影响适用场景NCNN_DISABLE_RTTI非移动端 OFF调用 ncnn 时不能使用 RTTI嵌入式/最小构建NCNN_DISABLE_EXCEPTION非移动端 OFF调用 ncnn 时不能使用异常嵌入式/最小构建NCNN_VULKANOFF无 GPU 加速纯 CPU 推理NCNN_STDIOON不能从文件加载模型可从内存/Assets 加载模型硬编码进程序NCNN_STRINGON不能加载明文 param、不能用字符串索引 blob使用 param.bin id.h 枚举NCNN_VALIDATIONON跳过参数与图校验模型需已可信已验证的固定模型NCNN_BF16ON不能使用 bf16 存储类型无需 bf16 推理NCNN_INT8ON不能使用 int8 量化推理未做 int8 量化NCNN_WEIGHT_QUANTON不能使用权重量化推理未使用权重量化NCNN_PIXEL_DRAWINGON无绘制图形/文字函数无需可视化输出NCNN_PIXEL_ROTATE/NCNN_PIXEL_AFFINEON无旋转/仿射变换函数无需图像旋转仿射NCNN_PIXELON无 from_pixels/to_pixels 系列纯张量输入输出NCNN_OPENMPON无 OpenMP 多线程加速单线程运行NCNN_AVX2/NCNN_ARM82平台相关 ON不编译对应指令集优化内核目标机不支持该指令集NCNN_RUNTIME_CPUON无运行时指令集分发已知目标机指令集NCNN_SIMPLESTLOFF使用 ncnn 自带 simplestl 替代编译器 STL极致体积、裸机环境WITH_LAYER_xxxON个别默认 OFF不编译对应层及其优化/Vulkan 实现模型不含该层九、总结与注意事项ncnn 的瘦身体系是由粗到细、层层递进的编译期能力开关NCNN_VULKAN / NCNN_STDIO / NCNN_STRING / NCNN_VALIDATION / NCNN_BF16 / NCNN_INT8 / NCNN_WEIGHT_QUANT按推理能力维度裁剪功能模块开关NCNN_PIXEL*系列、NCNN_OPENMP、NCNN_AVX2 / NCNN_ARM82 / NCNN_RUNTIME_CPU按平台与数据处理需求裁剪图层与内核级裁剪WITH_LAYER_xxx、手动删除src/layer/arm/优化内核、精简binaryop.cpp / unaryop.cpp算子分支按具体模型裁剪运行时环境替换NCNN_SIMPLESTL实现脱离编译器 STL 的极致瘦身。动手前请务必评估模型是否会用到被关闭的能力如 int8、bf16、像素变换、目标机指令集是否匹配、加载方式是否需要文件 IO。每一项关闭都有明确的功能代价正确做法是先裁剪到恰好够用再结合WITH_LAYER_xxx与内核删减做最后微调——这样既能拿到满意的体积又不会在部署后才发现关键路径被误删。【免费下载链接】ncnnncnn is a high-performance neural network inference framework optimized for the mobile platform项目地址: https://gitcode.com/gh_mirrors/nc/ncnn创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考