SlideShare a Scribd company logo
2
Most read
8
Most read
11
Most read
Ultra96ボードで
YOLOを高速化
奥畑 宏之 (@HiroyukiOkuhata)
インターフェース2019年1月号
第3部 最強FPGAボードで人工知能カリカリ画像認識
第1章 組み込み人工知能にピッタリ!最強Arm FPGAボード「Ultra96」
64ビットCortex-A/GPU/FPGAチップ搭載で3万円
第2章 最強ArmコアFPGAボードUltra96の基本的な使い方
開発環境の準備からLinux&My回路生成まで
第3章 はじめての行列演算ハードウェア化
画像認識人工知能高速化のために
第4章 映像認識人工知能のカリカリ高速化に挑戦
画像処理&行列計算チューンナップ技法の研究
第5章 リアルタイム物体検出に挑戦
精度よりリアルタイム性がほしいときのために
発表内容
• Ultra96ボード
• YOLO
• 開発フロー
• PetaLinux
• Vivado HLS
• PSとPL
• PLを用いた高速化
• HLSのクロック周波数設定
• キャッシュコヒーレンシ
• PL以外での高速化
• NEON
• GPU Mali
Ultra96ボードの概要
• XCZU3EG (PS + PL)
• Cortex-A53 1.5GHz
• Cortex-R5 600MHz
• Mali-400 MP2 667MHz
• 16nm UltraScale+ PL
• Mini-Display Port
• Wi-Fi/Bluetooth
• 2GB LPDDR4
• USB 3.0
• 拡張コネクタ
お手頃価格:29,800円(税別)
YOLO v3 によるオブジェクトの識別・検出
入力画像 結果画像
位置と種別を正しく
識別・検出
YOLOとは
• リアルタイム物体識別および検出のAIアルゴリズム
• ニューラルネットDarknetを用いる
• バージョン3 (v3) が 2018年4月に公開
YOLO 処理時間比較
213.6
115.9
18.1 9.14
0
50
100
150
200
250
ラズパイ3 Ultra96ボード
(高速化前)
Ultra96ボード
(高速化後)
Core i7 4GHz
YOLOv3で画像1枚(608×608)の推論にかかる時間 (秒)
YOLO 処理時間 内訳
• gprofによる推論処理
のプロファイリング
• gemm (行列乗算)が
処理時間の91%を占
める
浮動小数点の行列乗算
をPLでオフロード
Ultra96 開発フロー 概略
・Vivado HLS & Vivado で PLの設計
・OSはPetaLinuxを使う
PetaLinux Build Guide for Ultra96
・このWebページの通り進めると、お手軽に動く
PetaLinuxツール
• ビルド時間
• 少し変更してカーネルビルドするのに10分強 (i7-4790K @ 4.00GHz)
• ディスク容量
• ビルド後のプロジェクトフォルダ 44GB
• aptがほしい
• 一応、パッケージ管理システムDNFが使える (パッケージは少ない)
• 記事ではバージョン2018.02を使用
• Ubuntu16.04でないとうまく動かない
• 最新バージョンは2018.03だが
• Ultra96用のBSPがまだない
• 2018.02のBSPを使うとsystem-top.dtb周りでエラー
• 試される忍耐力
Vivado HLS
• gemm (行列乗算) のC記述をVivado HLSで高位合成
• Xilinxアプリケーションノートを流用
• 行列サイズ32×32の単精度浮動小数点(FP32)の乗算
• AXI4-Streamで入出力
• 高位合成の利点 → アーキテクチャの探索
• 行列のサイズ:32×32, 64×64, 128×128
• 演算の種類:C=A×B, C=A×B+C
• データバス幅
• 動作周波数とサイクル数
• 注意点
• 生成回路のサイクル数、回路規模
PSとPLの接続
• AXI4-Stream ⇔ AXIバス
• Xilinx AXI DMA IP を利用
• Linuxメモリの連続領域確保
• udmabuf (@ikwzmさん) を利用
udmabuf AXI DMA IP 行列乗算IP
PS PL
YOLO
(darknet)
• 接続してUltra96でYOLOを実行
処理時間:115.9秒
高速化
1. Vivado HLSのクロック周波数設定
2. キャッシュコヒーレンシ
3. AXIバス幅の拡張
4. ダブルバッファリング
高速化 1. Vivado HLSのクロック周波数設定
• Vivado HLS 設定クロック周波数≠生成回路の動作可能周波数
• 条件厳しめに高位合成される印象
• Uncertainty 12.5%が付加
• 余裕のありすぎる回路
• 逆にMETしない場合もあるらしい
• クロック周波数とサイクル数のトレードオフ
• 自動で探索してほしい (QuartusIIのDSEみたいな)
• 探索結果
• Vivado HLS の設定:150MHz
• Vivadoの設定:299MHz
高速化 2. キャッシュコヒーレンシ
• ハードウェアによるキャッシュ同期
• 以前のZynqではACPを利用
• AR#66643
Zynq UltraScale+ MPSoCのACPインターフェイスでは、次のキャッ
シュライン対応のトランザクションのみが許容されます。
(中略)
ACPの代わりに、コヒーレンシと共に幅広いAXIトランザクションがサ
ポートされるコヒーレンシHPCポートの使用をご検討ください。
• デフォルト設定ではHPCはキャッシュコヒーレンシではない
• AR#69446
• AXIバスのAxCACHE, AxPROTを適切に設定
• ブート時にBroadcasting Inner Shareableとする
• デバイスツリーの設定でdma-coherentのプロパティを追加
高速化 3. AXIバス幅の拡張
• AXI4-Streamのデータバス幅を32bitから128bitに拡張
• サイクル数
• YOLO実行時間
• 22.7秒→21.4秒
• サイクル数は削減できたが、全体の処理時間に占める割合は小
さかった
32bit 128bit
データ転送サイクル数 12,289 5,122
行列乗算サイクル数 4,549 4,549
総サイクル数 16,846 9,679
高速化 4. ダブルバッファリング
• Linuxメモリ内のコピーとDMA転送を同時に行う
行列B
行列C
①コピー
行列乗算IP
①DMA転送
②DMA転送
②コピー
DMAバッファ
(udmabuf)
• YOLO実行時間
• 21.4秒→18.1秒
• スキャッタギャザDMAを用いれば必要ないかも
高速化による時間短縮まとめ
高速化 YOLO実行時間 (秒)
行列サイズ32×32, クロック100MHz 115.9
行列サイズ64×64, クロック299MHz 46.2
キャッシュコヒーレンシ On 22.7
AXIバス幅 32bit → 128bit 21.4
ダブルバッファリング 18.1
リアルタイム
画像認識
• darknetをOpenCV付
きでコンパイル
• Tiny YOLO v3で2fps
• X Window Systemの
表示が遅い
PL以外での高速化
• NEONによる高速化
• GPU Maliによる高速化
NEONによるYOLO高速化
• NEONとは
• ARMアーキテクチャの64ビット, 128ビットのSIMD命令セット
• NEONを用いたDarknet実装
• NNPACK for Darknet (ライブラリ)
• https://github.com/digitalbrain79/NNPACK-darknet
• darknet-nnpack
• https://github.com/digitalbrain79/darknet-nnpack
• Ultra96でビルド
• darknet-nnpackのReadme.mdの通り
• clangは不要だった
• Ultra96で実行
YOLO v3 19.4 秒
YOLO v3 tiny 1.03 秒
速い...
GPU Maliによる高速化(の目論見)
• Mali-400 MP
• OpenCLが使えない
• OpenGL Extentionが使えない
→ OpenGL ES 2.0 で頑張る
• シェーディング言語(GLSL)で記述
バーテックス
シェーダー
フラグメント
シェーダー
画面描画
GLSL GLSL
通常 頂点計算 テクスチャ計算 描画
GPGPU 使わない 演算 glReadPixelsで結果取得
Ultra96でMaliの
動作確認
• Xilinx UG1209 チュート
リアルアプリ「tricube」
がそのまま動作する

