Настройте строение Bitstream, чтобы соответствовать требованиям к использованию ресурсов

Пользователь хочет развернуть сеть распознавания цифр с целевой эффективностью 500 систем координат в секунду (FPS) на устройстве Xilinx ZCU102 ZU4CG. Счетчики ресурсов целевого устройства:

  • Количество срезов на цифровом сигнальном процессоре (DSP) - 240

  • Блокируйте счетчик памяти с произвольным доступом (BRAM) -128

Ссылка (доставка) zcu102_int8 bitstream строения предназначен для устройства Xilinx ZCU102 ZU9EG. Счетчики ресурсов платы по умолчанию:

  • Количество срезов цифрового процессора сигналов (DSP) - 2520

  • Блокируйте счетчик памяти с произвольным доступом (BRAM) -912

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

В этом примере создайте пользовательское строение битового потока, которая будет соответствовать вашему бюджету ресурсов и требованиям к эффективности.

Необходимые условия

  • Пакет поддержки Deep Learning HDL Toolbox™ для Xilinx FPGA и SoC

  • Deep Learning Toolbox™

  • Deep Learning HDL Toolbox™

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

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

Для загрузки предварительно обученной последовательной сети, которая была обучена базе данных Модифицированного национального института стандартов технологии (MNIST), введите:

snet = getDigitsNetwork;

Квантование сети

Для квантования сети цифр на основе MNIST введите:

dlquantObj = dlquantizer(snet,'ExecutionEnvironment','FPGA');
Image = imageDatastore('five_28x28.pgm','Labels','five');
dlquantObj.calibrate(Image)
ans=21×5 table
        Optimized Layer Name        Network Layer Name    Learnables / Activations    MinValue     MaxValue
    ____________________________    __________________    ________________________    _________    ________

    {'conv_1_Weights'          }     {'batchnorm_1'}           "Weights"              -0.017061    0.013648
    {'conv_1_Bias'             }     {'batchnorm_1'}           "Bias"                 -0.025344    0.058799
    {'conv_2_Weights'          }     {'batchnorm_2'}           "Weights"               -0.54744     0.51019
    {'conv_2_Bias'             }     {'batchnorm_2'}           "Bias"                   -1.1787      1.0515
    {'conv_3_Weights'          }     {'batchnorm_3'}           "Weights"               -0.39927     0.44173
    {'conv_3_Bias'             }     {'batchnorm_3'}           "Bias"                  -0.85118      1.1321
    {'fc_Weights'              }     {'fc'         }           "Weights"               -0.22558     0.29637
    {'fc_Bias'                 }     {'fc'         }           "Bias"                 -0.011837    0.016848
    {'imageinput'              }     {'imageinput' }           "Activations"                  0         255
    {'imageinput_normalization'}     {'imageinput' }           "Activations"            -22.566      232.43
    {'conv_1'                  }     {'batchnorm_1'}           "Activations"            -7.9196      6.7861
    {'relu_1'                  }     {'relu_1'     }           "Activations"                  0      6.7861
    {'maxpool_1'               }     {'maxpool_1'  }           "Activations"                  0      6.7861
    {'conv_2'                  }     {'batchnorm_2'}           "Activations"            -8.4641      7.2347
    {'relu_2'                  }     {'relu_2'     }           "Activations"                  0      7.2347
    {'maxpool_2'               }     {'maxpool_2'  }           "Activations"                  0      7.2347
      ⋮

Извлечение zcu102_int Bitstream Configuration

Как извлечь zcu102_int8 bitstream строения, используйте dlhdl.ProcessorConfig объект. Для получения дополнительной информации смотрите dlhdl.ProcessorConfig. Чтобы узнать об изменяемых параметрах строения процессора, смотрите getModuleProperty и setModuleProperty.

