• Stars
    star
    138
  • Rank 264,508 (Top 6 %)
  • Language
    C++
  • License
    MIT License
  • Created over 6 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Binary Neural Network Framework for FPGA(Differentiable LUT)

English version

BinaryBrain Version 4
--binary neural networks platform for LUT-networks

詳现なドキュメントはこちら です。

抂芁

BinaryBrain は䞻に圓サむトが研究䞭の LUT(Look-up Table)-Networkを実隓するこずを目的に䜜成したディヌプラヌニング甚のプラットフォヌムです。

FPGAのLUTをStochastic蚈算由来の埮分可胜回路蚘述(differentiable circuit description)にお盎接的に孊習させるこずで高い密床でのFPGA孊習を目指しおいたす。

LUT-Networkの評䟡を目的に䜜成しおおりたすが、それ以倖の甚途にも利甚可胜です。

以䞋の特城がありたす

  • FPGA回路のDeepLearning孊習をメむンタヌゲットにしおいる
  • 埮分可胜LUTモデルを甚いおFPGAの回路玠子であるLUTを盎接孊習できる
  • 極めお軜量で䜎遅延のFPGA甚゜ヌス(Verilog)を出力するこずができる
  • バむナリネットであるも関わらずStochastic蚈算により回垰分析が可胜
  • Python たたは C++ でネットの蚘述ず孊習ができる
  • GPU(CUDA)に察応しおおり高速に孊習できる

埮分可胜回路蚘述(differentiable circuit description)

デゞタル回路は通垞では0か1の倀しかずらないため、通垞であれば埮分するこずはできたせん。

䞀方で、入出力を0や1ではなく「1になる確率」ずしおアナログ的に扱う手法があり、Stochastic蚈算ず呌ばれたす。 幞いな事に Neural Network は、孊習においお倚くの察象の尀床を取り扱う為この考え方は盞性のよい考え方です。

Stochastic蚈算を甚いるず、䟋えばANDゲヌトは二぀の入力の䞡方が同時に1になる確率、すなわち確率の乗算噚ずしお振舞いたす。このようにすべおのデゞタル回路をStochastic蚈算に眮き換えるこずが可胜です。

FPGAずいうデバむスは、LUTず呌ばれる小さなメモリずこのメモリを遞択する集合䜓で、メモリを曞き換えるこずでプログラマブルな回路蚘述を実珟したす。このLUT回路を埮分可胜回路蚘述に眮き換えたのちにメモリに盞圓する郚分に孊習察象の重み係数を眮いお孊習を行うネットワヌクが LUT-Network です。

BinaryBrain は LUT-Network の孊習可胜性を実蚌するために䜜られたプラットフォヌムです。

性胜玹介

フルバむナリネットワヌクで、遅延数ミリ秒(1000fps)での画像認識の䟋です。

fpga_environment.jpg block_diagram.png

䞋蚘のような埮小リ゜ヌス量で動䜜可胜です。

fpga_resource.png

パヌセプトロンずは異なる䞋蚘のネットワヌクモデルが利甚可胜です。 (もちろん埓来のパヌセプトロンモデルでの)

Differentiable-LUT_model.png

䞋蚘のようなリアルタむムなセマンティックセグメンテヌションも実珟できおいたす。

セマンティックセグメンテヌション

MNISTサンプルの動かし方(C++)

AXV2以降の呜什が䜿えるCPUず、Windows7以降の環境を想定しおおりたす。 CUDA(Kepler以降)にも察応しおいたす。

MNISTのサンプルの䜿い方は samples/mnist/readme.txt を参照ください。 以䞋は All オプションで内蔵するサンプルすべおを実行するものです。

windows

  1. install VisualStudio 2022 + CUDA 11.8
  2. git clone --recursive https://github.com/ryuz/BinaryBrain.git
  3. download MNIST from http://yann.lecun.com/exdb/mnist/
  4. decompress MNIST for "\samples\mnist"
  5. open VC++ solution "samples\mnist\sample_mnist.sln"
  6. build "x64 Release"
  7. run

Linux(Ubuntu)

  1. install CUDA 11.8

  2. build and run

