世界を動かす技術を、日本語で。

Alibaba CloudのFPGA: $200のKintex UltraScale+

概要

  • Xilinx Kintex UltraScale+ FPGAを低コストで開発ボードとして活用する方法の検討
  • Vivado WebPackライセンスの制約下でのFPGA選定と開発ボード調達戦略
  • JTAGデバッグ環境の構築とOpenOCDによる非公式書き込みへの挑戦
  • 中古FPGAアクセラレータボードの動作確認と初期テストの実施
  • PCIe経由での動作検証および基礎的なPCIe用語の解説

Xilinx Kintex UltraScale+ 開発ボード選定と調達戦略

  • 大規模プロジェクト用に Xilinx Virtex UltraScale+ FPGAを希望も、コスト面で Kintexシリーズ に選択肢を絞り込み
  • Vivado WebPack ライセンス制限により、Virtex UltraScale+は非対応だが、 XCKU3P/XCKU5P はサポート対象
  • 開発ボードに求める条件
    • SFP+×2またはQSFP×1 搭載
    • JTAGインターフェース 搭載
    • PCIe x8 以上のインターフェース実装
  • 調達手段
    • 自作設計は今回は見送り
    • Alinx社製AXKU3/AXKU5 がコストパフォーマンス最良(900〜1050ドル+拡張ボード150ドル)
    • eBayでAlibaba Cloud向け中古FPGAアクセラレータ を発見(XCKU3P搭載、$200、ドキュメント無し)

中古FPGAボードのJTAGデバッグ環境構築

  • Xilinx純正JTAGプローブ(UG908記載) は高価なため、 OpenOCD と汎用JTAGアダプタによる代替案を模索
  • OpenOCDは SVF(Serial Vector Format) に標準対応、Vivadoからエクスポート可能
  • 7シリーズ以降のFPGA対応情報は少ないが、 JTAGの基本仕様は共通
  • SVFをOpenOCD経由で書き込み、必要に応じてアダプタ固有の修正を加える方針

開発ボード利用までの段階的アプローチ

    1. 動作確認 :フラッシュ未消去なら既存ビットストリームでPCIeエンドポイントやSFPのアイドル信号を確認
    1. JTAG接続 :eBay情報をもとにJTAG端子探索、デイジーチェーン構成機器の特定、SYSMON等のFPGA内部情報取得も検討
    1. ピン配置把握 :外部クロック源やSFP/PCIeトランシーバの接続ピン特定
    1. ビットストリーム書き込み :OpenOCDのvirtex2+pldドライバやSVFリプレイで一時的な構成書き込みを試行、自動化も目指す

中古FPGAボードの到着と初期テスト

  • Alibaba Cloudアクセラレータ中古ボード が到着、 SFP28トランシーバOS2パッチケーブル が付属
  • PCIe to USBアダプタ12V電源 も同梱、スタンドアロン動作も可能
  • 外観はやや使用感ありだが、 SFPケージやPCIeコネクタは無傷

スタンドアロン動作・PCIe経由の動作確認

  • まずスタンドアロンで LED点灯・発熱 による通電確認
  • 本格的なテストは Raspberry Pi 5 +外付けPCIeアダプタで実施
    • Pi 5の PCIe Gen2 x1 にボードを接続、下位互換性で動作可能
  • Pi起動後、 dmesgログ でPCIeエンドポイント認識を確認

PCIe用語・dmesgログの基礎解説

  • PCIeデバイスID(domain:bus:device.function)vendor/device id の意味を解説
    • 例:[14e4:2712]はBroadcom BCM2712 PCIe Bridge
  • type 01/type 00 でブリッジ/エンドポイント区別
  • classコード(0x060400など) はデバイスの機能カテゴリを示す
  • 公式IDリストやLinuxカーネルの該当コードへのリンクも紹介

この流れで、次回以降はJTAGデバッグの詳細やピン配置特定、OpenOCDを用いた書き込み手順など、実践的な手順を順次解説予定。

Hackerたちの意見

参考までに:もしFT2232Hアダプターが手元にあれば(持ってないなら、ぜひゲットした方がいいよ)、そのアダプターはVivadoと互換性があるように簡単にフラッシュできるよ。https://docs.amd.com/r/en-US/ug908-vivado-programming-debugg...

