Slide 1

Slide 1 text

AIチップ入門:機械学習のための ハードウェアアクセラレーション 京都大学 粟野皓光

Slide 2

Slide 2 text

自己紹介 (粟野皓光;Hiromitsu Awano) ▍2016/03 京大大学院情報科学研究科博士後期課程修了 ▍2016/04 (株)日立製作所・中央研究所 ▍2017/01 東京大学大規模集積システム設計教育研究センター・助教 ▍2019/01 大阪大学大学院情報科学研究科・准教授 ▍2020/09 京都大学大学院情報学研究科・准教授 楕円曲線暗号アクセラレータ 3.56mm 1.76mm 128×128×6段 = 98304シナプス 完全自己同期AI アクセラレータ 3mm 6mm 生物(カエル)モニタリング 島根県隠岐の島諸島の水田 シュレーゲル アオガエル ニホンアマ ガエル ロボット模倣学習

Slide 3

Slide 3 text

背景:AIチップによるDNN大規模化 ▍性能向上が続く深層ニューラルネットワーク (DNN) ◆DeepLやChatGPTなどの実用的なアプリケーションが出現 ◆AI市場の規模は2030年までに9倍になると予測 ▍DNNの大規模化が進む ◆パラメタ数の増加に伴い推論精度が向上 ◆推論演算の計算コストも増加 • 積和演算の実行回数 • メモリアクセスの回数 ▍DNNの更なる大規模化・高度化には計算 コストの削減が必要不可欠 ▍DNN専用ハードウェア(AIチップ)開発の モチベーション 3

Slide 4

Slide 4 text

コンピュータの基本構造と消費エネルギ ▍以下の部品から構成される ◆プログラムカウンタ: 命令を読出す メモリのアドレスを格納 ◆命令デコーダ: 命令の実行内容を解析 ◆命令実行ユニット: 解析された内容により 命令を実行 ◆レジスタ: 小規模な記憶装置 ◆主記憶: 1次元アドレスを持つ大規模な記 憶装置 ▍プログラム実行とは命令に従ってメモリ の中身を書き換えること ▍コンピュータが消費する主なエネルギ ◆計算そのものに要するエネルギ ◆メモリとの通信に要するエネルギ 命令 レジスタ 命令 デコーダ 命令実行 ユニット レジスタ プログラム カウンタ メモリ 計算機の模式図 4

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

インバータ(論理反転素子)の実現例 p+ p+ n+ n p p+ n+ n+ 素子分離 (Shallow Trench Isolation; STI) 絶縁材(SiO2など) 断面図 鳥瞰図(レイアウト) 電源 0V 入力 出力 入力 出力 pMOS nMOS 0V 電源 回路図 動作 入力=0Vのとき 電源 0V 出力=電源電圧 入力=電源電圧のとき 電源 0V 出力=0V 6

Slide 7

Slide 7 text

CMOS集積回路における消費エネルギ ▍消費エネルギは主に以下の3つ ◆スイッチング(支配的) • トランジスタのゲートや配線の寄生容量を充放電するエネルギ ◆貫通電流 • nMOS/pMOSが両方ともONになっている僅かな時間に流れる貫通電流で消費されるエネルギ ◆リーク電流 • トランジスタは理想的なスイッチでは無く、オフ状態であっても僅かな電流(リーク電流)が流れ続け るため、エネルギが消費される ▍消費エネルギ削減には余分な機能を削ぎ落して小さな回路にすることが重要 7

Slide 8

Slide 8 text

プログラム容易性とエネルギのトレードオフ ▍CPU ◆プログラム容易 ◆非定型処理が得意 ▍GPU ◆CUDA等の専門知識が必要 ◆ベクトル演算などの定型処理が得意 ▍FPGA ◆ハードウェア設計の知識が必要 ◆プログラム容易性を犠牲にしてエネルギ効率を高めている ▍ASIC ◆製造したら再構成は困難 ◆(うまく設計すれば)エネルギ効率は非常に高い 8

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

