DLAI-设备人工智能笔记-全-
DLAI 设备人工智能笔记(全)
001:课程概述 🚀

在本课程中,我们将学习如何创建能够在设备上(如智能手机、摄像头、机器人等)本地运行的人工智能应用。我们将了解从模型转换、设备优化到性能验证和模型量化的完整流程,最终构建一个可实际运行的安卓应用。
现代智能手机可能拥有10到30万亿次的计算能力。当你拍照时,手机可能同时运行数十个AI模型,以实现实时的语义分割和场景理解。
设备端AI的优势与挑战
上一节我们了解了设备端AI的潜力,本节中我们来看看其核心优势与面临的挑战。将AI模型部署在设备端,可以降低延迟、提升隐私保护并提高运行效率。然而,这需要克服不同硬件和操作系统带来的差异。
尽管这些设备在硬件和操作系统上存在差异,但对于许多设备而言,部署模型的关键技术步骤原则实际上是相似的。
部署流程概览
以下是部署一个已训练好的模型(可能在云端训练)到设备端的主要步骤:
- 模型转换:将模型从原始框架(如PyTorch、TensorFlow)转换为设备端运行时兼容的格式。在此过程中,模型被“冻结”成一个神经网络计算图,然后被转换为可在设备上执行的文件。
- 设备优化:智能手机和边缘设备通常包含多种处理单元,如CPU、GPU和神经处理单元(NPU)。了解应用将运行的确切设备,可以进行针对性优化,有时能使模型运行速度提升高达10倍。
- 性能验证:确保模型在众多不同设备上表现一致。这可能意味着需要在广泛的设备上验证其数值正确性,以防止因硬件差异导致模型在一台设备上运行正常而在另一台上出错的情况。
- 模型量化:量化是运行设备端AI模型的常见步骤。如课程中将展示的实时分割应用,量化可以使应用运行速度提升数倍,同时显著减小模型体积。在我们的案例中,速度提升了约4倍,模型大小也缩小了约4倍。
讲师与课程目标

我们的讲师Krisishna Ser是高通公司的工程高级总监,拥有约十年的设备端AI经验。他构建的关键部署基础设施可能正运行在你的智能手机上。Krishna直接帮助部署了超过一千个模型在设备上,超过十万个应用使用了他及其团队构建的技术。
在本课程中,你将首先学习如何部署一个设备端模型。你只需几行代码就能部署你的第一个模型,该模型将对你的摄像头流进行实时分割。
你将学习四个核心概念:
- 模型图捕获:如何将模型捕获为一个可在设备上移植和运行的计算图。
- 模型编译:为该计算图针对特定设备进行编译的过程。
- 硬件加速:为了在设备上高效运行而对模型进行的硬件加速。
- 数值验证:在设备上验证该模型数值正确性的过程。
最后,你将学习如何量化模型,从而将性能提升近4倍,同时减少该模型的存储占用。最终,我们将把这个模型集成到一个你可以实际把玩的安卓应用程序中。
总结

本节课中我们一起学习了设备端人工智能的基本概念、优势、挑战以及完整的部署流程。设备端AI模型的部署正在兴起,为AI系统的构建者开启了大量激动人心的可能性。让我们进入下一个视频,开始动手实践。
002:为何选择设备端AI?🤔

在本节课中,我们将学习设备端人工智能(On-Device AI)为何如此流行。我们将探讨其带来的多种益处,例如降低延迟、提升效率、节约成本以及保护隐私。同时,我们也将了解设备端AI在当今现实世界中的各种应用,包括实时语音检测、实时语义分割、实时目标检测以及物理活动检测。让我们开始吧。
无处不在的设备端AI 🌍
首先,让我们了解一些关于设备端AI的有趣事实。你是否知道,每次你用智能手机拍照时,都有超过20个AI模型在几百毫秒内运行,以捕捉完美的照片?在工业物联网领域,设备端AI的预估经济影响高达约3万亿美元。此外,每次你驾驶配备高级驾驶辅助系统的汽车时,其功能完全基于设备端AI。
设备端AI无处不在。当你在笔记本电脑键盘上打字时,它由一个在设备上运行的语言模型驱动。当你与智能音箱对话时,文本转语音功能完全在设备端运行。负责配送和组装的机器人大量使用设备端AI。用于工业和农业场景的景观扫描无人机也使用设备端AI。每次你在智能手机或笔记本电脑上编辑图片,以及每次你驾驶汽车,背后都有设备端AI的驱动。
设备端AI的应用场景 📱

