本篇文章将详细说明如何将onnx模型转换为在ncnn中可以使用的fp16半精度模型。
本文所使用的操作系统为Windows,使用的全部是ncnn发布包中自带的工具。首先使用onnx2ncnn将onnx模型转换为ncnn的param和bin模型,然后使用ncnnoptimize工具将上一步转换的param和bin模型转换为fp16的param和bin模型。
1 使用onnx2ncnn将onnx模型转换为ncnn中的param和bin
这个部分可以参考我的另一篇文章:NCNN – 在windows上转换onnx模型为ncnn的param,bin格式 。
主要使用的以下转换命令:
<code class="language-cpp line-numbers">onnx2ncnn.exe ./input_mobile.onnx ./out_mobile.param ./out_mobile.bin </code>
2 使用ncnnoptimize转换fp16模型
这个ncnnoptimize依然是在ncnn发布包的bin目录下,这个工具主要是对ncnn中的算子进行合并和优化,并且可以指定输出模型的精度。
主要的使用命令如下
<code class="language-cpp line-numbers">ncnnoptimize.exe ./input.param ./input.bin ./out.param ./out.bin flag </code>
其中flag
参数为0则指fp32,参数为1则指fp16,参数65536也是指生成fp16模型,所以转换为fp16模型的命令如下
<code class="language-cpp line-numbers">ncnnoptimize.exe ./input.param ./input.bin ./out.param ./out.bin 1 </code>
或者
<code class="language-cpp line-numbers">ncnnoptimize.exe ./input.param ./input.bin ./out.param ./out.bin 65536 </code>
生成完成之后,可以发现fp16模型比原始的fp32模型文件大小差不多减少了一半。
3 ncnn中加载fp16模型
可以考虑为ncnn::net
的opt加上
<code class="language-cpp line-numbers">m_net.opt.use_fp16_arithmetic = true; m_net.opt.use_fp16_packed = true; m_net.opt.use_fp16_storage = true; </code>
完整的示例代码可参考如下,也可参考其他开源项目代码
<code class="language-cpp line-numbers">bool NanoDet::load_model(AAssetManager *mgr, const char *param, const char *bin, bool is_use_gpu) { m_net.clear(); m_blob_pool_allocator.clear(); m_workspace_pool_allocator.clear(); #if <a href="https://www.stubbornhuang.com/tag/ncnn/" title="浏览关于“NCNN”的文章" target="_blank" class="tag_link">NCNN</a>_VULKAN m_can_use_gpu = is_use_gpu && ncnn::get_gpu_count() > 0; m_net.opt.use_vulkan_compute = m_can_use_gpu; #endif m_net.opt.num_threads = ncnn::get_big_cpu_count(); m_net.opt.blob_allocator = &m_blob_pool_allocator; m_net.opt.workspace_allocator = &m_workspace_pool_allocator; m_net.opt.use_fp16_arithmetic = true; m_net.opt.use_fp16_packed = true; m_net.opt.use_fp16_storage = true; int load_res = -1; load_res = m_net.load_param(mgr, param); if(load_res != 0) return false; load_res = m_net.load_model(mgr, bin); if(load_res != 0) return false; return true; } </code>
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:NCNN – ncnn将onnx模型转换为fp16模型
原文链接:https://www.stubbornhuang.com/2905/
发布于:2023年12月07日 10:40:12
修改于:2023年12月07日 10:40:12
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
49