FC2カウンター FPGAの部屋
FC2ブログ

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

FPGAの部屋

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

finn をやってみる9(tfc_end2end_example.ipynb その4)

finn をやってみる8(tfc_end2end_example.ipynb その3)”の続き。

前回は、end2end_example の tfc_end2end_example.ipynb の Conversion to HLS layers, Creating a Dataflow Partition, Folding and Datawidth Converter, FIFO and TLastMarker Insertion をやってみた。今回は、end2end_example の tfc_end2end_example.ipynb

今回も end2end_example の tfc_end2end_example.ipynb の図や文章の翻訳、コードを引用して勉強していく。

3. Vivado HLS and IPI
・ Generating HLS Code
・ Synthesizing HLS to IP Blocks
・ IP Stitching

これらのタスクではFPGA合成ツールを扱うので、ターゲットとするザイリンクスFPGAパーツ名とPYNQボード名を記述する2つのヘルパー変数を定義する。
finn_61_200602.png

クロック周期は 10 ns つまり 100 MHz のようだ。

Generating HLS Code
このセクションでは、さまざまなレイヤーからのIPブロックの生成について説明する。これらは、完全なモデルに対応するブロックデザインを作成できる。IPブロックへの単一の変換により、優れた透過性が得られ、各IPブロックの機能をチェックして、対応するONNXノードの動作と比較できる。

各層のHLS IPブロックを生成するには、2つの変換が必要となる。

・ PrepareIP ノードのHLS C ++コードと、HLS合成を開始してデザインをIPとしてエクスポートするtclスクリプトを生成する。
・ HLSSynthIP tclスクリプトをVivado HLSに渡し、実際のIP生成を実行する。

まず、基本的な変換 GiveUniqueNodeNames を使用して一意のノード名を指定し、次に PrepareIP を使用してHLS C ++コード生成を続行する。
finn_62_200602.png

Synthesizing HLS to IP Blocks
各レイヤーのHLSコードを生成したので、HLSSynthIP変換を呼び出して、生成されたHLSをVivado IPブロックに変換できる。これにはHLS合成の呼び出しが含まれるため、この変換はしばらく(うちでは10分ほど)実行される。
finn_63_200602.png

各 StreamingFCLayer_Batch ノードには、netronでより詳細に検査できる新しい属性がある。

finn_64_200602.png

最初の StreamingFCLayer_Batch ノードを見てみると、たくさんの属性が増えている。
finn_65_200602.png
finn_66_200602.png
finn_67_200602.png

tfc_w1_a1_ipgen.onnx のグラフ全体を示す。
finn_68_200603.png

属性が 2 つ追加されている。
・ code_gen_dir_ipgen ipgen変換によって生成されたすべてのファイルが格納されるディレクトリパス
・ ipgen_path 生成されたIPブロックが保存されているプロジェクトディレクトリへのパス

このディレクトリを確認することで、どのファイルが生成されるかをさらに調査できる。たとえば、最初の StreamingFCLayer_Batch ノードの場合を示す。
finn_69_200602.png

ディレクトリ project_StreamingFCLayer_Batch_0 には、IP ブロックがエクスポートされる Vivado HLS によって作成されたプロジェクトと、 Vivado HLS によって生成された他のファイルが含まれる。上記の netron によるネットワークの視覚化と比較すると、これは正確にノード属性 ipgen_path に格納されているフォルダーの名前ということだ。 Vivado HLS に渡される.cppコードは、 top_StreamingFCLayer_Batch_0.cpp ファイルにある。 thresh.h ファイルもそれに属し、しきい値の値が含まれている。重みは .npy ファイルおよび .dat ファイル(memblock_0.dat)として保存される。 vivado_hls.log は、Vivado HLS からのログファイルだ。これらのファイルに加えて、フォルダーには ipgen.sh および hls_syn_StreamingFCLayer_Batch_0.tcl が含まれる。また、StreamingFCLayer を「decoupled」モードで使用するため、verilog ラッパー(StreamingFCLayer_Batch_0_memstream.v)が生成される。「decoupled」および「const」モードの詳細については、 FINN readthedocs Web サイトの Internals に書いてある。

以下では、生成された2つのスクリプトを詳しく見ていく。 ipgen.sh から始める。
finn_69_200602.png

/tmp/finn_dev_masaaki/code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos に cd して、 Vivado HLS の TCL ファイルを StreamingFCLayer_Batch_0.tcl を起動する。終わったら、/workspace/finn に戻る(これは私の解説)。

hls_syn_StreamingFCLayer_Batch_0.tcl を表示する。
finn_70_200602.png

