Snapdragon Neural Processing Engine SDK(教程)

2023-05-16

SNPE提供以下高级API:

DL Container Loader: SNPE使用后缀为dlc的模型文件,提供了模型load函数;

Molde Vallidation: 检查输入模型与所选择的运行后端是否合法;

Runtime Engine: 选择运行模式的API, 包括CPU, GPU, DSP和AIP四种运行模式;

Partitioning Logic: 模型处理API, 包括检查网络layer的合法性, 调度网络的Runtime(例如让网络的一部分执行在特定的后端上: UDLs--用户自定义的layer,它只能运行在CPU runtime上, 在 CPU fallback 开启时, 可以让非UDLs部分运行在你选择的除CPU以外的后端上,而UDLs运行于CPU上,这种后端的切换会里带来一定开销);

CPU Runtime : CPU运行模型, 支持32-bit和 8-bit量化模型;

GPU Runtime: GPU运行模型, 支持混合或完整16位浮点模式;

DSP Runtime: Hexagon DSP运行模型, 使用Q6 和 hexagon NN, 在HVX上运行, 只支持8-bit量化模型;

AIP Runtime: Hexagon DSP运行模型, 使用Q6, Hexagon NN 和HTA, 只支持8-bit量化模型;

AIP Runtime

AIP模式是Q6,HVX和HTA的软件混合模式的整体抽象,当选择AIP模式运行时,该模型的一部分将在HTA上运行,而一部分在HVX上(由Q6协调),SNPE在DSP上加载一个库,该库与AIP运行时进行通信, 该DSP库包含一个执行器(用于管理HTA和HVX中的模型的执行, HTA上运行子网基于HTA驱动程序,HVX运行子网基于Hexagon NN)。执行器executor使用模型描述(model description)描述模型的哪些部分将在HTA上运行以及在HVX上运行, 这些划分的子部分称作子网络;DSP执行器在相应的内核上执行子网,并根据需要协调缓冲区交换和格式转换, 随时准备跟CPU上运行的子网络通讯。

SNPE的Runtime可以是CPU模式+其他模式的混合组合,或者单独使用一种Runtime; 在模型的转化(Conversion)时可以设定具体Runtime模式,对于AIP模式,可以选择完全运行在HTA上,或者一部分运行在HTA一部分运行在HNN, 这取决于网络的op是否都被HTA支持,如果部分支持,则只能选择后者; 两种方案的选择在模型转化时由SNPE自动完成;也可以手动分解网络,但太多的子网络会影响运行速度。

SNPE Setup

英文Setup教程地址:https://developer.qualcomm.com/docs/snpe/setup.html

本机环境:Ubuntu16.04, 64位;

Caffe: 按照教程指示的分支下载安装caffe,并配置pycaffe;

Tensorflow: 我这里没有使用照教程指定的版本(版本太旧报错),使用的tf-1.14,跟我模型训练TF版本一致;

ONNX: 使用的最新版本,使用pip下载即可;

Python3.5: 我使用的是3.5版本,并更改系统Python默认版本到Python-3.5;

Android NDK: 下载对应版本NDK, libc++_shared.so没有按照教程操作,因为指定文件目录下已经存在(这块不太理解);

Android SDK: 没下载;

SNPE SDK下载:https://developer.qualcomm.com/software/qualcomm-neural-processing-sdk

下载好后解压并按照指示检查环境,并设置环境变量,此外为了能够顺利的使用SNPE SDK的相关工具,需要添加环境变量:

export PYTHONPATH=$SNPE_ROOT/lib/python

Network Models

英文文档地址:https://developer.qualcomm.com/docs/snpe/usergroup1.html

1、支持的网络Layers;

2、支持的ONNX Ops;

3、量化 vs 不量化

CPU、GPU模式下:可以直接处理非量化模型,对于量化模型输入,需要反量化处理,增加了初始化时间,且影响精度;

DSP模式 :可直接处理量化模型,对于非量化模型输入,初始化时会进行量化处理,精度跟前者会不一样;

AIP模式 :只支持量化模型输入;

