목적 : Floating point model 있을 때 AMD FPGA에서 실행 방법

사용 모델 :

1. Classification : resnet18

2. Detection : yolov5

3. Segmentation : Mobilenet_v2, UNET

실행 환경 : Ubuntu 20.04, Vitis-AI 3.0

Reference : Quick Start Guide for Zynq™ UltraScale+™ — Vitis™ AI 3.0 documentation (xilinx.github.io)

 

Prerequisit

- 다음과 같은 최소 사양을 만족해야 합니다.  Host System Requirements

- 100GB이상의 디스크 여유공간이 있어야 합니다.

 

Linux setup (WSL 사용)

윈도우 유저라면 윈도우에서 리눅스 kernel에 접속할 수 있게 해주는 WSL을 사용할 수 있습니다. Power shell을 열고 아래와 같은 command를 입력해주세요.

[Powershell] > wsl --install -d Ubuntu-20.04

 

아래와 같은 command를 통해 사용자는 설치 가능한 모든 distro들을 나열할 수 있습니다.

[Powershell] > wsl --list --online

 

특정 배포판을 시작하는 방법은 다음과 같습니다.

#설치된 wsl distro list 확인
[Powershell] > wsl --list
#그중 하나를 골라 실행
[Powershell] > wsl -d Ubuntu-20.04

 

Quickstart

Step 1 - Clone the Vitis AI Repository

아래 명령어를 통해 Vitis-AI 3.0을 설치 해 주세요.

[Host] $ git clone https://github.com/Xilinx/Vitis-AI

 

Step 2 - Install Docker

Reference : Docker desktop

 

1. 먼저 Docker Desktop for Windows 링크를 통해 Docker Desktop for windows를 다운 받아 설치 해 줍니다.

2. Docker Desktop for windows를 실행 후, Setting -> General -> Use the WSL 2 based engine에 check, -> Apply&restart를 눌러줍니다.

3. WSL에서 Ubuntu를 설치했다고 가정하겠습니다. 아래 commend를 이용해 Docker를 설치 해 주세요.

#Conflicting될 수 있는 package들을 제거해주세요.
[Host] for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
# Add Docker's official GPG key:
[Host] sudo apt-get update
[Host] sudo apt-get install ca-certificates curl
[Host] sudo install -m 0755 -d /etc/apt/keyrings
[Host] sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
[Host] sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
[Host] echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
[Host] sudo apt-get update

#Install the Docker packages
[Host] sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

#Docker group을 생성합니다.
[Host] sudo groupadd docker

#User ID를 docker group에 등록합니다.
[Host] sudo usermod -aG docker $USER

#아래 명령어를 입력해서 위 설정이 적용되게 해주세요.
[Host] newgrp docker

 

- Docker가 잘 설치 되었는지 확인하는 명령어는 아래와 같습니다. 이 command는 Docker Hub로부터 test image를 다운받고, container 안에서 실행 될 것입니다. Docker가 잘 설치 되었다면 "Hello World" message를 출력할 것입니다.

[Host] $ docker run hello-world

- 마지막으로 Docker의 version이 최소 사양  Host System Requirements을 충족하는지 확인해 주세요.

[Host] $ docker --version

 

Step 3 - Pull Vitis AI Docker

그 후, Vitis-AI PyTorch CPU Docker를 pull하고 실행하기 위해 아래 명령어를 입력해 주세요. 미리 build되어 있는 Vitis-AI-Pytorch docker를 불러옴으로서, 다양한 library, compiler등 환경을 구성할 필요 없이 mac/linux등에서 바로 작업을 실행할 수 있습니다.

[Host] $ docker pull xilinx/vitis-ai-pytorch-cpu:latest

 

Step 4 - Quantizing the Model

1. Vitis-AI directory로 들어가서 새로운 workspace를 만들어 주세요.

[Host] $ cd ~/Vitis-AI
[Host] $ mkdir -p resnet18/model

 

2. 'resnet18'폴더 아래에 Kaggle에서 ImageNet 1000 (mini) 데이터셋을 다운 받아 주세요. 이 데이터셋은 ILSVRC 2012-2017 데이터셋의 일부로, 1000개의 객체 클래스를 포함하고 있으며, 1,281,167개의 훈련 이미지, 50,000개의 검증 이미지, 그리고 100,000개의 테스트 이미지로 이루어져 있습니다.

그 후, 압축을 풀어주세요.

[Host] $ cd resnet18
[Host] $ unzip archive.zip

 

그러면 workspace directory는 아래와 같이 구성 되어 있을 것입니다.