Vivado HLS のプロジェクトを作って、xc7z020clg400-1、クロック 10 ns 、-cflags "-std=c++0x -I$config_bnnlibdir" 、axi_addr64 で合成して、IP としてエクスポートしている(これは私の解説)。

すべてのIPブロックが配置されたので、それらを一緒にステッチして、ONNXモデルに一致するIPデザインを作成できる。 これについては、次のセクションで説明する。

ここで、Vviado HLS のプロジェクトができているということで、起動中の docker コンテナに入って、実際のファイルを見てみよう。
起動中の docker コンテナのシェルに入る”を参考にして、起動中の docker コンテナを見る。docker ps
docker ps
docker exec -i -t 7b069b1e1356 /bin/bash

finn_71_200603.png

/workspace/finn に入れた。
ls をした。
finn_72_200603.png

今まで Jupyter Notebook で生成した onnx モデルが入っている。

/tmp/finn_dev_masaaki に行ってみると、今作った tfc_w1_a1_ipgen.onnx の各ノードがあった。
ls -alt
finn_74_200603.png

ノードを示す。

drwx------  3 masaaki docker 4096 Jun  2 19:55 code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos
drwx------  3 masaaki docker 4096 Jun  2 19:54 code_gen_ipgen_StreamingDataWidthConverter_Batch_0_nzm_awqb
drwx------  3 masaaki docker 4096 Jun  2 19:53 code_gen_ipgen_StreamingFCLayer_Batch_1_ze13mbt0
drwx------  3 masaaki docker 4096 Jun  2 19:52 code_gen_ipgen_StreamingFCLayer_Batch_2_cc9g0rxo
drwx------  3 masaaki docker 4096 Jun  2 19:51 code_gen_ipgen_StreamingFCLayer_Batch_3_8fn3j9gt
drwx------  3 masaaki docker 4096 Jun  2 19:50 code_gen_ipgen_TLastMarker_0_dkbjhrkw
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_5_rpmfwai3
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_4_hkgtx9lw
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_3_iz1kpch8
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_2_7lkicamh
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_1_eimmu84e
drwx------  3 masaaki docker 4096 Jun  2 19:46 code_gen_ipgen_StreamingFIFO_0_qnzwb_sa
drwx------  2 masaaki docker 4096 Jun  1 19:27 dataflow_partition_evha3xbg


code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos に入ってみる。
cd code_gen_ipgen_StreamingFCLayer_Batch_0_av35euos
finn_75_200604.png

ipgen.sh, hls_syn_StreamingFCLayer_Batch_0.tcl などが見える。
  1. 2020年06月04日 04:48 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

finn をやってみる8(tfc_end2end_example.ipynb その3)

finn をやってみる7(tfc_end2end_example.ipynb その2)”の続き。

前回は、end2end_example の tfc_end2end_example.ipynb の 2. Network preparation の FINN-style Dataflow Architectures, Tidy-up transformations, Streamlining をやってみた。今回は、end2end_example の tfc_end2end_example.ipynb の Conversion to HLS layers, Creating a Dataflow Partition, Folding and Datawidth Converter, FIFO and TLastMarker Insertion をやってみた。

今回も end2end_example の tfc_end2end_example.ipynb の図や文章の翻訳、コードを引用して勉強していく。

Conversion to HLS layers
finn-hls library の関数に対応する HLS レイヤーに変換する。今回の変換では、バイナリXnorPopcountMatMulレイヤーのペアをStreamingFCLayer_Batchレイヤーに変換する。直後のMultiThresholdレイヤーもMVTUに吸収される。
StreamingFCLayer_Batch、finn-hlslibライブラリからの関数呼び出しに対応するノードを含む新しい構造を作成する。
注:変換でto_hls.InferBinaryStreamingFCLayerは、引数として "decoupled" という文字列を取得する。これは、重みの mem_mode を示す。FINNには、重みの保存方法とアクセス方法を設定するためのさまざまなオプションがある。 FINN readthedocs website を参照のこと。
finn-hlslib ライブラリの StreamingFCLayer_Batch 関数はここにある。
finn_49_200602.png

tfc_w1_a1_hls_layers.onnx の全体を示す。
finn_50_200602.png

各StreamingFCLayer_Batchノードには、フォールディングの度合いを指定する2つの属性、PEとSIMDがある。すべてのノードで、これらの属性の値はデフォルトで1に設定される。これは、最大のフォールディング(時間多重化)に対応し、したがってパフォーマンスが最小になる。これらをどのように調整できるかについては後ほど説明するが、最初に、このネットワークでHLSレイヤーを非HLSレイヤーから分離したい。

