CIFAR10은 10개의 클래스를 가지는 작은 RGB 이미지 (32x32x3)들로 구성된 데이터셋입니다. 이번 예제에서는 CIFAR10 데이터를 이용하여 ResNet18 CNN 모델을 다시 학습시키는 실습을 진행합니다. 이 과정들은 /workspace/tutorials/RESNET18/files/run_all.sh
파일의 스크립트를 이용하여 진행됩니다.
# ===========================================================================
# STEP2: Prepare CIFAR10 Dataset
# ===========================================================================
cifar10_dataset(){
#rm -rf build/dataset
echo " "
echo "----------------------------------------------------------------------------------"
echo "[DB INFO STEP2] CREATING CIFAR10 DATASET OF IMAGES"
echo "----------------------------------------------------------------------------------"
echo " "
# organize CIFAR10 data
python code/cifar10_generate_images.py | tee build/log/cifar10_generate_images.log
}
run_all.sh
파일의 서브루틴 cifar10_dataset()
은 build/dataset/cifar10
디렉토리에 있는 train, valid, test 및 calib 하위 폴더를 만들고 이미지를 넣습니다. 학습셋 이미지, 검증셋 이미지, 테스트셋 이미지, 교정 이미지는 각각 50000개, 5000개, 5000개, 기존 이미지에서 복사된 1000개의 이미지로 구성됩니다.
CIFAR10 데이터셋은 일반적으로 다음과 같이 정규화 과정을 실행해야 합니다.
# scale data to the range of [0, 1]
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# normalize between -1 and +1
x_train = x_train -0.5
x_train = x_train *2
x_test = x_test -0.5
x_test = x_test *2
위의 과정들은 다음과 같이 터미널에 입력하여 실행할 수 있습니다.
source run_all.sh cifar10_dataset
# ===========================================================================
# STEP3: Train ResNet18 CNNs on CIFAR10
# ===========================================================================
run_cifar10_training(){
# floating point model training
echo " "
echo "----------------------------------------------------------------------------------"
echo "[DB INFO STEP3A] CIFAR10 TRAINING (way 1)"
echo "----------------------------------------------------------------------------------"
echo " "
python ./code/train1_resnet18_cifar10.py --epochs 50 | tee ./build/log/train1_resnet18_cifar10.log
mv ./build/float/train1_best_chkpt.h5 ./build/float/train1_resnet18_cifar10_best.h5
mv ./build/float/train1_final.h5 ./build/float/train1_resnet18_cifar10_final.h5
echo " "
echo "----------------------------------------------------------------------------------"
echo "[DB INFO STEP3B] CIFAR10 TRAINING (way 2)"
echo "----------------------------------------------------------------------------------"
echo " "
python ./code/train2_resnet18_cifar10.py --epochs 50 | tee ./build/log/train2_resnet18_cifar10.log
}
학습을 진행할 때는 train1_resnet18_cifar10.py
또는 train2_resnet18_cifar10.py
파일을 실행합니다. 첫번째 파일은 하드디스크에 저장된 이미지 파일에 대해 작동하고, 두번째 파일은 메인 메모리에 로드된 데이터에 대해 작동하는 차이가 있습니다.
학습 과정은 다음과 같이 터미널에 코드를 입력하여 실행할 수 있습니다.
source run_all.sh run_cifar10_training
확인해보면 10개의 클래스에 대해 다음과 같이 정확도를 보입니다.
학습이 완료된 .h5
모델은 /workspace/tutorials/RESNET18/files/build/float/
에 저장됩니다.
학습이 완료되었으면 FPGA 보드에서 실행하기 위한 Vitis AI Flow를 진행합니다.
Vitis AI Inspector는 FP32 모델이 FPGA 보드에 적용할 수 있는지 확인해줍니다. 주어진 모델이 FPGA 보드의 DPU 구조에 모두 지원되면 다음과 같은 내용을 표시합니다.
[SUMMARY INFO]:
- [Target Name]: DPUCZDX8G_ISA1_B4096
- [Total Layers]: 88
- [Layer Types]: InputLayer(1) BatchNormalization(19) ZeroPadding2D(18) Conv2D<linear>(21) Activation<relu>(18) MaxPooling2D(1) Add(8) GlobalAveragePooling2D(1) Dense<softmax>(1)
- [Partition Results]: INPUT(1) DPU(86) DPU+CPU(1)
Vitis AI Quantizer는 FP32 형식의 모델을 INT8 형식의 모델로 변환하는 작업을 합니다. 작업을 마친 INT8 모델은 /workspace/tutorials/RESNET18/files/build/quantized/
에 저장됩니다.
위의 작업들은 다음과 같이 터미널에 입력하여 실행할 수 있습니다.
source run_all.sh quantize_resnet18_cifar10
Quantization 과정이 무사히 끝나면 컴파일을 진행할 수 있습니다. 컴파일 과정에서는 INT8 모델을 이용하여 DPU 코드인 .xmodel
파일을 생성합니다. 파일을 문제없이 저장하면 다음과 같이 메세지가 출력됩니다.
[UNILOG][INFO] Target architecture: DPUCZDX8G_ISA1_B4096
[UNILOG][INFO] Graph name: model_1, with op num: 229
�[m[UNILOG][INFO] Total device subgraph number 3, DPU subgraph number 1
[UNILOG][INFO] Compile done.
[UNILOG][INFO] The compiled xmodel is saved to "/workspace/tutorials/RESNET18/files/./build/compiled_zcu102/zcu102_q_train1_resnet18_cifar10_final.h5.xmodel"
컴파일은 다음과 같이 코드를 작성하여 실행할 수 있습니다.
source run_all.sh compile_resnet18_cifar10
analyze_graphs()
를 실행하면 만들어진 구조를 그래프 이미지로 확인할 수 있습니다. 그런데 메세지를 보면 xmodel 파일이 /workspace/tutorials/RESNET18/files/./build/compiled_zcu102/zcu102_q_train1_resnet18_cifar10_final.h5.xmodel
경로에 저장되었다고 출력되지만 저기에서는 다음과 같이 해당 파일을 찾을 수가 없었습니다.
run_all.sh
파일을 살펴보니 다음과 같이 코드가 작성되어 있어 찾을 수 없었습니다.
그래서 다음과 같이 mv
명령어 대신 cp
로 변경하여 이후에 analyze_graphs()
를 실행할 수 있게 되었습니다.
다시 컴파일을 실행하면 표시되는 위치에 xmodel 파일이 생성된 것을 확인할 수 있습니다.
그래프 이미지는 /workspace/tutorials/RESNET18/files/build/log/
에 저장됩니다.