「PL は DDR の 74% を引き出せた」——前回そう書きました。あれは間違いでした。 測っていたのは DDR ではなく、その手前にあるもっと低い天井です。 今日はその二つを分けて測り、本当の上限 1.97 GB/s を見つけました。 これが自作アクセラレータの設計値になります。
why bandwidth is the number that matters
小さな言語モデルが1文字(1トークン)を出すとき、CPU や FPGA は モデルの重みを全部いちど読み直します。135M パラメータを INT8 で持てば 135 MB。 これを毎回読む。だから「1秒に何文字出せるか」は、ほぼそのまま 「1秒に何バイト読めるか」で決まります。
しかも INT8 では、重み1バイトを読むごとに掛け算が1回しか発生しません。 読む速度と計算する速度が 1 対 1 で紐づいている。 つまり演算器をいくら増やしても、読めなければ意味がない。 測るべき数字は帯域ただ一つです。
the DDR wall and the datapath wall
DDR から FPGA のファブリックまで、データは2つの狭いところを通ります。 この二つはまったく別の理由で決まる、別の天井です。 前回の私は、片方だけを測って、もう片方の話だと思い込んでいました。
the loopback hid the answer
前回作った回路は折り返し(ループバック)でした。DDR から読んで、 PL を一周させて、そのまま DDR に書き戻す。 読みと書きが必ず同じ量になる形です。
そこで出た「読み 0.77 + 書き 0.77 = 合計 1.54 GB/s」を、私は 「DDR の 2.1 に対して 74%」と読みました。 けれど読みの 0.77 も書きの 0.77 も、それぞれ自分の道幅 0.80 の 96% です。 つまり張り付いていたのは青のほうで、琥珀にはまだ大量の余裕がありました。 ループバックでは、二つの天井を切り分けられません。
assign tready = 1'b1; の一行です。
推論の本番も重みを読むだけで書き戻さないので、こちらのほうが実物に近い形でもあります。
if it tracks the clock, it is the datapath
「青が犯人だ」と言うには証拠が要ります。使ったのは単純な手です—— 道幅だけを変えて、実測が付いてくるかを見る。 道幅は 8 バイト × クロック なので、クロックを上げれば道幅だけが広がり、 DDR は何も変わりません。
100 MHz と 142.86 MHz の2種類を作って測りました。結果は判で押したようでした。
two HP ports, and the bottleneck moves
Zynq には PL から DDR へ行く「HP ポート」が4本あります。 1本では 142.86 MHz でも DDR の半分(53.7%)しか使えませんでした。 そこで DMA を2台立てて、HP0 と HP2 に振り分けました。 道幅は 1.14 × 2 = 2.29 GB/s ぶんになり、初めて DDR の 2.1 を上回ります。
| 構成 | クロック | 道幅 | 実測 | 道幅比 | DDR比 |
|---|---|---|---|---|---|
| HP 1本 | 100.00 MHz | 0.80 | 0.79 | 99.1% | 37.8% |
| HP 1本 | 142.86 MHz | 1.14 | 1.13 | 98.7% | 53.7% |
| HP 2本 | 142.86 MHz | 2.29 | 1.97 | 86.0% | 93.6% |
what 1.97 GB/s buys you
帯域が決まると、必要な演算器の数が割り算一つで出ます。 INT8 では1バイト読むごとに掛け算1回。142.86 MHz で 1.97 GB/s ということは、 1.97 ÷ 0.14286 ≒ 13.8、つまり 1クロックあたり約14バイトが届く。だから掛け算器も14個あれば足ります。
重みを −1 / 0 / +1 の三値にすると、1バイトに約5個詰められます(約 0.2 B/重み)。 同じ 1.97 GB/s の道で 毎秒 9.8 G 個の重みを運べる計算になり、実質5倍です。 おまけに掛け算が「足す・引く・何もしない」に変わるので、DSP すら要らず LUT で組めます。 帯域が壁である以上、伸ばすべきはここ——というのが今回の測定で改めて裏づけられました。
what I got wrong last time
「PL は DDR の 74% を引き出せた。CPU の 33% に対して倍以上」と書きました。 合計 1.54 GB/s という測定値そのものは正しいのですが、 あれは DDR の話ではなく、道幅 0.80 GB/s の 96% に張り付いていただけでした。 当時 DDR は半分も使っていません。
結論の向き——CPU より PL のほうが DDR を引き出せる——は変わりません。 むしろ正しい数字は 93.6% で、CPU の 33%(0.70 GB/s)に対して 2.8 倍。 前回より強い結果です。ただし「HP ポートを2本使う」ことが条件で、 1本では 53.7% までしか届きません。これは前回には無かった、設計上の重要な条件です。
stage 3
ヌルシンクは「捨てるだけ」の回路でした。ここを本物の掛け算器の並び(MAC アレイ)に差し替えます。 問うのは一点だけです——計算させても 1.97 GB/s を保てるか。 保てれば、あとは重みの表現を三値に変えていく段階に入ります。
段階3は 1.91 GB/s(計算なしの 96.7%)、段階4の三値は 9.16 G重み/s(INT8 の 4.8 倍)で DSP は 0 個でした。 ここで確定させた設計値 1.97 GB/s が、そのまま両方の物差しになっています。 続きは 「壁は動かない」へ。