量化算法:

        a、量化后区间要涵盖所有输入数据;

        b、输入数据的值域大于0.01;

        c、输入数据0 需要精确的表示(要与量化区间中具体的数值对应);

       获取输入数据的最大最小值i_max, i_min,如果两者的差小于0.01,则更新最大值i_max为max(i_max, i_min + 0.01), 以8-bit量化为例,此时求得区间刻度step = (i_max - i_min) / 255, 此时计算(0 - i_min) / (i_max - i_min) * 255 是否为整数,若不是,将i_max, i_min同时移动n * step刻度;

       算法优化:一种方案是忽略异常的极端值,特别大或者特别小的值;另一种方案也是优化最大最小值的选择,具体怎么做的不知道,由于量化容易损失精度,所以量化的同时还引进了CLE(跨层均衡)和BC(偏置校正);CLE和BC通常同时使用,CLE 对网络结构有要求,一个输出不能被多个Op操作,也就是不能有分支结构,这几乎等于没啥用了就,同时不支持Relu6, 会自动将其转化为Relu,精度下降;CLE要求在转换为DLC之前,原始模型中必须存在BatchNorm(特指可检测到批量标准中beta / gamma数据)才能运行完整算法并重新获得最大的准确性。CLE速度很快,BC很慢,几分钟到几小时都有可能;

User-defined Operations(自定义OP)

英文教程链接:https://developer.qualcomm.com/docs/snpe/udo_overview.html

比较麻烦,需要配置UDO Package Description文件,指定输入输出的数据格式,运行后端等描述性信息;然后通过generator工具生成源文件,但是对于每个运行后端的具体执行函数需要自己编写(函数声明已经写好,只需把定义添上就行),然后编译生成对应与各种Runtime的.so库文件,在模型转换时候,可以添加UDO参数(--udo_config_paths),指定要使用的so文件;运行时也需要指定库文件,详细见教程;

Model Conversion(模型转换)

英文教程链接:https://developer.qualcomm.com/docs/snpe/usergroup3.html

根据教程使用命令行,运行/$SNPE_ROOT/bin/x86_64-linux-clang文件夹下的工具完成转化即可,详情见教程;

注意:对于Tensorflow,需要重新训练去掉网络中的关于is_training 状态的placeholder,并使用False替代,且最好将batch_size同时设置为1,方便后续的量化操作;

Quantizing a Model

英文教程链接:https://developer.qualcomm.com/docs/snpe/model_conversion.html

按照教程命令行运行即可,注意--enable_hta参数,大概率添加此参数后转换会失败(SUB, MUL, Reducation, Stride_Slice都不支持),但仍会生成dlc文件,但是不会包含运行在HTA上的子网络,因为--enable_hta参数默认会最大化HTA子网络,让网络的更多部分运行在HTA,这种情况下HTA与HVX同时工作,如果开启CPU Fallback,则AIP任何未处理的部分都可以回退到CPU处理;当然,你还可以手动选取HTA分区,详见教程;

参数--input_list image_file_list.txt中存储着与训练输入数据相同格式的二进制图像数据的地址,一行存储一张图;

图片转二进制:

from PIL import Image

import numpy as np

img = Image.open("path of image")

img = np.array(img)

img = img.astype(np.float32)

##也许需要一些处理,例如channel调整顺序、减去均值、除以方差等##

img.tofile("path/{}.raw".format("name of binary file"))

Input Image Formatting

SNPE对输入图像格式的要求是NHWC; 但是,推理过程中使用的通道顺序必须与训练过程中使用的通道顺序相同。例如,在Caffe中训练的Imagenet模型需要BGR的频道顺序。

Running Nets

英文教程链接:https://developer.qualcomm.com/docs/snpe/tutorial_inceptionv3.html (Tensorflow Inception V3)

按教程命令行运行即可,生成结果会保存到output文件夹下的.raw文件中,使用np.fromfile("file‘s path", dtype=np.float32)即可提取输出,根据网络输出格式进行解读即可;

注意:snpe-net-run时可能会显示无法连接到libSNPE.so, 添加环境变量即可:                                                                       

export LD_LIBRARY_PATH =$SNPE_ROOT/lib/x86_64-linux-clang/libSNPE.so

Build the Sample with C++

英文教材链接:https://developer.qualcomm.com/docs/snpe/cplus_plus_tutorial.html

简单的C++ 调用demo,如果涉及UDL, UDO则详见教程。

// 获取Runtime后端
zdl::DlSystem::Runtime_t checkRuntime()
{
    static zdl::DlSystem::Version_t Version = zdl::SNPE::SNPEFactory::getLibraryVersion();
    static zdl::DlSystem::Runtime_t Runtime;
    std::cout << "SNPE Version: " << Version.asString().c_str() << std::endl; 

    if (zdl::SNPE::SNPEFactory::isRuntimeAvailable(zdl::DlSystem::Runtime_t::GPU)) {
        Runtime = zdl::DlSystem::Runtime_t::GPU;
    } else {
        Runtime = zdl::DlSystem::Runtime_t::CPU;
    }
    return Runtime;
}