以下是设备端AI在音频、图像和传感器方面的几个应用案例。
音频与语音应用包括:
- 文本转语音
- 语音识别
- 机器翻译
- 音频降噪
图像与视频应用包括:
- 照片分类
- 二维码检测
- 虚拟背景分割

传感器应用包括:
- 物理活动检测
- 键盘输入模型
- 数字手写识别
所有这些都由设备端AI驱动。更令人着迷的是,你甚至可以混合音频、图像、视频、语音和传感器等多种模态,创造出多模态的设备端AI模型。
设备端AI最流行的应用行业包括移动智能手机行业、个人电脑行业、工业物联网行业以及汽车行业。
为何选择设备端AI?🔍
现在,让我们看看为何要在设备上运行模型。主要有四个原因。
第一,成本效益高。 因为你可以利用本地所有可用的计算资源,无需额外的云计算资源。

第二,效率高。 因为你可以本地处理数据,无需将其发送到云端、接收结果,然后再在本地处理。这整个过程在计算上变得更加高效。
第三,保护隐私。 因为你的数据将保留在你的设备上,永远不会离开它。
第四,实现个性化。 因为让模型在你的设备上本地定制,无需任何外部数据,可以创造出独特的个性化体验。
如何部署设备端模型?🚀
上一节我们介绍了选择设备端AI的原因,本节中我们来看看如何部署模型到设备上。我们将介绍一种新的部署方式,它能让你将在云端训练好的模型,在大约五分钟内就能在设备上运行。
这个过程主要包括四个步骤。
第一步,捕获模型为计算图。 你将获取模型的计算图表示。
第二步,为目标设备编译计算图。 你将把捕获的计算图编译成适合目标设备的形式。
第三步,在目标设备上验证模型的数值准确性。 你将确保模型在部署设备上的计算结果正确。
第四步,在设备上测量性能。 你将评估模型在设备上的运行效率。
所有这些步骤都需要一个真实的设备参与。因此,你将使用一个“设备在环”的流程来完成这四个步骤。最终,当这四个步骤完成后,你将获得一个可以在设备上部署并集成到应用程序中的成品。
为了使这个过程极其顺畅,你将使用高通的AI Hub平台。该平台自动化了捕获、编译、验证和性能测量这四个步骤,并为你提供所需的设备,让你可以在大约五分钟内完成整个过程。

设备端AI与生成式AI ✨
设备端AI在生成式AI应用中也极为流行。这包括实时翻译、实时转录、照片生成、基于AI的照片编辑、语义搜索、文本摘要、各种虚拟助手、写作辅助以及图像生成等。所有这些都是在你的智能手机或笔记本电脑上商业部署的设备端AI应用。
可部署的模型集合 📚

以下是当今可以在智能手机、笔记本电脑、物联网设备或汽车上部署的各种模型集合。这包括像Llama和Bichn这样的语言模型,像Whisper这样的语音模型,像MediaPipe这样的面部检测模型,Stable Diffusion以及超过100多个模型。如今,所有这些模型都非常容易部署到设备端。
总结 📝

本节课中,我们一起学习了设备端人工智能为何如此重要和流行。我们了解了它在成本、效率、隐私和个性化方面的核心优势,探索了其在音频、图像、传感器及生成式AI领域的广泛应用。我们还简要了解了将云端模型快速部署到设备端的关键步骤。设备端AI正推动着智能手机、汽车、物联网等行业的创新,为我们的数字生活带来更快速、更安全、更个性化的体验。
003:3.L2 在设备端部署分割模型 🚀

在本节课中,我们将学习如何在设备端部署你的第一个模型,仅需几行代码。我们将介绍实时图像分割技术,了解该任务中流行的模型,并选择一个先进的模型将其部署到设备上。我们还将进行数值正确性验证和性能测试,并最终在真实的智能手机上看到推理过程。