仕事ではいつも20〜30個のFT2232Hをストックしてる。めっちゃ便利で、GPIO、I2C、SPI、パラレルFIFOとか話せるし。pyFTDIのPythonライブラリも素晴らしいよ。

実は、別のプロジェクトから余ってるのがあるんだよね。FPGAの作業はやったことないけど、Vivadoと互換性があるって言うのは、実際にはどういうことなの?

Alibabaがデータベース分野で、FPGAのクラスターを使ってLSMコンパクションをカスタムMySQLストレージエンジンでやってたのを思い出すな。https://dl.acm.org/doi/pdf/10.1145/3299869.3314041 基本的に、RocksDBに比べてスループットとレイテンシが大幅に改善されたんだ。ある操作では、なんとオーダーオブマグニチュードの差があったりも。サービスとして提供してたけど、結局撤退しちゃった。今も使ってるかは分からないけど、リピートデータベースワークロードにハードウェアアクセラレーションを使ってるところがほとんどないのには驚いたよ。

AWSは数年前にRedshiftで自社ハードウェアのクエリアクセラレーションを使ってたよ。https://aws.amazon.com/blogs/aws/new-aqua-advanced-query-acc... 最近はAWSがP&Lにもっと注力してるから、どれくらい注目されてるか(またはパフォーマンスが出てるか)は分からないな。

FPGA PCIeやPCIカードに興味があるなら、中古でGidelボードがたくさん出回ってるよ。ProcSparkやProcStarとか。公式ソフトはプロプライエタリで、複数のFPGAデバイスが含まれてることが多いから、Quartusで使うにはピンアウトを調べる必要があるかも。でかいStratix IVが載ってるのを手に入れたよ。でもKintel UltraScale+は本当に貴重で、素晴らしいレビューがあるね。

GidelのHawkEye 20G-48用のトップレベルVerilogモジュールとVivado .xdcファイル(ピンマッピング、タイミング制約などを含む)。[0] でもGidelからのSDKはないよ。俺のバックバーナープロジェクトは、2つを10 GbEで接続してTLPを中継するPCIe TLPスニファー/MiTM/デバイスエミュレーターを作ることなんだ。一つの残りの10 GbE接続は、スニファーされた/注入されたTLP用にホストPCに行く予定。Aria 10 FPGAのPCIeハードIPは、ルートモードかエンドポイントモードのどちらかを許可するから、「ただ」フクロウの残りを描くだけで、セットアップを不透明にするQuartusのIPモジュールは避ける必要がある。10 Gbitリンクを使ってPCIeをどうするかは、もっと速いデバイスと一緒だとどうなるかわからないけど、fail0verflowは115200ボーのUARTでTLPプロキシングをやってのけたよ。[1] [0]: https://www.ebay.com/itm/335904285904 [1]: https://fail0verflow.com/media/33c3-slides/#/11

「ボードにはトラベルケースも付いてきた」 なんで?これらのボードってデータセンターで頻繁に取り外して移動するものなの?それともeBayの売り手が保護のために付けたのかな?

でもなんで?現場に持っていくためだよ、だって彼らは「フィールド」プログラマブルゲートアレイだからさ /s

eBayにはまだたくさんあるよ。https://www.ebay.com/itm/167626831054 GPIOがヘッダーに配線されてないみたいだけど、何かいいプロジェクトのアイデアある?

それ、めっちゃいいね!コロナの時期には安いハードウェアが完全になくなってたけど、今はまた美しいKintexが200ドルで手に入るんだ。若い頃、これにすごく興味あったんだよね。2x SFPとPCIeの組み合わせはNetFPGAプロジェクトを思い出させる。このカードはそれにぴったりだね!!

""" dmesgログ : [ 0.388790] pci 0000:00:00.0: [14e4:2712] type 01 class 0x060400 [ 0.388817] pci 0000:00:00.0: PME# supported from D0 D3hot [ 0.389752] pci 0000:00:00.0: bridge configuration invalid ([bus 00-00]), reconfiguring [ 0.495733] brcm-pcie 1000110000.pcie: link up, 5.0 GT/s PCIe x1 (!SSC) [ 0.495759] pci 0000:01:00.0: [dabc:1017] type 00 class 0x020000 ... ほとんどの人がPCIe用語に詳しくないかもしれないから、ここで何が起こってるかを簡単に説明するね。0000:00:00.0: は識別子で、... [14e4:2712]: はデバイスの [ベンダーID:デバイスID] で、これらのベンダーIDはPCI標準団体がハードウェアベンダーに割り当ててるんだ。ベンダーは自分のベンダーIDを定義することができる。公式なベンダーIDとリリースされたデバイスIDの全リストはここで見つけられるよ: https://admin.pci-ids.ucw.cz/read/PC/14e4 またはLinuxカーネルコードの中でも... """ dmesgがデバイスについてもっと情報を持ってたらいいのにね。

