本文的视频教程可点击下面链接:
https://www.bilibili.com/video/BV1iB4y1E75V
动态Batch/动态分辨率设置例子详解
- MindStudio,选择AscendApp创建工程项目
- 点击next之后我们可以选择MindStudio提供的模板进行工程创建
- 这里我们选择官网提供的图像分类的Resnet50模型的模板
- 我们先到Pytorch官网下载Resnet50的pth文件,再到码云官网中找到Ascend 开源仓库,并找到Resnet50_Pytorch_Infer项目,然后根据里面的教程进行模型转换
- 我们需要先将pth格式文件转换成onnx格式文件,为此我们需要使用Resnet50_Pytorch_Infer项目下的pth2onnx.py脚本文件。首先使用MindStudio建立如下图所示的运行配置,并点击运行(注意这里我们使用本地环境,须保证电脑有完整的Pytorch环境)
- 运行脚本文件可以得到转换后的文件,并把它放在项目文件夹中
- 为了进行onnx模型到om模型的转换,需要使用MindStudio转换工具以及华为的远程CANN环境(这里我们已经连接上了)。点击MindStudio中的Ascend选项,并选择Model Converter
- 由于动态Batch和动态分辨率不能同时使用,故而我们分别使用MindStudio转换成支持动态batch和动态分辨率的离线模型。首先转换成支持动态Batch的离线模型,我们在Model Converter中选择部署在服务器中的onnx格式文件,选择输出路径(我们选择在本项目下的model文件夹),在输出形状中将Batch大小改为-1,并在Dynamic Batch中进行档位的输入(我们的档位为1,2,4,8),完成后一直点击next直到最后点击finsh ,直到控制台打印转换成功则模型转换完成,此时我们可以发现在modelzoo文件下出现了我们转换成功的离线模型文件
- 同理,将onnx文件转换成支持动态分辨率的离线模型,操作步骤和步骤8中是相似的,只需将长度和宽度两个维度设置为-1,并在Dynamic Image Size中进行档位的输入(我们的档位为224,224;448,448),并等待转换的完成
- 上述操作完成后我们便得到了支持动态Batch/动态分辨率的离线模型
- 打开模型的结构图,我们可以看到om模型对比原始模型,从原来的一个输入变为了两个输入,新增的输入就是用于调节可变Batch/分辨率设置的输入
- 点击模型的输入,我们可以看到模型此时的最大输入为动态Batch/动态分辨率最大档位的输入;而在项目代码中数据预处理的函数处理后的单张图片分辨率为224x224。我们利用这个函数实现动态Batch/动态分辨率(选择档位224x224)的输入数据预处理。须知,对同一个模型,不能同时调用acl.mdl.set_dynamic_batch_size接口和acl.mdl.set_dynamic_hw_size接口。
- 对于动态Batch设置,我们使用的档位是8,故而我们需要先加载支持动态Batch的离线模型resnet50_dybatch.om。该离线模型有两个输入,我们需要为两个输入分配内存,但是支持动态Batch的输入内存不需要向其中放入数据;对于动态分辨率设置,我们使用的档位是224x224,同理先加载支持动态Batch的离线模型resnet50_dyhw.om。该离线模型有两个输入,需要为两个输入分配内存,但是支持动态分辨率地输入内存不需要向其中放入数据。动态Batch/动态分辨率的输入名为ascend_mbatch_shape_data,为此我们可以通过接口方法acl.mdl.get_input_index_by_name(输入固定名称ascend_mbatch_shape_data)获得该输入的index,从而避免往其中放入数据
- 之后调用acl.mdl.create_dataset接口创建aclmdlDataset类型的数据,并调用acl.mdl.add_dataset_buffer接口向aclmdlDataset类型的数据中增加aclDataBuffer类型的数据
- 在准备好输入和输出的数据结构之后,我们就可以对动态Batch/动态分辨率进行设置了,须知我们输入的档位必须是符合转换模型时设置的档位。对于动态Batch,我们调用acl.mdl.set_dynamic_batch_size接口设置动态Batch数;对于动态分辨率,我们调用acl.mdl.set_dynamic_hw_size接口设置动态分辨率。
这里我们需要注意设置动态batch和动态分辨率的操作必须在模型执行前进行,否则程序会报错。
- 在设置完动态Batch/动态分辨率之后,我们调用模型的函数对模型进行测试。输入两张动物的图片,并对图片进行分类,最后的分类结果如图所示;到此动态Batch/动态分辨率的设置就结束了。
- 最后总结,对于使用离线模型使用动态Batch/动态分辨率的整体流程如下图所示
详情请见昇腾社区https://www.hiascend.com/
版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除