Creating a Dataflow Partition
上のグラフでは、FINN HLSレイヤー(StreamingFCLayer_Batch)と通常のONNXレイヤー(Reshape、Mul、Add)が混在していることがわかります。ビットストリームを作成するには、FINNはHLSレイヤーのみのモデルを必要とします。これを実現するために、 CreateDataflowPartition 変換を使用してこのグラフに "dataflow partition" を作成し、HLSレイヤーを別のモデルに分離し、それらを StreamingDataflowPartition と呼ばれる 1 つの placeholder layer に置き換える。
finn_51_200602.png

StreamingDataflowPartition のプロパティを示す。
finn_52_200602.png

tfc_w1_a1_dataflow_parent.onnx 全体を示す。
finn_53_200602.png

StreamingFCLayerインスタンスがすべて、HLSデータフローのみのグラフとして抽出された属性モデルを持つ単一のStreamingDataflowPartitionに置き換えられていることが分かる。
finn_54_200602.png

df_model.onnx 全体を示す。
finn_55_200602.png

抽出されたすべてのStreamingFCLayerインスタンスが子(データフロー)モデルに移動されていることが分かる。子モデルを ModelWrapper で読み込んで作業を続ける。

Folding and Datawidth Converter, FIFO and TLastMarker Insertion
FINNの折りたたみ(Folding in FINN)は、実行リソースの観点からレイヤーが時間多重化される量を表す。元のFINN論文で説明されているように、PE(出力での並列化)およびSIMD(入力での並列化)パラメーターによって制御される、各レイヤーにはいくつかの折りたたみ係数がある。PE値とSIMD値の設定が高いほど、生成されたアクセラレータの実行が速くなり、消費するFPGAリソースが増える。
折りたたみパラメータはノード属性であるため、ModelWrapperのヘルパー関数を使用して簡単にアクセスおよび変更できる。最初に、StreamingFCLayer_Batch操作を実装するノードの1つを詳しく見ていく。これは、Netronの視覚化が役立つ。上の図では、最初の4つのノードがStreamingFCLayer_Batchであることが分かる。例として、最初のノードを抽出する。

このノードには、より高レベルのHLSCustomOpラッパーを使用できる。これらのラッパーは、folding factors (PEおよびSIMD)など、これらのノードの特定のプロパティへの簡単なアクセスを提供します。 CustomOp ラッパーで定義されているノード属性を見て、SIMD属性とPE属性を調整してみよう。
finn_56_200602.png

PEとSIMDがノード属性としてリストされており、連続するレイヤーの間に挿入されるFIFOの深さも表示されている。また、set_nodeattrを使用して、特定の制約に従ってすべてを調整できる。
このノートブックでは、folding factors とFIFOの深さを手動で設定しているが、将来のバージョンでは、FINN-Rペーパーの分析モデルに従って、FPGAリソースバジェットを考慮して folding factors を決定できるようにする予定だそうだ。
finn_57_200602.png

PEとSIMDを設定して、各レイヤーの合計フォールディングが16になるようにする。
PEとSIMDの他に、3つのノード属性が設定されている。 ram_style は重みの格納方法を指定する(BRAM, LUTRAM など) auto にすると Vivado が決定する。 inFIFODepth and outFIFODepth はノード間に適切な FIFO の深さを指定する。
ただし、FIFOを追加する前に、データ幅コンバーター(DWC)が必要かどうかを判断し、それらを正しく挿入する必要がある。フォールディングを設定すると、あるノードのフォールド出力形状が次のノードのフォールド入力形状と一致しない場合があるためだ。
以下では、最初にDWC、次にFIFOがFINNの対応する変換を使用して挿入される。
finn_58_200602.png

最後に、InsertTLastMarker変換を実行して、このグラフの出力でTLastMarkerノードを入れる。これは、DMAエンジンを正しく実行するために必要ということだ。 netronを使用すると、ノードにFIFOが挿入され、必要に応じてDWCが挿入されたセットフォールディングがノードに含まれていることが分かる。
finn_59_200602.png

tfc_w1_a1_set_folding_factors.onnx のグラフを示す。
finn_60_200602.png

これでネットワークの準備が完了し、ネットワークを次のブロックVivado HLSおよびIPIに渡すことができる。
  1. 2020年06月03日 04:12 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

finn をやってみる7(tfc_end2end_example.ipynb その2)

finn をやってみる6(tfc_end2end_example.ipynb その1)”の続き。

