Квантуйте сеть для развертывания FPGA

В этом примере показано, как квантовать настраиваемые параметры в слоях свертки нейронной сети и проверить квантованную сеть. Быстрое прототипирование квантованная сеть при помощи симуляции MATLAB или FPGA, чтобы проверить квантованную сеть. В этом примере вы квантуете нейронную сеть LogoNet.

В данном примере вам нужно:

  • Deep Learning Toolbox ™

  • Deep Learning HDL Toolbox ™

  • Библиотека квантования модели Deep Learning Toolbox

  • Пакет поддержки Deep Learning HDL Toolbox для FPGA Xlinx и устройств SoC

  • Интерфейс MATLAB Coder для библиотек глубокого обучения.

Загрузите предварительно обученную сеть

Загружать предварительно обученную сеть LogoNet и анализировать сетевую архитектуру, введите:

snet = getLogoNetwork;
analyzeNetwork(snet);

Задайте наборы данных калибровки и валидации

Этот пример использует the logos_dataset набор данных. Набор данных состоит из 320 изображений. Каждое изображение находится 227 227 в размере и имеет три цветовых канала (RGB). Создайте augmentedImageDatastore возразите, чтобы использовать для калибровки и валидации. Незатрудненная калибровка и валидация путем сокращения калибровочного набора данных до 20 изображений. Рабочий процесс симуляции MATLAB имеет максимальный предел пяти изображений при проверении квантованной сети. Уменьшайте размеры набора данных валидации до пяти изображений. Рабочий процесс валидации FPGA имеет максимальный предел одного изображения при проверении квантованной сети. Уменьшайте набор данных валидации FPGA до одного изображения.

curDir = pwd;
newDir = fullfile(matlabroot,'examples','deeplearning_shared','data','logos_dataset.zip');
copyfile(newDir,curDir,'f');
unzip('logos_dataset.zip');
imageData = imageDatastore(fullfile(curDir,'logos_dataset'),...
'IncludeSubfolders',true,'FileExtensions','.JPG','LabelSource','foldernames');
[calibrationData, validationData] = splitEachLabel(imageData, 0.5,'randomized');
calibrationData_reduced = calibrationData.subset(1:20);
validationData_simulation = validationData.subset(1:5);
validationData_FPGA = validationData.subset(1:1);

Создайте квантованный сетевой объект

Создайте dlquantizer возразите и задайте сеть, чтобы квантовать. Задайте среду выполнения как FPGA для одного объекта. Работайте на симуляции MATLAB для второго dlquantizer объект.

dlQuantObj_simulation = dlquantizer(snet,'ExecutionEnvironment',"FPGA",'Simulation','on');
dlQuantObj_FPGA = dlquantizer(snet,'ExecutionEnvironment',"FPGA");

Калибруйте квантованную сеть

Используйте calibrate функционируйте, чтобы осуществить сеть с демонстрационными входными параметрами и собрать информацию области значений. calibrate функционируйте осуществляет сеть и собирает динамические диапазоны весов и смещений. Калибровать функция возвращает таблицу. Каждая строка таблицы содержит информацию об области значений для настраиваемого параметра квантованной сети.

