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

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

FPGAの部屋

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

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

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

finn をやってみる3(Jupyter Notebook2)”の続き。

前回は、Round を削除して basics の 0_how_to_work_with_onnx.ipynb をやってみたところ、すべて実行することができた。今回は、次に basics の 1_brevitas_network_import.ipynb をやってみよう。

記事中に basics の 1_brevitas_network_import.ipynb のコードや文章を全面的に引用する。

Importing Brevitas networks into FINN
Brevitas で訓練された QNN を FINN にインポートする方法を紹介する。
手順は、

1. Load up the trained PyTorch model
2. Call Brevitas FINN-ONNX export and visualize with Netron
3. Import into FINN and call cleanup transformations


onnx, showSrc, showInNetron をインポートする。

1. Load up the trained PyTorch model
example Brevitas networks の中の全結合ネットワークで 1 ビットの MNIST データセットの LFC-w1a1 モデルをやってみる。
showSrc(LFC) でソースコードを表示した。ソースコードは basics の 1_brevitas_network_import.ipynb のコード参照。
finn_22_200528.png

ネットワークトポロジは、量子化線形層と量子化アクティベーションを生成するいくつかのヘルパー関数を使用して構築されていることがわかります。レイヤーのビット幅は実際にはコンストラクターでパラメーター化されているので、このネットワークの1ビットの重みとアクティベーションバージョンをインスタンス化しましょう。モデルにロードするこのネットワークの事前トレーニング済みの重みもあります。


finn_23_200528.png

finn/src/finn/data/onnx/mnist-conv/test_data_set_0/input_0.pb をロードして、28 x 28 に reshape して表示した。 2 の画像だ。 2 の画像を推論すると 2 の確率が高い。 2 を表示するコードは 2 回実行しないと 2 が表示されない。
finn_24_200528.png

2 の画像を推論結果をグラフにする。
finn_25_200528.png

2. Call Brevitas FINN-ONNX export and visualize with Netron

Brevitasには、FINN-ONNXエクスポート機能が組み込まれています。これは、PyTorchの通常のONNXエクスポート機能に似ていますが、いくつかの違いがあります。
1. 重み量子化ロジックはグラフの一部としてエクスポートされません。むしろ、量子化された重み自体がエクスポートされます。
2. 特別な量子化アノテーションは、低ビット量子化情報を保持するために使用されます。ONNX(執筆時)は、最小ビット幅として8ビットの量子化をサポートしていますが、FINN-ONNXの量子化アノテーションは、バイナリ/バイポーラ量子化に分類できます。
3. 低ビット量子化アクティベーション関数は、MultiThresholdオペレーターとしてエクスポートされます。
実際、次のようにBrevitasモデルからONNXをエクスポートするのは非常に簡単です。


finn_26_200528.png

このノートブックをFINN Dockerコンテナーで実行すると、上記のインポートされたネットワークのインタラクティブな視覚化を確認し、個々のノードをクリックしてパラメーターを調べることができます。MatMulノードのいずれかを見ると、重みがすべて{-1、+1}の値であり、アクティベーションがSign関数であることがわかります。


LFCW1A1.onnx ネットワークを PNG ファイルにしたので貼っておく。
finn_27_200528.png
  1. 2020年05月28日 05:31 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0

finn をやってみる3(Jupyter Notebook2)

finn をやってみる2(Jupyter Notebook)”の続き。

前回は、Jupyter Notebook でサンプルをやってみたが、Round がバージョン 10 には存在しないということでエラーになってしまった。今回は、Round を削除して basics の 0_how_to_work_with_onnx.ipynb をやってみよう。

onnx モデルの Round をコメントアウトした。
finn_14_200527.png

Add2_node = onnx.helper.make_node(
    'Add',
    inputs=['sum1', 'in3'],
    outputs=['sum2'],
    name='Add2',
)

Add3_node = onnx.helper.make_node(
    'Add',
    inputs=['abs1', 'abs1'],
    outputs=['out1'],
    name='Add3',
)

Abs_node = onnx.helper.make_node(
    'Abs',
    inputs=['sum2'],
    outputs=['abs1'],
    name='Abs'
)

#Round_node = onnx.helper.make_node(
#    'Round',
#    inputs=['sum3'],
#    outputs=['out1'],
#    name='Round',
#)


前回書いた部分は同じなので、飛ばすが、onnx モデルの図を示す。
finn_15_200527.png

Round を飛ばして、直接 Add から out1 に出力している。

前回、エラーになった、onnxruntime でモデルを実行して計算する部分でもエラーにならずに通った。
しかし、モデルの実行出力と参照出力が Round を除いてしまったので、値が違ってしまった。
finn_16_200527.png

How to manipulate an ONNX model
現在のモデルでは、Add を 2 個接続して、3 個の入力の加算をやっているが、Sum もあって、複数入力の加算もできる。
FINN では、グラフを操作できるいくつかのヘルパー関数を持っている。
get_node_id() 関数を定義する。get_node_id() 関数は、モデルのノード名をキーとするインデックス番号の値のディクショナリを返す。
identify_adder_nodes() 関数を定義する。 identify_adder_nodes() 関数は、モデルの Add ノードを検索し、Add ノードのリストを返す。
identify_adder_nodes() 関数を使って Add ノードを表示した。
finn_17_200527.png

find_predecessor() 関数、 find_successor() 関数、 adder_pair() 関数を作成して、Add のペアを探そうとしている。

Add ノードリストの add_nodes にこれらの関数を適用すると Add1 + Add2 の Add のペアが見つかった。
finn_18_200527.png

substitute_pair の入力を検索すると、['in1', 'in2', 'in3'] だった。
Add ペアを Sum で代替えするために sum_output と Sum_node を用意した。
モデルに Sum_node を挿入して、Add ペアのノードを削除した。
finn_19_200527.png

ノードを適切な場所に挿入するには、substitute_pairの最初のノードのインデックスを合計ノードのノードインデックスとして使用し、 .insert を使用してモデルに埋め込む。次に、 .remove を使用して、substitute_pair の 2 個の Add を削除する。この .insert と .remove は ONNX の機能だそうだ。
新しい ONNX モデルのグラフを Netorn で描画する。
finn_20_200527.png

前のモデルと出力結果が同じかを調べた。
onnxruntime が使用できる。
finn_21_200527.png

Round が無いので、結果はエラーだが、期待値と同じだと思う。
  1. 2020年05月27日 04:54 |
  2. finn
  3. | トラックバック:0
  4. | コメント:0
»