専用ハードウェア化が必ずしもいいわけでは無い ▍Q:ASIC化すればGPUより高速になるのか? ▍A:一切のプログラマビリティを捨て去れば(ネットワーク重み等が固定された特定のモデル に特化した回路を作れれば)GPUより早くなる(かもしれない) ▍理由 ◆ASICはチップ外部との通信が遅い • GPUではシリコンインターポーザ等の後工程技術を使い、メモリとGPU本体を密に結合(ただし非常 にコストが高い) • チップを載せるプリント基板の設計にもノウハウがある(普通に作るとチップ外に引き出せる信号は 100MHz程度) • 学生さんが考えた最強回路が1GHzで動いたとしても、そこにデータを入れる手段がない ◆ASIC向けに使えるテクノロジノードが古いことが多い • テクノロジノードとは22nm・14nm・7nm等で表されるもの • 22nmより7nmの方が一般的には性能が高い • 2nm等の最先端プロセスを使えるのは極僅かな企業 11

Slide 12

Slide 12 text

ちなみに…テクノロジノードの数字の意味 ▍古くは製造できる最も短いチャネル長を指していた ◆短ければ短いほど微細なトランジスタ = 高速なスイッチング・高い集積度 ▍現代では物理的には意味のない数字 ◆2nm/1.4nmとは言わずにN2/14A等と言っている ◆CPUで言うところのモデルナンバーみたいなもの ◆2nmプロセスと言っても物理的に2nmの配線があるわけでは無い ▍微細化限界は?? ◆単体トランジスタの微細化は鈍化しているが、 トランジスタの縦積み、裏面配線等の駆使で、 ロードマップとしては2033年頃までに 5A(=0.5nm)を見込む ソース ゲート ドレイン Body n+ n+ p 絶縁膜 ポリシリコン チャネル長 12

Slide 13

Slide 13 text

専用ハードウェアが向いている処理 ▍計算へビーな処理がハードウェア化に向いている ◆フォンノイマンボトルネックはASIC利用に関わらず共通の課題 ◆ただし、CPU・GPUと比較してASIC・FPGAではメモリ周りが 貧弱なのでボトルネックが顕在化しやすい(もちろん、お金を掛ければその限りでは無い) ▍専用ハードウェア化が有効だった具体例 ◆暗号通貨のマイニング(ハッシュの繰り返し計算) ◆組み合わせ最適化問題を解くアニーリングプロセッサ メモリ ASIC チップ内で 閉じた処理 メモリ ASIC データ 入出力 頻繁にデータ入出力が 必要な処理は苦手 データ 入出力 チップ内で 閉じた処理 プロセッサ メモリ フォンノイマン ボトルネック 13

Slide 14

Slide 14 text

FPGAかASICか? ▍現実的にはFPGA一択 ◆高位合成でC言語レベルの記述からハードウェアを合成できる ◆Zynq等のARMコアがくっついたFPGAが普及しており、ARM上で普通にLinuxが走り Jupyterも立ち上がる。なので、一部の処理だけをFPGAに実行させることが容易 ◆ASIC作ろうとするとプロセスにもよるが数十万~数百万程度 ▍FPGA向けにTensorFlow等からハードウェアを合成するフレームワークが充実 ◆hls4ml:CERNが開発しているオープンソースフレームワーク ◆VitisAI:Xilinxが提供しているフレームワーク 14

Slide 15

Slide 15 text

hls4ml ▍学習済みのニューラルネットワークに特化した推論ハードウェアを合成 ◆ONNX等を読み込み、ハードウェアの C記述を吐き出す ◆ストリーム型のアーキテクチャ • モデルパラメータはFPGAのBRAM等に埋め込まれる • スループットは高いがモデルサイズに制限あり weights 1層目の 計算回路 weights 2層目の 計算回路 weights L層目の 計算回路 … 入力 画像 出力 FPGA CPU TensorFlow QKeras C code FPGA config hls4ml Vitis FPGA 例:LUTに設定され る真理値表等の情報 15