dlQuantObj_simulation.calibrate(calibrationData_reduced)
ans=35×5 table
        Optimized Layer Name        Network Layer Name    Learnables / Activations     MinValue       MaxValue 
    ____________________________    __________________    ________________________    ___________    __________

    {'conv_1_Weights'          }      {'conv_1'    }           "Weights"                -0.048978      0.039352
    {'conv_1_Bias'             }      {'conv_1'    }           "Bias"                     0.99996        1.0028
    {'conv_2_Weights'          }      {'conv_2'    }           "Weights"                -0.055518      0.061901
    {'conv_2_Bias'             }      {'conv_2'    }           "Bias"                 -0.00061171       0.00227
    {'conv_3_Weights'          }      {'conv_3'    }           "Weights"                -0.045942      0.046927
    {'conv_3_Bias'             }      {'conv_3'    }           "Bias"                  -0.0013998     0.0015218
    {'conv_4_Weights'          }      {'conv_4'    }           "Weights"                -0.045967         0.051
    {'conv_4_Bias'             }      {'conv_4'    }           "Bias"                    -0.00164     0.0037892
    {'fc_1_Weights'            }      {'fc_1'      }           "Weights"                -0.051394      0.054344
    {'fc_1_Bias'               }      {'fc_1'      }           "Bias"                 -0.00052319    0.00084454
    {'fc_2_Weights'            }      {'fc_2'      }           "Weights"                 -0.05016      0.051557
    {'fc_2_Bias'               }      {'fc_2'      }           "Bias"                  -0.0017564     0.0018502
    {'fc_3_Weights'            }      {'fc_3'      }           "Weights"                -0.050706       0.04678
    {'fc_3_Bias'               }      {'fc_3'      }           "Bias"                    -0.02951      0.024855
    {'imageinput'              }      {'imageinput'}           "Activations"                    0           255
    {'imageinput_normalization'}      {'imageinput'}           "Activations"              -139.34        198.11
      ⋮

dlQuantObj_FPGA.calibrate(calibrationData_reduced)
ans=35×5 table
        Optimized Layer Name        Network Layer Name    Learnables / Activations     MinValue       MaxValue 
    ____________________________    __________________    ________________________    ___________    __________

    {'conv_1_Weights'          }      {'conv_1'    }           "Weights"                -0.048978      0.039352
    {'conv_1_Bias'             }      {'conv_1'    }           "Bias"                     0.99996        1.0028
    {'conv_2_Weights'          }      {'conv_2'    }           "Weights"                -0.055518      0.061901
    {'conv_2_Bias'             }      {'conv_2'    }           "Bias"                 -0.00061171       0.00227
    {'conv_3_Weights'          }      {'conv_3'    }           "Weights"                -0.045942      0.046927
    {'conv_3_Bias'             }      {'conv_3'    }           "Bias"                  -0.0013998     0.0015218
    {'conv_4_Weights'          }      {'conv_4'    }           "Weights"                -0.045967         0.051
    {'conv_4_Bias'             }      {'conv_4'    }           "Bias"                    -0.00164     0.0037892
    {'fc_1_Weights'            }      {'fc_1'      }           "Weights"                -0.051394      0.054344
    {'fc_1_Bias'               }      {'fc_1'      }           "Bias"                 -0.00052319    0.00084454
    {'fc_2_Weights'            }      {'fc_2'      }           "Weights"                 -0.05016      0.051557
    {'fc_2_Bias'               }      {'fc_2'      }           "Bias"                  -0.0017564     0.0018502
    {'fc_3_Weights'            }      {'fc_3'      }           "Weights"                -0.050706       0.04678
    {'fc_3_Bias'               }      {'fc_3'      }           "Bias"                    -0.02951      0.024855
    {'imageinput'              }      {'imageinput'}           "Activations"                    0           255
    {'imageinput_normalization'}      {'imageinput'}           "Activations"              -139.34        198.11
      ⋮

Создайте целевой объект

Создайте целевой объект с пользовательским именем для вашего целевого устройства и интерфейса, чтобы соединить ваше целевое устройство к хосту - компьютеру. Интерфейсные опции являются JTAG и Ethernet. Чтобы использовать JTAG, установите Набор Проекта Xilinx™ Vivado™ 2020.1. Установить Xilinx Vivado toolpath, введите:

% hdlsetuptoolpath('ToolName', 'Xilinx Vivado', 'ToolPath', 'C:\Xilinx\Vivado\2020.1\bin\vivado.bat');

Создать целевой объект, введите:

hTarget = dlhdl.Target('Xilinx','Interface','Ethernet');

В качестве альтернативы можно также использовать интерфейс JTAG.

% hTarget = dlhdl.Target('Xilinx', 'Interface', 'JTAG');

Создайте dlQuantizationOptions Объект

Создайте dlquantizationOptions объект. Задайте целевой поток битов и интерфейс требуемой платы. Метрическая функция по умолчанию является Лучшей 1 метрической функцией точности.