├── archive.zip
│
├── model
│
└── imagenet-mini
        ├── train                    # Training images folder. Will not be used in this tutorial.
        │   └─── n01440764           # Class folders to group images.
        └── val                      # Validation images that will be used for quantization and evaluation of the floating point model.
            └─── n01440764

 

3. Vitis-AI directory로 가셔서 Docker를 시작해 주세요.

[Host] $ cd ..
[Host] ./docker_run.sh xilinx/vitis-ai-pytorch-cpu:latest

 

- Docker의 /workspace folder와 ~/Vitis-AI 폴더가 일치합니다.

 

workspace에 /resnet18 folder가 생성되었는지 확인 해 주세요.

[Docker] $ ls

 

4. 이미 training되어있는 resnet18 model을 다운로드 받아주세요.

[Docker] $ cd resnet18/model
[Docker] $ wget https://download.pytorch.org/models/resnet18-5c106cde.pth -O resnet18.pth

 

5. ResNet18 quantization script를 workspace의 resnet18폴더에 copy해주세요. 이 script는 Quantizer API를 이용하고 있습니다.

[Docker] $ cp /workspace/src/vai_quantizer/vai_q_pytorch/example/resnet18_quant.py /workspace/resnet18/

 

workspace/resnet18 directory의 device tree는 아래와 같습니다.

├── archive.zip
│
├── model
│   └── resnet18.pth             # ResNet18 floating point model downloaded from PyTorch.
│
├── imagenet-mini
│   ├── train                    # Training images folder. Will not be used in this tutorial.
│   │   └─── n01440764           # Class folders to group images.
│   └── val                      # Validation images that will be used for quantization and evaluation of the floating point model.
│       └─── n01440764
│
└── resnet18_quant.py            # Quantization python script.

 

resnet18_quant.py script를 보면 parser argument에 대한 설명들이 있습니다.

[Docker] $ vim resnet18_quant.py

 

아무것도 저장하지 않고 나가시려면 <esc> :q!를 사용해 주세요.

6. Floating model의 accuracy를 검증하려면 아래 command를 입력해 주세요. Dataset으로 아까 다운받았던 imagenet-mini를 사용하고, resnet18.pth모델이 들어있는 폴더를 지정합니다. 현재 floating model의 accuray를 검증하기 위해 --quant_mode를 float으로 설정합니다.

[Docker] $ python resnet18_quant.py --quant_mode float --data_dir imagenet-mini --model_dir model

 

위 command를 입력 하셨을 때, accuracy는 top-1 / top-5 accuracy : 69.9975/88.7586 이 나옵니다.

7. 다음으로, Model inspector를 실행해서 target DPU architecture와 호환되는지 확인해주세요.

[Docker] $ python resnet18_quant.py --quant_mode float --inspect --target DPUCZDX8G_ISA1_B4096 --model_dir model

아래 파일은 inspect한 후, log를 기록한 파일입니다.

model_inspect_log.txt
0.04MB

 

+ Known error

ModuleNotFoundError: No module named 'tabulate' => pip install tabulate

 

8. Quantization을 시작하기 위해 아래 code를 입력 해주세요. 일반적으로 100-1000개의 이미지들이 quantization을 위해 필요합니다. 반복 횟수는 'subset_len' data loading argument를 통해 조절이 가능합니다.

[Docker] $ python resnet18_quant.py --quant_mode calib --data_dir imagenet-mini --model_dir model --subset_len 200

 

위 명령어를 실행하면 1분 내외로 실행이 마쳐질 것입니다. GPU docker를 이용하면 시간이 더 단축될 수 있습니다.

 

[Docker] $ cd quantize_result
[Docker] $ ls

만약 command가 성공적으로 돌아갔다면, 'quantize_result'라는 output directory가 생성됬을 것입니다. 다음과 같은 2개의 파일을 포함하고 있습니다.

- ResNet.py : quantized된 vai_q_pytorch format model

- Quant_info.json : Quantize model evaluation을 위해 이 파일을 보관해주세요.

 

9. Quantized model의 accuracy를 evaluate하기 위해, 아래와 같은 명령어를 실행해 주세요. 약 20분 정도 걸릴 것입니다. 이 코드가 성공적으로 실행되면, top-1/top-5 accuracy : 69.1308/88.7076과 비슷한 정확도를 확인할 수 있을 것입니다.

[Docker] $ cd ..
[Docker] $ python resnet18_quant.py --model_dir model --data_dir imagenet-mini --quant_mode test

결과

 

10. Quantized된 .xmodel을 생성하기 위해, 아래 command를 실행 해 주세요. model 내보내기의 경우 여러 반복이 필요하지 않으므로 'bat_size', 'subset_len' argument를 1로 설정해야 합니다.

