转换代码主要涉及三个步骤
- 生成网络结构
- 导入参数
- 调用export函数导出air
# generate net work network =get_network(args.backbone,args.num_classes)# load ckpt param_dict =load_checkpoint(model) param_dict_new ={} forkey,values inparam_dict.items(): ifkey.startswith('moments.'): continue elifkey.startswith('network.'): param_dict_new[key[8:]]=values else: param_dict_new[key]=values load_param_into_net(network,param_dict_new) network.set_train(False) args.logger.info('load model {} success'.format(model)) # export airinput=np.random.uniform(0.0,1.0,size=[1,3,224,224]).astype(np.float32) export(network,Tensor(input),file_name='resnext101-150-with-softmax.air',file_format='AIR') args.logger.info('export model resnext101-150-with-softmax.air success')
调用export一些函数输出warning
2021-01-10 18:45:44,901:INFO:load model /root/resnext101_neoming/resnext101/models/0-150_20018.ckpt success[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.245.840 [mindspore/ccsrc/transform/graph_ir/op_adapter_util.cc:216]ConvertAnyUtil]Unsupported value type: Float to convert to tensor. Value: Float16[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.260.231 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab34e133d0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.269.363 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab26bdb240 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.278.786 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab167465c0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.288.567 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab2a975b50 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.297.078 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab2aecb3f0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.305.033 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab1666c7f0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.313.385 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab166c8b70 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.321.404 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab16d7ac70 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.329.271 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab1661b730 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.337.110 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab064202f0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.344.787 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab18607ae0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.352.329 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab10c26400 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.359.826 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaaafad57460 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.367.515 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab630657d0 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.375.417 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab1128f200 64[WARNING]GE_ADPT(102257,python):2021-01-10-18:47:11.382.835 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149]ConvertMakeTuple]ConvertMakeTuple: 0xaaab18826440 64[WARNING]GE_ADPT(102257,pythn):2021-01-10-18:47:11.390.312 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab16e120a0 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.397.779 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab62739750 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.405.440 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab2b0b0d20 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.412.949 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab62411a30 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.420.941 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab1053f610 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.428.574 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab0dfd4ed0 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.436.026 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaaaf1b82020 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.443.479 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaaafd7ed2f0 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.450.909 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab07c64010 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.458.355 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab0df5c7e0 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.466.103 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab11431e20 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.473.541 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab60b9f530 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.481.745 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab061ae260 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.489.055 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab06c538e0 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.496.550 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab0e2eb050 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.503.977 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab1c6a8010 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:11.511.435 [mindspore/ccsrc/transform/graph_ir/convert.cc:1149] ConvertMakeTuple] ConvertMakeTuple: 0xaaab2cfd4ab0 64[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:12.321.757 [mindspore/ccsrc/transform/graph_ir/df_graph_manager.cc:69] AddGraph] The new graph {init_subgraph.air.0.1610275540685778176}'s pointer is null, add graph failed
[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:12.321.805 [mindspore/ccsrc/transform/graph_ir/df_graph_manager.cc:69] AddGraph] The new graph {broadcast_subgraph}'s pointer is null, add graph failed[WARNING] GE_ADPT(102257,python):2021-01-10-18:47:12.321.818 [mindspore/ccsrc/transform/graph_ir/df_graph_manager.cc:69] AddGraph] The new graph {save.air.0.1610275540685778176}'s pointer is null, add graph failed2021-01-10 18:47:14,438:INFO:export model resnext101-150-with-softmax.air success[WARNING] SESSION(102257,python):2021-01-10-18:49:00.530.199 [mindspore/ccsrc/backend/session/ascend_session.cc:945] SelectKernel] There are 2184 node/nodes used reduce precision to selected the kernel!
2.使用ATC命令将.air转换成.om
使用如下命令进行转换,成功运行
atc --framework=1 --model=resnext101-150-with-softmax.air --output=resnext101-150-with-softmax --input_format=NCHW --soc_version=Ascend310
ATC start working now, please wait for a moment.
ATC run success, welcome to the next use.
3.使用mindspore的ImageFolderDataset生成测试用的bin
使用与在线推理相同的数据预处理,调用numpy的tofile方法将图片导出到bin文件
"""
generate val dataset.
"""import osfrom mindspore.common import dtype as mstypeimport mindspore.dataset as deimport mindspore.dataset.transforms.c_transforms as Cimport mindspore.dataset.vision.c_transforms as V_Cfrom PIL import Image, ImageFilefrom src.utils.sampler import DistributedSamplerimport numpy as np
ImageFile.LOAD_TRUNCATED_IMAGES = Truedef evalBinDataset(data_dir, target_dir, image_size, rank, group_size,num_parallel_workers=None):
# Per process
mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]
std = [0.229 * 255, 0.224 * 255, 0.225 * 255]
transform_img = [
V_C.Decode(),
V_C.Resize((256, 256)),
V_C.CenterCrop(image_size),
V_C.Normalize(mean=mean, std=std),
V_C.HWC2CHW()
]
transform_label = [C.TypeCast(mstype.int32)]
# get val dataset
de_dataset = de.ImageFolderDataset(data_dir, num_parallel_workers=num_parallel_workers,
num_shards=group_size,shard_id=rank)
de_dataset = de_dataset.map(input_columns="image", num_parallel_workers=num_parallel_workers,
operations=transform_img)
de_dataset = de_dataset.map(input_columns="label", num_parallel_workers=num_parallel_workers,
operations=transform_label)
file_prefix = "ILSVRC2012_val_"
file_suffix = ".JPEG.bin"
index=1
for data in de_dataset.create_dict_iterator():
# generate file names
s = "{:08d}".format(index)
index += 1
bin_filename=target_dir+"/"+file_prefix+s+file_suffix
# get data from dataset
image = data['image'].asnumpy()
label = data['label']
print("[INFO] Image shape:", image.shape, ", Label:", label)
image.tofile(bin_filename)
return de_dataset
de_dataset = evalBinDataset('/data/dataset/ImageNet/imagenet_original/val', '/data/dataset/ImageNet/imagenet_bin/val_bin',image_size=[224,224],rank=0, group_size=1,num_parallel_workers=16)
4. 使用msame工具进行推理
#!/bin/bashom_path="/home/HwHiAiUser/AscendProjects/resnext101/models/resnext101-150-with-softmax.om"output_path="/home/HwHiAiUser/AscendProjects/resnext101/msname_output/folder_test"imgbin_path="/home/HwHiAiUser/data/imagenet_bin/val_bin/images"
./msame --model $om_path --input $imgbin_path --output $output_path
解答:
请注意该网络与offiical的resnext不同,输出是1000个类型为fp16的数,内存长度为2000字节。不知道msame工具是谁提供的、或用什么代码编出来的,如果你掌握了msame的代码,请将fp16转为float或double类型再进行精度校验。我从imagenet2012验证集里拿了10张鱼做本地推理,有9张推对了