options_FPGA = dlquantizationOptions('Bitstream','zcu102_int8','Target',hTarget);
options_simulation = dlquantizationOptions;

Чтобы использовать пользовательскую метрическую функцию, задайте метрическую функцию в dlquantizationOptions объект.

% options_FPGA = dlquantizationOptions('MetricFcn',{@(x)hComputeAccuracy(x, snet, validationData_FPGA)},'Bitstream','zcu102_int8','Target',hTarget);
% options_simulation = dlquantizationOptions('MetricFcn',{@(x)hComputeAccuracy(x, snet,validationData_simulation)})

Проверьте квантованную сеть

Используйте validate функция, чтобы квантовать настраиваемые параметры в слоях свертки сети. The validate функция симулирует квантованную сеть в MATLAB. validate функционируйте использует метрическую функцию, заданную в dlquantizationOptions объект сравнить результаты одного сетевого объекта типа данных к результатам квантованного сетевого объекта.

prediction_simulation = dlQuantObj_simulation.validate(validationData_simulation,options_simulation)
### Notice: (Layer  1) The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer  2) The layer 'out_imageinput' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software.
Compiling leg: conv_1>>maxpool_4 ...
### Notice: (Layer  1) The layer 'imageinput' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer 14) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software.
Compiling leg: conv_1>>maxpool_4 ... complete.
Compiling leg: fc_1>>fc_3 ...
### Notice: (Layer  1) The layer 'maxpool_4' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer  7) The layer 'output' with type 'nnet.cnn.layer.RegressionOutputLayer' is implemented in software.
Compiling leg: fc_1>>fc_3 ... complete.
### Should not enter here. It means a component is unaccounted for in MATLAB Emulation.
### Notice: (Layer  1) The layer 'fc_3' with type 'nnet.cnn.layer.ImageInputLayer' is implemented in software.
### Notice: (Layer  2) The layer 'softmax' with type 'nnet.cnn.layer.SoftmaxLayer' is implemented in software.
### Notice: (Layer  3) The layer 'classoutput' with type 'nnet.cnn.layer.ClassificationOutputLayer' is implemented in software.
prediction_simulation = struct with fields:
       NumSamples: 5
    MetricResults: [1×1 struct]

Для основанной на FPGA валидации, validate функционируйте использует выход функции компиляции, чтобы программировать плату FPGA при помощи файла программирования. Это также загружает сетевые веса и смещения. validate функционируйте использует метрическую функцию, заданную в dlquantizationOptions объект сравнить результаты сети до и после квантования.

prediction_FPGA = dlQuantObj_FPGA.validate(validationData_FPGA,options_FPGA)
### Compiling network for Deep Learning FPGA prototyping ...
### Targeting FPGA bitstream zcu102_int8 ...
### The network includes the following layers:

     1   'imageinput'    Image Input             227×227×3 images with 'zerocenter' normalization and 'randfliplr' augmentations  (SW Layer)
     2   'conv_1'        Convolution             96 5×5×3 convolutions with stride [1  1] and padding [0  0  0  0]                (HW Layer)
     3   'relu_1'        ReLU                    ReLU                                                                             (HW Layer)
     4   'maxpool_1'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
     5   'conv_2'        Convolution             128 3×3×96 convolutions with stride [1  1] and padding [0  0  0  0]              (HW Layer)
     6   'relu_2'        ReLU                    ReLU                                                                             (HW Layer)
     7   'maxpool_2'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
     8   'conv_3'        Convolution             384 3×3×128 convolutions with stride [1  1] and padding [0  0  0  0]             (HW Layer)
     9   'relu_3'        ReLU                    ReLU                                                                             (HW Layer)
    10   'maxpool_3'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
    11   'conv_4'        Convolution             128 3×3×384 convolutions with stride [2  2] and padding [0  0  0  0]             (HW Layer)
    12   'relu_4'        ReLU                    ReLU                                                                             (HW Layer)
    13   'maxpool_4'     Max Pooling             3×3 max pooling with stride [2  2] and padding [0  0  0  0]                      (HW Layer)
    14   'fc_1'          Fully Connected         2048 fully connected layer                                                       (HW Layer)
    15   'relu_5'        ReLU                    ReLU                                                                             (HW Layer)
    16   'dropout_1'     Dropout                 50% dropout                                                                      (HW Layer)
    17   'fc_2'          Fully Connected         2048 fully connected layer                                                       (HW Layer)
    18   'relu_6'        ReLU                    ReLU                                                                             (HW Layer)
    19   'dropout_2'     Dropout                 50% dropout                                                                      (HW Layer)
    20   'fc_3'          Fully Connected         32 fully connected layer                                                         (HW Layer)
    21   'softmax'       Softmax                 softmax                                                                          (SW Layer)
    22   'classoutput'   Classification Output   crossentropyex with 'adidas' and 31 other classes                                (SW Layer)