[Docker] $ python resnet18_quant.py --quant_mode test --subset_len 1 --batch_size=1 --model_dir model --data_dir imagenet-mini --deploy

 

아래는 실행 결과 파일입니다.

Generating_xmodel_log.txt
0.01MB

 

Step 5 - Compile the model

Vitis-AI Compiler는 graph operator를 이용해 DPU를 돌리기 위한 instruction으로 compile을 합니다. 이번 step에선 이전에 quantized했던 ResNet18 model을 compile해보겠습니다.

 

1. Compiler는 quantized된 'INT8.xmdoel'을 이용하여 보드에서 돌릴 수 있는 'DPU.xmodel'을 생성합니다.이를 위해 적절한 DPU arch.json파일이 필요합니다. Zynq MPSoC를 위한 arch.json파일은 Docker안에서 /opt/vitis_ai/compiler/arch/DPUCZDX8G에 위치하고 있습니다.

[Docker] $ cd /workspace/resnet18
[Docker] $ vai_c_xir -x quantize_result/ResNet_int.xmodel -a /opt/vitis_ai/compiler/arch/DPUCZDX8G/<Target ex:KV260>/arch.json -o resnet18_pt -n resnet18_pt

 

결과 log입니다.

만약 compile이 제대로 됬다면, resnet18_pt.xmodel이 생성되었을 것입니다.

 

2. texteditor (ex. vim)을 이용해 'resnet18_pt.prototxt'파일을 만들고 아래 내용을 copy&paste 해주세요.

model {
   name : "resnet18_pt"
   kernel {
         name: "resnet18_pt_0"
         mean: 103.53
         mean: 116.28
         mean: 123.675
         scale: 0.017429
         scale: 0.017507
         scale: 0.01712475
   }
   model_type : CLASSIFICATION
   classification_param {
          top_k : 5
          test_accuracy : false
          preprocess_type : VGG_PREPROCESS
   }
}

 

 

Step 6 - Model Deployment

이 과정은 compile된 xmodel을 이용해 Board에서 resnet18을 돌리는 과정입니다.

 

1. scp명령어를 이용해 만들어진 folder를 보드로 옮겨주세요.

[Docker] $ scp -r resnet18_pt root@[TARGET_IP_ADDRESS]:/usr/share/vitis_ai_library/models/

 

2. vitis_ai_library_r3.0.0_images.tar.gz 과 vitis_ai_library_r3.0.0_video.tar.gz 패키지들은 각각 test image와 test video를 포함합니다. 

#Package를 다운받아주세요
[Docker] $ cd /workspace
[Docker] $ wget https://www.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_images.tar.gz -O vitis_ai_library_r3.0.0_images.tar.gz
[Docker] $ wget https://www.xilinx.com/bin/public/openDownload?filename=vitis_ai_library_r3.0.0_video.tar.gz -O vitis_ai_library_r3.0.0_video.tar.gz

#파일을 SCP를 이용해 보드로 전송해주세요
[Docker] $ scp -r vitis_ai_library_r3.0.0_images.tar.gz root@[TARGET_IP_ADDRESS]:~/
[Docker] $ scp -r vitis_ai_library_r3.0.0_video.tar.gz root@[TARGET_IP_ADDRESS]:~/

#보드에서 파일을 압축 해제 해주세요
[Target] $ tar -xzvf vitis_ai_library_r3.0.0_images.tar.gz -C ~/Vitis-AI/examples/vai_library/
[Target] $ tar -xzvf vitis_ai_library_r3.0.0_video.tar.gz -C ~/Vitis-AI/examples/vai_library/

 

3. Sample directory에 들어가서 compile해주세요. 시간이 조금 걸릴 수 있습니다.

[Target] $ cd ~/Vitis-AI/examples/vai_library/samples/classification
[Target] $ ./build.sh

 

4. single-image test application을 실행 해주세요.

[Target] $ ./test_jpeg_classification resnet18_pt ~/Vitis-AI/examples/vai_library/samples/classification/images/002.JPEG

 

결과입니다. brain coral이라는 label로 판단 했고, confidence는 0.999702입니다.

 

5, Video example을 실행시키기 위해 아래 command를 입력해주세요. (ssh 연결 필요)

[Target] $ ./test_video_classification resnet18_pt ~/Vitis-AI/examples/vai_library/apps/seg_and_pose_detect/pose_960_540.avi -t 8

 

아래 사진은 위 커멘드 실행 결과 나온 비디오의 순간을 캡쳐한 것입니다. 


