Skip to content

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 芯片的绑定,技术选型更灵活,产品落地更快速。

支持情况

操作系统支持情况

LinuxAndroid
C++
Python
Java

AI框架支持情况

Qualcomm SNPEQualcomm QNNRKNNTFLiteONNX
AidLite for Linux🚧
AidLite for Android🚧

✅:已支持 🚧:计划支持

快速开始

AidLite 在底层整合了多种深度学习的推理框架,所以不管具体使用的是哪个深度学习框架的模型,其推理所需流程、所需 API 都是高度统一的。

开发者如果使用了阿加犀提供的开发板,则预装了 开发套件 AidLux SDK 并完成了授权激活,可以跳过安装步骤

安装

bash
sudo aid-pkg update
sudo aid-pkg install aidlite-sdk

# Install the latest version of AidLite (latest QNN version)
sudo aid-pkg install aidlite
bash
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安装
bash
# 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())"
bash
To be released

接口文档

开发流程图

开发流程说明

💡注意

以下代码仅用于展示主要开发流程,更多的接口和配置信息请详见 AidLite 接口文档

使用 AidLite SDK C++ 开发需要了解如下事项:

  • 编译时需要包含头文件,存放路径 /usr/local/include/aidlux/aidlite/aidlite.hpp
  • 链接时需要指定库文件,存放路径 /usr/local/lib/libaidlite.so
Python
# 获取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
C++
// 获取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;
}
Java
To be released

例子

💡注意

开发者可以访问 Model Farm 下载更多模型代码案例 (包括了前后处理) 。 关于Model Farm的使用文档请参考:Model Farm用户指南

使用 AidLite (QNN2.31) 在高通NPU上推理yolov5

AidLite 在Linux环境中预置了yolov5的例子,其路径位于/uer/local/share/aidlite/examples/,以下是例子运行方式:

Python

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
C++

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
Java
To be released