Slide 1

Slide 1 text

Python(PYNQ)がテーマのAMD主催の FPGAコンテストに参加してきた ミソジ 2024/11/16 PyCon mini 東海 #pycontokai

Slide 2

Slide 2 text

自己紹介 名前: ミソジ @misoji_engineer ブログ: エンジニアの電気屋さん(https://misoji-engineer.com/) ハードウェアのエンジニアで、趣味でブログとか書いてます

Slide 3

Slide 3 text

アジェンダ • AMD Pervasive AI Developer Contest
 
 • コンテストでやったこと + スケジュール
 
 • Python(PYNQ)に助けてもらった箇所
 
 • 海外のコンテストについて
 
 • まとめ AMDのコンテストに参加した内容を紹介します

Slide 4

Slide 4 text

AMD Pervasive AI Developer Contest *Pervasive…普及する

Slide 5

Slide 5 text

AMD Pervasive AI Developer Contest 「FPGAの評価ボード(KR260)を使って、ロボットとAIっぽいことをする」ことがテーマ Robotics AI 部門に参加していました。 *コンテストのリンク先より引用 https://www.hackster.io/contests/amd2023 3部門に分かれていました。 ・GPU部門     …AMDのGPU ・Robotics部門 …AMDのFPGA (Kria_KR260) ・PC部門    …AMDのminiPC

Slide 6

Slide 6 text

2位でした。 2024/10/10にアメリカのサンフランシスコで開催。 AMDの開発者向けのイベント。 AMD開催の「Advancing AI 2024」で表彰されました。

Slide 7

Slide 7 text

プロジェクト詳細 GitHub・デモ動画含めてプロジェクトは全てオープン済。 ・hackster.io(公開済プロジェクト) https://www.hackster.io/iotengineer22/360-object-detection-robot-car-bdb1bd ・GitHub(ソースコード・回路図・基板データ・ BOM) https://github.com/iotengineer22/AMD-Pervasive-AI-Developer-Contest ・Youtube(テスト動画) https://www.youtube.com/playlist?list=PLVu7mPgGBMbaku3Ff9iG18OYoNWfO1pT7

Slide 8

Slide 8 text

ブログ記事 ブログ記事としてもアップしています。 ・AMD(Xilinx)のFPGAコンテストに参加した感想 https://misoji-engineer.com/archives/amd-xilinx-fpga-contest.html ・AMDの開発者向けイベントの Advancing AIに参加してきた https://misoji-engineer.com/archives/amd-advancing-ai.html ・サンフランシスコとかシリコンバレーを 1日観光してきた https://misoji-engineer.com/archives/sanfrancisco-sightseeing.html

Slide 9

Slide 9 text

コンテストでやったこと

Slide 10

Slide 10 text

FPGAとは? FPGA…自由にハード設計・書き換え可能なIC FPGA…Field Programmable Gate Array ・同期した信号制御 ・CPU/GPU代わりの高速な推論  ハードウェア言語 (Verilog, VHDL)

Slide 11

Slide 11 text

FPGAの最近の事例 車載カメラ・産業用ネットワークにもFPGAが使われています SUBARUの運転支援システム AMDのリンク先より引用 https://www.amd.com/ja/resources/case-studies/subaru.html AMDのリンク先より引用 https://www.amd.com/ja/resources/case-studies/moxa.html MOXAの産業用イーサネットスイッチ

Slide 12

Slide 12 text

開発したもの 「360°カメラ」 と 「KR260(FPGA + CPU)」 を搭載したロボットカー

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

Architecture(ハード・ソフト) Python(PYNQ)から、FPGAとCPUをまとめて制御 コンテストの テーマ(要件)の一つ 

Slide 15

Slide 15 text

コンテストのスケジュール

Slide 16

Slide 16 text

・2023/12… コンテストの開催アナウンス    ↓ ・2024/2… 評価ボードの申請期限(Webテスト+Abstract提出) ・2024/3… 評価ボードの当選発表 ・2024/4… 評価ボードが到着 ・2024/7… プロジェクトの提出期限    ↓ ・2024/9… 最終候補者(Finalist)を選出         AMD関係者にレビュー ・2024/10… 開発者向けイベント「Advancing AI 」で表彰 コンテストの期間 コンテストとしての期間は約10か月、開発期間は約7か月 約7か月 趣味でコツコツと開発

Slide 17

Slide 17 text

2024/1 2024/2 2024/3 2024/4 2024/5 2024/6 2024/7 開発ネタ検討 基板作成 ハードウェア開発 FPGA合成 ライブラリ調査 コーディング デバッグ ドキュメント整理 デモ動画作成 スケジュール 開発期間は7か月だけど、がっつりコード書ける期間は短い。 ・Webテスト ・Abstract提出 ・評価ボード到着 ・元々の 提出期限 ・提出期限 +1か月 ・+αの 追加仕様 コード書ける期間 約1か月

Slide 18

Slide 18 text

2024/1 2024/2 2024/3 2024/4 2024/5 2024/6 2024/7 開発ネタ検討 基板作成 ハードウェア開発 FPGA合成 ライブラリ調査 コーディング デバッグ ドキュメント整理 デモ動画作成 スケジュール ドキュメントには時間かかるので、コーディング・デバッグは短縮したい… ・Webテスト ・Abstract提出 ・元々の 提出期限 ・提出期限 +1か月 ・+αの 追加仕様 ・hackster.io(公開済プロジェクト) https://www.hackster.io/iotengineer22/36 0-object-detection-robot-car-bdb1bd

Slide 19

Slide 19 text

Python(PYNQ)に助けてもらった箇所

Slide 20

Slide 20 text

PYNQとは? AMDのFPGAで、Pythonを動かせるフレームワーク *AMDのリンク先より引用 https://www.amd.com/ja/products/adaptive-socs-and-fpgas/soc/zynq-ultrascale-plus-mpsoc.html ・ZYNQ・・・(かなり)高価なAMDのFPGA        1chipにCPUまで入っている *全てのFPGAでPythonから 制御できるわけではないので注意

Slide 21

Slide 21 text

コードは全部Pythonで 本来FPGAをデバッグする場合、合成など時間がかかる… 本来はハードウェア言語 (Verilog, VHDL) + デバッグする毎に FPGAの合成などが必要

Slide 22

Slide 22 text

コードは全部Pythonで Pythonから楽に雑に制御することで、コーティング・デバッグを短縮 ハードウェア言語を使わず Pythonで全て書く

Slide 23

Slide 23 text

コードの概要(1) from pynq_dpu import DpuOverlay from pynq import Overlay from pynq.lib import AxiGPIO overlay = DpuOverlay(dpu_model) overlay.load_model(cnn_xmodel) # Define and create the GStreamer pipeline for 360-camera pipeline = "thetauvcsrc mode=2K ! h264parse ! avdec_h264 ! videoconvert ! video/x-raw,format=BGR ! appsink" # Initialize the VideoCapture object cap = cv2.VideoCapture(pipeline, cv2.CAP_GSTREAMER) # Initialize and start the Motor-controller-thread controller_thread = threading.Thread(target=continuous_controller) controller_thread.start() 物体検出の例(1)

Slide 24

Slide 24 text

コードの概要(2) try: while True: ret, frame = cap.read() # Split the 360-image into 2 quadrants quadrants = { 'q1': frame[:, :width // 2], #front 'q2': frame[:, width // 2:], #back } # Apply YOLOX object detection and ROS2 Output to each quadrant for key, img in quadrants.items(): d_boxes, d_scores, d_classes = yolox_run(img, key) # Publish each quadrant as a separate ROS message img_publishers[key].publish(bridge.cv2_to_imgmsg(img, encoding="bgr8")) publish_markers(box_publishers, node_box, d_boxes, d_classes, key) 物体検出の例(2)

Slide 25

Slide 25 text

コードの概要(3) def run(input_image): # Pre-processing image_size = input_image.shape[:2] image_height, image_width = input_image.shape[0], input_image.shape[1] image_data, ratio = preprocess(input_image, input_shape) # inference(FPGA_DPU) image[0,...] = image_data.reshape(shapeIn[1:]) job_id = dpu.execute_async(input_data, output_data) dpu.wait(job_id) # Post-processing outputs = np.concatenate([output.reshape(1, -1, output.shape[-1]) for output in output_data], axis=1) bboxes, scores, class_ids = postprocess( FPGA(DPU)の推論の例

Slide 26

Slide 26 text

ただ100%正解かは怪しい… C++で書いた方が、速い + 過去のコードの資産流用できるケースも (例)ハードウェア言語で書いて、 AXIバスで繋げる (例)C++の ランタイムもある (例)普通に C++で書く

Slide 27

Slide 27 text

海外のコンテストについて

Slide 28

Slide 28 text

発表している人の英語 めっちゃ苦手です。マジで英語を聞き取れない人です… 典型的な日本人のサラリーマン・エンジニア。 ・働き始めて約10年 … 英語は全く使わない部門  ※データシートを英語で読むぐらい ・最近の2~3年 … 英語を多少は使う部門に (ただ1か月に1回Web会議で報告できるかの頻度) ・海外のコンテスト … 本格的に参加したのも初めて。 昔Kaggleを試みたけど、3日坊主。 ⇒今回は興味あるハードウェアが絡む内容だったので完走できた

Slide 29

Slide 29 text

メインプロジェクト + 14個のサブプロジェクトのドキュメント 技術ブログを書く感じで(何とか)乗り切りました。 0. 360° Object Detection Robot Car 1. PYNQ + GPIO(LED Blinking) 2. PYNQ + PWM(DC-Motor Control) 3. Object Detection(Yolo) with DPU-PYNQ 4. Implementation DPU, GPIO, and PWM 5. Remote Control 360° Camera 6. GStreamer + OpenCV with 360°Camera 7. 360 Live Streaming + Object Detect(DPU) 8. ROS2 3D Marker from 360 Live Streaming 9. Control 360° Object Detection Robot Car 10. Improve Object Detection Speed with YOLOX 11. Benchmark Architectures of the DPU 12. Power Consumption of 360° Object Detection Robot Car 13. Application to Vitis AI ONNX Runtime Engine (VOE) 14. Appendix: Object Detection Using YOLOX with a Webcam 英語のドキュメント 日本語の下書き ⇒ ChatGPTで翻訳 ⇒ 修正 で対応しました

Slide 30

Slide 30 text

英語のプレゼン AMD関係者への英語のプレゼン。たぶん何とかなった? 最終候補者(Finalist)は英語でのプレゼンがありました。 ※Web会議でQA含めて40分ぐらい  ⇒一夜漬けだけど、練習してなんとかなった? と思いたい…

Slide 31

Slide 31 text

英語のQA 英語のQA(質疑応答)でも、ダメなところ一杯でした。 Robotics AI部門なのに、ロボットに関する重要な質問をミスりました。  ⇒ROSとLossを聞き間違える。 ただ、答えられる質問は何とか(拙い英語で)返したつもり…。 Did you use ROS just for visualization? Or are you also processing nodes, packets, or other elements? Loss(ロス)? nodes? Paket? ノード・パケットを失う?通信不良のこと? ROS…Robot operating system Loss…損失・失うこと

Slide 32

Slide 32 text

海外のコンテストの感想 色々と大変だったけど、入賞したし、現地でのイベントも楽しかった お酒と飯を入れれば、エンジニア同士で好きな技術を熱く語れるのは万国共通です。 ⇒約10か月の長い苦行のコンテストでしたけど、振り返れば楽しかったです。

Slide 33

Slide 33 text

まとめ

Slide 34

Slide 34 text

まとめ PythonもFPGAも海外のコンテストもおススメです! ・Pythonで動かせるFPGAも出てきている  (AMDがコンテストの要件・テーマにするぐらい…) ・Pythonで書くことで、コーディング・デバッグの短縮に  (初心者にとって、画像処理などはPythonの方が楽だった。) ・海外でもエンジニア向けの面白いコンテストは沢山あります  (N=1だけど、英語苦手でもなんとかなった?)

Slide 35

Slide 35 text

最後に ご清聴ありがとうございました。