FC2カウンター FPGAの部屋 「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化8(浮動小数点数)

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化8(浮動小数点数)

「ゼロから作るDeep Learning」の2層ニューラルネットワークのハードウェア化7(指示子を入れる2)”の続き。

前回は、使いそうなインターフェース指示子を入れてみた。入力はAXI4-Stream で出力は、AXI4-Lite だった。今回は、内部の処理を浮動小数点数で処理することで、どのくらいリソースを消費するのか確かめてみよう。

まずは、プロジェクトを新規作成して、mnist_nn_float とした。
nn_fpga_ch5_50_170612.png

mnist_nn_float.cpp を示す。

// mnist_nn.cpp
// 2017/06/01 by marsee
//

#include <stdio.h>
#include <ap_fixed.h>

#include "af1_weight.h"
#include "af1_bias.h"
#include "af2_weight.h"
#include "af2_bias.h"

int mnist_nn(ap_ufixed<80, AP_TRN_ZERO, AP_SAT> in[784], ap_fixed<135, AP_TRN_ZERO, AP_SAT> out[10]){
#pragma HLS INTERFACE s_axilite port=out
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both port=in
    float buf[784];
    float dot1[50];
    float dot2[10];

    buf_copy: for(int i=0; i<784; i++)
        buf[i] = (float)in[i];

    af1_dot1: for(int col=0; col<50; col++){
        dot1[col] = 0;
        af1_dot2: for(int row=0; row<784; row++){
            dot1[col] += buf[row]*af1_fweight[row][col];
        }
        dot1[col] += af1_fbias[col];

        if(dot1[col] < 0)    // ReLU
            dot1[col] = 0;
    }

    af2_dot1: for(int col=0; col<10; col++){
        dot2[col] = 0;
        af2_dot2: for(int row=0; row<50; row++){
            dot2[col] += dot1[row]*af2_fweight[row][col];
        }
        dot2[col] += af2_fbias[col];

        if(dot2[col] < 0)    // ReLU
            dot2[col] = 0;
        out[col] = (ap_fixed<135, AP_TRN_ZERO, AP_SAT>)dot2[col];
    }

    return(0);
}


C コードの合成を行った。
nn_fpga_ch5_51_170612.png

レイテンシは444409 クロックで、クロックが100 MHz の時は、4.44 ms の処理時間だ。これでも問題ない。
リソースはBRAM_18K が 135 個で 48 % 消費している。DSP48E が 4 個になった。FF も LUT も固定小数点数の時よりは増えているが、それぞれ 2 % と 8 % でまだまだ余裕がある。
浮動小数点数演算にしてもPYNQ に入るのがびっくりした。なお、浮動小数点数になったことで、配列でメモリを取るとメモリ・オーバーフローになってしまうので、シミュレーションの結果は出ていない。配列から malloc() でメモリを確保することに変更すればシミュレーションできると思う。

最後にAnalysis 画面を貼っておく。
nn_fpga_ch5_52_170612.png
  1. 2017年06月12日 04:04 |
  2. DLNN
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3828-a64e7348
この記事にトラックバックする(FC2ブログユーザー)