hPC_reference = dlhdl.ProcessorConfig('Bitstream','zcu102_int8')
hPC_reference = 
                    Processing Module "conv"
                            ConvThreadNumber: 64
                             InputMemorySize: [227  227    3]
                            OutputMemorySize: [227  227    3]
                            FeatureSizeLimit: 2048
                              KernelDataType: 'int8'

                      Processing Module "fc"
                              FCThreadNumber: 16
                             InputMemorySize: 25088
                            OutputMemorySize: 4096
                              KernelDataType: 'int8'

                   Processing Module "adder"
                             InputMemorySize: 40
                            OutputMemorySize: 40
                              KernelDataType: 'int8'

                     System Level Properties
                              TargetPlatform: 'Xilinx Zynq UltraScale+ MPSoC ZCU102 Evaluation Kit'
                             TargetFrequency: 250
                               SynthesisTool: 'Xilinx Vivado'
                             ReferenceDesign: 'AXI-Stream DDR Memory Access : 3-AXIM'
                     SynthesisToolChipFamily: 'Zynq UltraScale+'
                     SynthesisToolDeviceName: 'xczu9eg-ffvb1156-2-e'
                    SynthesisToolPackageName: ''
                     SynthesisToolSpeedValue: ''

Оценка эффективности сети и использования ресурсов для zcu102_int8 Битовый поток Строения

Чтобы оценить эффективность сети серий цифр, используйте estimatePerformance функция dlhdl.ProcessorConfig объект. Функция возвращает предполагаемую задержку слоя, сетевую задержку и эффективность сети в системах координат в секунду (кадры/с).

Оценка использования ресурсов zcu102_int8 битовый поток ,использовать estimateResourcesфункция dlhdl.ProcessorConfig объект. Функция возвращает предполагаемый срез DSP и использование BRAM.

hPC_reference.estimatePerformance(dlquantObj)
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer'
3 Memory Regions created.



              Deep Learning Processor Estimator Performance Results

                   LastFrameLatency(cycles)   LastFrameLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                      57955                  0.00023                       1              57955           4313.7
    ____conv_1                4391                  0.00002 
    ____maxpool_1             2877                  0.00001 
    ____conv_2                2351                  0.00001 
    ____maxpool_2             2265                  0.00001 
    ____conv_3                2507                  0.00001 
    ____fc                   43564                  0.00017 
 * The clock frequency of the DL processor is: 250MHz
hPC_reference.estimateResources
              Deep Learning Processor Estimator Resource Results

                             DSPs          Block RAM*     
                        -------------    -------------    
DL_Processor                     768              386 		 
    conv_module                  647              315 		 
    fc_module                     97               50 		 
    adder_module                  24               12 		 
    debug_module                   0                8 		 
    sched_module                   0                1 		 
* Block RAM represents Block RAM tiles in Xilinx devices and Block RAM bits in Intel devices

Предполагаемая эффективность составляет 4314 FPS, и предполагаемое количество использования ресурсов:

  • Количество срезов на цифровом сигнальном процессоре (DSP) - 768

  • Блокируйте счетчик памяти с произвольным доступом (BRAM) -386

Предполагаемое количество срезов DSP и использование BRAM превышает целевой бюджет ресурсов устройства. Настройте строение битового потока, чтобы уменьшить использование ресурсов.

Создайте пользовательское строение битового потока

Чтобы создать пользовательское строение процессора, используйте dlhdl.ProcessorConfig объект. Для получения дополнительной информации смотрите dlhdl.ProcessorConfig. Чтобы узнать об изменяемых параметрах строения процессора, смотрите getModuleProperty и setModuleProperty.

Чтобы уменьшить использование ресурса для пользовательского битового потока, измените KernelDataType для conv, fc, and модули сумматора. Измените ConvThreadNumber чтобы уменьшить количество срезов DSP . Reduce the InputMemorySizeи OutputMemorySize для conv модуль для уменьшения счетчика BRAM.

