Qualcomm AI Hub-示例(三)模型推理

文章介绍

Qualcomm® AI Hub提供了部署在云端边缘物理设备执行模型推理的任务,让你能够快速的评估在真实硬件上模型推理的精度和性能。本文介绍了如何使用AI Hub提供的接口在云端设备执行推理,更多详情可以参阅 Running Inference

模型推理

      出于功耗和性能的考虑,部署到边缘物理设备是量化后的模型。比如,原始模型是PyTorch实现以float32精度运行推理时,单目标硬件可能使用float16甚至int8运行计算。这些差异可能导致结果数值差异,所以在部署之前需要在真实的环境中对比评估数值的差异是否能够满足到需求。

      AI Hub提供云端真实硬件去运行推理和并且输出报告。通过报告和原始模型的实现进行比较,您可以确定优化的模型是否按预期工作。需要注意,如果原始模型为PyTorch和ONNX的,必须使用submit_compile_job()接口完成编译模型

使用TensorFlow Lite模型运行推理

此示例使用TensorFlow Lite模型 SqueezeNet10.tflite来运行推理。

import numpy as np

import qai_hub as hub

sample = np.random.random((1, 224, 224, 3)).astype(np.float32)

inference_job = hub.submit_inference_job(

    model="SqueezeNet10.tflite",

    device=hub.Device("Samsung Galaxy S23 Ultra"),

    inputs=dict(x=[sample]),

)

assert isinstance(inference_job, hub.InferenceJob)

inference_job.download_output_data()

  • 推理的输入必须是dict,其中键是特征的名称,值是张量。张量可以是numpy数组的列表,如果是单个数据点,则可以是单个numpy数组。
  • inference_job是InferenceJob的一个实例。

通过向submit_inference_job() API提供device列表,可以同时启动多个推理任务。

使用QNN模型库运行推理

此示例将TorchScript模型(mobilenet_v2.pt)编译为QNN模型库格式。然后在具有编译的目标模型的设备上运行推理。

import numpy as np

import qai_hub as hub

sample = np.random.random((1, 3, 224, 224)).astype(np.float32)

compile_job = hub.submit_compile_job(

    model="mobilenet_v2.pt",

    device=hub.Device("Samsung Galaxy S23"),

    options="--target_runtime qnn_lib_aarch64_android",

    input_specs=dict(image=(1, 3, 224, 224)),

)

assert isinstance(compile_job, hub.CompileJob)

inference_job = hub.submit_inference_job(

    model=compile_job.get_target_model(),

    device=hub.Device("Samsung Galaxy S23 Ultra"),

    inputs=dict(image=[sample]),

)

assert isinstance(inference_job, hub.InferenceJob)

使用推理任务验证设备上的模型准确性

此示例演示如何在设备上验证QNN模型库模型的数值。

重用评测示例中的模型(mobilenet_v2.pt)

from typing import Dict, List

import torch

import qai_hub as hub

device_s23 = hub.Device(name="Samsung Galaxy S23 Ultra")

compile_job = hub.submit_compile_job(

    model="mobilenet_v2.pt",

    device=device_s23,

    input_specs={"x": (1, 3, 224, 224)},

    options="--target_runtime qnn_lib_aarch64_android",

)

assert isinstance(compile_job, hub.CompileJob)

on_device_model = compile_job.get_target_model()

我们可以使用这个优化的.so模型,并在特定设备上使用输入数据进行推理。本例中使用的输入图像可以下载- input_image1.jpg。

import numpy as np

from PIL import Image

# Convert the image to numpy array of shape [1, 3, 224, 224]

image = Image.open("input_image1.jpg").resize((224, 224))

img_array = np.array(image, dtype=np.float32)

# Ensure correct layout (NCHW) and re-scale

input_array = np.expand_dims(np.transpose(img_array / 255.0, (2, 0, 1)), axis=0)

# Run inference using the on-device model on the input image

inference_job = hub.submit_inference_job(

    model=on_device_model,

    device=device_s23,

    inputs=dict(x=[input_array]),

)

assert isinstance(inference_job, hub.InferenceJob)

我们可以在设备上使用这个原始输出来生成类预测,并将其与参考实现进行比较。为此,您需要imagenet类-imagenet_classes.txt。

# Get the on-device output

on_device_output: Dict[str, List[np.ndarray]] = inference_job.download_output_data()  # type: ignore

