AidLite SDK
简介
AidLite SDK是阿加犀推出的的AI执行框架,旨在充分调度端侧芯片的各计算单元 (CPU、GPU、NPU) 实现AI模型的加速推理。
AidlLite 跨平台统一了 AI 推理中间件,针对不同 AI 框架和不同 AI 芯片的调用进行了抽象,形成统一 API,可实现模型推理实现的解耦合。
- 兼容主流开源 AI 框架。
- 兼容主流 AI 芯片厂商专属框架 (SNPE、RKNN 等) ,支持厂商专属硬件(NPU)调用。
其特性如下图所示:
AidLite 高度统一的 API 抽象,兼容了不同框架模型及 AI 芯片的调用,让开发人员只需进行一次开发,即可任意更换不同格式的模型或在不同厂商 AI 芯片实现迁移。大大减少了开发者的学习成本,平台迁移难度和成本。摆脱了对特定 AI 框架或者 AI 芯片的绑定,技术选型更灵活,产品落地更快速。
支持情况
操作系统支持情况
Linux | Android | |
---|---|---|
C++ | ✅ | / |
Python | ✅ | / |
Java | / | ✅ |
AI框架支持情况
Qualcomm SNPE | Qualcomm QNN | RKNN | TFLite | ONNX | |
---|---|---|---|---|---|
AidLite for Linux | ✅ | ✅ | ✅ | ✅ | 🚧 |
AidLite for Android | ✅ | ✅ | ✅ | ✅ | 🚧 |
✅:已支持 🚧:计划支持
快速开始
AidLite 在底层整合了多种深度学习的推理框架,所以不管具体使用的是哪个深度学习框架的模型,其推理所需流程、所需 API 都是高度统一的。
开发者如果使用了阿加犀提供的开发板,则预装了 开发套件 AidLux SDK 并完成了授权激活,可以跳过安装步骤。
安装
sudo aid-pkg update
sudo aid-pkg install aidlite-sdk
# Install the latest version of AidLite (latest QNN version)
sudo aid-pkg install aidlite
To be released
💡注意
Linux环境下,安装指定QNN版本的AidLite SDK:sudo aid-pkg install aidlite-{QNN Version}
例如:安装QNN2.16版本的AidLite SDK —— sudo aid-pkg install aidlite-qnn216
- 验证AidLite安装
# aidlite sdk c++ check
python3 -c "import aidlite; print(aidlite.get_library_version())"
# aidlite sdk python check
python3 -c "import aidlite; print(aidlite.get_py_library_version())"
To be released
接口文档
开发流程图
开发流程说明
💡注意
以下代码仅用于展示主要开发流程,更多的接口和配置信息请详见 AidLite 接口文档
使用 AidLite SDK C++ 开发需要了解如下事项:
- 编译时需要包含头文件,存放路径
/usr/local/include/aidlux/aidlite/aidlite.hpp
- 链接时需要指定库文件,存放路径
/usr/local/lib/libaidlite.so
# 获取SDK版本信息,设置日志相关事项
print(f"Aidlite library version : {aidlite.get_library_version()}")
print(f"Aidlite Python library version : {aidlite.get_py_library_version()}")
# aidlite.set_log_level(aidlite.LogLevel.INFO)
# aidlite.log_to_stderr()
# aidlite.log_to_file("./fast_SNPE_inceptionv3_")
# 创建Model实例对象,并设置模型相关参数
model = aidlite.Model.create_instance(model_path)
if model is None:
print("Create model failed !")
return False
input_shapes = [[1,320,320,3]]
output_shapes = [[1,10,10,255],[1,20,20,255],[1,40,40,255]]
model.set_model_properties(input_shapes, aidlite.DataType.TYPE_FLOAT32, output_shapes, aidlite.DataType.TYPE_FLOAT32)
# 创建Config实例对象,并设置配置信息
config = aidlite.Config.create_instance()
if config is None:
print("build_interpretper_from_model_and_config failed !")
return False
config.framework_type = aidlite.FrameworkType.TYPE_SNPE
config.accelerate_type = aidlite.AccelerateType.TYPE_DSP
config.is_quantify_model = 1
config.snpe_out_names = ["InceptionV3/Predictions/Softmax"]
# 创建推理解释器对象
fast_interpreter = aidlite.InterpreterBuilder.build_interpretper_from_model_and_config(model, config)
if fast_interpreter is None:
print("build_interpretper_from_model_and_config failed !")
return None
# 完成解释器初始化
result = fast_interpreter.init()
if result != 0:
print(f"interpreter init failed !")
return False
# 加载模型
result = fast_interpreter.load_model()
if result != 0:
print("interpreter load model failed !")
return False
# 完整的推理代码示例:一般包括三部分:前处理 + 推理 + 后处理
# 对于不同的模型,对应不同的前处理操作
input_tensor_data = preprocess()
# 设置推理所需的输入数据
result = fast_interpreter.set_input_tensor(0, input_tensor_data)
if result != 0:
print("interpreter set_input_tensor() failed")
return False
# 完成推理操作
result = fast_interpreter.invoke()
if result != 0:
print("interpreter set_input_tensor() failed")
return False
# 获取模型此次推理的结果数据
out_data = fast_interpreter.get_output_tensor(0)
if out_data is None:
print("sample : interpreter->get_output_tensor() 0 failed !")
return False
# 对于不同的模型,对应不同的后处理操作
result = postprocess(out_data)
# 完成解释器资源释放操作
result = fast_interpreter.destory()
if result != 0:
print("interpreter destory() failed !")
return False
// 获取SDK版本信息,设置日志相关事项
printf("Aidlite library version : %s\n", Aidlux::Aidlite::get_library_version().c_str());
// Aidlux::Aidlite::set_log_level(Aidlux::Aidlite::LogLevel::INFO);
// Aidlux::Aidlite::log_to_stderr();
// Aidlux::Aidlite::log_to_file("./fast_snpe_inceptionv3_");
// 创建Model实例对象,并设置模型相关参数
Model* model = Model::create_instance("./inceptionv3_float32.dlc");
if(model == nullptr){
printf("Create model failed !\n");
return EXIT_FAILURE;
}
std::vector<std::vector<uint32_t>> input_shapes = {{1,299,299,3}};
std::vector<std::vector<uint32_t>> output_shapes = {{1,1001}};
model->set_model_properties(input_shapes, DataType::TYPE_FLOAT32,
output_shapes, DataType::TYPE_FLOAT32);
// 创建Config实例对象,并设置配置信息
Config* config = Config::create_instance();
if(config == nullptr){
printf("Create config failed !\n");
return EXIT_FAILURE;
}
config->framework_type = FrameworkType::TYPE_SNPE;
config->accelerate_type = AccelerateType::TYPE_CPU;
// config->is_quantify_model = 0;
config->snpe_out_names.push_back("InceptionV3/Predictions/Softmax");
// 创建推理解释器对象
std::unique_ptr<Interpreter>&& fast_interpreter =
InterpreterBuilder::build_interpretper_from_model_and_config(model, config);
if(fast_interpreter == nullptr){
printf("build_interpretper_from_model_and_config failed !\n");
return EXIT_FAILURE;
}
// 完成解释器初始化
int result = fast_interpreter->init();
if(result != EXIT_SUCCESS){
printf("sample : interpreter->init() failed !\n");
return EXIT_FAILURE;
}
// 加载模型
fast_interpreter->load_model();
if(result != EXIT_SUCCESS){
printf("sample : interpreter->load_model() failed !\n");
return EXIT_FAILURE;
}
//完整的推理代码示例:一般包括三部分:前处理 + 推理 + 后处理
{
// 对于不同的模型,对应不同的前处理操作
void* input_tensor_data = preprocess();
// 设置推理所需的输入数据
result = fast_interpreter->set_input_tensor(0,input_tensor_data);
if(result != EXIT_SUCCESS){
printf("sample : interpreter->set_input_tensor() failed !\n");
return EXIT_FAILURE;
}
// 完成推理操作
result = fast_interpreter->invoke();
if(result != EXIT_SUCCESS){
printf("sample : interpreter->invoke() failed !\n");
return EXIT_FAILURE;
}
// 获取模型此次推理的结果数据
float* out_data = nullptr;
uint32_t output_tensor_length = 0;
result = fast_interpreter->get_output_tensor(0, (void**)&out_data, &output_tensor_length);
if(result != EXIT_SUCCESS){
printf("sample : interpreter->get_output_tensor() failed !\n");
return EXIT_FAILURE;
}
// 对于不同的模型,对应不同的后处理操作
int32_t result = postprocess(out_data);
}
// 完成解释器资源释放操作
result = fast_interpreter->destory();
if(result != EXIT_SUCCESS){
printf("interpreter->destory() failed !\n");
return EXIT_FAILURE;
}
To be released
例子
💡注意
开发者可以访问 Model Farm 下载更多模型代码案例 (包括了前后处理) 。 关于Model Farm的使用文档请参考:Model Farm用户指南
使用 AidLite (QNN2.31) 在高通NPU上推理yolov5
AidLite 在Linux环境中预置了yolov5的例子,其路径位于/uer/local/share/aidlite/examples/
,以下是例子运行方式:
mkdir -p /home/aidlux/aidlite_demo/
cp -r /uer/local/share/aidlite/examples/ /home/aidlux/aidlite_demo/
cd /home/aidlux/aidlite_demo/aidlite_qnn231/python
python qnn_yolov5_multi.py
sudo apt update
sudo apt-get install cmake -y
mkdir -p /home/aidlux/aidlite_demo/
cp -r /uer/local/share/aidlite/examples/ /home/aidlux/aidlite_demo/
cd /home/aidlux/aidlite_demo/aidlite_qnn231/cpp
mkdir -p build && cd build
cmake ..
make
/xxx.exe
To be released