hPC_custom = dlhdl.ProcessorConfig;
hPC_custom.setModuleProperty('conv','KernelDataType','int8');
hPC_custom.setModuleProperty('fc','KernelDataType','int8');
hPC_custom.setModuleProperty('adder','KernelDataType','int8');
hPC_custom.setModuleProperty('conv','ConvThreadNumber',4);
hPC_custom.setModuleProperty('conv','InputMemorySize',[30 30 1]);
hPC_custom.setModuleProperty('conv','OutputMemorySize',[30 30 1]);
hPC_custom
hPC_custom = 
                    Processing Module "conv"
                            ConvThreadNumber: 4
                             InputMemorySize: [30  30   1]
                            OutputMemorySize: [30  30   1]
                            FeatureSizeLimit: 2048
                              KernelDataType: 'int8'

                      Processing Module "fc"
                              FCThreadNumber: 4
                             InputMemorySize: 25088
                            OutputMemorySize: 4096
                              KernelDataType: 'int8'

                   Processing Module "adder"
                             InputMemorySize: 40
                            OutputMemorySize: 40
                              KernelDataType: 'int8'

                     System Level Properties
                              TargetPlatform: 'Xilinx Zynq UltraScale+ MPSoC ZCU102 Evaluation Kit'
                             TargetFrequency: 200
                               SynthesisTool: 'Xilinx Vivado'
                             ReferenceDesign: 'AXI-Stream DDR Memory Access : 3-AXIM'
                     SynthesisToolChipFamily: 'Zynq UltraScale+'
                     SynthesisToolDeviceName: 'xczu9eg-ffvb1156-2-e'
                    SynthesisToolPackageName: ''
                     SynthesisToolSpeedValue: ''

Оценка эффективности сети и использования ресурсов для пользовательского строения битового потока

Чтобы оценить эффективность сети серий цифр, используйте estimatePerformance функция dlhdl.ProcessorConfig объект. Функция возвращает предполагаемую задержку слоя, сетевую задержку и эффективность сети в системах координат в секунду (кадры/с).

Оценка использования ресурсов hPC_custom битовый поток ,использовать estimateResourcesфункция dlhdl.ProcessorConfig объект. Функция возвращает предполагаемый срез DSP и использование BRAM.

hPC_custom.estimatePerformance(dlquantObj)
### Optimizing series network: Fused 'nnet.cnn.layer.BatchNormalizationLayer' into 'nnet.cnn.layer.Convolution2DLayer'
3 Memory Regions created.



              Deep Learning Processor Estimator Performance Results

                   LastFrameLatency(cycles)   LastFrameLatency(seconds)       FramesNum      Total Latency     Frames/s
                         -------------             -------------              ---------        ---------       ---------
Network                     348511                  0.00174                       1             348511            573.9
    ____conv_1               27250                  0.00014 
    ____maxpool_1            42337                  0.00021 
    ____conv_2               45869                  0.00023 
    ____maxpool_2            68153                  0.00034 
    ____conv_3              121493                  0.00061 
    ____fc                   43409                  0.00022 
 * The clock frequency of the DL processor is: 200MHz
hPC_custom.estimateResources
              Deep Learning Processor Estimator Resource Results

                             DSPs          Block RAM*     
                        -------------    -------------    
DL_Processor                     120              108 		 
    conv_module                   89               63 		 
    fc_module                     25               33 		 
    adder_module                   6                3 		 
    debug_module                   0                8 		 
    sched_module                   0                1 		 
* Block RAM represents Block RAM tiles in Xilinx devices and Block RAM bits in Intel devices

Предполагаемая эффективность составляет 574 FPS, а предполагаемое количество использования ресурсов:

  • Количество срезов цифрового процессора сигналов (DSP) - 120

  • Блокируйте счетчик памяти с произвольным доступом (BRAM) -108

Предполагаемые ресурсы настраиваемого потока битов совпадают с бюджетом ресурса целевого устройства, а предполагаемая эффективность соответствует эффективности целевой сети.