设备端AI的应用场景
上一节我们介绍了课程目标,本节中我们来看看设备端人工智能的几种常见应用。
以下是设备端AI的几个主要应用方向:
- 实时目标检测:用于检测人、人脸和二维码。
- 语音识别:将语音输入转换为文本。
- 姿态估计:基于实时图像或视频流预测人体姿态。
- 图像生成:输入文本,由生成式AI渲染出对应的图片。
- 超分辨率:将低分辨率图像提升为高分辨率。
- 图像分割:这是本节课的重点。
你可以在 AIhub.callcomm.co 上探索针对所有这些主题的各种模型。同时,GitHub和Hugging Face上也有相关教程和资源,帮助你让这些模型在设备端运行起来。
什么是图像分割?
了解了应用场景后,我们来深入了解一下本节课的核心——图像分割。


图像分割的任务是,给定一张图像,将其分解为所有有意义的片段,以便进行分析和更轻松的对象识别。
举个例子,假设你有一张街道的图像。图像分割模型接收这张图像,并提供图像中预测区域的各种不同片段。例如,粉色代表道路,绿色代表树木,浅绿色代表人行道,红色代表人。
图像分割的类型

图像分割有多种类型,其中最流行的两种是语义分割和实例分割。

- 语义分割:如左侧蓝色示意图所示,每个像素都指向一个特定的类别。图中,黄色代表桌子,粉色代表人。
- 实例分割:如右侧示意图所示,每个像素不仅指向一个类别,还指向同一类别内的单个实例。图中,每个人都被标记为不同的颜色,表示他们是“人”这一类别中的独立实例。
图像分割的应用

图像分割有许多实际应用。
- 它被部署在所有高级驾驶辅助系统中,用于分别标记道路、汽车和行人。
- 在图像编辑软件中极为流行,用于对头发或脸部应用滤镜,或模糊背景。
- 在视频会议软件中无处不在,用于在通话时模糊你的背景。
- 最后,它还用于无人机测绘地形,特别是在农业和工业应用中。
实时分割的挑战
在本节课中,你将部署一个实时分割模型。这意味着图像的处理和分割必须即时完成,并且要逐帧进行。
这段视频描绘了在街景摄像头上执行的实时分割。浅蓝色是汽车,灰色是道路,深绿色是树木,粉色是行人,蓝色是天空。所有这些都必须逐帧应用。

从系统角度来看,这极具挑战性。举个例子,假设你需要以每秒30帧的速度处理所有这些数据。每秒30帧意味着在下一帧到达之前,你只有大约33毫秒来处理整个帧。这意味着你的整个AI模型必须在30毫秒内运行完毕,以便在下一帧到达之前完成所有所需的分析。
流行的分割模型
有多种不同的模型用于语义分割,以下是四种最流行的模型。
以下是四种流行的语义分割模型:
- ResNet:使用残差连接来训练非常深的网络,在分割应用中相当流行。
- 高分辨率网络:另一种流行的实时分割算法。该网络通过在网络中保持高分辨率表示来捕获更精细的细节。
- 特征聚合网络:专注于从不同尺度聚合各种不同的特征,以获得尽可能好的预测细节。
- 双动态分辨率网络:采用双路径架构来平衡效率和准确性。
所有这些网络都可以完全在设备本地运行。
聚焦FFNet网络
在本节课中,我们将重点介绍一个名为 FFNet 的网络,即快速特征网络。
该网络具有简单的编码器-解码器架构,带有类似ResNet的主干网络和一个小的多尺度头部。从准确性的角度来看,该网络的性能与之前介绍的HRNet或FANet等复杂的语义分割网络一样好,但它有一个巨大的优势:计算效率非常高,因此非常适合在设备上部署。
该网络的另一个优点是高度可配置。你可以根据环境需求和应用精度需求,拥有不同大小的编码器和解码器。

以下是本节课中你将探索的几种FFNet架构变体。
以下是FFNet架构的几种变体:
- FFNet-40S、54S、78S:基于ResNet主干,在1024x2048的高分辨率上运行。模型大小约为55MB到100MB,参数在1300万到2700万之间,在设备上运行需要约62到96 GigaFLOPs的计算量。
- FFNet-78-LowRes、122-LowRes:在512x1024的较低分辨率上运行。模型稍大,约100到130MB,参数约2600万到3200万。低分辨率显然需要更少的操作,因此所需的GigaFLOPs也更少。
在设备上部署模型
现在,让我们看看如何在设备上部署所有这些网络。