// 基于Runtime初始化SNPE
void initializeSNPE(zdl::DlSystem::Runtime_t runtime) {
  // 声明container指向导入的dlc模型
  std::unique_ptr<zdl::DlContainer::IDlContainer> container;
  // load
  container = zdl::DlContainer::IDlContainer::open("/path/to/model.dlc");
  // 实例化一个SNPE Builder
  zdl::SNPE::SNPEBuilder snpeBuilder(container.get());
  // 使用了ITensors模式
  snpe = snpeBuilder.setOutputLayers({})
                      .setRuntimeProcessor(runtime)
                      .setUseUserSuppliedBuffers(false)
                      .setPerformanceProfile(zdl::DlSystem::PerformanceProfile_t::HIGH_PERFORMANCE)
                      .build();
}

// 加载输入数据
std::unique_ptr<zdl::DlSystem::ITensor> loadInputTensor(std::unique_ptr<zdl::SNPE::SNPE> &snpe, std::vector<float> inputVec) {
  // 定义ITensors格式的input作为网络输入的容器
  std::unique_ptr<zdl::DlSystem::ITensor> input;
  // 获取网络输入name
  const auto &strList_opt = snpe->getInputTensorNames();
  if (!strList_opt) throw std::runtime_error("Error obtaining Input tensor names");
  const auto &strList = *strList_opt;
  
  const auto &inputDims_opt = snpe->getInputDimensions(strList.at(0));
  const auto &inputShape = *inputDims_opt;

  input = zdl::SNPE::SNPEFactory::getTensorFactory().createTensor(inputShape);
  std::copy(inputVec.begin(), inputVec.end(), input->begin());

  return input;
}