# Load the torch model and perform inference

torch_model = torch.jit.load("mobilenet_v2.pt")

torch_model.eval()

# Calculate probabilities for torch model

torch_input = torch.from_numpy(input_array)

torch_output = torch_model(torch_input)

torch_probabilities = torch.nn.functional.softmax(torch_output[0], dim=0)

# Calculate probabilities for the on-device output

output_name = list(on_device_output.keys())[0]

out = on_device_output[output_name][0]

on_device_probabilities = np.exp(out) / np.sum(np.exp(out), axis=1)

# Read the class labels for imagenet

with open("imagenet_classes.txt", "r") as f:

categories = [s.strip() for s in f.readlines()]

# Print top five predictions for the on-device model

print("Top-5 On-Device predictions:")

top5_classes = np.argsort(on_device_probabilities[0], axis=0)[-5:]

for c in reversed(top5_classes):

    print(f"{c} {categories[c]:20s} {on_device_probabilities[0][c]:>6.1%}")

# Print top five prediction for torch model

print("Top-5 PyTorch predictions:")

top5_prob, top5_catid = torch.topk(torch_probabilities, 5)

for i in range(top5_prob.size(0)):

    print(

        f"{top5_catid[i]:4d} {categories[top5_catid[i]]:20s} {top5_prob[i].item():>6.1%}"

)

上面的代码生成的结果如下所示:

Top-5 On-Device predictions:

968 cup                   71.3%

504 coffee mug            16.4%

967 espresso               7.8%

809 soup bowl              1.3%

659 mixing bowl            1.2%

Top-5 PyTorch predictions:

968 cup                   71.4%

504 coffee mug            16.1%

967 espresso               8.0%

809 soup bowl              1.4%

659 mixing bowl            1.2%

设备上的结果几乎等同于参考实现。这告诉我们,该模型精度没有倒退,并使我们相信,一旦部署,它将按预期运行。

为了增强这种信心,可以考虑将其扩展到几个图像,并使用定量总结,例如测量KL散度或比较准确性(如果标签已知)。这也使您更容易在目标设备上进行验证。

使用先前上传的数据集和模型运行推理

与模型类似,AI Hub公开了一个API,允许用户上传可重复使用的数据。

import numpy as np

import qai_hub as hub

data = dict(

    x=[

        np.random.random((1, 224, 224, 3)).astype(np.float32),

        np.random.random((1, 224, 224, 3)).astype(np.float32),

    ]

)

hub_dataset = hub.upload_dataset(data)

现在,您可以使用上载的数据集运行推理作业。此示例使用SqueezeNet10.tflite。

# Submit job

job = hub.submit_inference_job(

    model="SqueezeNet10.tflite",

    device=hub.Device("Samsung Galaxy S23 Ultra"),

    inputs=hub_dataset,

)

作者:高通工程师,戴忠忠(Zhongzhong Dai)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/474076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rust Rocket简单入门

简介 Rust中最知名的两个web框架要数Rocket和Actix了,Rocket更注重易用性,Actix则更注重性能。这里只是了解一下Rust下的WebAPI开发流程,就学一下最简单的 Rocket。 Rocket 是一个用于 Rust 的异步 Web 框架,专注于可用性、安全性…

FreeRTOS教程9 软件定时器

目录 1、准备材料 2、学习目标 3、前提知识 3.1、软件定时器回调函数 3.2、软件定时器属性和状态 3.2.1、周期 3.2.2、分类 3.2.3、状态 3.3、软件定时器运行原理 3.3.1、RTOS 守护进程任务 3.3.2、定时器命令队列 3.3.3、守护进程任务调度 3.4、创建、启动软件定…

Web框架开发-Django模型层(数据库操作)

一、ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动ORM是“对象-关系-映…

ubuntu20.04安装Pycharm

下载pycharm安装包 https://www.jetbrains.com/pycharm/download/#sectionlinux 使用社区版点击download 下载好的pycharm如图所示,右键解压: 打开终端,输入cd命令,进入刚刚解压文件夹下的bin文件夹,命令行是cd 文…

手撕算法-二叉搜索树与双向链表

牛客BM30。 描述:https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId295&tqId23253&ru/exam/oj&qru/ta/format-top101/question-ranking&sourceUrl%2Fexam%2Foj分析:二叉搜索树的中序遍历是递增序列。可以利用…