Slide 16

Slide 16 text

Vitis AI ▍汎用的に使える演算器(DPU)をFPGAに実装 ◆1層ごとに重みと入力を与え、計算結果を出力させる (FPGAのオンチップメモリが十分大きければ 中間出力は読み出さなくて良い) ◆GPUに近いアーキテクチャ 汎用的な 演算器 1層目重み 出力 FPGA CPU 入力画像 汎用的な 演算器 2層目重み 出力 時刻 TensorFlow DPU用 バイナリ compiler FPGA config Vitis AI FPGA 16

Slide 17

Slide 17 text

量子化 ▍多くの推論ハードウェアは“量子化”を前提としている ▍重みのみの量子化 / 重み+活性化値の量子化 ▍浮動小数点演算器が不要になる ◆回路面積・エネルギの削減 ▍タスクにもよるが画像分類であれば1bit重み・8bit活性化値で十分 ◆拡散モデルのような連続量の回帰が必要なタスクや、Transformerの様な活性化値の 2次の項が必要なタスクでは更に高い精度が必要なことがある 0.7 0.2 -0.3 f(x) +1 +1 -1 f(x) 重み2値化 17

Slide 18

Slide 18 text

Tensorflow liteの量子化モデル ▍スケール係数・バイアスを使って実数値を近似表現 ◆𝑟 ≈ 𝑆 𝑞 − 𝑍 • 𝑟:実数値・ 𝑆 :スケール係数・ 𝑞:量子化後の値・ 𝑍:ゼロ点 • rとSは浮動小数点数、q・Zは整数 ▍1層分の計算(𝑙層の活性化値・重みから𝑙 + 1層の活性化値を計算する)を考え ると以下のようになる ◆𝑆𝑎 𝑙 𝑞𝑎 𝑙 − 𝑍𝑎 𝑙 ∙ 𝑆𝑤 𝑞𝑤 − 𝑍𝑤 = 𝑆𝑎 𝑙+1 𝑞𝑎 𝑙+1 − 𝑍𝑎 𝑙+1 ◆整理すると𝑞𝑎 𝑙+1 = 𝑆𝑎 𝑙 ∙𝑆𝑤 𝑆𝑎 𝑙+1 𝑞𝑎 𝑙 − 𝑍𝑎 𝑙 𝑞𝑤 − 𝑍𝑤 + 𝑍𝑎 𝑙+1 ▍経験的に𝑆𝑎 𝑙 ∙𝑆𝑤 𝑆𝑎 𝑙+1 が1より小さいことが分かっているので、 𝑆𝑎 𝑙 ∙𝑆𝑤 𝑆𝑎 𝑙+1 を2−𝑁の形で近似 ▍整数の加減算とシフト演算のみで右辺を計算できる 18

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

他にも… ▍Incremental Quantization [Aojun Zhow et al., ICLR2017] ◆絶対値の大きな重みだけを選ん で量子化→再学習→残った重み から絶対値の大きなものを選んで 量子化、を繰り返す ▍Logarithmic Quantization [Daisuke Miyashita et al., arXiv:1603.01025] ◆ゼロ付近の値を高精度に表現し たいので、2の冪で近似する 20

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

アナログかディジタルか? ▍プロセスと計算精度で選択すべき ▍微細プロセスではアナログ回路設計 が困難 ◆トランジスタ特性ばらつき等など ◆22nm以降のプロセスではディジタル? ▍4bit精度程度まではアナログが有 利? A. Joubert et al., “Hardware spiking neurons design: analog or digital?,” WCCI’12. B. Murmann, “Mixed-Signal Computing for Deep Neural Network Inference,” IEEE TVLSI, 201. 22

Slide 23

Slide 23 text

