智能计算系统---实验二实时风格迁移在线推理与离线部署

智能计算系统---实验二实时风格迁移在线推理与离线部署

实验简介与说明

该实验是寒武纪陈云霁老师所著的《智能计算系统》自带的实验二

该实验通过使用智能编程语言(BANGC)进行算子开发,对高性能库(CNML)算子进行扩展,并最终集成到编程框架(TensorFlow)中,掌握对高性能库及编程框架进行扩展的能力,使读者可以在 DLP 硬件上自由设计并优化满足特定应用场景的新算子,满足日新月异智能算法的实际需求。

而本文章并不是对该实验的直接解答,而是介绍在实验部分一些无所谓关键的坑。在本人的理解,这个实验的主要目的就是让大家熟悉使用BANGC语言进行MLU的算子开发,让大家认识到智能硬件对于目前一些特定任务,比如各种神经网络,卓越的加速作用。但是限于篇幅或是精力,该书提供的实验文档和寒武纪官网文档对于部分接口的使用没有明确和说明,造成本人在进行实验的部分时踩了不少问题点。故此写下这篇博客向各位读者介绍文档中没有介绍或说明,但对整个实验难度上没有影响的部分。

同时具体的实验步骤请参考寒武纪官方实验介绍

实验内容

这次的实验是基于实验一开发出的集成算子power_difference在tensorflow中的使用,实验主要分为三个部分。

  1. 模型量化:将单精度模型量化为 INT8 模型。
  2. 在线推理,完成 MLU 推理代码的移植工作,分别比较三种不同模型(原始模型、PowerDifference 算子模型,Numpy 算子模型)在 CPU 和 MLU 上的性能和精度。
  3. 离线推理,完成 MLU CNRT 离线推理代码,并完成部署测试。

模型量化

该部分代码和量化手段已经提前给出,直接按照教程即可完成。

在线推理

在线推理部分主要分为两块,分别需要补全/opt/AICSE-demo-student/demo/style_transfer_bcl/
src/online_mlu/transform_mlu.py 和 /opt/AICSE-demo-student/demo/style_transfer_bcl/src/online_cpu/transform_cpu.py

online_cpu

在cpu部分里,使用到的模型是非量化后的模型文件。

该部分需要补全两个函数run_ori_power_diff_pb和run_numpy_pb

  • run_ori_power_diff_pb :直接按照同文件下的run_ori_pb逻辑进行书写,但是要注意该函数使用的计算图与run_ori_pb不同点在于将原生的差平方计算算子改成了实验一中集成的power_difference算子,所以只需要我们进行feed数据(不需要重新实现power_difference的计算),将pow值传递至计算图计算。而其在计算图中的各节点信息可使用神经网络模型可视化网站进行查找
  • run_numpy_pb:与上一个类似,只不过这里需要我们手动将原生的差平方计算算子的输入数据提出并使用实验一中的power_diff_numpy.py的内置函数进行计算后,再传回计算图进行计算。需要注意该函数的输入参数跟上一个run_ori_power_diff_pb的计算图一样的参数,因为这里要手动算,所以在可视化的计算图上可以发现这里断开了。

online_mlu

在mlu部分,使用到的模型是量化后的模型文件。

仅仅需要在每个函数前加上
config.mlu_options.save_offline_model = True

这句话用于保存量化后可用于mlu的离线模型,其余部分均与cpu相同

离线推理

在执行 MLU 在线推理时,通过配置文件生成并保存两种离线模型至/opt/AICSE-demo-student/demo/style_transfer_bcl/models/offline_models 文件夹下。补全 CNRT 离线推理模型代码:/opt/AICSE-demo-student/demo/style_transfer_bcl/src/offline/src/inference.cpp 然后编译并执行离线推理。

该部分实验可以参考CNRT官方例程和实验一中powerDiff.cpp共同完成。

但是还需要注意以下几点:

  1. 模型文件的名字name:name的值并不是DataT中model_name,而需要点开/opt/AICSE-demo-student/demo/style_transfer_bcl/models/offline_models/*.cambricon_twins文件中查看。
  2. 模型的输入数据inputCpuPtrS:该指针指向的数据已经由data_provider.cpp所处理好直接在(*DataT).input_data中。
  3. 模型数据转化:需要注意模型的输入输出均是half型,而该函数所提供的输入和输出均是float型,需要使用cnrtConvertFloatToHalfArray内置功能进行转换。
  4. 数据尺寸inputSizeS & outputSizeS:DataT中均没有提供,直接使用示例程序的中方法获得即可。
  5. 内存空间释放:在示例程序中最后均进行了free(input&output)的操作,在这个cpp文件里不要实现,因为后续的post_processor.cpp环节还要使用这个空间。

实验结果

原图
原模型风格迁移cpu计算结果
原模型风格迁移cpu计算结果

原模型powerDifference算子风格迁移cpu计算结果原模型powerDifference算子风格迁移cpu计算结果

量化模型风格迁移mlu计算结果量化模型风格迁移mlu计算结果
量化模型powerDifference算子风格迁移mlu计算结果
量化模型powerDifference算子风格迁移mlu计算结果

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值