More Related Content

PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
PDF
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
PPTX
研究者のための Python による FPGA 入門
PDF
高位合成ツールVivado hlsのopen cv対応
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
PDF
Tensor flow usergroup 2016 (公開版)
PDF
Chainer で Tensor コア (fp16) を使いこなす
プログラムを高速化する話Ⅱ 〜GPGPU編〜
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
2015年度GPGPU実践プログラミング 第5回 GPUのメモリ階層
研究者のための Python による FPGA 入門
高位合成ツールVivado hlsのopen cv対応
ARM CPUにおけるSIMDを用いた高速計算入門
Tensor flow usergroup 2016 (公開版)
Chainer で Tensor コア (fp16) を使いこなす

What's hot (20)

PDF
いまさら聞けない!CUDA高速化入門
PDF
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
PDF
分散学習のあれこれ~データパラレルからモデルパラレルまで~
PDF
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
PDF
CUDAプログラミング入門
PDF
Singularityで分散深層学習
PDF
ディープラーニングの2値化(Binarized Neural Network)
PDF
機械学習のための数学のおさらい
PDF
TVM の紹介
PDF
【メタサーベイ】基盤モデル / Foundation Models
PDF
ChatGPTは思ったほど賢くない
PDF
バンディットアルゴリズム入門と実践
PDF
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
PDF
モデルアーキテクチャ観点からのDeep Neural Network高速化
PDF
効率的学習 / Efficient Training(メタサーベイ)
PDF
【DL輪読会】Domain Generalization by Learning and Removing Domainspecific Features
PPTX
【DL輪読会】"Instant Neural Graphics Primitives with a Multiresolution Hash Encoding"
PDF
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
PDF
計算機アーキテクチャを考慮した高能率画像処理プログラミング
PDF
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
いまさら聞けない!CUDA高速化入門
[GTCJ2018]CuPy -NumPy互換GPUライブラリによるPythonでの高速計算- PFN奥田遼介
分散学習のあれこれ~データパラレルからモデルパラレルまで~
オープンソースコンパイラNNgenでつくるエッジ・ディープラーニングシステム
CUDAプログラミング入門
Singularityで分散深層学習
ディープラーニングの2値化(Binarized Neural Network)
機械学習のための数学のおさらい
TVM の紹介
【メタサーベイ】基盤モデル / Foundation Models
ChatGPTは思ったほど賢くない
バンディットアルゴリズム入門と実践
GPGPU Seminar (GPU Accelerated Libraries, 3 of 3, Thrust)
モデルアーキテクチャ観点からのDeep Neural Network高速化
効率的学習 / Efficient Training(メタサーベイ)
【DL輪読会】Domain Generalization by Learning and Removing Domainspecific Features
【DL輪読会】"Instant Neural Graphics Primitives with a Multiresolution Hash Encoding"
2015年度GPGPU実践プログラミング 第9回 行列計算(行列-行列積)
計算機アーキテクチャを考慮した高能率画像処理プログラミング
2015年度先端GPGPUシミュレーション工学特論 第5回 GPUのメモリ階層の詳細 (様々なメモリの利用)
Ad

