TNN模型转换为mem

1. 引言

原始我们将TNN模型保存为本地磁盘文件,而后调用TNN接口传入模型路径,将模型从磁盘加载至内存中。使用该方式存在弊端,首先是编译的动态库和模型需要分开提供,使用者需要手动传递模型路径;在一些操作系统中模型不便直接本地存储(Android、IOS读取本地路径文件均存在权限问题)。因此如果可将模型一并合封装至动态库中,那么开发者使用将会得到便利。

2. 转换流程

2.1 编译tnn2mem工具

TNN为使用者提供了内存读取的模型的转换工具。首先,在TNN编译时打开开关

mkdir build
cd build
cmake ..  -DTNN_TNN2MEM_ENABLE=ON

2.2 使用tnn2mem将模型转化为头文件

然后就可以在tools/tnn2mem 目录下得到可执行工具tnn2mem,这里我们以常见的mobilenetv2为例

cd tools/tnn2mem
./tnn2mem mobilenetv2.tnnproto mobilenetv2.tnnmodel mobilenetv2.h

模型的参数会以非明文的形式保存在生成的mobilenetv2.h文件中

2.3 引入头文件,加载模型

为了读取模型,我们需要头文件

#include "mobilenetv2.h"
#include "tnn/core/common.h"
#include "tnn/utils/string_utils.h"
#include <string>

在加载模型时,我们需要定义模型变量

ModelConfig model_config;
std::string mobilenetv2_tnnproto_string = UcharToString(mobilenetv2_tnnproto,mobilenetv2_tnnproto_length);
std::string mobilenetv2_tnnmodel_string = UcharToString(mobilenetv2_tnnmodel,mobilenetv2_model_length);
model_config.params.push_back(mobilenetv2_tnnproto_string);
model_config.params.push_back(mobilenetv2_tnnmodel_string);

在变量model_config中储存模型信息,之后便可按照所需要的补齐其他参数进行推理

3. 总结

1. 我们发现使用tnn2mem转换之后的头文件,相较于原始权重文件,大约大了3~4倍数,这里借鉴ncnn作者思路,二进制转文本类会造成文件变大;但是实际打包成动态库时,动态库包大小增加量约等于原始未转化的模型权重大小。

2. 通过上述方式,我们将模型权重封装至动态链接库,提升了引擎的跨平台性能。

4. 参考

TNN/tnn2mem.md at 0281d86483aa20ce16fea501580e16d44070bff0 · Tencent/TNN · GitHub

模型导出成 .C 文件, 提高跨平台性能. · Issue #72 · Tencent/TNN · GitHub

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值