RKNN部署记录-1

部署运行你感兴趣的模型镜像

导出模型:

将tensorflow模型导出为.pb文件

tf.keras.models.save_model(model,"./models/pb_/")

将.pb文件转换为.onnx文件(命令行操作)

python -m tf2onnx.convert --saved-model ./pb_ --opset 18 --output model.onnx

python下查看onnx结构: 

import onnx

def print_graph_nodes(model_path):
    # 加载 ONNX 模型
    model = onnx.load(model_path)

    # 遍历所有图节点并打印节点信息
    for node in model.graph.node:
        node_type = node.op_type
        node_name = node.name
        print(f'Node Type: {node_type}, Node Name: {node_name}')

if __name__ == '__main__':
    onnx_model_file = './models/model.onnx'
    print_graph_nodes(onnx_model_file)

测试onnx模型:

import onnxruntime
# import numpy as np
# input1 = np.random.random((1, 7, 7, 3)).astype('float32')

ort_sess = onnxruntime.InferenceSession("./models/model.onnx")
ort_inputs = {ort_sess.get_inputs()[0].name: input1 }
ort_outs = ort_sess.run(None, ort_inputs)

RKNN环境搭建:ubuntu 22.04.4,Python3.10,RKNN-Toolkit2-2.0.0,

在~/.config/pip/pip.conf文件中设置镜像以下载tensorflow-2.8.0:

index-url = https://pypi.tuna.tsinghua.edu.cn/simple

依次执行

sudo apt-get install python3 python3-dev python3-pip 

sudo apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc

pip3 install -r doc/requirements_cp310.txt

ip3 install packages/rknn_toolkit2-2.0.0b0+9bab5682-cp310-cp310-linux_x86_64.whl

参考:RKNN例程RKNN工具

 使用rknn库转换模型(Linux系统)

实际部署后,将动态输入修改为静态,由于python API没有动态接口的讲解和示例,实际运行也不成功。

同时去掉量化:

rknn.config(dynamic_input = [[[1,600,1]]],
            target_platform = 'rk3568')

ret = rknn.load_onnx(model = './model.onnx')

ret = rknn.build(do_quantization=True, dataset='./dataset.txt')

改为:

rknn.config(target_platform = 'rk3568')

ret = rknn.load_onnx(model = './model.onnx', inputs = ['input'], input_size_list = [[1,600,1]])

ret = rknn.build(do_quantization=False)

 

 原代码:

import numpy as np

from rknn.api import RKNN
rknn = RKNN(verbose=True)



rknn.config(dynamic_input = [[[1,600,1]]],
            target_platform = 'rk3568')

if __name__ == '__main__':

    # Load model
    print('--> Loading model')

			
    #ret = rknn.load_tflite(model = './quantized_saved_model.tflite')
    ret = rknn.load_onnx(model = './model.onnx')
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')


    # Build model
    print('--> Building model')
    ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
    if ret != 0:
        print('Build model failed!')
        exit(ret)
    print('done')

    # Export rknn model
    print('--> Export rknn model')
    ret = rknn.export_rknn('./mobilenet_v1.rknn')
    if ret != 0:
        print('Export rknn model failed!')
        exit(ret)
    print('done')
    
    
    
rknn.release()

 待解决问题:模型中使用了talking head attention,模型使用tf.sinsum构建。tf.sinsum会导致构建RKNN模型失败,报错提示使用了动态图。

p_attn_talk = tf.convert_to_tensor(tf.einsum('ij,ajbk->aibk', self._post_softmax_weight, p_attn))

 解决方案:

        修改为:

_pre_softmax_weight = np.random.randint(0, 10, size=(8, 8))
scores = np.random.randint(0, 10, size=(1, 8, 300, 300))

scores_rhp = tf.reshape(scores,(tf.shape(scores)[0],tf.shape(scores)[1],tf.shape(scores)[2]*tf.shape(scores)[3]))
print(scores_rhp.shape)
scores_talk = tf.matmul(_pre_softmax_weight, scores_rhp)
print(scores_talk.shape)
scores_talk = tf.reshape(scores_talk,(tf.shape(scores)[0],tf.shape(scores)[1],tf.shape(scores)[2],tf.shape(scores)[3]))
print(scores_talk.shape)

scores_talk_1 = tf.convert_to_tensor(tf.einsum('ij,ajbk->aibk', _pre_softmax_weight, scores))

print("\n结果是否相等:", np.allclose(scores_talk.numpy(), scores_talk_1.numpy()))

修改后的模型可以继续使用原始权重数据,效果基本不变。

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### RKNN-Toolkit2 和 RKNN-Toolkit Lite2 的功能差异 RKNN-Toolkit2 是 Rockchip 提供的一个用于将神经网络模型转换为 RKNN (Rockchip Neural Network) 格式的工具集[^3]。它支持多种主流框架的模型导入,并提供优化选项以提高推理性能和兼容性。而 RKNN-Toolkit Lite2 则是一个轻量级版本,主要针对资源受限环境设计。 以下是两者的主要区别: #### 功能对比 | 特性 | RKNN-Toolkit2 | RKNN-Toolkit Lite2 | |--------------------------|---------------------------------------------|--------------------------------------------| | **目标设备** | 支持全系列 Rockchip 芯片 | 主要面向低功耗、嵌入式设备 | | **依赖库大小** | 较大 | 显著减小 | | **运行时内存占用** | 更高 | 降低 | | **编译复杂度** | 需要完整的开发环境 | 简化安装流程 | | **调试能力** | 完整的日志记录与分析工具 | 基础日志支持 | | **量化精度调整** | 多种量化策略 | 固定量化方案 | #### 技术细节说明 1. **模型优化** - RKNN-Toolkit2 提供更全面的模型优化选项,例如动态图转静态图的支持以及自定义算子扩展接口[^3]。 - RKNN-Toolkit Lite2 则专注于快速部署已知架构的标准模型,减少不必要的计算开销。 2. **硬件适配** - RKNN-Toolkit2 可配置多核 NPU 并行处理逻辑,适合高性能场景需求。 - RKNN-Toolkit Lite2 对单核或无专用加速单元的情况进行了特别优化,在边缘端表现出更好的能效比。 3. **易用性改进** - 在脚本编写方面,Lite 版本简化了许多参数设置过程,使得开发者能够更快完成原型验证阶段的工作。 ```python from rknnlite.api import RKNNLite # 初始化 RKNN-Lite 实例 rknn_lite = RKNNLite() # 加载 .rknn 文件 ret = rknn_lite.load_rknn('./model.rknn') if ret != 0: print('Load RKNN model failed!') else: print('Model loaded successfully.') ``` 上述代码片段展示了如何利用 RKNN-Toolkit Lite 进行简单高效的推断操作。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值