前回は、end2end_example の tfc_end2end_example.ipynb をやってみようということで、Overview と 1. Brevitas export をやってみた。今回は、end2end_example の tfc_end2end_example.ipynb の 2. Network preparation をやってみよう。

今回も end2end_example の tfc_end2end_example.ipynb の図や文章の翻訳、コードを引用して勉強していく。

2. Network preparation

・ FINN-style Dataflow Architectures
・ Tidy-up transformations
・ Streamlining
・ Conversion to HLS layers
・ Creating a Dataflow Partition
・ Folding and Datawidth Converter, FIFO and TLastMarker Insertion


FINN-style Dataflow Architectures
ネットワークを順々に変換していって、FINN のデータフロー形式にしていくようだ。

finn-hw-arch.png を引用する。
この図を見ると、on-chip にネットワークを展開して、並列化(というかパイプライン)するのだと思う。
finn_38_200601.png

やはり、以前 FPGA の部屋でもやってみた finn-hlslib ライブラリを使用して、Vivado HLS で IP にするようだ。( finn-hlslib ライブラリをやっていても使い方が資料不足でいまいち分からなかった)
ネットワークを変換して、 finn-hlslib ライブラリを使えるようにするようだ。楽しみだ。。。

Tidy-up transformations
ここでは、処理を用意にするためのモデルに適用される基本的な変換を説明してくれるらしい。

・ GiveUniqueNodeNames
・ GiveReadableTensorNames
・ InferShapes
・ InferDataTypes
・ FoldConstants


グーグル翻訳を一部変更して引用する。
GiveUniqueNodeNames、GiveReadableTensorNames では、グラフのノードに最初に(列挙によって)一意の名前が付けられ、次にテンソルに人間が読める名前(ノード名に基づく)が付けられる。
InferShapes、InferDataTypes は、モデルプロパティからテンソルの形状とデータ型を導出し、モデルの ValueInfo に設定する。
FoldConstants は、出力が定数のノードを削除して、定数にするようだ。
finn_39_200601.png

GiveUniqueNodeNames、GiveReadableTensorNames では、グラフのノードに分かりやすい名前が付いて、FoldConstants は、出力が定数のノードを削除しているようだ。
変更した新しいネットワークの tfc_w1_a1_tidy.onnx を Netron で示す。
finn_40_200601.png

tfc_w1_a1.onnx よりも簡単な図になった。
Reshape を見てみると、適当なノード名が付いている。
finn_41_200601.png

比較のために同じ Mul で比べてみると、 tfc_w1_a1_tidy.onnx ではノード名が付いている。
finn_42_200601.png

しかし、以前の tfc_w1_a1.onnx ではノード名が番号だった。
finn_43_200601.png

tfc_w1_a1_tidy.onnx 全体を示す。
finn_44_200601.png

Streamlining
streamlining (合理化)はいくつかのサブ変換がある。目的は、浮動小数点数を multi-thresholding nodes に変換することのようだ。論文は、”Streamlined Deployment for Quantized Neural Networks

finn_45_200601.png

streamlining 変換には複数の変換がある。Move と Collapse の変換を行って、MultiThreshold に変換される。変換はここにある。
その後、3つの tidy-up 変換(GiveUniqueNodeNames, GiveReadableTensorNames and InferDataTypes)がモデルに対して適用される。

tfc_w1_a1_streamlined.onnx のグラフを示す。
finn_46_200601.png

finn_47_200601.png

MatMul 層間で多くのノードが消え、Sign ノードのが MultiThreshold に変更された。
現在の streamlining の実装は非常にネットワークに依存するそうだ。ネットワークのトポロジがここに示すネットワークの例と大きく異なる場合は、動作しない可能性がある。今後のリリースで修正する予定だそうだ。

現在のネットワークは 1 ビット(-1, +1 の値)の量子化ネットワークで、FNN の論文に書いてあるように XNOR-popcount 操作として実装されている。2 値の行列の乗算は xnorpopcount 操作に変換される。この変換により、削除されて、しきい値演算が行われる。
finn_48_200601.png

finn_49_200601.png

XnorPopcountmatMulとMultiThresholdレイヤーのペアを観察する。これは、次のステップでそれらをHLSレイヤーに変換するための特定のパターンとなる。
  1. 2020年06月02日 03:33 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

finn をやってみる6(tfc_end2end_example.ipynb その1)

finn をやってみる5(1_brevitas_network_import.ipynb その2)”の続き。