【AI工具】文字/图片生产3D模型-MVEdit 3D Toolbox

MVEdit 是一款无需培训的 3D 适配器,可 使用现成的 2D 稳定扩散模型进行 3D 生成/编辑 定位:一款功能强大的 3D 工具箱,可通过文本和图像创建和生成 3D 模型,具有可视化 UI 操作。 功能介绍: 能够从多视角图像生成高质量纹理网格,通过 3D 适配器实现出色的 3D 一致性。…

JAVA每日面经——并发编程(一)必看

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、并发编程之AQS二、并发编程之CAS…

广东省30m二级分类土地利用数据(矢量)

广东省,地处中国大陆最南部,属于东亚季风区,从北向南分别为中亚热带、南亚热带和热带气候,是中国光、热和水资源最丰富的地区之一。主要河系为珠江的西江、东江、北江和三角洲水系以及韩江水系。广东省面积为17.977万平方公里&…

【python + Django】Django模板语法 + 请求和响应

前言: 现在现在,我们要开始将变量的值展现在页面上面啦! 要是只会显示静态页面,我们的页面也太难看和死板了, 并且数据库的数据也没法展现在页面上。 但是呢,模板语法学习之后就可以啦!&…

Halcon 3D 平面拟合(区域采样、Z值过滤、平面拟合、平面移动)

Halcon 3D 平面拟合(区域采样、Z值过滤、平面拟合、平面移动) 链接:https://pan.baidu.com/s/1UfFyZ6y-EFq9jy0T_DTJGA 提取码:ewdi * 1.读取图片 ****************

政安晨:【深度学习实践】【使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络】(二)—— 深度神经网络

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 概述 深度神经网络(Deep Neural Network&…

24北京教资认定明日开始,请提前准备证件照

24北京教资认定明日开始,请提前准备证件照哦!

KEY ENERGY欧洲意大利能源光伏储能展

3月1号第18届意大利里米尼国际可再生能源展(KEY ENERGY)由知名主办方ITALIAN EXHIBITION GROUP S.P.A组织举办,每年一届,是欧洲第二大能源展,也是覆盖范围最全知名度最高的可再生能源展览会。 该展会将于2024扩大规模…

EL表达式

一、什么是EL EL(Expression Language)表达式语言 由两个开发团队共同开发 JSP 标准标签库专家组 JSP 2.0 专家组 EL表达式语言的语法 ${Expression} JSP EL 表达式用于以下情形 在JSP页面中输出静态内容 为标准标签和自定义标签提供属性值 二、作用&am…

排序算法之选择排序介绍

目录 算法简介 算法描述 代码实现 算法简介 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素…

解析服务器出现大量 TIME_WAIT 和 CLOSE_WAIT 状态的原因及排查方法

服务器出现大量 TIME_WAIT 状态的原因有哪些? 首先要知道 TIME_WAIT 状态是主动关闭连接方才会出现的状态(别陷入一个误区不是只有客户端才能主动关闭连接的),所以如果服务器出现大量的 TIME_WAIT 状态的 TCP 连接,就是…

MongoDB系列之查询计划

概述 一个查询具体如何被执行的过程,称为查询计划。MongoDB采用自底向上的方式来构造查询计划,每一个查询计划(query plan)都会被分解为若干个有层次的阶段(stage)。整个查询计划最终会呈现出一颗多叉树。…

3个Tips,用“AI”开启新生活

相信最近,很多朋友们都回归到了忙碌的生活节奏中。生活模式的切换,或多或少会带来身体或情绪状况的起伏。新技术正在为人们生活的方方面面带来便利。3个小Tips或许能让你也从新技术中获益,从身到心,用“AI”开启新生活。 关”A…

【机器学习】基于正余弦搜索算法优化的BP神经网络分类预测(SCA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】正余弦优化算法(SCA)原理及实现 2.设计与实现 数据集: 多输入多输出:样本特征24,标签类…

基于深度学习的面部情绪识别算法仿真与分析

声明:以下内容均属于本人本科论文内容,禁止盗用,否则将追究相关责任 基于深度学习的面部情绪识别算法仿真与分析 摘要结果分析1、本次设计通过网络爬虫技术获取了七种面部情绪图片:吃惊、恐惧、厌恶、高兴、伤心、愤怒、自然各若…