---
# System prepended metadata

title: ZCU102 上部署 ViT 模型全流程

---

# 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

祝順利!