前回は、 basics の 1_brevitas_network_import.ipynb の 3. Import into FINN and call cleanup transformations をやってみた。今回は、end2end_example の tfc_end2end_example.ipynb をやってみよう。これは全結合ネットワークを PYNQ ボードのビットファイルと制御用 Python コードに変換する手順を示した Jupyter Notebook のようだ。

end2end_example の tfc_end2end_example.ipynb のコンテンツを引用する。

FINN - End-to-End Flow
このノートブックでは、MNISTデータセットでトレーニングされた全結合2値化ネットワークを PYNQ ボードのビットファイルにする方法をやっていくそうだ。

Overview
finn-design-flow-example.svg を引用する。これは、ネットワークをトレーニングしてから、PYNQ ボードのビットファイルと Python ファイルを得るまでの手順を示しているようだ。
finn_32_200601.png

最初に緑の Brevitas のセクションがあって、その後、青の Vivado HLS に書けるための変換、オレンジのVivado HLS 処理、黄色のPYNQ ボードのビットファイルと Python コードを生成するフェーズがある。赤の項目は、 tfc_end2end_verification.ipynb でやるそうだ。

最初に showSrc, showInNetron をインポートする。
finn_33_200601.png

Outline

1. Brevitas export
2. Network preparation
3. Vivado HLS and IPI
4. PYNQ hardware generation and deployment


1. Brevitas export
FINN は ONNX モデルを入力することを想定しているようだ。よって、Brevitas で学習したモデルを使うことができる。FINN の Docker イメージにも Brevitas ネットワークの例が入っている。ここでは、TFC-w1a1 モデルをネットワークの例として使用する。
finn_34_200601.png

これで、トレーニングされた重みを持ったモデルがエクスポートされて、 tfc_w1_a1.onnx という名前でセーブされた。 tfc_w1_a1.onnx を見るのに Netron で視覚化する。
finn_35_200601.png

tfc_w1_a1.onnx の Netron で視覚化した図を示す。
finn_36_200601.png

.onnx フォーマットのモデルができたので、FINN を使うことができるようになった。FINN ModelWrapper を使ってモデルでの作業をしていく。

finn_37_200601.png

FINN には解析パスと変換パスがあるようだ。解析パスはモデルの情報を取り出してディクショナリ型にして返す。変換パスはモデルを変更して、変更されたモデルを FINN フローに返す。
  1. 2020年06月01日 05:38 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

xclbinutil を使ってみる2(--key-value、 --add-signature、 --get-signature)

xclbinutil を使ってみる”の続き。

前回は、Xilinx の日本語ビデオ資料の”ザイリンクス XCLBIN ユーティリティの概要 (日本語吹替)”を見たので、xclbinutil を使ってみたくなったので、やってみたのだが、一部ビデオの内容にあったのにやらなかったオプションがあった。私には要らなかな?と思ってやらなかったのだが、やはりやってみることにした。今回は、その抜けていたオプションの --key-value、 --add-signature、 --get-signature を使ってみよう。

key - value ペアを xclbin ファイルに埋め込むオプションが --key-value オプションだ。USER と SYS があるようだが、USER で key - valule ペアを埋め込んだ xclbin ファイルを生成する。
xclbinutil -i all_layers_dnn.xclbin -o all_layers_dnn_key.xclbin --key-value USER:layers_template:20200531
xclbinutil_13_200531.png

all_layers_dnn_key.xclbin が生成されているのが分かる。

それでは、 --info オプションで埋め込んだ key - valule ペアを確かめてみよう。
xclbinutil --info -i all_layers_dnn_key.xclbin
xclbinutil_14_200531.png

情報の最後に User Added Key Value Pairs が見える。

次に、 signature を xclbin に埋め込む。
やはり、 signature を埋め込んだ新しい xclbin ファイルを生成する。
xclbinutil -i all_layers_dnn.xclbin -o all_layers_dnn_sign.xclbin --add-signature all_laysers_template_20200531
xclbinutil_15_200531.png

all_layers_dnn_sign.xclbin が生成された。

all_layers_dnn_sign.xclbin の signature を見る時は、 --get-signature を使用する。
xclbinutil -i all_layers_dnn_sign.xclbin --get-signature
xclbinutil_16_200531.png

signature を取得することができた。
  1. 2020年05月31日 04:32 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

xclbinutil を使ってみる

Xilinx の日本語ビデオ資料の”ザイリンクス XCLBIN ユーティリティの概要 (日本語吹替)”を見たので、xclbinutil を使ってみたくなったので、やってみた。

xilinx の日本語ビデオ資料の”ザイリンクス XCLBIN ユーティリティの概要 (日本語吹替)”を参照して、やってみた。