在这个Notebook中,你将在设备上部署一个实时分割模型。本Notebook的目标是让你对如何在设备上部署模型有一个高层次的概述。在下一课中,你将更详细地学习本Notebook中涉及的每个概念。
本Notebook部署的是FFNet模型。我已分享FFNet论文的链接供你参考。
现在,你将探索FFNet网络的各种不同变体,并使用 Qcomm AI Hub Python包 来实现,该包包含许多可以直接试用的PyTorch模型。
为了获取特定模型的计算摘要,你将使用 torchinfo包,它可以提供关于参数总数、模型大小以及计算复杂性的详细描述。
现在,让我们运行一些代码来提供模型的计算摘要。
# 示例代码:使用torchinfo获取模型摘要
import torchinfo
# ... 加载FFNet预训练权重 ...
summary = torchinfo.summary(model, input_size=(1, 3, 1024, 2048))
print(summary)
这段代码获取了输入分辨率为1024x2048的模型的预训练权重,并使用torchinfo包为该特定输入分辨率提供模型摘要。摘要包含参数数量、计算复杂性以及网络大小。
如果我们向下滚动,可以看到参数总数约为1390万,全部可训练。该网络的总计算复杂度约为62 GigaFLOPs,该特定模型的输入大小约为25MB。这让你大致了解这个模型有多大、需要多少计算能力以及部署该模型所需的总参数数量。
我为你创建了一个练习,以重现讲座中展示的表格。这个练习允许你探索FFNet架构的不同变体以及每个变体相关的计算复杂性。这里突出显示的前三个变体在1024x2048的较高分辨率上运行,而接下来的两个变体在512x1024的低分辨率变体上运行。你可以获取每个FFNet变体的计算摘要,包括参数数量、计算复杂性和模型大小。
设置AI Hub进行设备端部署
下一步是为你设置AI Hub,以配置设备在环部署。
AI Hub作为一个Python包提供。接下来,我们将为设备在环部署设置Qcomm AI Hub。你可以将其安装为Python包并使用API令牌进行配置。
现在,你将在Notebook中运行FFNet-40S网络的简单演示。

# 示例代码:运行FFNet-40S推理
from ai_hub import load_model
model = load_model('ffnet-40s')
# ... 加载图像并运行推理 ...
predictions = model(image)
这行特定的代码从源直接下载FFNet-40S模型的预训练权重,并在简单图像上运行示例推理,提供该模型在该特定图像上的预测结果。

这段特定的代码在预先提供给网络的样本图像上运行推理,并提供带有注释的预测结果:红色代表人,绿色代表树,灰色代表道路,蓝色代表其他汽车。请注意,这个特定的演示完全在云环境的Notebook中运行。本节课的目标是让你能够获取这个特定的模型和示例,并在智能手机上运行它。
在真实智能手机上运行模型
现在,让我们在真实的智能手机上运行这个特定的模型。
为此,我们将使用 FFNet_export 函数并指定一个设备,例如三星Galaxy S23。

运行这段特定的代码行会完成幻灯片中展示的所有四个步骤:
- 模型从PyTorch获取,并针对三星Galaxy S23进行转换和编译(通过这个特定的编译任务完成)。
- 编译完成后,在云中配置一台真实的三星Galaxy S23物理设备。
- 一旦这个真实设备配置好,就会运行性能分析,以了解这个特定模型在设备上运行需要多长时间。
- 最后,性能分析完成后,我们在设备上对之前展示的相同样本运行推理,以便你了解在设备上运行的准确性如何。
这个过程大约需要2到5分钟,具体取决于服务器的负载。
性能与正确性验证
这个特定脚本的结果是一个非常简单但重点突出的性能摘要。
摘要显示,该模型在三星Galaxy S23上运行,耗时约22毫秒,总操作符数量约为92个,并且完全在神经处理单元上运行。你将在下一课中详细探讨这些概念中的每一个。
数值正确性也在这里显示。它展示了一个称为 峰值信噪比 的特定度量标准,用于比较在设备上运行的推理与在Notebook本地环境中运行的推理的数值正确性。通常,任何高于30的值都被认为是良好的。这个特定的PSNR是62,这意味着设备端推理的结果与云端几乎完全一致。
请注意,其中许多链接你可能无法访问,因此我们为你提供了一组简单的可探索链接,你可以探索FFNet的所有变体,其中包含详细视图,描述了性能、层数以及FFNet架构所有不同变体的内存消耗。
在物理设备上运行最终演示
在本Notebook的最后一步,你将在物理设备上运行图像分割模型。


