AIのチップ(?)のまとめ

半導体回路の重要国際会議

から、チップレベルで実装されている深層学習アクセラレータの研究を抜粋した個人的なまとめ。 時折更新する。
産業的な要請 (?) から、多くはエッジデバイスにおける推論処理にフォーカスしている。
アプリケーションへの特化具合はものによりけり。

2018年におけるトレンド

  • 量子化
    重みや活性化関数のバイナリ化、3値化、対数近似 。
    専用ハードウェアの実装においては、特にメモリ使用量や演算器の削減効果が大きい。

  • Computing in-memory
    メモリと演算コアの間のデータ転送が性能のボトルネックになり易いため、 メモリ (主にSRAM) の内部や近傍で計算をおこなう構成が流行している。

  • アナログ演算
    差別化や演算効率化 (?) のためにアナログ的な演算手法を取り入れた研究が散見される。

関連分野、他に見ておくべき論文

  • アーキテクチャ
    ISCA, MICRO, HPCA, ASPLOSといった重要会議から演算コアやネットワークのアーキテクチャを引用した論文が多い。

  • コンピュータビジョン
    深層学習と親和性が高く、なおかつエッジデバイス向けのアプリケーションが多いため、 CVPR等で発表されたアプリケーションを引用して、専用ハードウェアによる低消費電力化・高速化を謳う論文が多々ある。

  • FPGA
    FPGA, FCCM, FPLといった重要会議でFPGA上への実装が報告されており、これらを参考に書かれた論文が多数ある。

汎用アクセラレータ

  • Eyeriss: A Spatial Architecture for Energy-Efficient Dataflow for Convolutional Neural Networks (MIT, NVIDIA, ISSCC 2016)
    • メッシュ型ネットワークで接続された積和演算コアとデータフローアーキテクチャで畳み込み演算を効率化。
  • EIE: Efficient Inference Engine on Compressed Deep Neural Network (Stanford University, Tsinghua University, ISSCC 2016)
    • スパース性を利用したチップ内SRAMへの効率的なデータ格納で性能改善。
  • A 1.42TOPS/W Deep Convolutional Neural Network Recognition Processor for Intelligent IoE Systems (KAIST, ISSCC 2016)
  • A 0.3‐2.6 TOPS/W Precision‐Scalable Processor for Real‐Time Large‐Scale ConvNets (KU Leuven, VLSI Cir. 2016)
  • A 1.40mm2 141mW 898GOPS Sparse Neuromorphic Processor in 40nm CMOS (University of Michigan, VLSI Cir. 2016)
  • Time-domain neural network: A 48.5 TSOp/s/W neuromorphic chip optimized for deep learning and CMOS technology (Toshiba, A-SSCC 2016)
    • 2信号間の時間的な遅延を利用してアナログ演算。遅延量は抵抗で調整。将来的な積層ReRAMの利用を想定。
  • DNPU: An 8.1TOPS/W Reconfigurable CNN-RNN Processor for GeneralPurpose Deep Neural Networks (KAIST, ISSCC 2017)
    • 畳み込み演算に特化したユニットと、全結合層+RNN演算に特化したユニットのハイブリッド型。
  • ENVISION: A 0.26-to-10TOPS/W Subword-Parallel Computational Accuracy-Voltage-Frequency-Scalable Convolutional Neural Network Processor in 28nm FDSOI (KU Leuven, ISSCC 2017)
  • A 3.43TOPS/W 48.9pJ/Pixel 50.1nJ/Classification 512 Analog Neuron Sparse Coding Neural Network with On-Chip Learning and Classification in 40nm CMOS (University of Michigan, Intel, VLSI Cir. 2017)
  • BRein Memory: A 13-Layer 4.2 K Neuron/0.8 M Synapse Binary/Ternary Reconfigurable In-Memory Deep Neural Network Accelerator in 65 nm CMOS (Hokkaido University, TiTech, Keio University, VLSI Cir. 2017)
    • 2値化・3値化が可能で、活性化関数もバイナリ。演算はSRAMの近くで効率よくおこなう。
  • A 1.06-To-5.09 TOPS/W Reconfigurable Hybrid-Neural-Network Processor for Deep Learning Applications (Tsinghua University, VLSI Cir. 2017)
  • A Shift Towards Edge Machine-Learning Processing (Google, ISSCC 2018)
  • QUEST: A 7.49TOPS Multi-Purpose Log-Quantized DNN Inference Engine Stacked on 96MB 3D SRAM Using Inductive-Coupling Technology in 40nm CMOS (Hokkaido University, Keio University, ISSCC 2018)
    • 対数量子化、三次元積層のSRAMチップで大容量化と転送速度向上を図っている。
  • UNPU: A 50.6TOPS/W Unified Deep Neural Network Accelerator with 1b-to-16b Fully-Variable Weight Bit-Precision (KAIST, ISSCC 2018)
    • 1bitから16bitまで自由に精度調整可能。ユニファイド型。ネットワーク構成も自由度が高い。
  • Conv-RAM: An Energy-Efficient SRAM with Embedded Convolution Computation for Low-Power CNN-Based Machine Learning Applications (MIT, ISSCC 2018)
    • バイナリ重みの畳み込み2層をインメモリ計算。
  • A 65nm 1Mb Nonvolatile Computing-in-Memory ReRAM Macro with Sub-16ns Multiply-and-Accumulate for Binary DNN AI Edge Processors (NTHU, ISSCC 2018)
  • A 65nm 4Kb Algorithm-Dependent Computing-in-Memory SRAM Unit Macro with 2.3ns and 55.8TOPS/W Fully Parallel Product-Sum Operation for Binary DNN Edge Processors (NTHU, TSMC, UESTC, ASU, ISSCC 2018)
  • STICKER: A 0.41‐62.1 TOPS/W 8bit Neural Network Processor with Multi‐Sparsity Compatible Convolution Arrays and Online Tuning Acceleration for Fully Connected Layers (THU, VLSI Cir. 2018)