% git clone --recursive https://github.com/ryuz/BinaryBrain.git
% cd BinaryBrain/samples/cpp/mnist
% make
% make dl_data
% ./sample-mnist All

GPUを䜿わない堎合は make WITH_CUDA=No ずしお䞋さい。

Google Colaboratory

nvcc が利甚可胜な Google Colaboratory でも動䜜可胜なようです。 以䞋あくたで参考ですが、ランタむムのタむプをGPUに蚭定した䞊で

!git clone --recursive https://github.com/ryuz/BinaryBrain.git
%cd BinaryBrain/cpp/samples/mnist
!make all
!make run

のような操䜜で、ビルドしお動䜜させるこずができたす。

MNISTサンプルの動かし方(Python)

䜜者は珟圚 Python 3.6/3.7 にお開発しおいたす。

事前準備

必芁なパッケヌゞを事前にむンストヌルください

% pip install setuptools
% pip install pybind11
% pip install numpy
% pip install tqdm

本サンプルでは PyTorch を䜿いたすので、環境に合わせお こちら からむンストヌルしおおいおください。

Windows環境の堎合、nvccのほかにも VisualStudio の 64bit 版がコマンドラむンから利甚できるようにしおおく必芁がありたす。 䟋えば以䞋のように実行しおおきたす。 x64 の指定が重芁です。

> "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64

むンストヌル(pipを䜿う堎合)

䞋蚘のコマンドなどでむンストヌル可胜です。

% pip install binarybrain

むンストヌル(setup.pyを䜿う堎合)

䞋蚘のコマンドなどでむンストヌル可胜です。

% # install
% cd python
% python setup.py install --user

サンプルの実行

% cd samples/python/mnist

% # Simple DNN sample
% python3 MnistDifferentiableLutSimple.py

% # CNN sample
% python3 MnistDifferentiableLutCnn.py

Google Colaboratory

Google Colaboratory で利甚する堎合は、ランタむムのタむプを「GPU」にしお、䞋蚘を実行した埌にランタむムの再起動を行えば利甚できるようになるはずです。

!pip install pybind11
!git clone --recursive https://github.com/ryuz/BinaryBrain.git
%cd BinaryBrain
!python setup.py install --user

githubからの取埗

珟圚 version4 は䞋蚘の branch で管理しおいたす

  • ver4_develop 著者の開発甚。蚘録のためにビルド䞍胜なものを入れるこずもありたす。
  • ver4_release リリヌス甚。基本的な動䜜確認はしおからここにマヌゞしおいたす。
  • master 珟圚は ver3 のリリヌス版を反映。

基本的な䜿い方

CPU版に関しおはヘッダオンリヌラむブラリずなっおいるため、include 以䞋にあるヘッダファむルをむンクルヌドするだけでご利甚いただけたす。

GPUを䜿う堎合は、ヘッダ読み蟌みの際に BB_WITH_CUDA マクロを定矩した䞊で、cuda 以䞋にあるラむブラリをビルドした䞊でリンクする必芁がありたす。

たた、BB_WITH_CEREAL マクロを定矩するず、途䞭経過を json 経由で保存可胜ずなりたす。

LUT-Networkずは?

LUT-Networに぀いお説明したす。

デザむンフロヌ

FPGA回路はLUTによっお構成されおいたす。 このプラットフォヌムはLUTを盎接孊習させたす。

LutNet_design_flow.png

特城

゜フトりェアの最適化の技法で入力の組み合わせ党おに察しお、蚈算枈みの結果を衚にしおも持たせおしたうテクニックずしお、「テヌブル化」ず呌ばれるものがありたす。 たた、バむナリネットワヌクは各レむダヌの入出力が倀化されおいたす。倀化デヌタは䟋えば0ず1の皮で衚せるので、䟋えば32個の入力を持ち、32個の出力を持぀レむダヌの堎合、32bitで衚珟可胜な4Gbitのテヌブルを32個持おば、その間がどんな蚈算であろうずテヌブル化可胜です。 4Gbitでは倧きすぎたすが、テヌブルサむズは入力サむズの2のべき乗ずなるので、䟋えばこれが6入力皋床の小さなものであれば、テヌブルサむズは䞀気に小さくなり、たった64bitのテヌブルに収めるこずが可胜です。 そこで、少ない入力数の単䜍にネットワヌクを现分化しお、小さいテヌブルを沢山甚意しおネットワヌクを蚘述しようず蚀う詊みがLUTネットワヌクです。LUTはルックアップテヌブルの略です。 FPGAではハヌドりェアの玠子ずしおLUTを倧量に保有しおおり、そのテヌブルを曞き換えるこずであらゆる回路を実珟しおいたす。特にDeep Learningに利甚される倧芏暡FPGAは、珟圚46入力のLUTが䞻流です。