まずは、 xclbinutil コマンドへのパスを設定する。
xrt の環境変数を設定する。
source /opt/xilinx/xrt/setup.sh

どの xclbin を見てみようということで、Vitis を起動して、アプリケーション・プロジェクトを見たところ、最初の all_layers_template プロジェクトを見てみよう。
xclbinutil_1_200530.png

all_layers_dnn.xclbin ファイルは /home/masaaki/Vitis_Work/2019.2/all_layers_template/Hardware/sd_card ディレクトリにある。
xclbinutil_2_200530.png

Vitis のアクセラレーション・カーネルがあるディレクトリに移動する。
cd /home/masaaki/Vitis_Work/2019.2/all_layers_template/Hardware/sd_card

最初に help を見てみよう。
xclbinutil --help
xclbinutil_3_200530.png
xclbinutil_4_200530.png

masaaki@masaaki-H110M4-M01:~/Vitis_Work/2019.2/all_layers_template/Hardware/sd_card$ xclbinutil --help
This utility operates on a xclbin produced by xocc.

For example:
  1) Reporting xclbin information  : xclbinutil --info --input binary_container_1.xclbin
  2) Extracting the bitstream image: xclbinutil --dump-section BITSTREAM:RAW:bitstream.bit --input binary_container_1.xclbin
  3) Extracting the build metadata : xclbinutil --dump-section BUILD_METADATA:HTML:buildMetadata.json --input binary_container_1.xclbin
  4) Removing a section            : xclbinutil --remove-section BITSTREAM --input binary_container_1.xclbin --output binary_container_modified.xclbin
  5) Signing xclbin                : xclbinutil --private-key key.priv --certificate cert.pem --input binary_container_1.xclbin --output signed.xclbin

Command Line Options
Options:
  -h [ --help ]             Print help messages
  -i [ --input ] arg        Input file name. Reads xclbin into memory.
  -o [ --output ] arg       Output file name. Writes in memory xclbin image to 
                            a file.
  --private-key arg         Private key used in signing the xclbin image.
  --certificate arg         Certificate used in signing and validating the 
                            xclbin image.
  --digest-algorithm arg    Digest algorithm. Default: sha512
  --validate-signature      Validates the signature for the given xclbin 
                            archive.
  -v [ --verbose ]          Display verbose/debug information.
  -q [ --quiet ]            Minimize reporting information.
  --migrate-forward         Migrate the xclbin archive forward to the new 
                            binary format.
  --remove-section arg      Section name to remove.
  --add-section arg         Section name to add.  Format: 
                            <section>:<format>:<file>
  --dump-section arg        Section to dump. Format: <section>:<format>:<file>
  --replace-section arg     Section to replace. 
  --key-value arg           Key value pairs.  Format: [USER|SYS]:<key>:<value>
  --remove-key arg          Removes the given user key from the xclbin archive.
  --add-signature arg       Adds a user defined signature to the given xclbin 
                            image.
  --remove-signature        Removes the signature from the xclbin image.
  --get-signature           Returns the user defined signature (if set) of the 
                            xclbin image.
  --info [=arg(=<console>)] Report accelerator binary content.  Including: 
                            generation and packaging data, kernel signatures, 
                            connectivity, clocks, sections, etc.  Note: 
                            Optionally an output file can be specified.  If 
                            none is specified, then the output will go to the 
                            console.
  --list-sections           List all possible section names (Stand Alone 
                            Option)
  --version                 Version of this executable.
  --force                   Forces a file overwrite.

Addition Syntax Information
---------------------------
Syntax: <section>:<format>:<file>
    <section> - The section to add or dump (e.g., BUILD_METADATA, BITSTREAM, etc.)
                Note: If a JSON format is being used, this value can be empty.  If so, then
                      the JSON metadata will determine the section it is associated with.
                      In addition, only sections that are found in the JSON file will be reported.

    <format>  - The format to be used.  Currently, there are three formats available: 
                RAW: Binary Image; JSON: JSON file format; and HTML: Browser visible.

                Note: Only selected operations and sections supports these file types.

    <file>    - The name of the input/output file to use.

  Used By: --add_section and --dump_section
  Example: xclbinutil --add-section BITSTREAM:RAW:mybitstream.bit


all_layers_dnn.xclbin の情報を見てみよう。
xclbinutil --info --input all_layers_dnn.xclbin
xclbinutil_5_200530.png
xclbinutil_6_200530.png

