Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20250516_cvim.pdf

Avatar for Hiromitsu Awano Hiromitsu Awano
May 19, 2025
340

 20250516_cvim.pdf

Avatar for Hiromitsu Awano

Hiromitsu Awano

May 19, 2025
Tweet

Transcript

  1. 自己紹介 (粟野皓光;Hiromitsu Awano) ▍2016/03 京大大学院情報科学研究科博士後期課程修了 ▍2016/04 (株)日立製作所・中央研究所 ▍2017/01 東京大学大規模集積システム設計教育研究センター・助教 ▍2019/01

    大阪大学大学院情報科学研究科・准教授 ▍2020/09 京都大学大学院情報学研究科・准教授 楕円曲線暗号アクセラレータ 3.56mm 1.76mm 128×128×6段 = 98304シナプス 完全自己同期AI アクセラレータ 3mm 6mm 生物(カエル)モニタリング 島根県隠岐の島諸島の水田 シュレーゲル アオガエル ニホンアマ ガエル ロボット模倣学習
  2. コンピュータの基本構造と消費エネルギ ▍以下の部品から構成される ◆プログラムカウンタ: 命令を読出す メモリのアドレスを格納 ◆命令デコーダ: 命令の実行内容を解析 ◆命令実行ユニット: 解析された内容により 命令を実行

    ◆レジスタ: 小規模な記憶装置 ◆主記憶: 1次元アドレスを持つ大規模な記 憶装置 ▍プログラム実行とは命令に従ってメモリ の中身を書き換えること ▍コンピュータが消費する主なエネルギ ◆計算そのものに要するエネルギ ◆メモリとの通信に要するエネルギ 命令 レジスタ 命令 デコーダ 命令実行 ユニット レジスタ プログラム カウンタ メモリ 計算機の模式図 4
  3. CMOS集積回路 ▍pMOS・nMOSの2種類のトランジスタを組み合わせて論理回路を実現 ソース ゲート ドレイン Body n+ n+ p 絶縁膜

    ポリシリコン LSIチップの断面 トランジスタ 配線 LSIチップ ゲート: 0V スイッチOFF ゲート: 電源電圧 スイッチON ソース ゲート ドレイン Body p+ p+ n 絶縁膜 ポリシリコン ゲート: 0V スイッチOFF ゲート: 電源電圧 スイッチON nMOS pMOS 動作 動作 Cmos-chip structure in 2000s / Cepheiden / CC BY 2.5 / https://en.wikipedia.org/wiki/Back_end_of_line 5
  4. インバータ(論理反転素子)の実現例 p+ p+ n+ n p p+ n+ n+ 素子分離

    (Shallow Trench Isolation; STI) 絶縁材(SiO2など) 断面図 鳥瞰図(レイアウト) 電源 0V 入力 出力 入力 出力 pMOS nMOS 0V 電源 回路図 動作 入力=0Vのとき 電源 0V 出力=電源電圧 入力=電源電圧のとき 電源 0V 出力=0V 6
  5. CMOS集積回路における消費エネルギ ▍消費エネルギは主に以下の3つ ◆スイッチング(支配的) • トランジスタのゲートや配線の寄生容量を充放電するエネルギ ◆貫通電流 • nMOS/pMOSが両方ともONになっている僅かな時間に流れる貫通電流で消費されるエネルギ ◆リーク電流 •

    トランジスタは理想的なスイッチでは無く、オフ状態であっても僅かな電流(リーク電流)が流れ続け るため、エネルギが消費される ▍消費エネルギ削減には余分な機能を削ぎ落して小さな回路にすることが重要 7
  6. Field Programmable Gate Array (FPGA) ▍“再構成可能な”ハードウェア ◆勿論、物理的に再構成するわけでは無く、論理的に再構成する ◆実体としてはメモリ+スイッチマトリクスのお化け ▍ルックアップテーブルを用いて任意の 真理値表を実現

    A B C Y 0 0 0 1 0 0 1 0 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 A (=0) B (=1) C (=1) Y (=0) ここを書き換えられるようにメモリで作っておく 真理値表に応じて 書き換える 入 力 出力 9
  7. FPGAとASICの性能比較 ▍ASICの方が当然高速 ◆FPGAは“再構成”するためにかなりのオーバーヘッドが割かれている ◆古い研究だが • 乗算専用回路等を持たないFPGAは ASICと比較して 32xの面積と3.4xの遅延 • DSPを持つFPGAと比較しても

    17xの面積と3xの遅延 Logic Element Switch Box ブロック間の接続も実装したい回路に応じて 切り替えられるようになっている I. Kuon and J. Rose, "Measuring the Gap Between FPGAs and ASICs," IEEE Transactions on Computer-Aided Design of Integrated Circuits and Systems, vol. 26, no. 2, pp. 203-215, Feb. 2007. 10
  8. 専用ハードウェア化が必ずしもいいわけでは無い ▍Q:ASIC化すればGPUより高速になるのか? ▍A:一切のプログラマビリティを捨て去れば(ネットワーク重み等が固定された特定のモデル に特化した回路を作れれば)GPUより早くなる(かもしれない) ▍理由 ◆ASICはチップ外部との通信が遅い • GPUではシリコンインターポーザ等の後工程技術を使い、メモリとGPU本体を密に結合(ただし非常 にコストが高い) •

    チップを載せるプリント基板の設計にもノウハウがある(普通に作るとチップ外に引き出せる信号は 100MHz程度) • 学生さんが考えた最強回路が1GHzで動いたとしても、そこにデータを入れる手段がない ◆ASIC向けに使えるテクノロジノードが古いことが多い • テクノロジノードとは22nm・14nm・7nm等で表されるもの • 22nmより7nmの方が一般的には性能が高い • 2nm等の最先端プロセスを使えるのは極僅かな企業 11
  9. Tensorflow liteの量子化モデル ▍スケール係数・バイアスを使って実数値を近似表現 ◆𝑟 ≈ 𝑆 𝑞 − 𝑍 •

    𝑟:実数値・ 𝑆 :スケール係数・ 𝑞:量子化後の値・ 𝑍:ゼロ点 • rとSは浮動小数点数、q・Zは整数 ▍1層分の計算(𝑙層の活性化値・重みから𝑙 + 1層の活性化値を計算する)を考え ると以下のようになる ◆𝑆𝑎 𝑙 𝑞𝑎 𝑙 − 𝑍𝑎 𝑙 ∙ 𝑆𝑤 𝑞𝑤 − 𝑍𝑤 = 𝑆𝑎 𝑙+1 𝑞𝑎 𝑙+1 − 𝑍𝑎 𝑙+1 ◆整理すると𝑞𝑎 𝑙+1 = 𝑆𝑎 𝑙 ∙𝑆𝑤 𝑆𝑎 𝑙+1 𝑞𝑎 𝑙 − 𝑍𝑎 𝑙 𝑞𝑤 − 𝑍𝑤 + 𝑍𝑎 𝑙+1 ▍経験的に𝑆𝑎 𝑙 ∙𝑆𝑤 𝑆𝑎 𝑙+1 が1より小さいことが分かっているので、 𝑆𝑎 𝑙 ∙𝑆𝑤 𝑆𝑎 𝑙+1 を2−𝑁の形で近似 ▍整数の加減算とシフト演算のみで右辺を計算できる 18
  10. Quantization Aware Training (QAT) ▍量子化誤差を加味して学習する方法 ▍量子化関数(sign等)は至る所で微分がゼロで 誤差が伝播しない ▍順伝播と逆伝播で異なる活性化関数を使う (Straight through

    estimator) ◆順伝播: sign(x) ◆逆伝播:hard-tanh(x) ▍Binarized Neural Network(重み・活性化値ともに2値)ではQATが主流 x Sign(x) x Htanh(x) MNIST CIFAR10 SVHN Binarized Neural Network 0.96% 11.4% 2.80% BinaryConnect 1.29% 9.90% 2.30% 19
  11. 他にも… ▍Incremental Quantization [Aojun Zhow et al., ICLR2017] ◆絶対値の大きな重みだけを選ん で量子化→再学習→残った重み

    から絶対値の大きなものを選んで 量子化、を繰り返す ▍Logarithmic Quantization [Daisuke Miyashita et al., arXiv:1603.01025] ◆ゼロ付近の値を高精度に表現し たいので、2の冪で近似する 20
  12. ASIC実装 ▍ASIC実装まで選択肢を広げれば“アナログ計算”も視野に入る ▍アナログ計算とは電流・電圧・電荷等の加算を使って積和演算をアナログ的 に行う手法 Vdd Vss … … S S

    𝑥1 ∙ 𝑤1 𝑥2 ∙ 𝑤2 𝑥𝑛−1 ∙ 𝑤𝑛−1 𝑥𝑛 ∙ 𝑤𝑛 +1 +1 -1 -1 乗算結果に従って スイッチの接続を 切り替える Vout Vdd Vss Vout Vout = R R R R R オン状態のトランジスタ は抵抗としてみなせる Noff Vdd側に繋いだ 数:Non Vss側に繋いだ 数:Noff R Noff + R Non = Non Non+Noff ×Vdd ×Vdd σ 𝒙𝒊 ∙ 𝒘𝒊 をアナログ電圧として取り出せる 21
  13. キャパシタ分圧 ▍抵抗分圧のキャパシタ版 ▍抵抗分圧と違って貫通電流が流れないため、エネルギ効率が高い Vdd Vss … … 𝑥1 ∙ 𝑤1

    𝑥2 ∙ 𝑤2 𝑥𝑛−1 ∙ 𝑤𝑛−1 𝑥𝑛 ∙ 𝑤𝑛 Vout +1 +1 -1 -1 乗算結果に従って スイッチの接続を 切り替える Vdd Vss Vout C C C C 24
  14. ASIC設計するには?? ▍ASIC設計の成果物はレイアウト図 ◆集積回路の製造:印刷技術(フォトリソグラ フィ)により選択的に処理する • 特定のイオンを注入する領域 / しない領域 • 絶縁膜に穴をあける領域

    / しない領域 • 金属配線を形成する領域 / しない領域 ▍ディジタル回路の場合は(ほぼ)自動で レイアウトが生成できる ▍アナログ回路は未だに手設計が主流 26 レイアウト例
  15. ハードウェア記述言語 ▍HDL:Hardware Description Language ▍C言語に似た平易で表現力の高い記述言語 ▍VHDL ◆1987年に IEEEにより標準化(IEEE1076) ◆1992年に 改訂(IEEE1164)

    ◆元々は仕様を記述するための言語 ▍Verilog-HDL ◆1995年に IEEEにより標準化(IEEE1364) ◆元々はシミュレーション用の言語 0 50 100 150 200 Groovy VHDL Ruby Scala C/C++ Bash ABAP Rust Clojure Solidity Salary [k USD] Top 10 highest paid programming languages in 2024 https://www.devjobsscanner.com/blog/top-10-highest-paid- programming-languages/ 28
  16. Verilog-HDLとC言語の比較 ▍C言語の関数は、手続きを逐次的に 実行する ▍Verilog-HDLのモジュールは、全ての 手続きブロックを同時に実行する main () { } 宣言

    手続き module foo; endmodule 宣言 initialブロック alwaysブロック alwaysブロック 手続き 逐次的 並列動作と して扱う 30
  17. 合成の例 ▍人間が書く必要があるのが以下の コード(16bit乗算器) ▍これを合成すると…約900行のVerilog が生成される ◆NAND/INV等の論理ゲートを使った記 述になっている module mul(a, b,

    p); input [15:0] a; input [15:0] b; output [31:0] p; assign p = a*b; endmodule // mul module mul ( A, B, P ); input [15:0] A; input [15:0] B; output [31:0] P; wire N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12, N13, N14, N15, N16,N17, N18, N19, N20, N21, N22, N23, N24, N25, N26, N27, N28, N29, N30, N31, N32, N33, N34, N35, N36, N37, N38, N39, N40, N41, N42, N43, N44, INVXD U669 ( .A(N766), .YB(P[3]) ); OA21XB U670 ( .A0(N769), .A1(N768), .B(N767), .Y(P[2]) ); NAND2XB U671 ( .A(A[1]), .B(B[0]), .YB(N771) ); XOR2XB U672 ( .A(N771), .B(N770), .Y(P[1]) ); INVXD U673 ( .A(N773), .YB(N775) ); AO221XB U674 ( .A0(N775), .A1(N774), .B0(N773), .B1(B[15]), .C(N772), .Y(N784) ); ADDFXD U675 ( .A(N786), .B(N777), .CIN(N776), .COUT(N782), .SUM(N778) ); ADDFXD U676 ( .A(N780), .B(N779), .CIN(N778), .COUT(N781), .SUM(N659) ); XNOR2XB U677 ( .A(N782), .B(N781), .YB(N783) ); XNOR2XB U678 ( .A(N784), .B(N783), .YB(N785) ); XOR2XB U679 ( .A(N786), .B(N785), .Y(P[31]) ); endmodule … 32
  18. モジュールの書き方 ▍module で始まり、endmodule で終わる ▍回路の種類を表すモジュール名を付ける ▍通常、入出力信号がある module add32(a,b,s); input [31:0]

    a,b; output [32:0] s; assign s=a+b; endmodule キーワード「module」 キーワード「endmodule」 モジュール名 入出力信号名 入力信号の宣言 出力信号の宣言 33
  19. スタンダードセルの形状 ▍各セルには、そのセルが占有する長方形の領域(他のセルと重ねてはいけな い領域)が定義されている ▍高さはどのセルも同じ、幅はある値の整数倍 ▍全てのセルは同じ Y 座標に VDD 端子と VSS

    端子がある ◆セルを横に並べると自動的に電源は相互に接続される ▍信号配線が通る場所(トラック)は縦横にあらかじめ定義されている ◆全ての入出力端子は水平配線トラックと垂直配線トラックの交点に置かれている ▍セル内では、入出力端子以外には第2層メタルをなるべく使わないようにして ある ◆上層配線の邪魔になるため 38
  20. レイアウト検証 ▍レイアウトが出来たからと言って終わりでは無い…幾つかの検証が必要 ▍設計ルール検証 (DRC: design rule check) ◆レイアウト設計結果が全てのDRを満たすか ▍回路図との一致検証 (LVS:

    layout versus schematic) ◆レイアウト設計結果と回路図が一致するか ▍電気的ルール検証 (ERC: electrical rule check) ◆意図しないショートや浮きがないか ▍アンテナルール検証 (antenna rule check) ◆アンテナ比のルールを満たしているか 42
  21. Layout Versus Schematic (LVS) ▍出来上がったレイアウト(図形)から 回路を抽出して、元の回路と整合 するかをチェックする ◆図形データからトランジスタ等の素 子・配線を抽出し回路図を作る ◆元の回路と等価か否かを検証する

    ▍自動配置配線ツールへの制約(セ ル密度など)が厳しいと、LVSエラー が出る可能性が高くなる ◆配線密度が高すぎて、短絡したり、繋 げなかったりする 回路設計 レイアウト設計 ネットリスト レイアウトデータ 素子抽出プログラム ネットリスト 比較 43
  22. LSI設計に必要なもの ▍EDAツール ◆回路図エディタ(emacs等でも可) ◆レイアウトエディタ ◆SPICEシミュレータ ◆論理合成ツール ◆配置配線ツール ◆検証ツール ◆フリーのものもあるが、本格的な設計に は有償ツールが不可欠

    • Cadence / Synopsys / Mentor ◆日本の教育機関は東大dlabを介して EDAライセンスを取得可能 ▍プロセスデザインキット(PDK)≒試作 プロセス ◆トランジスタ等の素子特性をモデル化し たファイル(SPICEモデル) ◆検証ツール用のルールファイル (DRC/LVS) ◆スタンダードセルライブラリ • レイアウト(GDS) • ネットリスト • 自動配置配線用のファイル(LEF) • タイミングファイル(.db / .lib) • Verilogシミュレーション用のファイル 45
  23. 畳み込み層の実装例 ▍ソフトウェア的なコード ▍ハードウェア実装を指向したコード for (row=0; row<R; row++) { for (col=0;

    col<C; col++) { for (to=0; to<M; t o++) { for (ti=0; ti<N; ti++) { for (i=0; i<K; i++) { for (j=0; j<K; j++) { output_fm[to][row][col] += weights[to][ti][i][j]∗input_fm[ti][S∗row+i][S∗col+j] ; }}}}}} for (row=0; row<R; row+=Tr) { for (col=0; col<C; col+=Tr) { for (to=0; to<M; to+=Tm) { for (ti=0; ti<N; ti +=Tn) { for ( i=0; i<K; i++) { for ( j=0; j<K; j++) { for (trr=row; trr<min(row+Tr,R); trr++){ for (tcc=col; tcc<min(col+Tc,C); tcc++){ for (too=to; too<min(to+Tm,M); too++){ #pragma HLS UNROLL for (tii=ti; tii<min(ti+Tn,N); tii++){ #pragma HLS UNROLL output_fm[too][trr][tcc] += weights[too][tii][i][j]∗input_fm[tii][S∗trr+i][S∗tcc+j]; }}}}}} }}}} “for文を全展開せよ”という指示 赤枠部分のコードで、出力マップのうちで Tm×Tr×Tcのキューブを計算している この記述例だとTm×Tn個のMACを同時 に計算する回路が生成される 47 (off chipのDRAMからオンチップBRAMへのデータ転送)
  24. 畳み込み層の実装例(ストリーム対応のHLSコード) ▍ストリーム的に畳み込みを計算するには以下のようなコードにする for (int i=0; i<INPUT_H * INPUT_W; i++){ #pragma

    HLS PIPELINE data_t pixel = input_stream.read(); for (int j=2*INPUT_W+K_SIZE-1; i>0; i--){ line_buffer[j] = line_buffer[i-1]; } line_buffer[0] = pixel; if(i >= INPUT_W*(K_SIZE-1)+K_SIZE){ output_pixel = 0; for (int ki=0; ki<K_SIZE; ki++){ for (int kj=0; kj<K_SIZE; kj++){ output_pixel += line_buffer[ki*INPUT_W+kj]*kernel[ki][kj]; } } output_stream.write(output_pixel); } } 同じ畳み込み演算処理であっても 実現したいアーキテクチャによって コードを改変する必要がある 49
  25. FPGAとCPUを組み合わせたシステム ▍FPGAだけだと不便なことが多い ◆ネットワークやファイルシステム・オフチップメモリ等はOSが動いていた方が便利 ▍最近のFPGAはArm等のCPUを搭載している(Zynq / Agilex) ◆Arm上でUbuntuが動き、jupyter notebookも起動する ▍PYNQ (Python

    Productivity for Zynq) ◆PythonからFPGAを制御できるようになっている from pynq import Overlay, allocate # bitファイルを読み込み(FPGAをコンフィグする) overlay = Overlay("design.bit") # レジスタマップを取得 regmap = conv2d_ip.register_map # FPGAからアクセスする配列を宣言 input_array = allocate(shape=(INPUT_CHANNELS * INPUT_HEIGHT * INPUT_WIDTH,), dtype=np.int16) # FPGAに配列先頭アドレスを伝える regmap.input_array_1 = input_array.physical_address # FPGAでの計算を開始 regmap.CTRL.AP_START = 1 50
  26. 生成されたコードの一部 void conv2d( pixel_t input[H][W][C_IN], weight_t kernel[C_OUT][C_IN][K][K], acc_t output[H][W][C_OUT] )

    { #pragma HLS ARRAY_PARTITION variable=kernel complete dim=1 #pragma HLS ARRAY_PARTITION variable=kernel complete dim=2 #pragma HLS ARRAY_PARTITION variable=input complete dim=3 #pragma HLS ARRAY_PARTITION variable=output complete dim=3 pixel_t line_buffer[K][W][C_IN]; #pragma HLS ARRAY_PARTITION variable=line_buffer complete dim=1 #pragma HLS ARRAY_PARTITION variable=line_buffer complete dim=3 for (int row = 0; row < H + 1; row++) { for (int col = 0; col < W; col++) { #pragma HLS PIPELINE II=1 // シフトラインバッファ if (row < H) { for (int k = K - 1; k > 0; k--) { for (int ch = 0; ch < C_IN; ch++) { line_buffer[k][col][ch] = line_buffer[k - 1][col][ch]; } } for (int ch = 0; ch < C_IN; ch++) { line_buffer[0][col][ch] = input[row][col][ch]; } } 53
  27. トップ階層も生成できた #include <ap_int.h> #include <hls_stream.h> #include <assert.h> #define H 32

    #define W 32 #define C_IN 3 #define C_OUT 3 #define K 3 typedef ap_uint<8> pixel_t; typedef float acc_t; typedef float weight_t; void conv2d_hw_axi( volatile pixel_t* input, // AXI master port volatile acc_t* output, // AXI master port volatile weight_t kernel[C_OUT][C_IN][K][K] // AXI- liteまたはBRAM想定 ) { #pragma HLS INTERFACE m_axi port=input offset=slave bundle=gmem0 depth=3072 #pragma HLS INTERFACE m_axi port=output offset=slave bundle=gmem1 depth=3072 #pragma HLS INTERFACE s_axilite port=input bundle=control #pragma HLS INTERFACE s_axilite port=output bundle=control #pragma HLS INTERFACE s_axilite port=kernel bundle=control #pragma HLS INTERFACE s_axilite port=return bundle=control … return; } 54 モジュールに対するインタフェースの定義
  28. トップ階層を呼び出すPythonコードも作れる from pynq import Overlay, allocate import numpy as np

    ol = Overlay("conv2d_axi.bit") ip = ol.conv2d_hw_axi_0 # バッファの確保 input_buf = allocate(shape=(32*32*3,), dtype=np.uint8) output_buf = allocate(shape=(32*32*3,), dtype=np.float32) # 入力画像の準備 input_image = np.random.randint(0, 255, size=(32,32,3), dtype=np.uint8) input_buf[:] = input_image.flatten() # DMAを使わず、AXI master経由で直接呼び出し ip.write(0x10, input_buf.physical_address) ip.write(0x18, output_buf.physical_address) ip.write(0x00, 1) # start # 終了をポーリング(もしくは割り込み) while (ip.read(0x00) & 0x2) == 0: pass output = np.array(output_buf).reshape(32,32,3) 55 実機で動かしてみたところ正しく動作した
  29. まとめ ▍集積回路実装(ASIC/FPGA)の概要を紹介 ▍専用回路の向き不向きがある ◆回路化を念頭に置いたアルゴリズム開発が重要 ▍Skywater130のようなオープンソースPDKも整備されるなど、集積回路設計を 始めやすい環境が整いつつある ◆Open-source EDA supporters /

    MakeLSI / ISHI会などのコミュニティもある ◆Zero to ASIC(有料だが優良だと思われる教育コース) ▍「どうやって微細トランジスタを作るか?」ももちろん大切だが、「膨大なトラン ジスタ資源をどうやって使うか?」も非常に大切 ▍アプリケーション(やりたいこと)がある方々に集積回路設計に踏み込んで貰 いたい 56