Submit Search
Upload
高位合成でDeep learning
•
3 likes
•
3,095 views
Mori Labo.
Follow
以下の勉強会にて使用したスライドになります。 RTLを語る会(12) 〜Vivado HLS GO〜 http://talkrtl.connpass.com/event/36574/
Read less
Read more
Engineering
Slideshow view
Report
Share
Slideshow view
Report
Share
1 of 60
Download now
Download to read offline
Recommended
Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)
marsee101
Vivado hls勉強会5(axi4 stream)
Vivado hls勉強会5(axi4 stream)
marsee101
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
marsee101
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Preferred Networks
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
marsee101
RISC-Vの可能性
RISC-Vの可能性
たけおか しょうぞう
Zynq mp勉強会資料
Zynq mp勉強会資料
一路 川染
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
Recommended
Vivado hls勉強会1(基礎編)
Vivado hls勉強会1(基礎編)
marsee101
Vivado hls勉強会5(axi4 stream)
Vivado hls勉強会5(axi4 stream)
marsee101
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
marsee101
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
Preferred Networks
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
marsee101
RISC-Vの可能性
RISC-Vの可能性
たけおか しょうぞう
Zynq mp勉強会資料
Zynq mp勉強会資料
一路 川染
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
Fixstars Corporation
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
直久 住川
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
CUDAプログラミング入門
CUDAプログラミング入門
NVIDIA Japan
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
Shinya Takamaeda-Y
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
marsee101
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
Zynq + Vivado HLS入門
Zynq + Vivado HLS入門
narusugimoto
第9回ACRiウェビナー_セック/岩渕様ご講演資料
第9回ACRiウェビナー_セック/岩渕様ご講演資料
直久 住川
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
Hiroki Nakahara
フラグを愛でる
フラグを愛でる
MITSUNARI Shigeo
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
ManaMurakami1
OpenMPI入門
OpenMPI入門
Yusuke Matsushita
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
裕士 常田
ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料
直久 住川
Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)
marsee101
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究について
Deep Learning JP
hbstudy25 劇的ビフォーアフター
hbstudy25 劇的ビフォーアフター
semind
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
More Related Content
What's hot
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
直久 住川
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
MITSUNARI Shigeo
CUDAプログラミング入門
CUDAプログラミング入門
NVIDIA Japan
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
Shinya Takamaeda-Y
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
marsee101
新しい並列for構文のご提案
新しい並列for構文のご提案
yohhoy
冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
Fixstars Corporation
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun
Zynq + Vivado HLS入門
Zynq + Vivado HLS入門
narusugimoto
第9回ACRiウェビナー_セック/岩渕様ご講演資料
第9回ACRiウェビナー_セック/岩渕様ご講演資料
直久 住川
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
Hiroki Nakahara
フラグを愛でる
フラグを愛でる
MITSUNARI Shigeo
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
ManaMurakami1
OpenMPI入門
OpenMPI入門
Yusuke Matsushita
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
裕士 常田
ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料
直久 住川
Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)
marsee101
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究について
Deep Learning JP
What's hot
(20)
ACRiウェビナー:小野様ご講演資料
ACRiウェビナー:小野様ご講演資料
Intro to SVE 富岳のA64FXを触ってみた
Intro to SVE 富岳のA64FXを触ってみた
CUDAプログラミング入門
CUDAプログラミング入門
FPGA・リコンフィギャラブルシステム研究の最新動向
FPGA・リコンフィギャラブルシステム研究の最新動向
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
新しい並列for構文のご提案
新しい並列for構文のご提案
冬のLock free祭り safe
冬のLock free祭り safe
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
Zynq + Vivado HLS入門
Zynq + Vivado HLS入門
第9回ACRiウェビナー_セック/岩渕様ご講演資料
第9回ACRiウェビナー_セック/岩渕様ご講演資料
Tensor flow usergroup 2016 (公開版)
Tensor flow usergroup 2016 (公開版)
フラグを愛でる
フラグを愛でる
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
「NVIDIA プロファイラを用いたPyTorch学習最適化手法のご紹介(修正版)」
OpenMPI入門
OpenMPI入門
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
ACRiウェビナー:岩渕様ご講演資料
ACRiウェビナー:岩渕様ご講演資料
Vivado hls勉強会3(axi4 lite slave)
Vivado hls勉強会3(axi4 lite slave)
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
【DL輪読会】Hopfield network 関連研究について
【DL輪読会】Hopfield network 関連研究について
Similar to 高位合成でDeep learning
hbstudy25 劇的ビフォーアフター
hbstudy25 劇的ビフォーアフター
semind
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
MITSUNARI Shigeo
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
Hirotaka Kawata
Xen Nic
Xen Nic
Kazuhisa Hara
Java Drag Race Tuning
Java Drag Race Tuning
nekop
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
Takuya Matsunaga
Osc2009 Do Xen Hara
Osc2009 Do Xen Hara
Kazuhisa Hara
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
Hiroki Nakahara
Or seminar2011final
Or seminar2011final
Mikio Kubo
Multi Chassis LAG for Cloud builders
Multi Chassis LAG for Cloud builders
Juniper Networks (日本)
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
Kiyoshi Ogawa
MySQL Clusterを運用して10ヶ月間
MySQL Clusterを運用して10ヶ月間
hiroi10
Gitと出会って人生変わった テックヒルズ2013-03-22
Gitと出会って人生変わった テックヒルズ2013-03-22
Shota Umeda
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
yohhoy
Kaggleのテクニック
Kaggleのテクニック
Yasunori Ozaki
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
Takeshi Yamamuro
KVM環境におけるネットワーク速度ベンチマーク
KVM環境におけるネットワーク速度ベンチマーク
VirtualTech Japan Inc.
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
Similar to 高位合成でDeep learning
(20)
hbstudy25 劇的ビフォーアフター
hbstudy25 劇的ビフォーアフター
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
Xen Nic
Xen Nic
Java Drag Race Tuning
Java Drag Race Tuning
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
Osc2009 Do Xen Hara
Osc2009 Do Xen Hara
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
Or seminar2011final
Or seminar2011final
Multi Chassis LAG for Cloud builders
Multi Chassis LAG for Cloud builders
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
MySQL Clusterを運用して10ヶ月間
MySQL Clusterを運用して10ヶ月間
Gitと出会って人生変わった テックヒルズ2013-03-22
Gitと出会って人生変わった テックヒルズ2013-03-22
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
C++ Transactional Memory言語拡張の紹介
C++ Transactional Memory言語拡張の紹介
Kaggleのテクニック
Kaggleのテクニック
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
KVM環境におけるネットワーク速度ベンチマーク
KVM環境におけるネットワーク速度ベンチマーク
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
高位合成でDeep learning
1.
高位合成でDeepLearningしたい(仮) ~素人の犯行~
2.
自己紹介 Twitter ● @morittyo HP ● morilab報告書
http://morilab-report.blog.jp/ 仕事 ● RTL設計・検証 ○ Verilog , SystemVerilog, VivadoHLS(高位合成) ○ 検証メソドロジ(UVM)、ランダム検証、アサーション等
3.
目的(目標) 1. ディープラーニングとやらをC++でゼロから書いてみる 2. Xilinx
VivadoHLS WebEditionを使って高位合成する 3. カッコイイ!(予定)
4.
前提 ● RTL設計ができる ● VivadoHLSを使っての高位合成経験がある ●
ニューラルネットワークに関しては素人
5.
設計環境 ● VivadoHLS 2016.2 ●
Windows 10 Home (64bit) ● i5-4210U @1.70GHz 2.40GHz ● Memory 8GB
6.
まずはDeepLearningのお勉強 初めはネットだけで頑張っていた …が、断片的な情報ばかりを収集してしまい全体像がわからなくなってしまった 本を買いました。 ⇒3割ぐらい理解した気になった。色々間違ってそう。
7.
ニューラルネットワークとは? (ざっくり)
8.
ニューロンモデル 複数から入力を受け付ける ● 出力は1つ Step1 :
各入力を重みと積和演算する u = weight * x + bias Step2 : 活性化関数を通す y = func(u) *W2 *W1 *W3 x1 x2 x3 ∑ func() y bias
9.
(単純)パーセプトロン 同一層にあるニューロン同士はネットワー クが存在しない 入力は前段の層からのみ、出力は後段 の層へのみ伝搬する 同一層 ・並列実行って感じがするし RTL(FPGA)向きでは? ・高位合成を使えば簡単に違いな い!(フラグ)
10.
畳み込みニューラルネット(畳み込み処理) ・ラプラシアンフィルタ+ αといった感じ ・これならいけそうな気がする …
11.
畳み込みニューラルネット(MAXプーリング処理) 2x2エリアの中で最大値を採用する →画像サイズがWidth,Heightどちらも半分になる データを適度に間引きつつ、入力画像の位置ずれにもそれなりに効果があるものらしい
12.
多層ニューラルネットワーク
13.
ディープラーニング ● 単層のニューラルネットワークは、限定的な問題しか解けない(線形分離) ● 多層のニューラルネットワークは、複雑な問題が解けそうだけどパラメータが複雑 すぎて学習が全然進まない ディープラーニングは、多層のニューラルネットワークのパラメータをイイ感じに学習する ことができるアルゴリズムのこと(らしいですよ)
14.
問題点 とりあえず多層ニューラルネットワークで出力するまでを高位合成してみる ディープラーニングの学習 アルゴリズムが難しくてよく わからない(致命的)
15.
C++実装
16.
Matrixクラス とりあえず行列演算用クラスを作成 ● まずはC++に慣れよう ● クラス記述がちゃんと高位合成できるかどうかも知りたい 数学力に乏しいためかあまり活用できていない気がする…
17.
MNISTクラス MNISTデータセットを読み出すだけのクラス ● http://yann.lecun.com/exdb/mnist/ 以下のイメージファイルとラベルファイルに対応 ● TRAINING
SET LABEL FILE (train-labels-idx1-ubyte) ● TRAINING SET IMAGE FILE (train-images-idx3-ubyte) 高位合成はされないが、テスト時に使用
18.
MNISTデータセット MNISTデータセットとは? ● 28x28=784画素からなる8ビット(255諧調)モノクロ画像 ● 0~9の手書き文字 ●
答え(ラベル)付き ● 機械学習業界では有名なデータ(らしい) ● イケてる機械学習だと正解率99%以上とか 実際の背景色は0x00(黒)
19.
convolution_perceptronクラス 畳み込みニューラルネットのモデル 入力層(L1)、中間層(L2)にて使用 ● 畳み込み演算 ○ 入力画像 (幅=IN_X、高さ=IN_Y) ○
フィルタウインドウ(幅= CNV_X、高さ=CNV_Y) ○ 額縁補正 →外周データは0扱いとし、演算対象と同じ画像サイズで出力 ● プーリング演算 ○ ウインドウ(2x2固定) ○ 最大値選択 ● 活性化関数 ○ ReLU →0以下を0にクリッピングする関数。演算負荷が少なく、学習結果も良いらしい。
20.
relu_perceptron_fnnクラス 単純パーセプトロンのモデル 中間層(L3)にて全結合層として使用 ● 活性化関数 ○ ReLU
21.
softmax_perceptron_fnnクラス 単純パーセプトロンのモデル → relu_perceptron_fnnクラスから派生 出力層(L4)で使用 ● 活性化関数 ○
ソフトマックス ■ 出力は正規化され、合計値が常に同じ ■ 活性化関数にてexp関数を使用
22.
なんとなく実装完了 実装にかかった時間はおよそ3日 ● C++のテンプレートと仮想関数に嵌るなど ● 学習部分が無いのでとても残念な感じのコード ○
学習後のパラメータを使って動かすことは出来る … ● GitHubに一応コミットしてあります(クソコード) ○ https://github.com/morilab/deep_learning_hls
23.
高位合成にむけて
24.
インターフェース インターフェース仕様は性能に大きく影響する ● 入力画像 ○ 28x28x8bit
(MNIST) ● パーセプトロン用パラメータ ○ Weight ○ Filter ○ Bias ● 判定結果 ○ 0~9の各確率 ● 学習用パラメータ ○ 教師信号(0~9のいずれか) ○ 学習率 ○ その他?(良く分かっていない)
25.
入力画像 ● ディープラーニングによる学習を行う場合は大量の画像データを切り替える ● MNISTデータセットを使いたいのでそちらに合わせる ●
リードのみ →今回はサイズがそれほど大きくないのでブロックRAMでの実装を目指す サイズ : 28x28x8=6272Bit / 784Byte
26.
パーセプトロン用パラメータ ● 各パラメータは主に学習時に更新される(リードライト) ● ユーザーは基本的にあまり操作しない ○
初期値の設定→バイアスは0、その他はランダム ○ 学習値の設定→1回設定するのみ ● かなり容量が必要…実用的に動かすには一部外部メモリを使わないと難しい? ○ Bias : [L1Size]+([L1Size]*[L2Size])+[L3Size]+[L4Size(10)] ○ Filter : [L1Size]*[WindowSize1]+[L1Size]*[L2Size]*[WindowSize2] ○ Weight : ([L2Size]*[L2OutFrame(49)])*[L3Size]+[L3Size]*[L4Size(10)] ○ →L1Size=32,L2Size=64,L3Size=1024,WindowSize=5x5で見積もると… Bias=3,114要素,Filter=52,000要素,Weight=3,221,504要素 合計約3.3M要素 サイズの調整が必要 でかい!!
27.
判定結果 ● 0~9の各確率を正規化して出力する ● 判定時はライトのみ、学習時はリードライト ●
数が10個と少ないのでレジスタ実装で問題なさそう
28.
これらを踏まえて…
29.
設計仕様 ニューラルネットワーク構成 1層目 2層目 3層目
4層目 セット数 20 20 500 10 フィルタ 5x5 5x5 - - 活性化関数 ReLU ReLU ReLU SoftMax 入力 28x28x8Bit (白黒) 内部変数型 S2.6 (-2.0~1.984375) 出力 各8Bit
30.
Solution1
31.
とりあえず高位合成してみる ディレクティブなしの状態 クロック:100MHz(10ns) ターゲット:xc7z020clg484-1 (ZedBoard) レイテンシ:約200ms さすがに200msはシミュレー ションしたくない… 合成は 30分弱
32.
デフォルト設定での合成 ディレクティブ(高位合成に対する指示)が何もない場合、 ● ループは記述通りに実装されるため、リソースは少ないがレイテンシは大きい ● パイプライン化を行わない ●
ループなどの並列実行を行わない …というふうに、並列化を行わないためレイテンシが(恐らく)最大となる回路を生成 演算処理はProjectSettingにあるクロック周波数を元に適度にFFを挟んだ回路になる ⇒周波数設定を弄るとレイテンシサイクルが減るが、処理の絶対時間は大体同じ
33.
モジュールIFがどうなったか見てみる 項目 I/F セット数
詳細 Input Frame Memory 1 Address[9:0],Data[7:0] L1 Filter Memory 1 Address[8:0],Data[7:0] L1 Bias Memory 1 Address[4:0],Data[7:0] L2 Filter Memory 1 Address[13:0],Data[7:0] L2 Bias Memory 1 Address[8:0],Data[7:0] L3 Weight Memory 1 Address[18:0],Data[7:0] L3 Bias Memory 1 Address[8:0],Data[7:0] L4 Weight Memory 1 Address[12:0],Data[7:0] L4 Bias Memory 1 Address[3:0],Data[7:0] Result Validつき出 力 8 Data[7:0] 配列はデフォルトですべて1次元メモリ (合成結果には接続すべきメモリは含まれない) ● L3_Weightが512kバイト空間をご所望 良し悪しは兎も角、概ね想定通りの結果 1次元メモリなので基本的に異なる要素へのアク セスができない (リードだけの場合、2PortRAMの2面読み出しに なることはある)
34.
レイテンシの内訳を見てみる(全体) レイテンシ表示は以下のようになっている [Latency] = [Iteration
Latency] × [Trip count] 問題がTrip Count(ループ回数)か、Iteration Latency(1回分の処理にかかるサイクル数)か を考えていく Loop14が全体レイテンシの約65%を占めてい る。もう少し細かく見てみることにする。
35.
レイテンシの内訳を見てみる(Loop14) 多重ループになっている 下位レイテンシが上位のいてレーションレイ テンシになるが、このとき(基本)+2される ⇒多重ループはレイテンシに無駄が出る ディレクティブを挿入して 改善することができる
36.
ループ部分にラベルを追加 ディレクティブの追加にはループにラベルが必要。ログも通し番号でラベルを付けられてしまうため解析が大変 →“<クラス名>_<機能名>_<階層>”という形ですべてのループにラベルを付加した チューニング、解析いずれにしてもラベルの追加は必須!
37.
ラベル付加後のレイテンシ内訳 ラベルがあると見やすい! (何故かレイテンシ変わってるけど) IterationLatencyが大きいところに注目 →下位ループのLatencyを合計した値から大 きく離れている 演算に必要なデータが揃っていないため無駄 に待たされている可能性が高い →畳み込み演算のFilter/Weightパラメータが 1個づつしか参照できないためでは?
38.
Solution2
39.
チューニング用に仕様を弄る 1回30分も待つのがつらいので、一時的にサイズを小さくしてみる。 1層目 2層目 3層目
4層目 セット数 20⇒10 20⇒10 500⇒100 10 フィルタ 5x5 5x5 - - 活性化関数 ReLU ReLU ReLU SoftMax 入力 28x28x8Bit (白黒) 内部変数型 S2.6 (-2.0~1.984375) 出力 各8Bit 15分くらいに改善 → チューニング時にとりあえず小さくするのは効果アリ
40.
とりあえずPIPELINEいれてみる トップ関数にPIPELINEを入れてみる 設定はII(開始間隔)=1にしてみる → 目標値なので達成されるかどうかはわからないが、とりあえず入れてみる VivadoHLSでは良くあること…終わるかどうかも分からないので止める 24時間経っても高位合成終わらず
41.
Solution2
42.
トップ関数を分離する 全体を一気に高位合成するのは作業効率が悪く現実的ではない →4層をそれぞれ関数に分離し、個別に高位合成することにする 各層のチューニングが終わったら、その設定をもってトップで高位合成をする。 トップの合成が終わらない場合は、最悪各合成結果をRTLレベルで手で接続する
43.
Layer4だけを高位合成する
44.
とりあえず高位合成してみる Layer4が比較的簡単そうだったので、まずはここから。 セット数は目標仕様の設定(L3=500,L4=10) これをベースにチューニングをしていく 合成は 3分弱
45.
入出力をバラす 入出力はデフォルトなのでデータ幅=8Bitのメモリになっている 出力は10個バラにする →HLS_ARRAY_PARTITION complete その他は32Bit幅のメモリに変更する →HLS_ARRAY_RESHAPE cyclic
factor=4 原因不明の死…blockにすると通る…とりあえずblockで続けることに。。。 Layer4() weight bias [31:0] [31:0] [7:0] [7:0] in [31:0] Array reshapingさん、突如StackDumpをキメる
46.
ループ部分を見直す Cコードを忠実に実行してくれているので、無駄が多い 値の0初期化に 6,520 入力取り込みに 1,000 パラメータ取り込みに 10,030 これは省略しよう
47.
Matrixクラスのコード改善 コンストラクタにある0初期化部分をコメントアウト
48.
レイテンシの内訳 データおよびパラメータをロードし、演算する →パラメータは内部にメモリとして保持している形(微妙) 演算系 ロード系
49.
演算系(Layer4_run)の詳細 レイテンシ的にはRun2,Run3(SoftMax処理)よりも、 Run1(畳み込み演算)を改善しないとダメ
50.
ディレクティブを入れやすいようにコードを書き直す 演算子のオーバーロードを使って行列演 算を書いたはいいが、このままでは細か くディレクティブが書けない模様。。。 ベタ書きに直した
51.
演算部チューニング結果 500回ループするRun1_L2をパイプライン指示 →間隔2、レイテンシ4に Run1_L1をUNROLLで2パラ指示 →Run1_L2の繰り返し回数を半分(5回)に
52.
ロード系のチューニング In_L1とParam_L2は同じループ、かつ独立した処理 →ループのマージができる In_Param_L2は500回繰り返すところなのでパイプライン化を指示 Param_L1をUNROLLで4パラ指示
53.
ロード部チューニング結果
54.
Layer4チューニング結果 ● レイテンシは半分以下になったが、DSPとLUTのリソースは改善の必要あり ● 入出力、パラメータを内部で保持する形になっているのでLayer1~3では別の チューニングを行う必要がある
55.
今回のまとめ
56.
成功したこと ● なんとなく高位合成できた ○ C++でクラスやテンプレートを使ったコードでも大丈夫だった ○
ディレクティブなしでとりあえず合成できた ● テンプレート使用しても合成できた ○ 一時的に規模を小さくすることで合成時間を短縮できるので、素早いチューニングができる ● 細かいチューニング ○ ソースコードは弄らず、ディレクティブのみなら複数の Solutionをプロジェクトで持てる ○ 関数単位でチューニングしていくのが良さそう ○ 良い合成結果を出すためにはソースコードの修正が必要
57.
失敗したこと ● 現実的な合成結果には到達せず ○ ディレクティブなしの結果は基本クソ(
FPGAの演算に求めるのは並列実行) ○ 畳み込み演算(Layer1,2)は現実的な合成結果にするにはソースコードの根本改善が必要 ○ ディレクティブ設定しても落ちたり帰ってこなかったりで大変 ● 今回のクラス構造は失敗 ○ 派生クラスから基底クラスへ細やかなディレクティブ指示ができない(気がする) ● ベタでフラットに関数を並べたようなコードが結局チューニングしやすい ○ C/C++で書くけど変に抽象化や汎用化するとチューニングできない ● ポインタをもっと活用しないとダメ ○ Layer4のパラメータは内部ブロックで持てる量だったが、 Layer2は絶対無理 ○ Layer間のデータ受け渡しが無駄に発生するコードになってしまった ● ディープラーニングできなかった ○ もっと勉強します…
58.
というわけで… ● 性能のいいもの(動くもの)を高位合成で作るのは大変 ● 高位合成は得手不得手がかなりある ●
高位合成するコードはハード屋がゼロから作ろう ● VivadoHLSはまだバグる
59.
Appendix
60.
DirrectiveFileは頻繁に狂う DirectiveWindowから設定変更はラクチン でもそれ、本当に変更されてますか?? 毎回directives.tclを確認しよう! ファイルと表示が合わなくなったらDirectiveWindowタブを閉 じてWindow>ShowView>Directivesで再度開くべし DirectiveWindowは嘘つきです (重要)
Download now