masaaki@masaaki-H110M4-M01:~/Vitis_Work/2019.2/all_layers_template/Hardware/sd_card$ xclbinutil --info --input all_layers_dnn.xclbin 
XRT Build Version: 2.3.1301
       Build Date: 2019-10-24 20:05:16
          Hash ID: 192e706aea53163a04c574f9b3fe9ed76b6ca471
------------------------------------------------------------------------------
Warning: The option '--output' has not been specified. All operations will    
         be done in memory with the exception of the '--dump-section' command.
------------------------------------------------------------------------------
Reading xclbin file into memory.  File: all_layers_dnn.xclbin

==============================================================================
XRT Build Version: 2.3.1301
       Build Date: 2019-10-24 20:05:16
          Hash ID: 192e706aea53163a04c574f9b3fe9ed76b6ca471
==============================================================================
xclbin Information
------------------
   Generated by:           v++ (2019.2) on Thu Oct 24 18:45:48 MDT 2019
   Version:                2.3.1301
   Kernels:                all_layers_dnn
   Signature:              
   Content:                Bitstream
   UUID (xclbin):          5def028b-c959-4a11-b9c6-8aed2fda4be3
   Sections:               BITSTREAM, MEM_TOPOLOGY, IP_LAYOUT, CONNECTIVITY, 
                           BUILD_METADATA, EMBEDDED_METADATA, SYSTEM_METADATA
==============================================================================
Hardware Platform (Shell) Information
-------------------------------------
   Vendor:                 vendor
   Board:                  Ultra96V2
   Name:                   ultra96v2_min2
   Version:                1.0
   Generated Version:      Vivado 2019.2 (SW Build: 2700185)
   Created:                Fri Nov 29 04:12:55 2019
   FPGA Device:            xczu3eg
   Board Vendor:           em.avnet.com
   Board Name:             em.avnet.com:ultra96v2:1.0
   Board Part:             em.avnet.com:ultra96v2:part0:1.0
   Platform VBNV:          vendor_Ultra96V2_ultra96v2_min2_1_0
   Static UUID:            00000000-0000-0000-0000-000000000000
   Feature ROM TimeStamp:  0

Clocks
------
   No clock frequency data available.

Memory Configuration
--------------------
   Name:         HPC
   Index:        0
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HPC
   Index:        1
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HP
   Index:        2
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x80000000
   Bank Used:    Yes

   Name:         HP
   Index:        3
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HP
   Index:        4
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No

   Name:         HP
   Index:        5
   Type:         MEM_DRAM
   Base Address: 0x0
   Address Size: 0x0
   Bank Used:    No
==============================================================================
Kernel: all_layers_dnn

Definition
----------
   Signature: all_layers_dnn (* inm, * output, * dot2, int x_size, int y_size)

Ports
-----
   Port:          M_AXI_GMEM
   Mode:          master
   Range (bytes): 0xFFFFFFFF
   Data Width:    32 bits
   Port Type:     addressable

   Port:          M_AXI_GMEM2
   Mode:          master
   Range (bytes): 0xFFFFFFFF
   Data Width:    32 bits
   Port Type:     addressable

   Port:          S_AXI_CONTROL
   Mode:          slave
   Range (bytes): 0x1000
   Data Width:    32 bits
   Port Type:     addressable

--------------------------
Instance:        all_layers_dnn_1
   Base Address: 0xa0000000

   Argument:          inm
   Register Offset:   0x10
   Port:              M_AXI_GMEM
   Memory:            HP (MEM_DRAM)

   Argument:          output
   Register Offset:   0x1C
   Port:              M_AXI_GMEM
   Memory:            HP (MEM_DRAM)

   Argument:          dot2
   Register Offset:   0x28
   Port:              M_AXI_GMEM2
   Memory:            HP (MEM_DRAM)

   Argument:          x_size
   Register Offset:   0x34
   Port:              S_AXI_CONTROL
   Memory:            <not applicable>

   Argument:          y_size
   Register Offset:   0x3C
   Port:              S_AXI_CONTROL
   Memory:            <not applicable>
==============================================================================
Generated By
------------
   Command:       v++
   Version:       2019.2 - Thu Oct 24 18:45:48 MDT 2019 (SW BUILD: 2700185)
   Command Line:  v++ --target hw --link --config common-config.ini --config all_layers_dnn-link.ini -oall_layers_dnn.xclbin ../src/all_layers_dnn.xo 
   Options:       --target hw
                  --link
                  --config common-config.ini
                  --config all_layers_dnn-link.ini
                  -oall_layers_dnn.xclbin ../src/all_layers_dnn.xo 
==============================================================================
User Added Key Value Pairs
--------------------------
   <empty>