特定アプリ向けアクセラレータ

  • A 126.1mW Real-Time Natural UI/UX Processor with Embedded Deep Learning Core for Low-Power Smart Glasses Systems (KAIST, ISSCC 2016)
    • 音声と手形状認識によるマルチモーダルなUIを実現。スマートグラス向け。
  • A 502GOPS and 0.984mW Dual-Mode ADAS SoC with RNN-FIS Engine for Intention Prediction in Automotive Black-Box System (KAIST, ISSCC 2016)
  • A 0.55V 1.1mW Artificial-Intelligence Processor with PVT Compensation for Micro Robots (KAIST, ISSCC 2016)
  • A 0.62mW Ultra-Low-Power Convolutional-Neural-Network Face Recognition Processor and a CIS Integrated with Always-On Haar-Like Face Detector (KAIST, ISSCC 2017)
    • ウェアラブル常時稼動顔認識デバイス向け。Haar-Like顔検出器チップと、CNN顔分類プロセッサチップを混載。
  • A 9.02mW CNN-stereo-based real-time 3D hand-gesture recognition processor for smart mobile devices (Georgia Tech, ISSCC 2018)
    • HMD向け3Dハンドジェスチャ認識。ステレオマッチング。
  • A 55nm Time-Domain Mixed-Signal Neuromorphic Accelerator with Stochastic Synapses and Embedded Reinforcement Learning for Autonomous Micro-Robots (Georgia Tech, ISSCC 2018)
    • 自律動作のナノロボット向け。強化学習プロセッサ。
  • An Always-On 3.8μJ/86% CIFAR-10 Mixed-Signal Binary CNN Processor with All Memory on Chip in 28nm CMOS (Stanford, KU Leuven, ISSCC 2018)
  • A 1μW Voice Activity Detector Using Analog Feature Extraction and Digital Deep Neural Network (Columbia University, ISSCC 2018)
  • B‐Face: 0.2 mW CNN‐Based Face Recognition Processor with Face Alignment for Mobile User Identification (KAIST, VLSI Cir. 2018)
  • PhaseMAC: A 14 TOPS/W 8bit GRO based Phase Domain MAC Circuit for In‐Sensor‐Computed Deep Learning Accelerators (Toshiba, VLSI Cir. 2018)

