# ZCU102 上使用 DPU 部署 ViT 全流程 這份筆記是在紀錄用Vitis AI 將 ViT 模型部署到 Xilinx ZCU102 板卡上,使用 Vitis-AI 2023.2 工具鏈編譯模型(ONNX 格式)成可在板上執行的 .xmodel。 以下分章節詳述流程、坑點與解法,手把手帶你從一開始架設WSL以及Docker開始,到最後的上板,但要先說,筆者上板失敗XD,因為現在DPU還不支援Transformer,但是流程只要走通了,要做CNN-oriented的都很容易,像做是YOLO或是ResNet等模型。 ## 專案簡介與背景 * **Vision Transformer (ViT)**:一種基於 Transformer 架構的影像分類模型,性能優異但使用了自注意力(Self-Attention)機制。此模型通常以浮點數訓練,在部署時需要考慮量化與 DPU 支援。 * **Vitis-AI 工具鏈**:Xilinx 提供的 AI 部署工具,包括模型量化(vai_q)和編譯(vai_c)等。2020.2 版對應 Vitis-AI 1.2 系列,內含支援於 Zynq Ultrascale+ 平台的 DPU IP。 * **ZCU102 平台**:基於 Zynq UltraScale+ MPSoC (XCZU9EG),有雙 Cortex-A53 + FPGA 邏輯,並搭載 4GB DDR4。其豐富外設和高速記憶體使其適合進行 AI 推理加速。 * **目標**:將 vit_fpga.onnx(ViT 模型的 ONNX 格式檔)編譯為 DPU 可用的 Xilinx XMODEL 格式,送到 ZCU102 執行。由於缺乏標註資料,跳過量化步驟,直接編譯浮點模型。 ## Windows Subsystem for Linux (WSL, Ubuntu) 安装 ### 一、什麼是 WSL ? WSL(Windows Subsystem for Linux)是微軟開發的一項技術,允許用戶在Windows系統中直接運行完整的Linux環境,無需虛擬機。通過操作系統級虛擬化,WSL將Linux子系統無縫嵌入Windows,提供原生Linux命令行工具、軟件包管理器及應用程序支持。 ### 二、使用步驟 ### 1.啟動wsl功能 打開開始菜單,在開始菜單中輸入 **開啟或關閉 Windows 功能**,在彈出的窗口中勾選 **虛擬機平台(Virtual Machine Platform)** 和 **適用於 Linux 的 Windows 子系統**,確定之後重開系統。 ![image](https://hackmd.io/_uploads/BkMxa2bZbe.png) ![image](https://hackmd.io/_uploads/HkZV2hWb-x.png) 重開系統後,打開終端,在終端中輸入: ``` wsl.exe --update ``` 就可以安裝 WSL 相關的組件,這一步可能需要幾分鐘的時間。 ### 2.安裝Ubantu 打開 Microsoft Store,搜索 Ubuntu並下載。 ![image](https://hackmd.io/_uploads/Sy-V6nZ-bl.png) 下載完成後,可以在開始菜單中找到 Ubuntu,如果終端使用的是 Windows Terminal 那麼在選項卡中也能看到 Ubuntu 的選項。 下載完成後,打開終端,在上面可以選擇Ubuntu。 ![image](https://hackmd.io/_uploads/ryaZA3bbbx.png) ### 3.創帳號密碼 ![image](https://hackmd.io/_uploads/HyjwAn-Zbl.png) 這一步需要輸入用戶名和密碼,注意:輸密碼的界面是看不到的,不要認為是哪裡出問題了。 在輸入完用戶名稱和密碼之後,就代表安裝成功了: ### 4.更換映像檔以及初步設置 在Ubantu終端輸入: ``` lsb_release -a ``` 即可查詢當前安裝的 Ubuntu 版本,本文使用的版本是 24.04。 Ubuntu 24.04 及以前版本的軟件源所在位置為 /etc/apt/sources.list,而在 Ubuntu 24.04中,Ubuntu 官方更改了軟件源的位置和形式,新的位置為 /etc/apt/sources.list.d/ubuntu.sources。 使用 Ubuntu 自帶的 nano 程序進行軟件源的更換,在終端輸入以下內容: ``` sudo nano /etc/apt/sources.list.d/ubuntu.sources ``` 用下面的內容完全替換並保存(該內容僅適用於 Ubuntu 24.04): ``` Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu Suites: noble noble-updates noble-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg # 以下安全更新軟件源包含了官方源與鏡像站配置,如有需要可自行修改注釋切換 Types: deb URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu Suites: noble-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg ``` 如果不是 Ubuntu 24.04 請不要復制上面的內容,自行前往[映像站](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)復制對應的Source。 按下 Ctrl + O 並Enter保存,再按下 Ctrl + X 退出 nano。 保存之後,輸入以下內容更新映像源: ``` sudo apt update && sudo apt upgrade -y ``` 一般來說對 GUI 的支持需要 WSL 2,如果當前采用的是 WSL 1 需要升級為 WSL2。在 Windows 終端中輸入: ``` wsl -l -v ``` 即可檢查 WSL 版本,如果輸出的是1,輸入以下內容轉換: ``` wsl --set-default-version 2 ``` 之後只要在Windows終端打: ``` wsl ``` 就可以進到wsl環境,不需要再特別開Ubuntu。 ![image](https://hackmd.io/_uploads/rkNWLTZ-Zx.png) ![image](https://hackmd.io/_uploads/HkEMI6-Zbx.png) 相關語法等等可以再上網查詢,像是mnt就是代表Windows端,所以上面顯示的: ``` /mnt/c/Users ``` 在Windows端對應到的就是: ``` C:\Users ``` ## 在Windows環境下Docker安装 ### 一、什麼是Docker? Docker是一個開源的容器化平台,它可以讓開發者將應用及其依賴打包到一個輕量級、可移植的容器中,實現"一次構建,到處運行"的目標。 ### 二、Docker Desktop安裝步驟 ### 1.下載Docker Desktop 進入到Docker官網:https://www.docker.com/products/docker-desktop 點擊“Download for Windows”按鈕下載最新版本的安裝包。 ![image](https://hackmd.io/_uploads/Hk5kOTW-We.png) ### 2.運行安裝程式 按兩下下載的檔案啟動安裝精靈.exe 重要設定項目: 在安裝配置介面,務必勾選以下選項: ``` ☑ Use WSL 2 instead of Hyper-V (recommended) ☑ Add shortcut to desktop ``` 安裝好了後在 Docker Desktop 裡面把 Ubuntu WSL2 勾成可以使用 Docker engine。 回到 WSL 內確認: ``` docker info docker run hello-world ``` 可以跑就 OK。 ### 3.理解WSL 2的作用 為什麼選擇WSL 2? * Docker最初是為Linux設計的 * WSL 2內置了輕量級Hyper-V虛擬化技術 * 提供更好的性能和相容性 * WSL 2並非取代Hyper-V,而是利用其核心功能 *注意:建議保持Docker的預設安裝路徑(C槽),不要隨意修改,避免出現許可權問題* #### 以上,我們的基本工具就準備好了,再來就要進到重頭戲,安裝Vitis AI環境。 ## 自建 platform 一開始我是想照官方 Tutorial 自己做一個 Edge-AI platform: 參考文件: * [Vitis Platform Creation – 02 Edge AI ZCU104 step1](https://github.com/Xilinx/Vitis-Tutorials/blob/2025.1/Vitis_Platform_Creation/Design_Tutorials/02-Edge-AI-ZCU104/step1.md) * [Vitis Platform Creation – 02 Edge AI ZCU104 step2](https://github.com/Xilinx/Vitis-Tutorials/blob/2025.1/Vitis_Platform_Creation/Design_Tutorials/02-Edge-AI-ZCU104/step2.md) * [Vitis Platform Creation – 02 Edge AI ZCU104 step3](https://github.com/Xilinx/Vitis-Tutorials/blob/2025.1/Vitis_Platform_Creation/Design_Tutorials/02-Edge-AI-ZCU104/step3.md) 大致流程(理想狀況): 1.在 Vivado 做 block design:PS + DPU + DDR + 中斷等等。 2.匯出硬體 → 在 Vitis 做 platform(包含:硬體 HW、device tree、rootfs、boot 相關)。 3.用 PetaLinux 或官方 rootfs 做出 Linux 映像,讓 FPGA 開機後有 Linux + DPU + 驅動。 ![image](https://hackmd.io/_uploads/rJNfaSwbWg.png) ### 1.Device Tree 是什麼、為什麼筆者被卡住 **Device tree** :一個描述硬體結構的檔案(通常是 .dts / .dtsi,最後編成 .dtb)。 Linux 開機時會讀 device tree,才知道: * 板上有哪些裝置(CPU、UART、Ethernet、DPU …) * 每個 IP 的 base address、中斷號碼、時脈等 沒有正確 device tree,Linux 雖然可以開機,但 driver 找不到硬體,DPU 也就不會動。 官方 ZCU104 教學裡有一步是 Create the device tree file,但那個教學是針對 2022.2以後,而我是 2020.2: * 一些指令在 2020.2 沒有、或長得不一樣。 * 對 2020.2 來說,要自己整合 PetaLinux、device-tree-xlnx 等工具,會很辛苦。 但實驗室只有2020.2版本的ZCU102 License,ZCU102在 generate bitstream/syn等時需要License,所以如果你是使用更高版本的工具且有License可以試試看自建Platform。 但因為專題時間有限,又只是想讓 ViT 跑在 DPU 上做 demo,所以後來我決定,不再硬做自己的 platform。 改走 Vitis-AI 官方預建 ZCU102 映像 + Docker 的flow也就是下一段要講的。 這一段的收穫主要是概念: Platform = 包起來的一整包東西: * HW design (DPU + DDR + AXI 等) * device tree * boot files * Linux rootfs Linux 在 ZCU102 上其實就是跑在 ARM Cortex-A53 上的 rootfs + kernel,跟一般嵌入式 Linux 一樣,只是下面多一顆 DPU。 PetaLinux 就是 AMD 提供的「幫你產 Linux + rootfs + device tree」的套件,實際跑在板子上的是它產出的 rootfs / kernel / dtb。 ## 抓 Vitis-AI repo ## 1.clone Vitis-AI repo 在 WSL: ``` cd ~ git clone https://github.com/Xilinx/Vitis-AI.git cd Vitis-AI ``` docker_run.sh 是跟「你現在的路徑」綁在一起的,它會把「當前這個 Vitis-AI 資料夾」mount 到容器的 /workspace。 如果你在 ~/Vitis-AI 跑: ``` ./docker_run.sh xilinx/vitis-ai-cpu:latest ``` → 容器裡 /workspace 對應的是 ~/Vitis-AI ## 2.第一次進 Vitis-AI Docker:踩到沒有 compiler的坑 ``` cd ~/Vitis-AI ./docker_run.sh xilinx/vitis-ai-cpu:latest ``` 進去後會看到大大的 Vitis-AI logo,底下會寫: * Docker Image Version: … (CPU) * Workflow: tf1 或類似 ![image](https://hackmd.io/_uploads/BknmpSwZWg.png) 我一開始想直接在裡面找 compiler: ``` vai_c --help vai_c_xir --help vai_c_onnx --help ``` 結果全部 command not found。 看 compiler 目錄: ``` ls /opt/vitis_ai ls /opt/vitis_ai/compiler ``` 只有 arch/ conda scripts 等,沒有 bin/vai_c_*,確定這個 image 沒有 compiler。 ## 3.想做 PyTorch 量化(還是沒有 compiler) 我改用 PyTorch 的 image,希望裡面有 vai_q_onnx: ``` ./docker_run.sh xilinx/vitis-ai-pytorch-cpu:latest ``` 進去後: ``` conda activate vitis-ai-pytorch vai_q_onnx --help ``` 還是 command not found。 所以: * ilinx/vitis-ai-cpu:latest → 沒 compiler * xilinx/vitis-ai-pytorch-cpu:latest → 沒 onnx quantizer / compiler 結論: 要做編譯(vai_c_xir)的話,不要用上面這兩個。 ## 4. 正解:用 xilinx/vitis-ai-tensorflow-cpu:latest 拿到 compiler 最後成功的是這個 image: ``` ./docker_run.sh xilinx/vitis-ai-tensorflow-cpu:latest ``` 進去畫面: * Docker Image Version: ubuntu2004-3.5.0.250 (CPU) * Workflow: tf1 ### 啟動正確的 conda env: ``` conda env list # 會看到 vitis-ai-tensorflow 等 conda activate vitis-ai-tensorflow ``` ![image](https://hackmd.io/_uploads/S1CUaSDbZx.png) ![image](https://hackmd.io/_uploads/ByPt6HwZZx.png) 確認 compiler: ``` which vai_c_xir # 會回 /opt/vitis_ai/conda/envs/vitis-ai-tensorflow/bin/vai_c_xir ls /opt/vitis_ai/compiler # 會有 arch ... 代表我們的compiler其實不在compiler folder :) ``` 這就是之後用來編 ONNX → xmodel 的 compiler。 ## 5. 建 ImageNet 資料夾(可略) ImageNet Dataset可以去ImageNet的官網下載。要先註冊登入才能下載。 ImageNet本身資料很大,有上百GB,所以一般在用是用ImageNet的Subset,最常用的是 **ILSVRC2012** 筆者原本想用 ImageNet 當量化 / 測試資料,就把壓縮檔丟進 repo: ``` cd ~/Vitis-AI/datasets mkdir -p imagenet mv ILSVRC2012_img_*.tar imagenet/ cd imagenet tar xf ILSVRC2012_img_test_v10102019.tar tar xf ILSVRC2012_img_val.tar # ... ``` * 保證 docker_run.sh 跟 datasets/imagenet 在同一棵樹下,例如: ``` ~/Vitis-AI ├─ docker_run.sh └─ datasets/ └─ imagenet/ ├─ data/ (val) └─ test/ (test) ``` * 在容器裡就可以看到: ``` ls /workspace/datasets/imagenet/data | head ls /workspace/datasets/imagenet/test | head ``` ## 6. 嘗試量化 ViT(tf_ViT_3.5) Vitis-AI repo 裡有一個 ViT QAT 示例: 要先進到model zoo裡面: ![image](https://hackmd.io/_uploads/SkQORSPb-l.png) 然後使用指令: ``` python downloader.py ``` 會跳出要你選哪一種環境,因為我想使用ViT,所以選擇tf。詳細的模型可以到: https://github.com/Xilinx/Vitis-AI/tree/master/model_zoo 在model zoo的清單下可以查看要用什麼模型。 再選取要的模型,像是ViT在這邊是編號34,那就打34,type選0即可: ![image](https://hackmd.io/_uploads/Byat1IwZbl.png) 然後: ``` unzip 'tf_ViT_3.5.zip ' ``` (記得用引號,因為.zip後面有一個空格我也不知道為啥==,我在這裡卡關卡半小時) 再來: ``` cd /workspace/model_zoo/tf_ViT_3.5/tf_ViT_3.5 ls # code data float qat README.md run_quant.sh run_test.sh ... ``` 理想流程是跑: ``` bash run_quant.sh | tee log_quant.txt ``` 這個 script 會: * 用 ImageNet 子集做 QAT / quantize * 產生量化後的 checkpoint / xmodel ### 6.1 但實際踩到的坑 ### 1. tf not defined 在 quantizer_base.py 中有 @tf.custom_gradient,但環境裡 import tensorflow as tf 的部分有衝突,腳本沒被官方更新,跑起來直接噴 NameError: name 'tf' is not defined。 所以要vim進去他的py檔,然後在最前面import tensorflow as tf,再跑一次量化。 ### 2.Loss 維度不合(0 vs 1000) 修到可以跑時,又踢到: ``` ValueError: Dimensions must be equal, but are 0 and 1000 for 'loss/mul' ... ``` 這其實是因為我沒準備好符合格式的 label / ground truth,只隨便丟了 ImageNet test/val 進去,導致 loss 計算崩潰。 ### 3.沒有 label 只下載 ILSVRC2012_img_val.tar / ILSVRC2012_img_test_v10102019.tar,沒有標籤。 後來才發現 devkit ILSVRC2012_devkit_t12.tar.gz 裡有 ILSVRC2012_validation_ground_truth.txt,但那是 validation label,不一定跟 quant script 要的一樣,最多只能保Calibration 不能跑Validation。 **最後決策:** QAT 太花時間,又只是 demo,改用官方提供的 vit_fpga.onnx 直接編譯成 xmodel,不再自己做 quantization,所以說第五點下載ImageNet可略。 ## 7. 使用 vit_fpga.onnx 編譯成 xmodel Vitis-AI 工程根目錄(容器裡 /workspace)下有這些檔案: ``` ls # board_setup datasets docker_run.sh dpu model_zoo ... # vit_fpga.onnx vit_load.py vit-train.py ``` ![image](https://hackmd.io/_uploads/rJVtWUwWWl.png) 這個 vit_fpga.onnx 是 AMD 官方準備好的 ViT 模型(已經處理好權重、輸入輸出)。 ### 7.1 用 vai_c_xir 編譯 在 xilinx/vitis-ai-tensorflow-cpu:latest 裡,且 conda activate vitis-ai-tensorflow 後: ``` cd /workspace vai_c_xir \ -x vit_fpga.onnx \ -a /opt/vitis_ai/compiler/arch/DPUCZDX8G/ZCU102/arch.json \ -o vit_zcu102 \ -n vit_v3_5 ``` 參數說明: * -x vit_fpga.onnx:輸入 ONNX 模型 * -a .../ZCU102/arch.json:描述 ZCU102 上 DPUCZDX8G 結構的 JSON (這個檔紀錄 DPU 多少 MAC、bank configuration、batch size 等) * -o vit_zcu102:輸出目錄 * -n vit_v3_5:輸出 xmodel 名稱(會變成 vit_v3_5.xmodel) 成功之後會看到 log: ``` [UNILOG][INFO] Compile mode: dpu [UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096 ... [UNILOG][INFO] The compiled xmodel is saved to "/workspace/vit_zcu102/vit_v3_5.xmodel" [UNILOG][INFO] The compiled xmodel's md5sum is ... ``` 並且: ``` ls vit_zcu102 # md5sum.txt meta.json vit_v3_5.xmodel ``` ![image](https://hackmd.io/_uploads/r12iWIvWbl.png) 這一步就是整個 host 端最關鍵的成果:vit_v3_5.xmodel。 ## 8. 把 xmodel 從容器 → Windows → ZCU102 **因為 docker_run.sh 把 host 的 ~/Vitis-AI 映射到容器 /workspace,** 所以編完後,在 Windows / WSL 那邊也能看到: ``` cd ~/Vitis-AI ls vit_zcu102 # md5sum.txt meta.json vit_v3_5.xmodel ``` ![image](https://hackmd.io/_uploads/BkMkM8wb-x.png) ### 8.1 ZCU102 端:設定 IP 1. 板子用官方 Vitis-AI ZCU102 映像 從 SD 開機。 2. 用 USB-UART(MobaXterm 的 COM4)登入,帳號密碼都是 root。 3. 設定靜態 IP: ``` ifconfig eth0 192.168.10.2 netmask 255.255.255.0 up ifconfig eth0 # 確認 inet addr:192.168.10.2 ``` 4. 在 Windows 把乙太網路的 IPv4 設成: * IP:192.168.10.1 * 子網路遮罩:255.255.255.0 * Gateway 留空即可 5. 互 ping: * Windows → 板子: ``` ping 192.168.10.2 ``` * 板子 → Windows: ``` ping 192.168.10.1 ``` 都 OK 再往下。 ## 9. 板子上開 SSH:跟 Dropbear 奮戰 ZCU102 預設跑的是 BusyBox + Dropbear,不是完整的 OpenSSH。 ### 9.1 檢查 SSH / Dropbear 狀態 在板子上: ``` which sshd # 回傳 "no sshd in ...",表示沒有 OpenSSH which dropbear # 通常會在 /usr/sbin/dropbear netstat -tnl | grep ':22' # 可能沒有任何東西在 LISTEN(一開始就是這樣) ``` 再看 Dropbear 設定: ``` cat /etc/default/dropbear ``` 裡面有一行: ``` # Disallow root logins by default DROPBEAR_EXTRA_ARGS="-B" ``` -B 就是 禁止 root 登入 的參數,所以即使服務在跑,root 也會被拒絕。 ### 9.2 修改設定 & 重啟 Dropbear 1. 編輯 /etc/default/dropbear(用 vi 或 nano): ``` vi /etc/default/dropbear ``` 改成: ``` #DROPBEAR_EXTRA_ARGS="-B" DROPBEAR_EXTRA_ARGS="" ``` 2. 重新啟動服務: ``` killall dropbear 2>/dev/null rm -f /var/run/dropbear.pid 2>/dev/null /etc/init.d/dropbear start ``` 3. 確認 22 port 在聽: ``` netstat -tnl | grep ':22' # 會看到 0.0.0.0:22 LISTEN ``` ### 9.3 PowerShell vs MobaXterm 接著在 Windows 端測: ``` ssh root@192.168.10.2 ``` 第一次會問 fingerprint,輸入 yes,再輸入 root 密碼,就可以成功登入。 如果加 -vvv 可以看到一堆 debug log,顯示最後: ``` Authenticated to 192.168.10.2 ([192.168.10.2]:22) using "password". ``` 如果在過程中有要打帳號或是密碼的一律輸入**root**。 但在 **MobaXterm** 開 SSH session(192.168.10.2, port 22, user root)時,卻常常出現: * Network error: Software caused connection abort * 或是 Connection timed out 推測原因: * Moba 會先試一堆 key-based auth / GSSAPI,有時候跟 Dropbear 不太合拍。 * PowerShell/OpenSSH 相對單純,用 password auth 比穩定。 **實際結論**: 只要有一個方式(PowerShell)可以穩定 ssh / scp,其實就夠了。 MobaXterm 不一定要硬搞好。 ## 10. 用 scp 把 vit_v3_5.xmodel 丟到 ZCU102 在 Windows PowerShell 或 WSL 皆可(以下以 PowerShell 為例): ``` cd C:\Users\你的帳號\Vitis-AI scp vit_zcu102\vit_v3_5.xmodel root@192.168.10.2:/root/vit_v3_5.xmodel ``` 輸入板子 root 密碼後,檔案就會複製過去。 在板子上確認: ``` ls # Vitis-AI dpu_sw_optimize vit_v3_5.xmodel ``` ## 11. 寫一個簡單的 Runner:發現「No DPU subgraphs」的大坑 我把 vit_v3_5.xmodel 放在板子家目錄 /root,再建一個 demo 資料夾: ``` mkdir vit_demo cd vit_demo cp ../vit_v3_5.xmodel . # 再把 run_vit.py 等腳本放進來 ``` run_vit.py 概念上就是: 1. 用 vart.Runner 打開 vit_v3_5.xmodel。 2. 準備一張圖片,例如 ILSVRC2012_test_00000001.JPEG。 3. 做前處理(resize / normalize)。 4. 把資料餵進 runner,取得輸出。 但實際跑: ``` python3 run_vit.py ILSVRC2012_test_00000001.JPEG ``` 出現錯誤: ``` Found DPU subgraphs: [] RuntimeError: No DPU subgraphs found in xmodel! ``` 意思是: * vit_v3_5.xmodel 裡面 沒有任何 DPU 子圖。 * 也就是:所有 layer 都沒辦法被 DPU 支援,整個網路完全留在 CPU domain ### 11.1 為什麼沒有 DPU subgraph? 關鍵原因是 DPUCZDX8G 不支援 Self-Attention / Transformer 這類 op。 在官方文件裡,它主要支援: * conv / depthwise conv / transposed conv * pooling (max / avg) * ReLU, ReLU6, Leaky ReLU, HardSigmoid, HardSwish * elementwise ops (add, mul 等) * reshape, concat, FC, softmax, batchnorm, etc. ViT 核心的 Multi-Head Self-Atten tion / MatMul + Softmax 的這種 pattern 沒有對應到 DPU 的硬體 op。 所以 compiler 會認為: 這些 op 沒法 offload,全部留在 CPU。 自然就找不到任何可以形成 DPU subgraph 的部分。 **因此:** * xmodel 存在,但只是一個「CPU-only graph」。 * 用 DPU Runner 會報 No DPU subgraphs,無法跑在加速器上。 By the way, ZCU102的DPU是DPUCZDX8G (PG338), 其他板子的DPU可以到以下網址查詢,特性也有寫在手冊中: https://xilinx.github.io/Vitis-AI/3.5/html/docs/reference/release_documentation.html 而我Next step是想用VMK180、VHK158 部屬ViT,但我還找不到這兩塊板子的DPU,看起來除了上述網址有列出來的板子以外,其他的支援性還很差。 目前只有看到這個 [ViT demo](https://github.com/Xilinx/Vitis-AI/tree/2.5/examples/Transformer) for VCK5000 but it was for evaluation purpose only. ## 12. 回顧整條路線 & 給下一個人的建議 ### 12.1 我實際走過的路線 **1. 原本想自建 platform** * 照 ZCU104 edge-AI Tutorial 做 block design + platform + device tree。 * 因為 Vitis 2020.2 vs 2022.1 差異太大,卡在「Create device tree」這一步,最後先放棄。 **2. 改走 Vitis-AI 官方路線:Host 上安裝 WSL + Docker** * Windows 11 裝 WSL2 Ubuntu。 * 裝 Docker Desktop,讓 WSL 也能用 docker。 * clone Vitis-AI repo。 **3. 第一個坑:選錯 Docker image** * xilinx/vitis-ai-cpu:latest → 沒 compiler (vai_c / vai_c_xir). * xilinx/vitis-ai-pytorch-cpu:latest → vai_q_onnx 也沒有。 * 正解:xilinx/vitis-ai-tensorflow-cpu:latest + conda activate vitis-ai-tensorflow。 **4. 嘗試量化 tf_ViT_3.5 失敗** * run_quant.sh 遇到自定義 gradient 的問題。 * 再加上沒有完整 label,loss shape 出錯。 * 最後改用官方的 vit_fpga.onnx。 **5. 使用 vit_fpga.onnx + vai_c_xir 編譯** * vai_c_xir -x vit_fpga.onnx -a ...ZCU102/arch.json -o vit_zcu102 -n vit_v3_5 * 成功產生 vit_v3_5.xmodel。 **6. 第二個坑:ZCU102 上 SSH / Dropbear** * 預設 DROPBEAR_EXTRA_ARGS="-B" 禁止 root 登入。 * 改成 "" 並重啟 /etc/init.d/dropbear start。 * PowerShell ssh root@192.168.10.2 正常,但 MobaXterm 常常 abort。 * 實務上:用 PowerShell 就好。 **7. scp xmodel 到板子** * PowerShell:scp vit_zcu102\vit_v3_5.xmodel root@192.168.10.2:/root/。 **8. 最大的坑:No DPU subgraphs** * 板子上用 run_vit.py + vit_v3_5.xmodel 嘗試跑,結果 Found DPU subgraphs: []。 * 根本原因:DPUCZDX8G 不支援 self-attention,ViT 幾乎完全無法 offload。 ### 12.2 給下一個人的建議 **1. 確認 DPU 支援的 op 再決定模型** * 若想真正用 DPU 加速,優先選 CNN 類(ResNet, YOLO 等),不要先挑 Transformer。 * ViT 可以當研究題目,但硬體支援度有限。 **2. 版本問題要一開始就想清楚** * 如果要自建 platform,最好用 Tutorial 對應的版本(例如 2022.1) * 如果工具版本被鎖死(像我 2020.2),就先考慮用官方預建 platform / image。 **3. 選對 Docker image** * 想用 compiler → xilinx/vitis-ai-tensorflow-cpu:latest * 然後 conda activate vitis-ai-tensorflow。 **4. 要上板就一定要先搞定 SSH** * 確認 dropbear 設定允許 root。 * 能 ssh / scp 才有辦法愉快地傳檔、除錯。 最後,有任何問題都可以私訊筆者的Gmail: will54068.ee12@nycu.edu.tw 祝順利!