==============================================================================
Leaving xclbinutil.


セクション項目を観察するために xclbin ファイルのセクション項目をリストしてみよう。
xclbinutil --list-section
xclbinutil_7_200530.png
xclbinutil_8_200530.png

masaaki@masaaki-H110M4-M01:~/Vitis_Work/2019.2/all_layers_template/Hardware/sd_card$ xclbinutil --list-section
XRT Build Version: 2.3.1301
       Build Date: 2019-10-24 20:05:16
          Hash ID: 192e706aea53163a04c574f9b3fe9ed76b6ca471
All supported section names supported by this tool:
  BITSTREAM
  BITSTREAM_PARTIAL_PDI
  BMC
  BUILD_METADATA
  CLEARING_BITSTREAM
  CLOCK_FREQ_TOPOLOGY
  CONNECTIVITY
  DEBUG_DATA
  DEBUG_IP_LAYOUT
  DESIGN_CHECKPOINT
  DNA_CERTIFICATE
  EMBEDDED_METADATA
  EMULATION_DATA
  FIRMWARE
  IP_LAYOUT
  KEYVALUE_METADATA
  MCS
  MEM_TOPOLOGY
  PARTITION_METADATA
  PDI
  SCHED_FIRMWARE
  SOFT_KERNEL
  SYSTEM_METADATA
  USER_METADATA


MEM_TOPOLOGY セッションを mem.json ファイルに書き出す。
xclbinutil --dump-section MEM_TOPOLOGY:json:mem.json -i all_layers_dnn.xclbin
xclbinutil_9_200530.png

mem.json ファイルが生成された。
xclbinutil_10_200530.png

mem.json ファイルを示す。

{
    "mem_topology": {
        "m_count": "6",
        "m_mem_data": [
            {
                "m_type": "MEM_DRAM",
                "m_used": "0",
                "m_sizeKB": "0x0",
                "m_tag": "HPC",
                "m_base_address": "0x0"
            },
            {
                "m_type": "MEM_DRAM",
                "m_used": "0",
                "m_sizeKB": "0x0",
                "m_tag": "HPC",
                "m_base_address": "0x0"
            },
            {
                "m_type": "MEM_DRAM",
                "m_used": "1",
                "m_sizeKB": "0x200000",
                "m_tag": "HP",
                "m_base_address": "0x0"
            },
            {
                "m_type": "MEM_DRAM",
                "m_used": "0",
                "m_sizeKB": "0x0",
                "m_tag": "HP",
                "m_base_address": "0x0"
            },
            {
                "m_type": "MEM_DRAM",
                "m_used": "0",
                "m_sizeKB": "0x0",
                "m_tag": "HP",
                "m_base_address": "0x0"
            },
            {
                "m_type": "MEM_DRAM",
                "m_used": "0",
                "m_sizeKB": "0x0",
                "m_tag": "HP",
                "m_base_address": "0x0"
            }
        ]
    }
}


もう1つ IP_LAYOUT セクション項目を ip_layout.json に出力した。
xclbinutil --dump-section IP_LAYOUT:json:ip_layout.json -i all_layers_dnn.xclbin
xclbinutil_11_200530.png

ip_layout.json が生成された。
xclbinutil_12_200530.png

ip_layout.json ファイルを示す。

{
    "ip_layout": {
        "m_count": "1",
        "m_ip_data": [
            {
                "m_type": "IP_KERNEL",
                "m_int_enable": "1",
                "m_interrupt_id": "0",
                "m_ip_control": "AP_CTRL_HS",
                "m_base_address": "0xa0000000",
                "m_name": "all_layers_dnn:all_layers_dnn_1"
            }
        ]
    }
}

  1. 2020年05月30日 07:17 |
  2. Vitis
  3. | トラックバック:0
  4. | コメント:0

finn をやってみる5(1_brevitas_network_import.ipynb その2)

finn をやってみる4(1_brevitas_network_import.ipynb その1)”の続き。

前回は、 basics の 1_brevitas_network_import.ipynb の 2. Call Brevitas FINN-ONNX export and visualize with Netron までをやってみた。今回は、 basics の 1_brevitas_network_import.ipynb の 3. Import into FINN and call cleanup transformations をやってみよう。

basics の 1_brevitas_network_import.ipynb のコードや文章、またそれの Google 翻訳を引用する。

finn_28_200529.png
finn_29_200529.png
finn_30_200529.png

すべて正常に実行することができた。
最後に /tmp/LFCW1A1-clean.onnx のグラフを示す。
finn_31_200529.png
  1. 2020年05月29日 04:56 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0
»