目录
1. 简介
在《Vitis AI 基本认知(模型校准+量化)》一文中,笔者简单分享了 inspector 的简单用法,本文将深入探究其用法。
inspector 的函数,用来诊断不同器件架构下的神经网络 (NN) 模型。检查器可以基于硬件约束来预测目标器件分配。生成的检查报告可用于指导用户对 NN 模型进行修改或最优化,从而显著降低部署难度并缩短部署时间。
建议在量化浮点模型前对其进行检查。
NNDCT:Neural Network Development and Compiler Tools。
2. 代码详解
2.1 导入所需的库
Vitis AI 2.5, Pytorch 版本信息:
Python 3.7.12
PyTorch 1.10.1
torchvision 0.11.2
import torch
from torchvision.models import resnet18
from pytorch_nndct.apis import Inspector
from IPython.display import Image
功能解释:
- import torch:PyTorch 库,用于深度学习的开源框架,核心功能是张量计算(类似于NumPy)以及深度神经网络的自动求导机制。
- torchvision.models:建立在 PyTorch 之上的一个库,专门用来处理图像数据。提供了三大主要功能。
- 一是加载和预处理图像数据的工具。
- 二是常用的图像数据集,如ImageNet、CIFAR10、MNIST等。
- 三是预训练好的模型,如VGG、ResNet等。
- Inspector 是 Vitis AI 工具的一部分,用于检查和诊断浮点模型。
2.2 创建 Inspector
target = "DPUCZDX8G_ISA1_B4096"
inspector = Inspector(target)
#---
#输出
#---
[VAIQ_NOTE]: =>Inspector is initialized successfully with target:
name: DPUCZDX8G_ISA1_B4096
type: DPUCZDX8G
isa_version: 1
该方法来自于类:
# <Vitis-AI-2.5/src/Vitis-AI-Quantizer/vai_q_pytorch/pytorch_binding/pytorch_nndct/apis.py>
---
class Inspector(object):
def __init__(self, name_or_fingerprint: str):
两种创建方法:
inspector = Inspector("0X101000016010407") # by target fingerprint
# or
inspector = Inspector("DPUCZDX8G_ISA1_B4096") # by target name
目标指纹(target fingerprint)是 Vitis AI 框架中用于表征不同 DPU 目标的唯一标识符。它由1个字节表示 DPU 类型、1个字节表示 ISA 版本、6个字节表示具体配置组成(feature code)。
2.3 下载模型
model = resnet18(pretrained=True)
model.eval()
当使用 pretrained=True 参数时,模型会自动从网络上下载预训练的权重并将其加载到模型中。 下载完毕,显示如下内容:
Downloading: "https://download.pytorch.org/models/resnet18-f37072fd.pth" to /home/vitis-ai-user/.cache/torch/hub/checkpoints/resnet18-f37072fd.pth
100% [-------------------------------]44.7M/44.7M [00:06<00:00, 7.62MB/s]
如果使用 model = resnet18(),则不会从网上下载预训练的权重。这种情况下,模型会初始化为随机权重,需要自己进行训练。
训练模式model.train() vs 评估模式model.eval(),这两种模式的主要区别在于某些层(如 Dropout 和 Batch Normalization)的行为不同。
1. Dropout 层:在训练过程中,Dropout 会随机丢弃一部分神经元以防止过拟合。但在评估模式下,Dropout 会被关闭,所有神经元都会被使用。
2. Batch Normalization 层:在评估模式下,Batch Normalization 层会使用在训练过程中计算得到的全局均值和方差,而不是当前 mini-batch 的均值和方差。
3. 梯度计算和权重更新:在评估模式下,模型只进行前向传播,不会计算梯度,也不会更新权重,需要配合 torch.no_grad() 一起使用。
2.4 检查模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
dummy_input = torch.randn(1, 3, 224, 224)
inspector.inspect(model, (dummy