Detection 모델을 test해보고 싶다면 (ex. yolov5)

1. yolov5 폴더에 들어가서 compile을 해줍니다.

[Target] $ cd ~/Vitis-AI/examples/vai_library/samples/yolov5
[Target] $ ./build.sh

 

2.  single-image test application을 실행 해주세요. 실행 가능한 모델은 보드의 '/usr/share/vitis_ai_library/models'에서 확인 가능합니다.

[Target] $ ./test_jpeg_yolov5 yolov5_nano_pt sample_yolov5.jpg

3. Video example을 실행시키기 위해 아래 command를 입력해주세요.

[Target] $ ./test_video_yolov5 yolov5_nano_pt ~/Vitis-AI/examples/vai_library/apps/seg_and_pose_detect/pose_960_540.avi -t 8

 

아래 사진은 위 커멘드 실행 결과 나온 비디오의 순간을 캡쳐한 것입니다. 객체에 검은색 박스가 쳐져 있고, FPS가 15정도 나오는 것을 알 수 있습니다.

 

Segmentation model을 test해보고 싶다면(ex. )

1. segmentation 폴더에 들어가서 compile을 해줍니다.

[Target] $ cd ~/Vitis-AI/examples/vai_library/samples/segmentation
[Target] $ ./build.sh

 

2.  single-image test application을 실행 해주세요. 실행 가능한 모델은 보드의 '/usr/share/vitis_ai_library/models'에서 확인 가능합니다.

[Target] $ ./test_jpeg_segmentation mobilenet_v2_cityscapes_tf sample_segmentation.jpg

 

결과

 

3. Video example을 실행시키기 위해 아래 command를 입력해주세요.

[Target] $ ./test_video_yolov5 yolov5_nano_pt ~/Vitis-AI/examples/vai_library/apps/seg_and_pose_detect/pose_960_540.avi -t 8

 

아래 사진은 위 커멘드 실행 결과 나온 비디오의 순간을 캡쳐한 것입니다.

/test_video_yolov5 yolov5_nano_pt ~/Vitis-AI/examples/vai_library/apps/segs_and_roadline_detect/seg_512_288.avi -t 8

 

 ./test_video_segmentation SemanticFPN_Mobilenetv2_pt ~/Vitis-AI/examples/vai_library/apps/segs_and_roadline_detect/seg_512_288.avi -t 8

[추가 예정]


감사합니다.

 

 

+ 아래 사진은 위 커멘드 실행 결과 나온 비디오의 순간을 캡쳐한 것입니다.

Yolov3(obj.)

[Target] $ cd ~/Vitis-AI/examples/vai_library/samples/yolov3
[Target] $ ./build.sh
[Target] $ ./test_video_yolov3 yolov3_voc ~/Vitis-AI/examples/vai_library/apps/segs_and_roadline_detect/seg_512_288.avi -t 8

 

 ./test_accuracy_yolov3_voc yolov3_voc ./images/001.png
yolov3_accuracy_result.txt -t 2

(-t는 thread입니다)

 

accuracy test방법

#image file list가 들어있는 .txt파일을 만들어줍니다.
[Target] $ vim test_performance_yolov3.list
[In the vim environment] wq image_list.txt
[Target] $ vim
#accuracy 결과가 저장 될 txt파일을 만들어줍니다.
[Target] $ yolov3_voc_accuracy.txt 
#accuracy check을 위해 아래 코드를 실행합니다.
./test_accuracy_yolov3_mt yolov3_bdd image_list.txt yolov3_voc_accuracy.txt -t 2

아래는 결과 파일입니다.

yolov3_voc_accuracy.txt
0.06MB

 

Unet(seg.)

[Target] $ cd ~/Vitis-AI/examples/vai_library/samples/segmentation
[Target] $ ./build.sh
[Target] $ ./test_jpeg_segmentation unet_chaos-CT_pt sample_segmentation_chaos.jpg

현재 Vitis-AI-library에선 Unet은 Medical Segmentation용으로 supporting하고 있습니다.

 

그 외, fpn model을 사용한 결과입니다.

[Target] $ ./test_video_segmentation SemanticFPN_Mobilenetv2_pt ~/Vitis-AI/examples/vai_library/apps/segs_and_roadline_detect/seg_512_288.avi -t 8

 

VGGNet(class.)

[Target] $ cd ~/Vitis-AI/examples/vai_library/samples/classification
[Target] $ ./build.sh
[Target] $ ./test_video_classification vgg_16_tf ~/Vitis-AI/examples/vai_library/apps/segs_and_roadline_detect/seg_512_288.avi -t 8

 

 

 

 

+ Recent posts