アナログインメモリ計算 ▍SRAM・DRAM・Flash Memory等のメモリの中で計算までやってしまう方式 ▍大きく分けて5つの方法がある ◆電流加算・抵抗分圧・電荷共有・キャパシタ分圧・時間加算 ◆キャパシタ分圧が貫通電流が流れないためにエネルギ効率に優れている ◆時間加算は低電圧動作への耐性が高い (a) 電流加算 (b) 抵抗分圧 (c) 電荷共有 (d) キャパシタ分圧 (e) 時間加算 23

Slide 24

Slide 24 text

キャパシタ分圧 ▍抵抗分圧のキャパシタ版 ▍抵抗分圧と違って貫通電流が流れないため、エネルギ効率が高い Vdd Vss … … 𝑥1 ∙ 𝑤1 𝑥2 ∙ 𝑤2 𝑥𝑛−1 ∙ 𝑤𝑛−1 𝑥𝑛 ∙ 𝑤𝑛 Vout +1 +1 -1 -1 乗算結果に従って スイッチの接続を 切り替える Vdd Vss Vout C C C C 24

Slide 25

Slide 25 text

どのモードを使うのが良いのか? ▍個人的な見解(もちろん回路実装やプロセスに左右 される) ◆積和される次元数が256次元程度なら“キャパシタ分圧” ◆512次元より大きいなら“時間加算” ▍理由 ◆(a)~(d)の方式は積和演算結果を0V~電源電圧(0.8V程 度)の間のアナログ電圧として表現するため、次元が大き くなるとAD変換が大変になる(数ミリボルトを精度よく見分 ける必要があるし、ノイズにも弱い) ◆時間加算方式(e)は“遅延時間”として演算結果を表現す るため、ゆっくりでよければ大きい数も表現できる。一方で、 アナログ的な中間電位を使っていないため、エネルギ効 率は低めになる傾向がある 積和演算結果 H. Tagata et al., OJCAS2024. 電圧モードでの積和演算の例 25

Slide 26

Slide 26 text

ASIC設計するには?? ▍ASIC設計の成果物はレイアウト図 ◆集積回路の製造:印刷技術(フォトリソグラ フィ)により選択的に処理する • 特定のイオンを注入する領域 / しない領域 • 絶縁膜に穴をあける領域 / しない領域 • 金属配線を形成する領域 / しない領域 ▍ディジタル回路の場合は(ほぼ)自動で レイアウトが生成できる ▍アナログ回路は未だに手設計が主流 26 レイアウト例

Slide 27

Slide 27 text

ディジタル回路の設計フロー ▍アルゴリズム設計(C言語・Python等) ◆実現したい処理を実行するためのアルゴリズムを設計する ▍ハードウェア記述言語(Verilog-HDL・VHDL等) ◆人手でアルゴリズムをハードウェアに落とし込む ◆高位合成ツール(C言語などの高位言語から自動的にハードウェアを生成するツール) も発達してきている ▍ネットリスト(回路図) ◆論理合成ツールで生成可 ▍レイアウト ◆配置配線ツールで生成可 おおむね自動化されている 27

Slide 28

Slide 28 text

ハードウェア記述言語 ▍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

Slide 29

Slide 29 text

HDLとプログラミング言語の比較 ▍共通点 ◆構文が似ている ◆C言語の「変数」=Verilog-HDLの「reg」 ▍相違点…「Verilog-HDLは、、、」 ◆「時間」の概念がある ◆複数のブロックやモジュールが同時に動く ◆プログラミング言語が逐次的であるのに対してHDLは並列動作を記述するように設計 されている ◆永続的な接続を表す「wire」がある ◆不定値「x」やハイインピーダンス「z」を扱える 29

Slide 30

Slide 30 text

Verilog-HDLとC言語の比較 ▍C言語の関数は、手続きを逐次的に 実行する ▍Verilog-HDLのモジュールは、全ての 手続きブロックを同時に実行する main () { } 宣言 手続き module foo; endmodule 宣言 initialブロック alwaysブロック alwaysブロック 手続き 逐次的 並列動作と して扱う 30