同意だね、すごくいいと思う。でも、dmesgをできるだけシンプルに保ちたい気持ちも分かるな。

誰か、FPGAを使ってニューラルネットや他の接続主義アーキテクチャを実装した例を知ってる人いる?FPGAの魅力は、大学や個人でも「カスタム」チップを手頃な価格で作れるところだよね。今のAI界はLLMに夢中だけど、小さなグループや個人がFPGAを使って、もっと動物に近い知能のアプローチを試すチャンスがある気がする。

なんでダウンボートされてるの?俺の理解では、AIにはFPGAは向いてないと思う。モデルには大量のRAM(できれば速いRAM)が必要だけど、FPGA自体はそれほど多くないから。FPGAには速いRAMを接続できるピンはあるけど、ボードのレイアウトやトレースの層を考えると、かなり面倒になる。だから、グラフィックカード(しかもたくさん)を使う方が適してるんじゃないかな。

誰か、FPGAを使ってニューラルネットや他の接続主義アーキテクチャを実装した例を知ってる人いる? 高速推論のための専門プロセッサとして使うのか、それともニューラルネットが重みを含めてFPGAアーキテクチャに直接合成されるという意味なの?どちらの使い方も他の選択肢ほど強力ではないよ。FPGAは完全にカスタムなロジックを実装するための無限の自由度を提供しないからね。ソフトウェアによって合成された特定の方法で再構成できるブロックの数は有限なんだ。このアーキテクチャは、大量の高帯域メモリアクセスが必要な大規模なLLMには向いてないと思う。FPGAを高速メモリに接続することはできるけど、今のGPUの方がずっと仕事が得意だよ。

https://arxiv.org/abs/2404.10076

微分可能なロジックゲートネットワークについて調べてみて。

確かに、FNALではLHC/CMSの高エネルギー物理学の結果に対する推論のためにFPGAでネットワークを使ってるよ。ダイナミカルシステムのマイクロ秒制御に関わるケースもあるしね。 https://fastmachinelearning.org/hls4ml/ https://indico.cern.ch/event/797510/contributions/3313676/at... https://cdrdv2-public.intel.com/833277/deploying-tinyml-fpga... https://ml4physicalsciences.github.io/2019/files/NeurIPS_ML4...

ほんと、すごい技術だね。大好きだわ。

Raspberry Pi Vを使って、Lattice Certus-Pro NXの「Versa」ボードでPCIeインターフェースを立ち上げたんだけど、めっちゃ便利だったよ。面白いのは、Raspberry Pi Vが現代のデスクトップソフトウェアを動かすのにちょうどいい速度なんだ。Microsoft Teamsも動くしね。会議中にデスクトップを共有してFPGAデザインのライブデモができたのが良かった。ただ、BroadcomからのSoCドキュメントがないのが唯一の不満かな。Intelについては色々言われるけど、NDAプロセスを通ればフルチップのドキュメントを提供してくれるからね。それを使ってXeon Ivy Bridge上に素晴らしいFPGA PCIe環境を作ったんだ。PCI設定レジスタを全部保存して、FPGAを再構成して、再プログラムしてもサーバーを再起動したり再列挙したりしなくてもチップがバスに表示されるようにできた。コツは、再構成プロセス中にPCIeエラーチェックを無効にするためにルートコンプレックスビットを一時的に設定することだよ。(その時はAltera Stratix-IIgxを使ってた)他にも方法があるかもしれないけど、試してないな:https://stackoverflow.com/questions/32334870/how-to-do-a-tru... でもそれを除いても、ドキュメントがあればPCIeの立ち上げ中に役立つエラーレポートがたくさん得られるからね。

ああ、それはすごいトリックだね!PCIeいじってLinuxを怒らせたことが何度もあったのを覚えてるよ。結局、デバイスのPCIe部分は再プログラムせずに、他の部分だけを再ロードできるPartial Reconfigurationを設定できたんだ。ただ、レイアウト計画やスペースの予約に関してはトレードオフだったけどね。