Hailo Model Zoo : hailomz API를 이용한 커스텀 YOLOv8 모델을 Hailo에서 동작가능한 바이너리파일(.hef)로 컴파일 및 테스트

실행환경

Build PC

  • CPU: Intel(R) Xeon(R) w5-3423 @ 12cores
  • RAM: 256GB
  • OS: Ubuntu-22.04 LTS
  • GPU: NVIDIA RTX A6000 x 2ea
  • Target Hailo System: Hailo8

Hailo Version

  • Hailo DFC: 3.27.0
  • Hailo Model Zoo: 2.11.0

사전설치

Dataflow Compiler (DFC)

Hailo Model Zoo


준비물

1. ONNX

  • 커스텀 데이터셋으로 학습한 YOLOv8 모델(.pt)을 ONNX로 변환한 파일
  • ultralytics 환경에서 model.export(format="onnx") 로 변환 가능
  • 커스텀 데이터셋 학습 방법: (YOLO) YOLOv8 학습

2. 스크립트 파일

  • 파싱, 최적화(양자화), 컴파일 과정을 위한 각각의 스크립트 파일
  • Hailo Model Zoo에서 제공한 YOLOv8 스크립트를 기반으로 커스텀 모델에 맞게 수정

3. 데이터셋

  • 학습에 사용한 데이터셋의 일부를 tfrecord로 변환한 파일
  • 양자화의 캘리브레이션 과정과 사후학습(파인튜닝)을 위해 1024개 이상을 추천

스크립트 준비

  • 아래 스크립트 파일은 Hailo Model Zoo에 기본 제공되는 스크립트를 기반하여 optimization level, compression level 등 임의의 최적화 방법을 설정한 것으로 최적의 성능을 보장할 수는 없음
  • custom_yolov8n.yaml : 컴파일 전 과정에서 필요한 config 파일
  • custom_yolov8n.alls : 최적화(양자화) 및 컴파일을 위한 함수가 명시되어있는 파일
  • custom_yolov8n_nms_config_640.json : postprocessing 과정인 NMS 알고리즘에 대한 파라미터

최적화 및 컴파일

1. 파싱 (Parsing)

  • 헤일로에서 이해하는 구문파일(.har)로 변환하는 과정
  • CKPTONNX 포맷을 지원하며 hailomz parse 명령어를 통해 실행함

parse

$ hailomz parse --ckpt custom_yolov8n.onnx --yaml custom_yolov8n.yaml

2. 최적화 (Optimization)

  • 파싱 과정을 통해 변환된 .har 파일을 파라미터 양자화하며 에러를 줄이는 과정
  • 양자화 성능 보장을 위해 기존 모델의 훈련 시 사용한 일부 데이터셋이 필요
  • config 파일에 명시되어있는 .alls 파일의 함수들이 적용됨
  • 양자화 캘리브레이션 및 파인튜닝을 위해 .alls 파일에 명시되어있는 데이터셋인 .tfrecord 파일이 적용됨
    • 커스텀 데이터셋 tfrecord 파일은 Hailo Model Zoo의 create dataset.py를 수정하여 생성 가능
  • postprocessing(nms)를 위해 .alls 파일에 명시되어있는 .json 파일이 적용됨

optimize

$ hailomz optimize --har custom_yolov8n.har --yaml custom_yolov8n.yaml

+) YOLOv8 양자화 고려해야할 것

normalization1 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])
 
change_output_activation(conv42, sigmoid)
change_output_activation(conv53, sigmoid)
change_output_activation(conv63, sigmoid)
quantization_param([conv42, conv53, conv63], force_range_out=[0.0, 1.0])
 
nms_postprocess("../../postprocess_config/yolov8n_nms_config.json", meta_arch=yolov8, engine=cpu)
입력 데이터 정규화
  • normalization1 = normalization([0.0, 0.0, 0.0], [255.0, 255.0, 255.0])
  • 데이터의 일관성을 위한 정규화
  • 헤일로 디바이스에서 처리되므로 .hef 인퍼런스 코드에서 반복 처리하지 않도록 주의
시그모이드 추가
  • change_output_activation(conv*, sigmoid)
  • 클래스 카테고리 점수에 대한 연산 및 nms 단계와 연결을 위한 sigmoid 활성화함수 변경
  • quantization_param([conv42, conv53, conv63], force_range_out=[0.0, 1.0])
  • [0-1] 범위로 잘 수렴하지 않는 문제가 있으면 강제로 출력 범위를 정해줌
Posetprocessing (nms)
  • nms_postprocess("../../postprocess_config/yolov8n_nms_config.json", meta_arch=yolov8, engine=cpu)
  • nms postprocess 과정으로 자신의 모델에 맞게 .json 파일을 수정하여 사용함

3. 컴파일 (Compile)

  • Optimize 완료된 .har 파일을 헤일로에서 실행가능한 바이너리파일인 .hef 파일로 컴파일하는 과정
  • ONNX 파일을 입력으로, 파싱, 최적화, 컴파일 과정을 한꺼번에 실행도 가능

Compile

hailomz compile --har custom_yolov8n.har --yaml custom_yolov8n.yaml

+) 컴파일 고려해야할 것

  • .alls 파일에 컴파일 관련 기능을 추가하여 컴파일 세팅을 할 수 음
  • performance_param(compiler_optimization_level=max) : 헤일로 디바이스에서 최적의 FPS 성능을 보장하지만 컴파일 시간이 길어짐

결과 및 실행

  • 컴파일이 완료되면 .hef 파일과 함께 컴파일까지의 과정을 담은 모델 .har이 생성됨

결과 확인

profiler

  • 컴파일된 .har 파일을 이용해 최종 네트워크 구조를 시각화함
hailo profiler custom_yolov8n_compiled.har

+full

실행

Hailo Sample Code