这将运行你之前在Notebook中看到的相同演示,但不是在本地Notebook环境中运行,而是在云中为你配置的三星Galaxy S23上运行。
请注意,这行特定的代码需要几分钟时间。在这几分钟内,PyTorch模型被发送到服务器并针对三星Galaxy S23进行编译,在云中为你配置一台三星Galaxy S23以便访问,图像随后通过为设备编译的模型传递,输出预测结果返回给你,然后你将看到来自三星Galaxy S23的结果显示输出。
好的,太棒了。你看到了结果。它看起来和我在Notebook中得到的结果完全一样。红色是人,蓝色是汽车,绿色是树木,灰色是道路。但这个特定的推理结果来自一台真实的三星Galaxy S23。
课程总结
在本节课中,我们一起学习了以下内容:
- 了解了FFNet的各种不同变体。
- 探索了每个变体的计算复杂性。
- 能够在Notebook本地环境中运行演示。
- 能够为三星Galaxy S23导出模型。
- 能够测量FFNet-40S变体的性能,大约为22毫秒。
- 注意到云端推理与设备端推理之间的PSNR约为62,这意味着它提供了与云端相同的结果。
- 最后,你看到了所有这些工作的端到端演示,你提供了一张图像并得到了返回的结果,它在视觉上与你在云端得到的结果完全相同。
在下一课中,我们将更详细地探讨这些概念,分解它们,理解每个领域背后发生的事情,以便你完全理解在设备上部署模型需要什么。

好的,我们下节课见。
004:L3 准备设备端部署 🚀




在本节课中,我们将学习设备端部署的四个核心概念。我们将了解如何将在云端训练的模型适配并部署到移动或嵌入式设备上,并确保其性能与准确性。
图捕获 📊

上一节我们介绍了设备端AI的基础,本节中我们来看看如何将模型的计算过程“打包”以便部署。这个过程称为图捕获。
图捕获是指将神经网络模型的计算过程,从代码表示转换为一个可移植的图表示。例如,一段包含两个卷积层(conv1 和 conv2)及其后ReLU激活函数的PyTorch代码,可以被捕获为一个计算图。这个图以输入 x 为起点,清晰地展示了数据流经卷积和激活函数的路径。

以下是图捕获的关键步骤:
- 导入预训练模型(例如
FFNet40S)。 - 定义模型所需的输入形状,例如一个3通道、尺寸为
1024x2048的张量。 - 生成随机输入数据用于追踪。
- 使用
torch.jit.trace函数执行追踪,该函数会记录模型对输入数据的完整计算过程。


最终,你将获得一个PyTorch追踪模型,它封装了模型的所有计算,并且是独立于原始代码的、可移植的格式,便于后续部署。
设备端编译 ⚙️
现在,我们已经有了一个捕获了计算过程的图,下一步是将其编译成能在目标设备上高效运行的格式。
以下是编译模型的主要步骤:
- 设置编译环境(例如Qualcomm AI Hub)。
- 从可用设备列表中选择一个目标设备(如三星Galaxy S23)。
- 使用
submit_compile_jobAPI,提交追踪模型和输入规格。 - 云端服务会针对该特定设备优化模型,并生成一个目标模型。
编译生成的模型文件(如 .tflite)与特定的运行时兼容。主流的设备端运行时包括:
- TensorFlow Lite:适用于Android应用,高效且节能。
- ONNX Runtime:适用于Windows应用。
- Qualcomm AI Engine:适用于高通硬件上的嵌入式应用。
你可以通过在编译API中指定 target_runtime 选项来选择不同的运行时。


硬件加速与性能剖析 ⚡

模型编译完成后,我们需要了解它在设备上的实际性能。现代设备通常拥有三种计算单元:
- CPU:通用计算单元,灵活易编程。
- GPU:擅长高性能并行计算。
- NPU(神经网络处理单元):为神经网络计算高度优化,能效极高(可比CPU高效10倍),但灵活性较低。