ここで「テヌブルを匕く」ずいう抂念を埮分しお逆䌝搬で孊習さえるずいうず䞍思議に思う方もおられるかもしれたせん。

しかしながらテヌブルを匕くずいう行為は回路的にはメモリをマルチプレクサで遞択しおいるのみです。

デゞタル回路は AND や OR などの論理回路ですが、これらは Stochastic挔算に圓おはめるず乗算などの䞀般的な蚈算に垰着可胜です。

Stochastic挔算を行う為には挔算察象が確率的なものでなければなりたせんが、DeepLearningで扱っおいる倀は そもそも「もっずもらしさ(尀床)」であっお、バむナリ化したからず蚀っお倱われるものではありたせん。

BinaryBrain では 入力46個のLUT を䜿った Network を逆䌝搬によっお盎接孊習させるこずで、GPU向けのネットワヌクをFPGAに移怍するよりも遥かに高い効率で実行できるネットワヌクが実珟可胜ずなりたす。LUTは単独でXORが衚珟できるなど、パヌセプトロンもモデルよりも高密床な挔算が可胜です。 たた2入力のLUTを定矩した堎合、これは単なるデゞタルLSIの基本ゲヌト玠子そのものなので、ASIC蚭蚈に応甚できる可胜性もありたす。

結合数がLUTのテヌブルサむズで埋速される為、疎結合ずなりたすが、他の点においおは、埓来盞圓の孊習胜力を持った䞊で、掚論に関しおは特にFPGA化においおは高いパフォヌマンスを発揮したす。

バむナリ倉調モデル

BinaryBrainではバむナリ倉調したデゞタル倀を扱うこずが出来たす。倉調を掛けずに普通のバむナリネットワヌクの孊習にBinaryBrainを䜿うこずはもちろん可胜ですが、その堎合は倀しか扱えないため、回垰分析などの倚倀のフィッティングが困難になりたす。 バむナリ倉調モデルは䞋蚘のずおりです。

modulation_model.png

特に難しい話ではなくD玚アンプ(デゞタルアンプ)や、1bit-ADC など、広く䜿われおいるバむナリ倉調の応甚に過ぎたせん。 昚今のデゞタルアンプは内郚では2倀を扱っおいるのに、人間の耳に届くずきにはアナログの矎しい音ずしお聞こえたす。

バむナリ倉調は、量子化を行う際により高い呚波数でオヌバヌサンプリングするこずで、バむナリ信号の䞭に元の情報を劣化させずに量子化を詊みたす。バむナリネットワヌク自䜓はそのようなバむナリを前提に孊習を行いたすが、極めお小さな回路芏暡で倧きな性胜を発揮したす。 これは、元の倚倀に埓った確率で0ず1を取る確率倉数に倉換しお扱うずいう抂念であり、Stochastic性を䞎えおいるず理解いただければよいかず思いたす。

ラむセンス

珟圚MITラむセンスを採甚しおいたす。lisense.txtを参照ください。

fpgax #11  TFUG ハヌド郚DNN専甚ハヌドに぀いお語る䌚(2019/02/02) にお発衚させお頂きたした

https://fpgax.connpass.com/event/115446/

ICCE2019(Berlin)にお発衚させお頂きたした

@FIssiki様の倚倧なるご協力のもず、ICCE2019(Berlin)にお発衚しおおりたす。

2019 IEEE 9th International Conference on Consumer Electronics (ICCE-Berlin) <slide> <pdf>

https://ieeexplore.ieee.org/document/8966187

䜜者情報

枕䞊 竜叞(Ryuji Fuchikami)

参考にさせお頂いた情報