title: A CNN framework accelerated by an FPGA in synthesized C
title: Ένα πλαίσιο συνελικτικού νευρωνικού δικτύου επιταχυνόμενο από μια συστοιχία επιτόπια προγραμματιζόμενων πυλών σε συνθέσιμη C
Creators: name: Χατζηδακη Ελευθερια
Publisher: name: Technical University of Crete
Year: 2019

description: These days, Convolutional Neural Networks are popular for image classification and recognition. We prefer to utilize them because they achieve high accuracy by exploiting the inherent properties of images. A major disadvantage of CNN is that they perform many and complex calculations that cost a lot of time, energy and resources. The best solution that we can suggest is to take advantage of the properties of Field Programmable Gate Arrays. FPGAs are specialized in the acceleration of calculations and they consume less energy than Graphics Processing Units or Central Processing Units. 
We introduce a framework written in C++ that can adopt FPGA kernels to accelerate calculations as matrix multiplications. We connected an available matrix multiplication with addition implementation to the framework and we tested it on a Trenz Platform. Apart from that, we implemented a fast and cache-aware framework applying OpenMP, GCC option flags, OpenMP environment variables and features from C++17.  Our CNN framework is tested on a LeNet-5 architecture using the MNIST dataset containing L1, L2 Regularizations, Vanilla, Momentum, Momentum with Nesterov Updates, He-et-al weight initialization, Fisher-Yates shuffle, Stochastic Gradient Descent techniques that are all implemented from scratch. Furthermore, we implemented 3 ways of load MNIST dataset, as well as, naive, cache blocking, OpenMP and Hybrid cache blocking with OpenMP in matrix multiplication, transpose and copy algorithms, that we tested and investigated their behavior among the mini-batch sizes and the number of used threads. 
Besides all the aforementioned that was made from scratch, we used the Xilinx Vivado SDK to make a bare-metal C++ project with the appropriate cache size linker script and adjusted the matrix multiplication with addition code to our framework. Afterwards, we programmed the Trenz Platform that contains an ARM CPU and an FPGA accelerator. As a result, we achieved a 4.3x-8.5x better performance using an FPGA to accelerate matrix multiplication with addition than using a naive or a cache blocking single thread implementations and in specific unfair(lack of multi-threading on Trenz) cases, depending on the mini-batch size of multi-threading OpenMP(up to 1.27x) or Hybrid algorithms(up to 2.27x) on a CPU.
description: Σήμερα, τα Συνελικτικά Νευρωνικά Δίκτυα(CNN) είναι γνωστά για την αναγνώριση και ταξινόμηση εικόνων. Προτιμούμε να τα χρησιμοποιούμε, λόγω το ότι επιτυγχάνουν υψηλή ακρίβεια, εκμεταλλευόμενα τις εγγενείς ιδιότητες των εικόνων. Ένα σημαντικό μειονέκτημα των Συνελικτικών Νευρωνικών Δικτύων είναι ότι εκτελούν πολλούς και πολύπλοκους υπολογισμούς, οι οποίοι απαιτούν χρόνο, ενεργειακή κατανάλωση και πόρους. Η καλύτερη λύση που μπορούμε να προτείνουμε είναι να εκμεταλλευτούμε τις ιδιότητες μιας συστοιχίας επιτόπια προγραμματιζόμενων πυλών(FPGA). Οι συστοιχίες επιτόπια προγραμματιζόμενων πυλών ειδικεύονται στην επιτάχυνση των πράξεων και καταναλώνουν λιγότερη ενέργεια από μια μονάδα επεξεργασίας γραφικών(GPU) ή μια κεντρική μονάδα επεξεργασίας(CPU).
Προτείνουμε ένα πλαίσιο γραμμένο σε C++ στο οποίο μπορούν να προσαρμοστούν μονάδες συστοιχίας επιτόπια προγραμματιζόμενων πυλών και να επιταχύνει τους υπολογισμούς, όπως τους πολλαπλασιασμούς πινάκων. Συνδέσαμε μια διαθέσιμη μονάδα πολλαπλασιασμού πινάκων με πρόσθεση στο πλαίσιο και το δοκιμάσαμε σε μια πλατφόρμα Trenz. Εκτός από αυτό, υλοποιήσαμε ένα πλαίσιο γρήγορης απόδοσης με επίγνωση μνήμης, που χρησιμοποιεί OpenMP, GCC επιλογές παραμέτρων, επιλογές παραμέτρων περιβάλλοντος OpenMP και δυνατότητες από την έκδοση της C ++ 17. Το πλαίσιο Συνελικτικών Νευρωνικών Δικτύων μας δοκιμάστηκε σε αρχιτεκτονική LeNet-5 χρησιμοποιώντας το MNIST σύνολο δεδομένων και περιλαμβάνει L1, L2 κανονικοποιήσεις βαρών, Vanilla, Momentum, Momentum with Nesterov ενημερώσεις βαρών, He-et-al αρχικοποίηση βαρών, Fisher-Yates ανακατάταξη εικόνων, Στοχαστική Ελάττωση της Παραγώγου, τεχνικές οι οποίες είναι όλες υλοποιημένες από την αρχή. Επιπρόσθετα, υλοποιήθηκαν 3 τρόποι φόρτωσης του συνόλου δεδομένων MNIST στη μνήμη, καθώς επίσης αλγόριθμοι απλής υλοποίησης, ομαδοποίησης μνήμης, OpenMP, Υβριδική υλοποίηση ομαδοποίησης μνήμης με OpenMP για πολλαπλασιασμό πινάκων, μετάθεσης και αντιγραφής, οι οποίοι δοκιμάστηκαν και παρατηρήθηκαν οι συμπεριφορές τους χρησιμοποιώντας διάφορα μεγέθη μικρο-πακέτων και νημάτων προς χρήση.

Εκτός από όλα τα παραπάνω που έγιναν από το μηδέν, χρησιμοποιήσαμε το εργαλείο Xilinx Vivado SDK για να δημιουργήσουμε ένα πρόγραμμα C χωρίς λειτουργικό, με τις κατάλληλες παραμετροποιήσεις στα συνδετικά αρχεία μνήμης και προσαρμόσαμε τον κώδικα του πολλαπλασιασμού πινάκων με πρόσθεση, στο πλαίσιο μας. Έπειτα, προγραμματίσαμε την πλατφόρμα Trenz που περιλαμβάνει μια ARM κεντρική μονάδα επεξεργασίας και ένα επιταχυντή συστοιχίας επιτόπια προγραμματιζόμενων πυλών. Σαν αποτέλεσμα, επιτύχαμε 4.3x-8.5x καλύτερη απόδοση χρησιμοποιώντας την υλοποίηση του πολλαπλασιασμού πινάκων με πρόσθεση, στη συστοιχία επιτόπια προγραμματιζόμενων πυλών απ’ ότι στον αλγόριθμο απλής υλοποίησης ή ομαδοποίησης μνήμης σε ένα νήμα, και σε κάποιες («άδικες» - λόγω του ότι δεν είχαμε χρήση πολλαπλών νημάτων στην πλατφόρμα Trenz) περιπτώσεις, ανάλογα με το μέγεθος των μικρο-πακέτων σε πολλαπλά νήματα, στην OMP(up to 1.27x) ή στον υβριδικό αλγόριθμο (up to 2.27x) στην κεντρική μονάδα επεξεργασίας.