不同的运行时都有相应的后端,可以调用这些计算单元。作为开发者,你可以选择将计算任务分配给特定的单元。

为了评估性能,我们需要进行性能剖析:
- 使用
submit_profile_jobAPI,将编译好的目标模型提交到选定的设备(如三星Galaxy S23)。 - 云端会在真实设备上运行模型并收集性能数据。
- 下载剖析结果,可以查看关键指标,例如模型在NPU上的推理时间(如27.9毫秒)和内存占用(3-5 MB)。

你还可以通过指定 compute_unit 选项(如 CPU、GPU、NPU),来对比模型在不同计算单元上的性能表现。

设备端数值正确性验证 ✅

确保模型在设备上运行的结果与云端一致至关重要。以下是验证数值正确性的流程:

- 云端推理:在笔记本环境中,使用PyTorch对样本输入进行推理,得到参考输出。
# 示例:在云端运行推理 cloud_output = pytorch_model(sample_input) - 设备端推理:使用
submit_infer_jobAPI,将相同的样本输入和编译好的目标模型发送到云端托管的真实设备(如三星Galaxy S23)上运行推理。 - 结果对比:下载设备端的推理输出,与云端输出进行比较。通常使用峰值信噪比(PSNR) 来衡量两者差异。
- PSNR值大于30通常认为匹配良好。
- 示例中PSNR约为60,表明设备端与云端结果高度一致,模型可以放心部署。


验证成功后,即可使用 get_target_model API 下载最终的可部署模型文件。



总结 🎯
本节课中我们一起学习了设备端模型部署的四个核心步骤:
- 图捕获:使用
torch.jit.trace将PyTorch模型转换为可移植的计算图。 - 设备端编译:针对目标设备和运行时,将图编译成高效的部署格式。
- 性能剖析:在真实设备上评估模型在不同计算单元(CPU/GPU/NPU)上的性能,确保满足约束。
- 数值验证:通过对比云端与设备端的推理结果,确保模型计算的正确性。

完成这些步骤后,你就得到了一个经过验证、性能达标、可在设备上运行的模型。在下一课中,我们将学习如何通过量化技术,让这个模型变得更小、更快。
005:模型量化 🧮


在本节课中,我们将要学习模型量化的概念与实践。量化是一种通过降低模型数值精度来提升计算速度、减小模型大小的关键技术。我们将了解其原理、优势,并通过一个实际案例演示如何对模型进行量化,最终实现模型大小和推理速度的显著提升。
什么是量化及其优势
上一节我们介绍了模型优化的基础,本节中我们来看看量化技术。量化是将模型从高精度(如32位浮点数)转换为低精度(如8位整数)表示的过程。
量化主要带来三大好处:
- 减小模型大小:使模型能更好地存储在容量有限的设备上。
- 加快处理速度:由于计算量减少,模型运行更快。
- 降低功耗:这对电池供电的设备至关重要。
量化可以使模型缩小4倍,并提速高达4倍。
量化原理详解
让我们深入了解量化的具体原理。假设你有一个浮点张量,每个值占用32位(4字节)。量化可以将其转换为每个值仅占8位(1字节)的整数表示。
浮点数值与整数值之间的转换通过缩放因子(scale) 和零点(zero point) 两个参数实现。浮点范围通常远大于整数范围。
转换公式如下:
- 量化(浮点 -> 整数):
quantized_value = round(float_value / scale) - zero_point - 反量化(整数 -> 浮点):
float_value = (quantized_value + zero_point) * scale
由于精度损失,转换过程会引入量化误差。量化过程的目标就是在转换时使这个误差最小化。
量化类型与方法
量化主要有两种类型:
- 权重量化:仅降低模型权重的精度,主要优化存储。
- 激活量化:对激活值也应用低精度,从而利用低精度计算加速整个推理过程。
根据精度选择,量化有不同的配置,例如:
- W8A8: 权重和激活都量化为8位。
- W8A16: 权重量化为8位,激活保持16位。
- W4A16: 权重量化为4位,激活保持16位(常用于大语言模型)。
有两种常见的量化实施方式:
- 训练后量化:模型训练完成后,使用校准数据(通常几百个样本)来确定最佳量化参数,以最小化精度损失。
- 量化感知训练:在模型训练过程中就模拟量化效应,让模型学习适应低精度表示,通常能获得更精确的量化模型。
实践:在Notebook中进行量化
现在,让我们通过一个Notebook实例来看量化如何实际操作。你将学习如何准备校准数据集、准备模型进行量化、执行训练后量化,并验证模型的精度和设备端性能。