// 执行并返回输出ITensors
zdl::DlSystem::ITensor* executeNetwork(std::unique_ptr<zdl::SNPE::SNPE>& snpe,
                    std::unique_ptr<zdl::DlSystem::ITensor>& input) {
  static zdl::DlSystem::TensorMap outputTensorMap;
  snpe->execute(input.get(), outputTensorMap);
  zdl::DlSystem::StringList tensorNames = outputTensorMap.getTensorNames();

  const char* name = tensorNames.at(0);
  auto tensorPtr = outputTensorMap.getTensor(name);
  return tensorPtr;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Snapdragon Neural Processing Engine SDK(教程) 的相关文章

  • 警告:“SDK 版本问题”。 Xcode 10.1

    当使用 xcode 10 1 上传我的应用程序时 我收到警告 警告 ITMS 90725 SDK 版本问题 此应用程序是使用 iOS 12 0 SDK 构建的 从 2019 年 3 月开始 提交到 App Store 的所有 iOS 应用程
  • 以编程方式更改 iOS 锁定屏幕

    我正在构建一个应用程序 它必须能够在 iPhone 锁定屏幕上显示我自己的视图 我见过很多应用程序可以让你自定义锁屏等等 这些都是应用程序商店应用程序 所以我猜它一定是可能的 我只是不知道在 iOS SDK 中使用什么来尝试实现这个 哦 还
  • 为什么我的 GraphServiceClient 在每次 API 调用时都要重新进行身份验证?

    I am using Microsoft Graph API to call some endpoints I am using the SDK for C When opening a fiddler trace I found out
  • 如何在 Xcode 4.5 上安装 iOS 4.3 模拟器?

    我通过 App Store 安装了 Xcode 4 5 它支持 iOS 5 1 和 6 0 但不支持 iOS 4 3 也无法在首选项的 下载 选项卡中下载 我尝试从另一台计算机上抓取它并将其放在这台计算机上 因为多米尼克 波拉达描述 htt
  • Android SDK 安装:找不到 Java SE 开发工具包 (JDK) [重复]

    这个问题在这里已经有答案了 可能的重复 Android SDK安装找不到JDK https stackoverflow com questions 4382178 android sdk installation doesnt find j
  • 一台机器上可以有多个Java SDK吗?

    我的机器上可以安装多个 java SDK 版本吗 爪哇1 4 爪哇2 爪哇6 爪哇7 请告知 因为我必须在 Java 1 4 和 Java 2 中为 Maximo 开发解决方案 另外我想学习 Java 6 和 7 的开发 Thanks 我的
  • 如何使用 Twitter4j 检索超过 100 个结果

    我正在使用 Twitter4j 库来检索推文 但我得到的信息还不足以满足我的目的 目前 我从一页最多获取 100 个 如何在处理中的以下代码中实现 maxId 和sinceId 以便从 Twitter 搜索 API 检索超过 100 个结果
  • android-studio的sdk管理器中没有LLDB

    I am using android studio 3 6 3 in my Manjaro Linux I am trying to run c in android studio for that i need LLDB I reinst
  • 处理随机建筑绘图窗口问题

    我重新发布此内容是因为我第一次发布此内容时代码不正确 我已经把所有的事情都记下来了 看起来像这样 但它应该看起来像这样 任何帮助使窗户与建筑物对齐都会很棒 因为我对此很陌生 谢谢 int buildingHeights new int 12
  • Android sdk内容加载器错误[重复]

    这个问题在这里已经有答案了 我在用日食朱诺win 7 32位平台上的版本 一切都很顺利 直到今天当我启动 Eclipse 时 Android sdk 内容加载器不能超过 0 我尝试重新启动 Eclipse 我结束了 adb 进程并再次重新启
  • 创建自定义 ODBC 驱动程序

    在我目前的工作中 我们希望实现自己的 odbc 驱动程序 以允许许多不同的应用程序能够作为数据源连接到我们自己的应用程序 现在我们正在尝试权衡根据实施规范开发我们自己的驱动程序的选项 这是巨大的 or使用允许程序员 填充 数据特定部分并允许
  • iphone SDK:将图像从iphone上传到php服务器发送空文件?(内部示例代码链接)

    我尝试通过 PHP 将照片和 GPS 位置发送到服务器 这是 PHP 部分 从这里复制 http www w3schools com PHP php file upload asp保存上传的文件 上面的示例在服务器上的 PHP 临时文件夹中
  • 如何使用 Java 访问 Kinect?

    我目前正在学习计算机视觉课程 对于我的期末项目 我将制作一款与 Kinect 交互的小游戏 现在我想用 Java 制作这个游戏 因为我以前从未真正尝试过制作游戏 而且我对这种语言非常满意 但我似乎找不到一种方法来访问深度数据 我只需要将其打
  • iOS SDK Hue 飞利浦与 Swift

    我尝试在 Objective C 中为 Hue 导入 iOS SDK 我按照这里的说明进行操作 https github com PhilipsHue PhilipsHueSDK iOS OSX https github com Phili
  • 如何将Processing核心库与Maven一起使用?

    我想在我的 Maven 项目中使用处理库 但我找不到任何依赖项 我在哪里可以得到它 Edit 从处理 3 开始 官方文物 https mvnrepository com artifact org processing core发布到 Mav
  • 如何设置IntelliJ IDEA项目SDK

    我刚刚安装了 IntelliJ IDEA 当我尝试创建我的第一个项目时 它要求我设置项目 SDK 当我单击 JDK 时 它要求我选择 JDK 的主目录 如下图所示 我无法找到它在哪里 对于新项目 选择 jdk 的主目录 eg C Java
  • 安全移动 Microsoft SDK 文件夹

    我的硬盘上有一个文件夹 C Program Files Microsoft SDKs 我想知道将其移动到外部驱动器是否安全 Visual Studio 或任何其他工具是否依赖于此特定文件夹 注册表中有相当多的条目 至少在我的注册表中 指向该
  • 为什么在处理.org java pdf 导出时只显示一个框?

    下面是我的代码 在运行时它显示了我想要的多个框 但是当我尝试导出时 它只在该帧位置显示一个框 我尝试在特定帧生成输出 但它有同样的问题 import processing pdf int ofs 500 boolean record voi
  • Android studio 2.3 canary 在“SDK Manager”中缺少“Launch Standalone SDK Manager”选项

    我无意中接受了 android studio 的升级建议到 2 3 金丝雀 尽管我一直将其设置为检查开发者频道 而不是金丝雀 不知何故 它被切换了 现在 我的 SDK 管理器 窗口中不再有 启动独立 SDK 管理器 选项 我喜欢独立管理器有
  • 如何将我的应用程序的目标 API 级别从 23 更改为 26

    当我尝试将我的应用程序上传到 Google Play 控制台时遇到问题 API 级别必须为 26 而我的应用程序刚刚使用 23 版本开发 现在我不知道如何从 23 更改此 API 版本到 26 使其正常工作 请帮帮我 Steps Go to

随机推荐

  • 百度移动端面试回忆

    百度一面 xff1a 1 自我介绍 2 悲观锁和乐观锁 乐观锁 xff1a 总是认为不会产生并发问题 xff0c 每次去取数据的时候总认为不会有其他线程对数据进行修改 xff0c 因此不会上锁 xff0c 但是在更新时会判断其他线程在这之前
  • Quagga编译安装

    Quagga源码编译安装 1 Quagga下载 1 官网下载quagga 1 2 4 tar gz并拖入虚拟机桌面 2 解压到 opt目录下 sudo tar zxvf Desktop quagga 1 2 4 tar gz C opt 2
  • VINS-FUSION 源码 双目 单线程 按执行顺序阅读

    VINS FUSION 源码 双目 单线程 按执行顺序阅读 Keywords xff1a VINS FUSION vins 源码解读 源码梳理 vins数据结构 vinsfusion vins双目 双目vins 双目vinsfusion 双
  • 【C语言】__attribute__使用

    一 介绍 GNU C 的一大特色就是 attribute 机制attribute 可以设置函数属性 xff08 Function Attribute xff09 变量属性 xff08 Variable Attribute xff09 和类型
  • Ubuntu20.04下CUDA、cuDNN的详细安装与配置过程(图文)

    Ubuntu20 04下CUDA cuDNN的详细安装与配置过程 xff0c 亲测试可用 xff08 图文 xff09 一 NVIDIA xff08 英伟达 xff09 显卡驱动安装1 1 关闭系统自带驱动nouveau2 2 NVIDIA
  • 使用动量(Momentum)的SGD、使用Nesterov动量的SGD

    使用动量 Momentum 的SGD 使用Nesterov动量的SGD 参考 xff1a 使用动量 Momentum 的SGD 使用Nesterov动量的SGD 一 使用动量 Momentum 的随机梯度下降 虽然随机梯度下降是非常受欢迎的
  • Data Uncertainty Learning in Face Recognition

    Data Uncertainty Learning in Face Recognition 建模数据的不确定性对含噪音图像非常重要 xff0c 但对于人脸识别的研究却很少 先驱者的工作 35 通过将每个人脸图像嵌入建模为高斯分布来考虑不确定
  • ENAS代码解读

    ENAS代码解读 参考代码 xff1a https github com TDeVries enas pytorch 数据集 xff1a cifar10 main函数 xff1a span class token keyword def s
  • PC-DARTS Partial Channel Connections for Memory-Efficient Differentiable Architecture Search

    PC DARTS Partial Channel Connections for Memory Efficient Differentiable Architecture Search Abstract 可微体系结构搜索 xff08 DAR
  • deepsort代码解析

    DeepSort代码解析 项目地址 xff1a deepsort span class token keyword if span name span class token operator 61 61 span span class t
  • CBAM

    CBAM 我们提出了卷积块注意力模块 xff08 CBAM xff09 xff0c 这是一个简单而有效的前馈卷积神经网络的注意力模块 给定一个中间特征图 xff0c 我们的模块沿着通道和空间两个独立的维度依次推导注意力图 xff0c 然后将
  • onos2.0编译安装(npm install和 build问题解决)

    onos编译安装 Ubuntu16 04 1 前置下载安装 1 1 前置包安装 sudo apt get install git sudo apt get install python Oracle JDK8 sudo apt get in
  • iDLG Improved Deep Leakage from Gradients

    iDLG Improved Deep Leakage from Gradients 人们普遍认为 xff0c 在分布式学习系统中 xff0c 如协作学习和联合学习等 xff0c 共享梯度不会泄露私人训练数据 最近 xff0c Zhu等人 1
  • Improved Techniques for Training GANs

    Improved Techniques for Training GANs 在这项工作中 xff0c 我们介绍了几种旨在鼓励GANs游戏收敛的技术 这些技术的动机是对非收敛问题的启发式理解 它们导致了半监督学习效果的提高和样本生成的改进 我
  • CONTRASTIVE REPRESENTATION DISTILLATION

    CONTRASTIVE REPRESENTATION DISTILLATION 我们常常希望将表征性知识从一个神经网络转移到另一个神经网络 这方面的例子包括将一个大型网络提炼成一个较小的网络 xff0c 将知识从一种感觉模式转移到另一种感觉
  • torch.distributed.all_gather

    torch distributed all gather
  • Mosaicking to Distill Knowledge Distillation from Out-of-Domain Data

    Mosaicking to Distill Knowledge Distillation from Out of Domain Data 在本文中 xff0c 我们试图解决一项雄心勃勃的任务 xff0c 即域外知识蒸馏 xff08 OOD
  • python 23种常用模式设计总结

    python 23种常用模式设计总结
  • NormFace精简版

    NormFace
  • Snapdragon Neural Processing Engine SDK(教程)

    SNPE提供以下高级API DL Container Loader SNPE使用后缀为dlc的模型文件 xff0c 提供了模型load函数 xff1b Molde Vallidation 检查输入模型与所选择的运行后端是否合法 xff1b