Similar to Ultra96ボードでYOLOを高速化 (20)

PDF
Good Arm FPGA Board Ultra96 and Google AI YOLO
PPTX
Zynq + Vivado HLS入門
PPTX
Abstracts of FPGA2017 papers (Temporary Version)
PDF
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
PDF
ACRiルーム副室長_安藤様_講演資料
PDF
FPGA startup 第一回 LT
PDF
FPGAスタートアップ資料
PDF
Synthesijer zynq qs_20150316
PDF
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
PDF
IEICE technical report (RECONF), January 2015.
PDF
Halide, Darkroom - 並列化のためのソフトウェア・研究
PPTX
Androidとfpgaを高速fifo通信させちゃう
PDF
SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」
PDF
私のファミコンのfpsは530000です。もちろんフルパワーで(以下略
PPTX
FPGA勉強会資料 20210516
PDF
DAS_202109
PDF
Ultra96 pmod expansion board
PPTX
ヘネシー&パターソン7.4
PDF
FPGAをロボット(ROS)で「やわらかく」使うには
Good Arm FPGA Board Ultra96 and Google AI YOLO
Zynq + Vivado HLS入門
Abstracts of FPGA2017 papers (Temporary Version)
「FPGA 開発入門:FPGA を用いたエッジ AI の高速化手法を学ぶ」
ACRiルーム副室長_安藤様_講演資料
FPGA startup 第一回 LT
FPGAスタートアップ資料
Synthesijer zynq qs_20150316
2値ディープニューラルネットワークと組込み機器への応用: 開発中のツール紹介
IEICE technical report (RECONF), January 2015.
Halide, Darkroom - 並列化のためのソフトウェア・研究
Androidとfpgaを高速fifo通信させちゃう
SDSoC勉強会_170128_スライド「SDx 2016.3のプラグマによるハードウェアと性能」
私のファミコンのfpsは530000です。もちろんフルパワーで(以下略
FPGA勉強会資料 20210516
DAS_202109
Ultra96 pmod expansion board
ヘネシー&パターソン7.4
FPGAをロボット(ROS)で「やわらかく」使うには
Ad

Ultra96ボードでYOLOを高速化

  • 2. インターフェース2019年1月号 第3部 最強FPGAボードで人工知能カリカリ画像認識 第1章 組み込み人工知能にピッタリ!最強Arm FPGAボード「Ultra96」 64ビットCortex-A/GPU/FPGAチップ搭載で3万円 第2章 最強ArmコアFPGAボードUltra96の基本的な使い方 開発環境の準備からLinux&My回路生成まで 第3章 はじめての行列演算ハードウェア化 画像認識人工知能高速化のために 第4章 映像認識人工知能のカリカリ高速化に挑戦 画像処理&行列計算チューンナップ技法の研究 第5章 リアルタイム物体検出に挑戦 精度よりリアルタイム性がほしいときのために
  • 3. 発表内容 • Ultra96ボード • YOLO • 開発フロー • PetaLinux • Vivado HLS • PSとPL • PLを用いた高速化 • HLSのクロック周波数設定 • キャッシュコヒーレンシ • PL以外での高速化 • NEON • GPU Mali
  • 4. Ultra96ボードの概要 • XCZU3EG (PS + PL) • Cortex-A53 1.5GHz • Cortex-R5 600MHz • Mali-400 MP2 667MHz • 16nm UltraScale+ PL • Mini-Display Port • Wi-Fi/Bluetooth • 2GB LPDDR4 • USB 3.0 • 拡張コネクタ お手頃価格:29,800円(税別)
  • 5. YOLO v3 によるオブジェクトの識別・検出 入力画像 結果画像 位置と種別を正しく 識別・検出 YOLOとは • リアルタイム物体識別および検出のAIアルゴリズム • ニューラルネットDarknetを用いる • バージョン3 (v3) が 2018年4月に公開
  • 6. YOLO 処理時間比較 213.6 115.9 18.1 9.14 0 50 100 150 200 250 ラズパイ3 Ultra96ボード (高速化前) Ultra96ボード (高速化後) Core i7 4GHz YOLOv3で画像1枚(608×608)の推論にかかる時間 (秒)
  • 7. YOLO 処理時間 内訳 • gprofによる推論処理 のプロファイリング • gemm (行列乗算)が 処理時間の91%を占 める 浮動小数点の行列乗算 をPLでオフロード
  • 8. Ultra96 開発フロー 概略 ・Vivado HLS & Vivado で PLの設計 ・OSはPetaLinuxを使う
  • 9. PetaLinux Build Guide for Ultra96 ・このWebページの通り進めると、お手軽に動く
  • 10. PetaLinuxツール • ビルド時間 • 少し変更してカーネルビルドするのに10分強 (i7-4790K @ 4.00GHz) • ディスク容量 • ビルド後のプロジェクトフォルダ 44GB • aptがほしい • 一応、パッケージ管理システムDNFが使える (パッケージは少ない) • 記事ではバージョン2018.02を使用 • Ubuntu16.04でないとうまく動かない • 最新バージョンは2018.03だが • Ultra96用のBSPがまだない • 2018.02のBSPを使うとsystem-top.dtb周りでエラー • 試される忍耐力
  • 11. Vivado HLS • gemm (行列乗算) のC記述をVivado HLSで高位合成 • Xilinxアプリケーションノートを流用 • 行列サイズ32×32の単精度浮動小数点(FP32)の乗算 • AXI4-Streamで入出力 • 高位合成の利点 → アーキテクチャの探索 • 行列のサイズ:32×32, 64×64, 128×128 • 演算の種類:C=A×B, C=A×B+C • データバス幅 • 動作周波数とサイクル数 • 注意点 • 生成回路のサイクル数、回路規模
  • 12. PSとPLの接続 • AXI4-Stream ⇔ AXIバス • Xilinx AXI DMA IP を利用 • Linuxメモリの連続領域確保 • udmabuf (@ikwzmさん) を利用 udmabuf AXI DMA IP 行列乗算IP PS PL YOLO (darknet) • 接続してUltra96でYOLOを実行 処理時間:115.9秒
  • 13. 高速化 1. Vivado HLSのクロック周波数設定 2. キャッシュコヒーレンシ 3. AXIバス幅の拡張 4. ダブルバッファリング
  • 14. 高速化 1. Vivado HLSのクロック周波数設定 • Vivado HLS 設定クロック周波数≠生成回路の動作可能周波数 • 条件厳しめに高位合成される印象 • Uncertainty 12.5%が付加 • 余裕のありすぎる回路 • 逆にMETしない場合もあるらしい • クロック周波数とサイクル数のトレードオフ • 自動で探索してほしい (QuartusIIのDSEみたいな) • 探索結果 • Vivado HLS の設定:150MHz • Vivadoの設定:299MHz
  • 15. 高速化 2. キャッシュコヒーレンシ • ハードウェアによるキャッシュ同期 • 以前のZynqではACPを利用 • AR#66643 Zynq UltraScale+ MPSoCのACPインターフェイスでは、次のキャッ シュライン対応のトランザクションのみが許容されます。 (中略) ACPの代わりに、コヒーレンシと共に幅広いAXIトランザクションがサ ポートされるコヒーレンシHPCポートの使用をご検討ください。 • デフォルト設定ではHPCはキャッシュコヒーレンシではない • AR#69446 • AXIバスのAxCACHE, AxPROTを適切に設定 • ブート時にBroadcasting Inner Shareableとする • デバイスツリーの設定でdma-coherentのプロパティを追加
  • 16. 高速化 3. AXIバス幅の拡張 • AXI4-Streamのデータバス幅を32bitから128bitに拡張 • サイクル数 • YOLO実行時間 • 22.7秒→21.4秒 • サイクル数は削減できたが、全体の処理時間に占める割合は小 さかった 32bit 128bit データ転送サイクル数 12,289 5,122 行列乗算サイクル数 4,549 4,549 総サイクル数 16,846 9,679
  • 17. 高速化 4. ダブルバッファリング • Linuxメモリ内のコピーとDMA転送を同時に行う 行列B 行列C ①コピー 行列乗算IP ①DMA転送 ②DMA転送 ②コピー DMAバッファ (udmabuf) • YOLO実行時間 • 21.4秒→18.1秒 • スキャッタギャザDMAを用いれば必要ないかも
  • 18. 高速化による時間短縮まとめ 高速化 YOLO実行時間 (秒) 行列サイズ32×32, クロック100MHz 115.9 行列サイズ64×64, クロック299MHz 46.2 キャッシュコヒーレンシ On 22.7 AXIバス幅 32bit → 128bit 21.4 ダブルバッファリング 18.1
  • 19. リアルタイム 画像認識 • darknetをOpenCV付 きでコンパイル • Tiny YOLO v3で2fps • X Window Systemの 表示が遅い
  • 21. NEONによるYOLO高速化 • NEONとは • ARMアーキテクチャの64ビット, 128ビットのSIMD命令セット • NEONを用いたDarknet実装 • NNPACK for Darknet (ライブラリ) • https://github.com/digitalbrain79/NNPACK-darknet • darknet-nnpack • https://github.com/digitalbrain79/darknet-nnpack • Ultra96でビルド • darknet-nnpackのReadme.mdの通り • clangは不要だった • Ultra96で実行 YOLO v3 19.4 秒 YOLO v3 tiny 1.03 秒 速い...
  • 22. GPU Maliによる高速化(の目論見) • Mali-400 MP • OpenCLが使えない • OpenGL Extentionが使えない → OpenGL ES 2.0 で頑張る • シェーディング言語(GLSL)で記述 バーテックス シェーダー フラグメント シェーダー 画面描画 GLSL GLSL 通常 頂点計算 テクスチャ計算 描画 GPGPU 使わない 演算 glReadPixelsで結果取得
  • 23. Ultra96でMaliの 動作確認 • Xilinx UG1209 チュート リアルアプリ「tricube」 がそのまま動作する