Slide 31

Slide 31 text

組み合わせ回路の記述例 ▍下の例は組合せ回路(32bit 加算器)記述 ▍これは「合成前」のVerilog-HDL記述 ◆合成とは、Verilog記述をNAND/INV等の論理ゲートの組み合わせに変換すること ▍Verilog-HDL では、まとまった一つの回路をモジュール (module) と呼ぶ module add32(a,b,s); input [31:0] a,b; output [32:0] s; assign s=a+b; endmodule 31

Slide 32

Slide 32 text

合成の例 ▍人間が書く必要があるのが以下の コード(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

Slide 33

Slide 33 text

モジュールの書き方 ▍module で始まり、endmodule で終わる ▍回路の種類を表すモジュール名を付ける ▍通常、入出力信号がある module add32(a,b,s); input [31:0] a,b; output [32:0] s; assign s=a+b; endmodule キーワード「module」 キーワード「endmodule」 モジュール名 入出力信号名 入力信号の宣言 出力信号の宣言 33

Slide 34

Slide 34 text

assign文(継続的代入文) ▍純粋な組合せ回路は、assign文で記述 ▍assign文(継続的代入文)は、左辺の信号と右辺の信号の間の普遍的な関係 を定義する、一種の宣言 module add32(a,b,s); input [31:0] a,b; output [32:0] s; assign s=a+b; endmodule assign文 (継続的代入文) 34

Slide 35

Slide 35 text

順序回路の記述 ▍順序回路:外部からの入力信号と記憶されている内部状態との組み合わせ によって出力状態が決定されるディジタル回路 ▍クロックと呼ばれ信号に同期して状態・出力が切り替わる ▍要するに“一般的なディジタル回路” ▍Verilog-HDLではregister変数と always文を使って記述 ◆右:32bitカウンタの記述例 module count32(q,ck); input ck; output [31:0] q; reg [31:0] q; always @(posedge ck) begin q <= q+1; end endmodule always @(sensitivity list) begin ...何かの処理… end sensitivity listに記載した信号が変化したときに always文の中身が実行される 35

Slide 36

Slide 36 text

Verilog-HDLは代入文が2種類ある ▍ブロッキング代入・ノンブロッキング代入 ◆逐次実行を想定しているプログラミング言語との大きな違い ◆クロックに同期して“一斉に(同時に)”代入することが可能 ▍ブロッキング代入(=) ◆代入が逐次的に実行される ◆C言語などと同じ、最初の代入文が後続の代入文を“ブロック”しているように見える ▍ノンブロッキング代入(<=) ◆代入が並列に実行される ◆右の2つは結果が異なる a = 10; b = 20; a = b; b = a; // a = 20; b = 20; a = 10; b = 20; a <= b; b <= a; // a = 20; b = 10; // swap a and b 36

Slide 37

Slide 37 text

レイアウトを自動合成する仕組み ▍基本的な論理ゲートに対応するレイアウトがライブラリとして提供されている ◆「スタンダードセル」と呼ぶ ▍スタンダードセルをパッチワークのように張り合わせて(配置)、セル間の接続 を作る(配線)することで回路図からレイアウトを自動的に作っている Y A VDD VSS B NAND2の回路図とレイ アウト Y A VDD VSS INV1の回路図と レイアウト PMOS 1個 NMOS 1個 37

Slide 38

Slide 38 text

スタンダードセルの形状 ▍各セルには、そのセルが占有する長方形の領域(他のセルと重ねてはいけな い領域)が定義されている ▍高さはどのセルも同じ、幅はある値の整数倍 ▍全てのセルは同じ Y 座標に VDD 端子と VSS 端子がある ◆セルを横に並べると自動的に電源は相互に接続される ▍信号配線が通る場所(トラック)は縦横にあらかじめ定義されている ◆全ての入出力端子は水平配線トラックと垂直配線トラックの交点に置かれている ▍セル内では、入出力端子以外には第2層メタルをなるべく使わないようにして ある ◆上層配線の邪魔になるため 38

Slide 39

Slide 39 text

スタンダードセルの並べ方(水平方向) ▍各セルの占有領域の境界が互いに接するように並べる(重ねたり、すき間を あけたりしない) ▍セル間に間隔をあけたい場合は、フィラーセルを挟む ▍セル間の信号の接続がしやすいよう、必要に応じてセルのレイアウトを左右 反転して配置できる(セルのレイアウトを左右反転しても、セル自体の回路は 全く変わらない) INV NAND Filler NOR 39

Slide 40

Slide 40 text

スタンダードセルの並べ方(垂直方向) ▍VDD(電源)・VSS(グランド)が互い違いになるように並べる この行のセルは上下反転しない(VDDが上、VSSが下) この行のセルは上下反転(VDDが下、VSSが上) 上下セルのメタル部分 がぴったり重なるよう に置く 40

Slide 41

Slide 41 text

自動配置配線の様子 41 配置(スタンダードセルを並べる) 配線(スタンダードセル間を配線で繋ぐ)

Slide 42

Slide 42 text

レイアウト検証 ▍レイアウトが出来たからと言って終わりでは無い…幾つかの検証が必要 ▍設計ルール検証 (DRC: design rule check) ◆レイアウト設計結果が全てのDRを満たすか ▍回路図との一致検証 (LVS: layout versus schematic) ◆レイアウト設計結果と回路図が一致するか ▍電気的ルール検証 (ERC: electrical rule check) ◆意図しないショートや浮きがないか ▍アンテナルール検証 (antenna rule check) ◆アンテナ比のルールを満たしているか 42

Slide 43

Slide 43 text

Layout Versus Schematic (LVS) ▍出来上がったレイアウト(図形)から 回路を抽出して、元の回路と整合 するかをチェックする ◆図形データからトランジスタ等の素 子・配線を抽出し回路図を作る ◆元の回路と等価か否かを検証する ▍自動配置配線ツールへの制約(セ ル密度など)が厳しいと、LVSエラー が出る可能性が高くなる ◆配線密度が高すぎて、短絡したり、繋 げなかったりする 回路設計 レイアウト設計 ネットリスト レイアウトデータ 素子抽出プログラム ネットリスト 比較 43

Slide 44

Slide 44 text

Design Rule Check (DRC) ▍レイアウトが製造時の制約を満たしているかチェックする ◆図形データから配線の太さ・形状・配線間の距離等を抽出し、ルールを満たしているか チェック ◆問題があればレイアウトに戻って修正 ▍例えば…アンテナルール ◆配線加工時のプラズマにより電荷蓄積、薄膜ゲート絶縁膜が破壊される恐れがある ◆これを防ぐためにトランジスタのゲートに接続して良い金属配線の面積が決まっている ▍他にも…密度ルール ◆配線が一定密度で 埋まっている必要がある 44 M4 M3 M2 M1 gate gate diff diff

Slide 45

Slide 45 text

LSI設計に必要なもの ▍EDAツール ◆回路図エディタ(emacs等でも可) ◆レイアウトエディタ ◆SPICEシミュレータ ◆論理合成ツール ◆配置配線ツール ◆検証ツール ◆フリーのものもあるが、本格的な設計に は有償ツールが不可欠 • Cadence / Synopsys / Mentor ◆日本の教育機関は東大dlabを介して EDAライセンスを取得可能 ▍プロセスデザインキット(PDK)≒試作 プロセス ◆トランジスタ等の素子特性をモデル化し たファイル(SPICEモデル) ◆検証ツール用のルールファイル (DRC/LVS) ◆スタンダードセルライブラリ • レイアウト(GDS) • ネットリスト • 自動配置配線用のファイル(LEF) • タイミングファイル(.db / .lib) • Verilogシミュレーション用のファイル 45

Slide 46

Slide 46 text

高位合成(High Level Synthesis; HLS) ▍C/C++をもとにハードウェアを設計するツール ▍ハードウェア(アーキテクチャ)を想定した書き方に変更する必要がある ◆ソフトウェア的な書き方ではCPUが合成される(ハード化しても早くならない) ▍FPGAを用いたAIアクセラレータ設計では広く使われ始めている ◆データフローが比較的単純なのでHLSを使っても性能がそこそこ出る ◆配列等はBRAM(FPGA上の小規模メモリ)にマッピングされる ◆hls4ml等のAIアクセラレータ生成フローもONNX等を読み込んでCコードを出力している 46

Slide 47

Slide 47 text

畳み込み層の実装例 ▍ソフトウェア的なコード ▍ハードウェア実装を指向したコード for (row=0; row

Slide 48

Slide 48 text

畳み込みの実装例(ストリーム対応) ▍ストリーム的に処理する方法もある ◆左上からラスタスキャンして画像を入力 ◆13番目までのピクセルが入力されれば3x3の畳み込みを計算し、出力1ピクセルが得ら れる ◆14番目のピクセルが入力されれば、次の出力ピクセルを計算(この際、入力画像の1 番目のピクセル値は捨てる) ◆ハードウェア的にはシフトレジスタで実装できる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 後続の畳み込みでは不要 なので捨てても良い シフトイン シフトアウト 積和演算器 出力 48

Slide 49

Slide 49 text

畳み込み層の実装例(ストリーム対応のHLSコード) ▍ストリーム的に畳み込みを計算するには以下のようなコードにする for (int i=0; i0; 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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

生成AI(LLM)を用いたチップ設計自動化 ▍チップ設計でも生成AIは有用 ◆特にVerilog HDLや高位合成(C言語)といった言語が整備されているディジタル回路設 計 ◆チップ設計を生成AIで効率化するのは当たり前に行われているらしい(NVIDIA) ▍End2endの自動化はまだ難しそう ◆特にASICの場合、Verilogを配置配線して物理レイアウトを作る際に細かい調整が必 要になる(I/Oセル・電源セルをどの様に配置するのか?電源はどの様に配るのか?) ◆一方で、モジュールを作るだけならかなり使える印象 51

Slide 52

Slide 52 text

ChatGPT 4oを用いた畳み込みアクセラレータ設計 ▍プロンプト例: FPGAでconv2d演算を高速化することを考えています。HLSコードを生成して 貰えないでしょうか。仕様は以下の通りです。 ◆入力サイズ(HxWxC):32x32x3 ◆出力サイズ(HxWxC):32x32x3 ◆カーネルサイズ(HxWxCinxCout):3x3x3x3 ◆stride:1 ◆padding:'SAME' ◆アーキテクチャ:ラインバッファを使用した高スループットなもの 52

Slide 53

Slide 53 text

生成されたコードの一部 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

Slide 54

Slide 54 text

トップ階層も生成できた #include #include #include #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 モジュールに対するインタフェースの定義

Slide 55

Slide 55 text

トップ階層を呼び出す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 実機で動かしてみたところ正しく動作した

Slide 56

Slide 56 text

まとめ ▍集積回路実装(ASIC/FPGA)の概要を紹介 ▍専用回路の向き不向きがある ◆回路化を念頭に置いたアルゴリズム開発が重要 ▍Skywater130のようなオープンソースPDKも整備されるなど、集積回路設計を 始めやすい環境が整いつつある ◆Open-source EDA supporters / MakeLSI / ISHI会などのコミュニティもある ◆Zero to ASIC(有料だが優良だと思われる教育コース) ▍「どうやって微細トランジスタを作るか?」ももちろん大切だが、「膨大なトラン ジスタ資源をどうやって使うか?」も非常に大切 ▍アプリケーション(やりたいこと)がある方々に集積回路設計に踏み込んで貰 いたい 56