当前位置:   article > 正文

DPU-PYNQ使用笔记_vai_q_pytorch

vai_q_pytorch

Ubuntu

Tips:
1、在Ubuntu端运行Vitis AI时,最好将自己工程文件夹,放到Vitis AI 文件下级目录下,而后右键在当前路径打开终端
输入./docker_run.sh xilinx/vitis-ai
2、在训练Pytorch模型时,Vitis AI所支持的Pytorch版本是<=1.4,框架内部所安装的为1.4版本。
在这里插入图片描述
3、在打包Pytorch模型时(大于1.7版本),需要注意的是Pytorch高版本所生成的pth文件,为一压缩文件,如果需要得到低版本所保存的pth文件,需要在模型保存代码中加入torch.save(model.state_dict(), model_cp,_use_new_zipfile_serialization=False,最后获得的文件在Ubuntu中如下图所示,否则在量化过程中或出现版本过高的提示。关于Pytorch模型打包的几种方式,可以参考该文章
在这里插入图片描述

再根据的的模型框架,选择对应的版本。

查看模型的结构

可以使用Ubuntu中的Netron软件查看模型结构(Summary
在这里插入图片描述

量化(quantizing)

官方给出了量化的工作流程图,输入模型为浮点模型,其中预处理环节主要工作为折叠和删除无用节点,然后将模型的权重/偏差与激活 (weights/biases and activations)量化到给定的位宽。

To capture activation statistics and improve the accuracy of quantized models, the Vitis AI quantizer must run several iterations of inference to calibrate the activations. A calibration image dataset input is, therefore, required. Generally, the quantizer works well with 100–1000 calibration images. Because there is no need for back propagation, the un-labeled dataset is sufficient.

在量化过程中,为了提高最终模型的准确性,Vitis AI量化器必须运行多次推理迭代来校准激活,所以需要图像数据集输入,同时,由于不需要反向传播,所以未标记的数据集就行。对于量化的原理,可以参考这篇文章进行学习。
在这里插入图片描述而过程中不需要数据集label的原因,可以通过下图理解。即校准过程中,需要用dataset来获取的min和 max,来求取S与Z
在这里插入图片描述
在进行量化时,需要添加训练得到的浮点数模型校准数据集(100-1000张)
在Tensorflow中采用的是如下代码,由下代码可看出,其遵循上述流程图步骤。

from tensorflow_model_optimization.quantization.keras import vitis_quantize

float_model = tf.keras.models.load_model(‘float_model.h5’)
quantizer = vitis_quantize.VitisQuantizer(float_model)

#load datasets start
dir=r'\xilinx\jupyter_notebooks\Image\1'
imgs=np.ones(shape = [422,224,224,3], dtype=int)
for i in range(422):
	path = os.path.join(dir, str(i)+'.jpg')
	img=cv2.imread(path)
	# print("shape of img"+str(i)+'.jpg is: '+str(img.shape))
	# print(imgs[i,:,:,:].shape)
	imgs[i,:,:,:]=img
test_img = imgs/255
#load datasets end

quantized_model = quantizer.quantize_model(calib_dataset=test_img)   
quantized_model.save(os.path.join(args.output, args.name+'.h5'))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Pytorch流程
而Pytorch中的代码流程类似,详见该网页
1、导入vai_q_pytorch模块

from pytorch_nndct.apis import torch_quantizer, dump_xmodel
  • 1

2、生成一个量化输入所需的量化器,并得到转换后的模型

input = torch.randn([batch_size, 3, 224, 224])
    quantizer = torch_quantizer(quant_mode, model, (input))
    quant_model = quantizer.quant_model
  • 1
  • 2
  • 3

3、用转换后的模型建立神经网络。

acc1_gen, acc5_gen, loss_gen = evaluate(quant_model, val_loader, loss_fn)
  • 1

4、输出量化结果并部署模型。

if quant_mode == 'calib':
  quantizer.export_quant_config()
if deploy:
  quantizer.export_xmodel())
  • 1
  • 2
  • 3
  • 4

在GitHub的例程中,是如下使用的,与TF2的流程差异不大。
在这里插入图片描述

from pytorch_nndct.apis import torch_quantizer, dump_xmodel
from common import *

def quantize(build_dir,quant_mode,batchsize):

  dset_dir = build_dir + '/dataset'
  float_model = build_dir + '/float_model'
  quant_model = build_dir + '/quant_model'


  # use GPU if available   
  if (torch.cuda.device_count() > 0):
    print('You have',torch.cuda.device_count(),'CUDA devices available')
    for i in range(torch.cuda.device_count()):
      print(' Device',str(i),': ',torch.cuda.get_device_name(i))
    print('Selecting device 0..')
    device = torch.device('cuda:0')
  else:
    print
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/250439
推荐阅读
相关标签
  

闽ICP备14008679号