Ascend 310 AI处理器上使用MindIR模型进行推理
Linux
Ascend
推理应用
初级
中级
高级
概述
Ascend 310是面向边缘场景的高能效高集成度AI处理器。Atlas 200开发者套件又称Atlas 200 Developer Kit(以下简称Atlas 200 DK),是以Atlas 200 AI加速模块为核心的开发者板形态的终端类产品,集成了海思Ascend 310 AI处理器,可以实现图像、视频等多种数据分析与推理计算,可广泛用于智能监控、机器人、无人机、视频服务器等场景。
本教程介绍如何在Atlas 200 DK上使用MindSpore执行推理,主要包括以下流程:
开发环境准备,包括制作Atlas 200 DK的SD卡 、配置Python环境和刷配套开发软件包。
导出MindIR模型文件,这里以ResNet-50模型为例。
编译推理代码,生成可执行
main
文件。加载保存的MindIR模型,执行推理并查看结果。
开发环境准备
导出MindIR模型文件
在Ascend 910的机器上训练好目标网络,并保存为CheckPoint文件,通过网络和CheckPoint文件导出对应的MindIR格式模型文件,导出流程参见导出MindIR格式文件。
这里提供使用ResNet-50模型导出的示例MindIR文件resnet50_imagenet.mindir。
推理目录结构介绍
创建目录放置推理代码工程,例如/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/acllib_linux.arm64/sample/acl_execute_model/ascend310_resnet50_preprocess_sample
,可以从官网示例下载样例代码,model
目录用于存放上述导出的MindIR
模型文件,test_data
目录用于存放待分类的图片,推理代码工程目录结构如下:
└─ascend310_resnet50_preprocess_sample
├── CMakeLists.txt // 构建脚本
├── README.md // 使用说明
├── main.cc // 主函数
├── model
│ └── resnet50_imagenet.mindir // MindIR模型文件
└── test_data
├── ILSVRC2012_val_00002138.JPEG // 输入样本图片1
├── ILSVRC2012_val_00003014.JPEG // 输入样本图片2
├── ... // 输入样本图片n
推理代码介绍
环境初始化,指定硬件为Ascend 310,DeviceID为0:
ms::GlobalContext::SetGlobalDeviceTarget(ms::kDeviceTypeAscend310);
ms::GlobalContext::SetGlobalDeviceID(0);
加载模型文件:
// Load MindIR model
auto graph =ms::Serialization::LoadModel(resnet_file, ms::ModelType::kMindIR);
// Build model with graph object
ms::Model resnet50((ms::GraphCell(graph)));
ms::Status ret = resnet50.Build({});
获取模型所需输入信息:
std::vector<ms::MSTensor> model_inputs = resnet50.GetInputs();
加载图片文件:
// Readfile is a function to read images
ms::MSTensor ReadFile(const std::string &file);
auto image = ReadFile(image_file);
图片预处理:
// Create the CPU operator provided by MindData to get the function object
ms::dataset::Execute preprocessor({ms::dataset::vision::Decode(), // Decode the input to RGB format
ms::dataset::vision::Resize({256}), // Resize the image to the given size
ms::dataset::vision::Normalize({0.485 * 255, 0.456 * 255, 0.406 * 255},
{0.229 * 255, 0.224 * 255, 0.225 * 255}), // Normalize the input
ms::dataset::vision::CenterCrop({224, 224}), // Crop the input image at the center
ms::dataset::vision::HWC2CHW(), // shape (H, W, C) to shape(C, H, W)
});
// Call the function object to get the processed image
ret = preprocessor(image, &image);
执行推理:
// Create outputs vector
std::vector<ms::MSTensor> outputs;
// Create inputs vector
std::vector<ms::MSTensor> inputs;
inputs.emplace_back(model_inputs[0].Name(), model_inputs[0].DataType(), model_inputs[0].Shape(),
image.Data().get(), image.DataSize());
// Call the Predict function of Model for inference
ret = resnet50.Predict(inputs, &outputs);
获取推理结果:
// Output the maximum probability to the screen
std::cout << "Image: " << image_file << " infer result: " << GetMax(outputs[0]) << std::endl;
构建脚本介绍
构建脚本用于构建用户程序,样例来自于:https://gitee.com/mindspore/docs/blob/r1.1/tutorials/tutorial_code/ascend310_resnet50_preprocess_sample/CMakeLists.txt 。
由于MindSpore使用旧版的C++ ABI,因此用户程序需与MindSpore一致,否则编译链接会失败。
add_compile_definitions(_GLIBCXX_USE_CXX11_ABI=0)
set(CMAKE_CXX_STANDARD 17)
为编译器添加头文件搜索路径:
option(MINDSPORE_PATH "mindspore install path" "")
include_directories(${MINDSPORE_PATH})
include_directories(${MINDSPORE_PATH}/include)
在MindSpore中查找所需动态库:
find_library(MS_LIB libmindspore.so ${MINDSPORE_PATH}/lib)
file(GLOB_RECURSE MD_LIB ${MINDSPORE_PATH}/_c_dataengine*)
使用指定的源文件生成目标可执行文件,并为目标文件链接MindSpore库:
add_executable(resnet50_sample main.cc)
target_link_libraries(resnet50_sample ${MS_LIB} ${MD_LIB})
编译推理代码
进入工程目录ascend310_resnet50_preprocess_sample
,设置如下环境变量:
# control log level. 0-DEBUG, 1-INFO, 2-WARNING, 3-ERROR, default level is WARNING.
export GLOG_v=2
# Conda environmental options
LOCAL_ASCEND=/usr/local/Ascend # the root directory of run package
# lib libraries that the run package depends on
export LD_LIBRARY_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/acllib/lib64:${LOCAL_ASCEND}/ascend-toolkit/latest/atc/lib64:${LOCAL_ASCEND}/driver/lib64:${LOCAL_ASCEND}/opp/op_impl/built-in/ai_core/tbe/op_tiling:${LD_LIBRARY_PATH}
# lib libraries that the mindspore depends on, modify "pip3" according to the actual situation
export LD_LIBRARY_PATH=`pip3 show mindspore-ascend | grep Location | awk '{print $2"/mindspore/lib"}' | xargs realpath`:${LD_LIBRARY_PATH}
# Environment variables that must be configured
export TBE_IMPL_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe # TBE operator implementation tool path
export ASCEND_OPP_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp # OPP path
export PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/atc/ccec_compiler/bin/:${PATH} # TBE operator compilation tool path
export PYTHONPATH=${TBE_IMPL_PATH}:${PYTHONPATH} # Python library that TBE implementation depends on
执行cmake
命令,其中pip3
需要按照实际情况修改:
cmake . -DMINDSPORE_PATH=`pip3 show mindspore-ascend | grep Location | awk '{print $2"/mindspore"}' | xargs realpath`
再执行make
命令编译即可。
make
编译完成后,在ascend310_resnet50_preprocess_sample
下会生成可执行main
文件。
执行推理并查看结果
登录Atlas 200 DK开发者板环境,创建model
目录放置MindIR文件resnet50_imagenet.mindir
,例如/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/acllib_linux.arm64/sample/acl_execute_model/ascend310_resnet50_preprocess_sample/model
。
创建test_data
目录放置图片,例如/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/acllib_linux.arm64/sample/acl_execute_model/ascend310_resnet50_preprocess_sample/test_data
。
就可以开始执行推理了:
./resnet50_sample
执行后,会对test_data
目录下放置的所有图片进行推理,比如放置了9张ImageNet2012验证集中label为0的图片,可以看到推理结果如下。
Image: ./test_data/ILSVRC2012_val_00002138.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00003014.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00006697.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00007197.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00009111.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00009191.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00009346.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00009379.JPEG infer result: 0
Image: ./test_data/ILSVRC2012_val_00009396.JPEG infer result: 0