3 Memory Regions created.

Skipping: imageinput
Compiling leg: conv_1>>maxpool_4 ...
Compiling leg: conv_1>>maxpool_4 ... complete.
Compiling leg: fc_1>>fc_3 ...
Compiling leg: fc_1>>fc_3 ... complete.
Skipping: softmax
Skipping: classoutput
Creating Schedule...
.........
Creating Schedule...complete.
Creating Status Table...
........
Creating Status Table...complete.
Emitting Schedule...
......
Emitting Schedule...complete.
Emitting Status Table...
..........
Emitting Status Table...complete.

### Allocating external memory buffers:

          offset_name          offset_address     allocated_space 
    _______________________    ______________    _________________

    "InputDataOffset"           "0x00000000"     "48.0 MB"        
    "OutputResultOffset"        "0x03000000"     "4.0 MB"         
    "SchedulerDataOffset"       "0x03400000"     "4.0 MB"         
    "SystemBufferOffset"        "0x03800000"     "60.0 MB"        
    "InstructionDataOffset"     "0x07400000"     "8.0 MB"         
    "ConvWeightDataOffset"      "0x07c00000"     "12.0 MB"        
    "FCWeightDataOffset"        "0x08800000"     "12.0 MB"        
    "EndOffset"                 "0x09400000"     "Total: 148.0 MB"

### Network compilation complete.

### FPGA bitstream programming has been skipped as the same bitstream is already loaded on the target FPGA.
### Deep learning network programming has been skipped as the same network is already loaded on the target FPGA.
### Finished writing input activations.
### Running single input activations.


              Deep Learning Processor Profiler Performance Results

                   LastFrameLatency(cycles)   LastFrameLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                   12722978                  0.05783                       1           12722978             17.3
    conv_1                 3437086                  0.01562 
    maxpool_1              1296014                  0.00589 
    conv_2                 2813632                  0.01279 
    maxpool_2               477861                  0.00217 
    conv_3                 2462903                  0.01120 
    maxpool_3               535330                  0.00243 
    conv_4                  504820                  0.00229 
    maxpool_4                 8965                  0.00004 
    fc_1                    687629                  0.00313 
    fc_2                    439923                  0.00200 
    fc_3                     58721                  0.00027 
 * The clock frequency of the DL processor is: 220MHz
prediction_FPGA = struct with fields:
             NumSamples: 1
          MetricResults: [1×1 struct]
    QuantizedNetworkFPS: 17.2915

Просмотрите эффективность квантованной нейронной сети

Исследуйте MetricResults.Result поле валидации выход, чтобы видеть эффективность квантованной сети.

prediction_simulation.MetricResults.Result
ans=2×2 table
    NetworkImplementation    MetricOutput
    _____________________    ____________

     {'Floating-Point'}           1      
     {'Quantized'     }           1      

prediction_FPGA.MetricResults.Result
ans=2×2 table
    NetworkImplementation    MetricOutput
    _____________________    ____________

     {'Floating-Point'}           1      
     {'Quantized'     }           1      

Исследуйте QuantizedNetworkFPS поле валидации выход, чтобы видеть эффективность кадров в секунду квантованной сети.

prediction_FPGA.QuantizedNetworkFPS
ans = 17.2915

Смотрите также