准备校准数据
首先,需要设置校准数据。我们将使用包含约100张RGB城市街景图像的数据集。模型的输入分辨率是 3 x 1024 x 2048(通道 x 高 x 宽)。下载数据集后,会留出一小部分用于测试。
建立预处理与后处理流程


接下来,建立校准或推理流程。使用 torchvision.transforms 包中的 ToTensor API将图像转换为PyTorch张量,并将其维度调整为 1 x 3 x 1024 x 2048 的四维数组。
同时,需要定义后处理函数。该函数接收模型的输出张量,将其上采样到原始输出尺寸,并将预测结果叠加到原始图像上以便可视化。
加载并测试浮点模型

预处理和后处理设置好后,加载浮点精度模型。使用PyTorch的 from_pretrained API加载模型。然后,将测试样本输入模型,得到浮点32的输出结果,并应用定义好的后处理函数。在Notebook中,可以看到预测结果叠加在原图上的效果。

准备模型进行量化
为了量化模型,我们将使用名为 AIMET 的Python包。量化准备过程需要调用 prepare_model 函数。这个函数会标注模型中所有的浮点操作(包括权重和激活),并设置好对应的自动整数版本图,为接下来的校准过程做好准备。
执行训练后量化
我们编写一个简单的函数,将校准数据传递给模型,并学习训练后量化所需的所有校准参数。compute_encodings 函数是此计算的核心,它确保为图中的所有参数学习到正确的零点和缩放因子,从而获得最小的量化误差。

校准过程完成后,可以在PyTorch环境中将同一个测试样本输入完全校准和量化后的模型,得到同样是量化的输出结果。该结果会通过我们为浮点32版本编写的同一个后处理函数,并可以在Notebook中查看结果。

导出量化模型并在设备上验证
作为最后一步,将量化模型导出以供设备使用。使用与第二课中相同的 quantized_export 函数,将模型提交到服务器进行设备端优化。随后,设备会测量性能,并提供该模型性能的摘要。
此过程大约需要几分钟。从设备性能结果可以看到,该量化模型运行时间约为6.4毫秒,比原始浮点模型快了约4倍。它完全在神经处理单元上运行,内存消耗在1到10兆字节之间。峰值信噪比略低于浮点模型,约为33 dB(通常认为高于30 dB即为良好)。

量化效果总结
本节课中我们一起学习了模型量化。量化的影响在模型大小和性能上都非常显著:
- 模型大小:从55 MB减小到13 MB。
- 推理延迟:从16.9毫秒提升到4.6毫秒,实现了约3.7倍的加速(测试基于三星Galaxy S24)。

总结来说,你学会了如何将一个在云端以浮点精度训练的模型,量化为整数精度,从而得到一个缩小近4倍、提速近4倍的模型。在下一节课中,你将学习如何利用这个量化模型,构建并部署一个能够进行实时分割的端到端移动应用程序。
006:设备集成 🚀

在本节课中,我们将学习如何将AI模型集成到设备上的智能手机应用程序中。模型将直接从摄像头获取帧,并给出结果。你将能在智能手机上看到一个实时分割的演示,它以每秒30帧的速度运行。
现在,让我们看看如何将模型集成到设备端应用程序中。
处理流程概览 📊
在这个特定的应用中,集成需要你理解数据是如何从摄像头流一路转换到输出流的。
设备集成通常是将模型作为处理流水线一部分的过程。该流水线从摄像头流开始,它提供RGB格式或YUV格式的数据。
GPU预处理阶段将数据从YUV转换为RGB,因为模型需要RGB格式。如果模型是在特定分辨率下训练的,例如 224x224 分辨率,预处理通常还会进行下采样。下采样需要你将摄像头流的分辨率(例如720p)转换为模型的分辨率,即 224x224。
模型在神经处理单元上尽可能高效地运行。在分割应用中,你会得到一个输出掩码,其分辨率通常与模型相同,因此在本例中,输出掩码是 224x224。