hpを改修する (1)

 この記事は、アドベントカレンダー2018の4日目の記事です。

 hpを改修する。これまでレンタルサーバで運用していた (3月4日現在, http://www.saginomiya.xyz/)

f:id:ourfool:20180305000913j:plain

のをやめて、github pages (3月4日現在, https://ourfool.github.io/) で公開し直すことにした。

f:id:ourfool:20180305001035j:plain

 とりあえず、現状はあまり時間がなかったのでHexoで生成した適当なテンプレートを投げ込んでいる。簡単なサイトをさくっと作る用途だと静的サイトジェネレータで適当に生成するのが楽そうなのだけど、せっかくなのでもうちょっと凝ったサイトを目指したい。というわけで、デザインの改修と独自ドメイン化と、あと、最近やたらブラウザに怒られるのでhttps化をやっていく。

 明日は、ourfoolさんがコンパイラに関する記事を書きます。

Deep Learningをやる (1)

 この記事は、アドベントカレンダー2018の3日目の記事です。

 世はIoTでビッグデータディープラーニングの時代であるからして、ディープラーニングの基本を学んでいくことにした。とはいえ色々とフレームワークを弄ってがっつり学習回していく、という話になるとどうも腰を据えてクソ強いハードウェア資源でもってやっていく必要がでてきそうなので、原理的な部分だけを学ぶことを目的として以下の本を購入した。

f:id:ourfool:20180303233355j:plain

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

 

  「ゼロから作るDeep Learning」はNumPyだけ使って文字通りゼロから (?) ニューラルネットワークの構築と学習をおこなう本のようである。第1章のタイトルが「Python入門」であることからもわかるとおり、原理からブラックボックス無しで、というコンセプトを持ちつつ何もわからんな幼女向けの本でもある。本の中で使用するプログラムは全てGithubリポジトリにまとまっているので快適に進められる。

 ひとまず、昨日本日の余暇に1章~4章まで取り組んでみた。

 1章―Python入門。環境構築とか、基本的なNumPyの構文、Matplotlibの使い方。やさしい。

 2章―パーセプトロンについて。パーセプトロンを使ってどのように論理回路を構築するかを述べたのち、多層パーセプトロンを用いればより複雑な計算(非線形領域の表現、イメージ図がわかりやすい)がおこなえることを示す。簡単なPythonのコードであっても書きつつ進めるとやっていってる感がある。

 3章―ニューラルネットワークについて。シグモイドやReLUなどを例示して活性化関数の具体的な説明。NumPyの多次元配列でシュッとネットワークを構築できることの説明。最後に手書き数字認識の推論ネットワークを実装した。バッチ処理についても書いてある。

 4章―ニューラルネットワークの学習について。最初に学習の概念について簡単に解説があったのち、学習アルゴリズムを実際に実装していく。数学的な説明も入ってくるが平易に書いてあって数式はない。簡単に勾配を算出してパラメータを更新していくと、損失関数が減るので嬉しい!という章。ここでついに学習をおこなう。認識精度のグラフを出すとちゃんとディープにラーニングしてる感がわかる。

 5章以降は学習法の詳細にフォーカスしていくようなので楽しみ。回路やアーキテクチャの世界では主にエッジでの推論用アクセラレータに注目が集まっており、学習の話はよくわからんになりがちである。回路実装の簡単化のためデータは二値化されたり三値化されたりLog-Quantizedされたり、計算はメモリ内とか付近でちょろっとやるだけだったりで、学習側とは随分様子が異なる。バッチのサイズも遅延やスループットトレードオフも全く違う。そのあたりの感覚がちゃんとわかってくると、もしかすると何か面白いことが浮かぶかもしれない(特に役には立たないかもしれない)。

 明日は、ourfoolさんがgithubページの改修に関する記事を書きます。

OS自作入門をやる (1)

 この記事は、アドベントカレンダー2018の2日目の記事です。

 OSに関してやっていきたいという気持ちから、「12ステップで作る組込みOS自作入門」とH8マイコンボードを購入した。

12ステップで作る組込みOS自作入門

12ステップで作る組込みOS自作入門

 

f:id:ourfool:20180302235233j:plain

 手を動かしてOSを作る本としては、他に「30日でできる!」なる本等々も候補にあったのだが、

30日でできる! OS自作入門

30日でできる! OS自作入門

 

・頑張れば3日くらいで終わる本がいい

GUIの実装関連はあんまり重要視しない

ブートローダもやりたい

といった観点から今回はこちらをやっていくことにした。

 マイコンボードやケーブルは秋月電子通商さん等で全部揃った。今日は眠くなってきたのでこれだけでおわり。次回はHello Worldからブートローダの作成くらいまで行きたい。

 次は、ourfoolさんが機械学習入門に関する記事を書きます。

アドベントカレンダーを始める

 この記事は、アドベントカレンダー2018の1日目の記事です。

 アドベントカレンダーを始める。世のAdvent Calendarerたちはこぞって12月に仲良くクリスマスを祝うようだが、元よりadventusにはarrival以上の意味はないようだし、現在adventが意味するところも教派によって異なる様子である。ついては、3月に勝手にひとりで何らかのアドベントを祝い、勝手にひとりでアドベントカレンダーを始める人間が現れたところで特に問題はないだろう。

 というわけで、これはアドベントカレンダーなのである。これから31日間、コンピュータ関連のことを雑多にやり雑多に書き綴っていく。したがって次は、ourfoolさんが何らかのコンピュータに関する記事を書きます。

幼女でもできる自作CPUチップ (16) CPUチップの測定

 前回の記事

ourfool.hatenablog.com

では、CPUチップの製造について書いた。

 今回は、製造されたCPUの測定について書いていく。CPUチップの入ったQFPパッケージをソケットに入れ、ArduinoをROM代わりに使って実際に動作するかを確認する。

 まず、CPUのQFPパッケージをクラムシェル型の測定ソケットに入れ、ブレッドボードを介して、ArduinoやLEDと接続した。ここで、ArduinoはROMとクロック・リセット回路の役割を、LEDは出力ポートを可視化する役割を果たしている。実際に繋いだようすは以下のような感じ。

f:id:ourfool:20180216155854j:plain

 

f:id:ourfool:20180216160017j:plain

写真からは何一つ情報が読み取れないかと思うので、各接続を図解すると、以下のような感じである。

 

f:id:ourfool:20180216162441p:plain

CPUからAddressを受取ったArduinoはそれに対応する命令をCPUへ返し、同時にCLK信号を一定周期でCPUへ向けて出力する。また、CPUの出力ポートにLEDアレイを接続することで、CPUからの出力が目で確認できるようになっている。 

 ArduinoにROMやクロック回路の役割を担当させるためのコードは、たとえば以下のような感じである。Arduinoの文法だけを使って幼女的に書いているので読めばわかるはずである。

CPUEval

CPUから受け取ったアドレス(analogRead(ADDR0)などの値)に応じて、指定した命令列をCPUへ出力している(digitalWrite(IM0, LOW), digitalWrite(INST0, HIGH)等)。また、クロックの生成も担当している。ここでクロックの周期は400~ms程度と設定しているので、CPUは2Hz程度で動作することになる。
 Arduinoに書き込んだプログラム内容で意図しているCPUの動作や、そのときの出力LEDの状態は以下の表のとおりである。これを確認できれば、ひとまず各種転送命令や演算命令が一通り実行できていることが確認できる。

f:id:ourfool:20180216162226p:plain

各種転送命令、演算命令に応じてLEDの状態が変わっていき、最後はジャンプ命令で最初のアドレスへと戻り、無限ループするプログラムとなっている。

 上記のプログラムを実行した結果は、以下のようになった。

表の意図する出力LEDの状態と比較すると、想定のとおりに動作していることがわかる。

 さて、今回までで実際にCPUチップを設計・製造し、その動作を確認することができた。CPUを作るという目標は半ば達成できたと言っていいのだが、肝心のCPUの脇でROM代わりに高級なマイコンを使っているところは何とも微妙な印象である。
 そこで、以前の記事(幼女でもできる自作CPUチップ (2) - saginomiya1.5)で示したとおり、製造したCPUとROM、クロック・リセット回路を基板に実装し、マイコン等を使わない独立のシステムとして組み上げることを目標としたい。次回は、その基板設計について書く予定である。

幼女でもできる自作CPUチップ (15) CPUチップの製造

 前回の記事

ourfool.hatenablog.com

では、CPUチップの製造に向けて、CPUのレイアウトをおこなった。ここまででチップ開発者としておこなう作業は全て終了したため、彼のデータを国内工場へと送付し、手薬煉いて製造完了の知らせを待つ状態であった。

 さて、去る本年1月、1年弱の月日を経て、ついに正常に製造されたCPUチップが到着した。

f:id:ourfool:20180214232251j:plain

ここまでの道のりも平坦ではなかった、というのも、実は昨年3月の時点でCPUチップは一度製造されていたのである。

 昨年3月に無事製造されたかに見えたチップは、全く動作をしなかった。話によると、製造側でトラブルがあり、回路の特性がかなり怪しいらしい。そうなると、せめて、不良モデル・原因だけでも正確に把握したいところである。幸い同一チップ上にCPU以外にも非常に簡単な回路が載っており、このデバイス特性を参考にすることができる、また同一のラインで複数チップが製造されたため、他のチップに載った回路に関しても参考にできるはずであった。しかし、そもそもトランジスタとしての特性を示していないように思われる回路が多く、どの回路もまともに動いてくれなかったため、デバッグの甲斐もなかった。したがって、ともかく今回は製造に失敗したが同じデータで再度製造すれば大丈夫なはず、という非常に曖昧な状態で次の機会へ臨むこととなった。

 そうした状況で、次の製造機会までにいったい何ができるか。ひとまず、前回駆け足で作ったため貧弱になっていたレイアウトの電源部分を強化することにした。プリント基板作成などの場合と同様、大きな電流が流れる電源配線は可能な限り太く、複数経路で配線するのが望ましい。加えて、重要な信号配線のいくつかについて、直接チップの外へとつなぎ、直接観測できるようにした。これによって万が一回路にミスがあった場合にも、容易にデバッグが可能になる。

 こうした気休め程度の修正を終えたのち、ある考えが頭をよぎった。これまで真面目に作ってきたチップにおいて、製造側で問題が発生したことは一度もなかった。そうしたチップと今回のCPUチップとの違いは何か。明白である。貴重なシリコン面積を犠牲にして、絵を描いているのだ。

f:id:ourfool:20180214233648p:plain

そこで、ついに大きな決断を下した。絵を削除し、そのスペースを使った電源配線の強化、デバッグ用の信号配線に踏み切ったのである。これは疑心暗鬼というべきものだろうし、絵のひとつも載っていないCPUなど無用、学術的な裏付けなしにこの削除をおこなったのは理性の敗北というものかもしれない。しかし、絵を載せたところでCPUの特性に全く変化はなく、無駄に配線し辛くなるということだけは違いなく事実であるからして、今回は絵を全て削除して右のような新レイアウトを得た。

 そうした苦難の末に、ついに、正常に製造されたCPUチップは到着したのである。これを測定用のソケットに入れ、信号生成用のArduinoと接続したのが以下の図。せっかく1チップのCPUを作ったにも関わらず滅茶苦茶な配線である。

f:id:ourfool:20180215001243j:plain

 次回はこのチップの測定とその結果について書いていく。何気に3年ほど続いて来たCPUチップの製造開発にも、終わりが近づいて来たようだ。