# 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 子系統**,確定之後重開系統。


重開系統後,打開終端,在終端中輸入:
```
wsl.exe --update
```
就可以安裝 WSL 相關的組件,這一步可能需要幾分鐘的時間。
### 2.安裝Ubantu
打開 Microsoft Store,搜索 Ubuntu並下載。

下載完成後,可以在開始菜單中找到 Ubuntu,如果終端使用的是 Windows Terminal 那麼在選項卡中也能看到 Ubuntu 的選項。
下載完成後,打開終端,在上面可以選擇Ubuntu。

### 3.創帳號密碼

這一步需要輸入用戶名和密碼,注意:輸密碼的界面是看不到的,不要認為是哪裡出問題了。
在輸入完用戶名稱和密碼之後,就代表安裝成功了:
### 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。


相關語法等等可以再上網查詢,像是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”按鈕下載最新版本的安裝包。

### 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 + 驅動。

### 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 或類似

我一開始想直接在裡面找 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
```


確認 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裡面:

然後使用指令:
```
python downloader.py
```
會跳出要你選哪一種環境,因為我想使用ViT,所以選擇tf。詳細的模型可以到:
https://github.com/Xilinx/Vitis-AI/tree/master/model_zoo
在model zoo的清單下可以查看要用什麼模型。
再選取要的模型,像是ViT在這邊是編號34,那就打34,type選0即可:

然後:
```
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
```

這個 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
```

這一步就是整個 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
```

### 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
祝順利!