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
ネットワークトポロジは、量子化線形層と量子化アクティベーションを生成するいくつかのヘルパー関数を使用して構築されていることがわかります。レイヤーのビット幅は実際にはコンストラクターでパラメーター化されているので、このネットワークの1ビットの重みとアクティベーションバージョンをインスタンス化しましょう。モデルにロードするこのネットワークの事前トレーニング済みの重みもあります。
Brevitasには、FINN-ONNXエクスポート機能が組み込まれています。これは、PyTorchの通常のONNXエクスポート機能に似ていますが、いくつかの違いがあります。
1. 重み量子化ロジックはグラフの一部としてエクスポートされません。むしろ、量子化された重み自体がエクスポートされます。
2. 特別な量子化アノテーションは、低ビット量子化情報を保持するために使用されます。ONNX(執筆時)は、最小ビット幅として8ビットの量子化をサポートしていますが、FINN-ONNXの量子化アノテーションは、バイナリ/バイポーラ量子化に分類できます。
3. 低ビット量子化アクティベーション関数は、MultiThresholdオペレーターとしてエクスポートされます。
実際、次のようにBrevitasモデルからONNXをエクスポートするのは非常に簡単です。
このノートブックをFINN Dockerコンテナーで実行すると、上記のインポートされたネットワークのインタラクティブな視覚化を確認し、個々のノードをクリックしてパラメーターを調べることができます。MatMulノードのいずれかを見ると、重みがすべて{-1、+1}の値であり、アクティベーションがSign関数であることがわかります。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |