Qualcomm AI Hub-示例(二)模型性能分析

2024-03-22 02:28

本文主要是介绍Qualcomm AI Hub-示例(二)模型性能分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章介绍

模型性能分析(Profiling)

当模型尝试部署到设备时,会面临许多重要问题:

  • 目标硬件的推理延迟是多少?
  • 该模型是否符合一定的内存预算?
  • 模型能够利用神经处理单元吗?

通过在云端的物理设备运行模型完成性能分析,能够解答这些疑问。

编译模型

Qualcomm AI Hub支持分析已编译好的模型。在本例中,我们优化并评测了先前使用submit_compile_job()编译的模型。请注意,我们是如何利用compile_job使用get_target_model()的方法编译的模型。

import qai_hub as hub

# Profile the previously compiled model

profile_job = hub.submit_profile_job(

    model=compile_job.get_target_model(),

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

)

assert isinstance(profile_job, hub.ProfileJob)

返回值是ProfileJob的一个实例。要查看所有任务的列表,请转到/jobs/。

分析PyTorch模型性能

此示例需要PyTorch,可以按如下方式进行安装。

pip3 install "qai-hub[torch]"

在本例中,我们使用Qualcomm AI Hub优化和评测PyTorch模型。

from typing import List, Tuple

import torch

import qai_hub as hub

class SimpleNet(torch.nn.Module):

    def __init__(self):

        super().__init__()

        self.linear = torch.nn.Linear(5, 2)

    def forward(self, x):

        return self.linear(x)

input_shapes: List[Tuple[int, ...]] = [(3, 5)]

torch_model = SimpleNet()

# Trace the model using random inputs

torch_inputs = tuple(torch.randn(shape) for shape in input_shapes)

pt_model = torch.jit.trace(torch_model, torch_inputs)

# Submit compile job

compile_job = hub.submit_compile_job(

    model=pt_model,

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

    input_specs=dict(x=input_shapes[0]),

)

assert isinstance(compile_job, hub.CompileJob)

# Submit profile job using results form compile job

profile_job = hub.submit_profile_job(

    model=compile_job.get_target_model(),

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

)

assert isinstance(profile_job, hub.ProfileJob)

有关上传、编译和提交任务时选项的更多信息,请参考upload_model(), submit_compile_job() 和submit_profile_job().

分析TorchScript模型性能

如果您已经保存了traced或脚本化的torch模型(使用torch.jit.save保存),则可以直接提交。我们将以mobilenet_v2.pt为例。与前面的示例类似,只有在将TorchScript模型编译到合适的目标之后,才能对其进行概要评测。

import qai_hub as hub

# Compile previously saved torchscript model

compile_job = hub.submit_compile_job(

    model="mobilenet_v2.pt",

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

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

)

assert isinstance(compile_job, hub.CompileJob)

profile_job = hub.submit_profile_job(

    model=compile_job.get_target_model(),

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

)

assert isinstance(profile_job, hub.ProfileJob)

分析ONNX模型性能

Qualcomm AI Hub还支持ONNX。与前面的示例类似,只有在ONNX模型编译到合适的目标之后,才能对其进行评测。我们将以 mobilenet_v2.onnx为例。

import qai_hub as hub

compile_job = hub.submit_compile_job(

    model="mobilenet_v2.onnx",

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

)

assert isinstance(compile_job, hub.CompileJob)

profile_job = hub.submit_profile_job(

    model=compile_job.get_target_model(),

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

)

assert isinstance(profile_job, hub.ProfileJob)

分析TensorFlow Lite模型性能

Qualcomm AI Hub还支持以.tflite格式对模型Profiling。我们将使用SqueezeNet10 model。

import qai_hub as hub

# Profile TensorFlow Lite model (from file)

profile_job = hub.submit_profile_job(

    model="SqueezeNet10.tflite",

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

)

在多个设备上分析模型

通常,对多个设备的性能进行建模是很重要的。在本例中,我们介绍了最近的Snapdragon®8 Gen 1和Snapdragon™8 Gen 2设备,以获得良好的测试覆盖率。我们重用TensorFlow Lite示例中的SqueezeNet model,但这次我们在两个设备上对其进行了评测。

import qai_hub as hub

devices = [

    hub.Device("Samsung Galaxy S23 Ultra"),  # Snapdragon 8 Gen 2

    hub.Device("Samsung Galaxy S22 Ultra 5G"),  # Snapdragon 8 Gen 1

]

jobs = hub.submit_profile_job(model="SqueezeNet10.tflite", device=devices)

为每个设备创建一个单独的评测任务。

上传模型以进行评测

可以在不提交评测任务的情况下上传模型(例如SqueezeNet10.tflite)。

import qai_hub as hub

hub_model = hub.upload_model("SqueezeNet10.tflite")

print(hub_model)

现在,您可以使用上传的模型的model_id来运行评测任务。

import qai_hub as hub

# Retrieve model using ID

hub_model = hub.get_model("mabc123")

# Submit job

profile_job = hub.submit_profile_job(

            model=hub_model,

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

            input_shapes=dict(x=(1, 3, 224, 224)),

)

分析已编译好的模型

我们可以重用以前作业中的模型来启动新的评测任务(例如,在不同的设备上)。这样可以避免多次上传同一个模型。

import qai_hub as hub

# Get the model from the profile job

profile_job = hub.get_job("jabc123")

hub_model = profile_job.model

# Run the model from the job

new_profile_job = hub.submit_profile_job(

    model=hub_model,

    device=hub.Device("Samsung Galaxy S22 Ultra 5G"),

)

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

这篇关于Qualcomm AI Hub-示例(二)模型性能分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834338

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应