从模型获得输出掩码后,你将执行基于GPU的后处理。这通常包括平滑、上采样到输出分辨率、阈值处理以及模糊处理,以便将输出掩码很好地融合到图像之上。最终结果是预测结果叠加在摄像头流之上的输出流。
应用实现的关键部分 ⚙️
以下是这个应用程序实现的五个主要部分。
第一是摄像头流,你需要从中提取帧(例如每秒30帧),并理解摄像头流提供的数据类型,通常是RGB数据或YUV数据。
第二是实现预处理。这使用OpenCV在GPU上完成,以实现更快的处理速度。使用GPU以获得最佳性能至关重要。
第三是模型推理,在设备上使用运行时API(通常是基于C++或Java的API)完成。应确保模型在神经处理单元上运行以获得最佳性能。

第四是实现后处理,它接收模型的输出,并使用GPU上的OpenCV进行快速后处理,以便将输出叠加到显示器上。
最重要的一点是运行时的打包。应确保应用程序打包所有运行时依赖项,以最大化硬件加速。
运行时依赖管理 📦
为了让你了解运行时依赖是如何管理的,一个典型的Android项目包含Java源代码、原生源代码以及源代码的各种依赖项。
包含AI模型的应用程序通常需要将模型打包为应用程序的一部分。此外,运行时也需要与你的应用程序一起打包,这些库也是单独捆绑的。例如,有仅包含CPU实现的TensorFlow Lite运行时包;有GPU委托,这是一个额外的依赖项,以便在旧设备上使用GPU进行处理;还有基于NPU的委托,这是为了让你能够利用NPU而提供的专用库。
你可以选择将模型与应用程序一起打包,或者如果模型较大,可以通过无线方式下载。同样,库也可以随应用程序一起部署,或通过无线方式捆绑,以减少应用程序的大小。这些都是为了能为应用程序用户提供最佳用户体验的重要考虑因素。

实际演示 🎬
现在,让我们在一个真实演示中看看这个特定应用的实际运行效果。在这个演示中,你将看到我们训练并量化过的每秒30帧实时分割模型。我们将展示NPU的计算单元利用率,并比较NPU和CPU的差异。此应用程序兼容所有Android手机。它在2019年后发布的高通设备上运行于NPU,在其他所有手机上运行于GPU。

让我们看看实际效果。启动这个实时分割演示。

我将首先在CPU上运行,让你感受一下CPU运行此模型的性能。点击“开始摄像头”按钮。
你可以看到Ismail的实时分割效果。深蓝色是背景,红色是Ismail。你只能得到大约每秒1帧的速度。在CPU上运行模型大约需要800毫秒,速度非常慢。


现在,我将切换到使用神经处理单元。
再次按下“开始摄像头”按钮。如你所见,响应变得迅速得多。当Ismail移动时,可以以每秒30帧的速度运行,跟踪也更加准确。这是在设备神经处理器上运行的实时分割。

总结 📝
这非常令人兴奋。你看到了实时分割在神经处理单元上以每秒30帧的速度高效运行,能够准确地检测人物。

在本节课中,你学习了如何部署为设备量化并训练好的实时分割模型。你学习了如何在涉及预处理和后处理的摄像头流水线中部署此模型。最后,你看到了这个特定模型的实际演示。
007:总结

在本课程中,我们学习了设备端人工智能的重要性与普遍性,并掌握了将云端训练的模型部署到设备端的基本流程。
课程回顾
上一节我们构建了一个完整的智能手机端实时应用。现在,让我们回顾一下整个课程的核心内容。
以下是本课程涵盖的主要知识点:
- 模型部署:学习了如何将云端训练的模型进行适配与准备,以便在设备端部署。
- 代码实践:仅用几行代码就在设备上成功运行了你的第一个模型。
- 模型量化:学习了如何通过量化技术来提升模型效率,最高可达4倍的性能提升。
- 应用构建:看到了如何构建一个在智能手机上实时运行的端到端应用程序。
总结
本节课中,我们一起学习了设备端人工智能从模型准备、量化优化到最终应用构建的全过程。恭喜你完成本课程的学习,期待看到你运用这些知识构建出自己的作品。

浙公网安备 33010602011771号