FC2カウンター FPGAの部屋 2020年05月27日
FC2ブログ

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

FPGAの部屋

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

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