본문 바로가기

Capstone

[ Meeting ] 4월 3주차 - Quantized clip 조사, Baseline 성능 측정

 

Clip text encoder가 지금 프로젝트에 꼭 필요한 건지?

Image encoder 경량화 하는 work는 많음

 

text encoder 경량화만 생각하지 말고 quantized clip에 대해 더 찾아보자 !

 


CLIP‑android‑demo

https://github.com/greyovo/CLIP-android-demo

 

GitHub - greyovo/CLIP-android-demo: A demo for running quantized CLIP model (ViT-B/32) on Android.

A demo for running quantized CLIP model (ViT-B/32) on Android. - greyovo/CLIP-android-demo

github.com

 

A demo for running a quantized CLIP (ViT‑B/32) model on Android.

 

  • Usage:
    • Jupyter Notebook으로 INT8 양자화된 clip-image-encoder-quant-int8 & clip-text-encoder-quant-int8 생성
    • Android 앱의 assets/에 넣고 실행
  • 모델 크기:
    • FP32 – ImageEncoder 335 MB → TextEncoder 242 MB
    • INT8 – ImageEncoder 91.2 MB → TextEncoder 61.3 MB  
  • 성능:
    • Snapdragon 8+ Gen1 (Xiaomi 12S) 단일 스레드
      • 400×400px: FP32 54 s → INT8 20 s (≈2.7×)
      • 평균 이미지당 인코딩 35–45 ms

Quantizing CLIP with ONNX (Comet ML)

https://heartbeat.comet.ml/quantizing-clip-with-onnx-pt-1-smaller-faster-feasible-919966d44dbb

 

Quantizing CLIP with ONNX Pt. 1: Smaller, Faster, Feasible?

Exporting and quantizing a pre-trained CLIP model’s visual encoder using ONNX Runtime

heartbeat.comet.ml

 

ONNX Runtime Web 활용해 CLIP ViT‑B/32 시각 인코더를 post‑training 양자화.

 

  • 파일 크기:
    • 원본 대비 약 25% (4× 축소)  
  • 정확도:
    • CIFAR‑100 “linear probe” 검증 정확도
      • FP32 모델: 0.7964 → ONNX FP32: ~0.7967 → ONNX INT8: 0.805 (소폭 향상)
  • 의의:
    • 브라우저/클라이언트 사이드에서 CLIP 가동 가능성을 확인한 proof‑of‑concept

OpenVINO + NNCF 양자화 튜토리얼

https://docs.openvino.ai/2023.3/notebooks/228-clip-zero-shot-quantize-with-output.html

 

Post-Training Quantization of OpenAI CLIP model with NNCF — OpenVINO™ documentation

Post-Training Quantization of OpenAI CLIP model with NNCF This Jupyter notebook can be launched after a local installation only. The goal of this tutorial is to demonstrate how to speed up the model by applying 8-bit post-training quantization from NNCF (N

docs.openvino.ai

 

OpenVINO IR(FP16) → NNCF PTQ(Post‑Training Quantization)로 CLIP Zero‑Shot 모델(INT8) 생성

 

  • 흐름:
    1. OpenVINO IR(FP16) 생성
    2. NNCF nncf.quantize로 양자화
    3. openvino.runtime.serialize로 INT8 모델 저장
    4. 파일 크기·추론 속도 비교  
  • 결과:
    • INT8 모델이 FP16 대비 최대 ~2× 속도 향상 (환경에 따라 다름)
    • 정확도 손실 최소화

Hugging Face 컬렉션: Quantized CLIP and CLAP

https://huggingface.co/collections/MichielBontenbal/quantized-clip-and-clap-660e63decd9f6073486e6096

 

Quantized CLIP and CLAP - a MichielBontenbal Collection

MichielBontenbal 's Collections

huggingface.co

 

MichielBontenbal이 큐레이션한 양자화된 CLIP/CLAP 모델 모음집.

 

  • 다양한 Quant‑aware / Post‑training 양자화 버전 정리
  • 모델 파일·스펙·퍼포먼스 비교 자료 제공  

 


텍스트 인코더 vs. 이미지 인코더 경량화 비교

항목 Text encoder quantization Image encoder quantization
모델 크기 CLIP 텍스트 인코더: ~242 MB → INT8 약 61 MB (¼ 수준)  CLIP 이미지 인코더: ~335 MB → INT8 약 91 MB (¼ 수준)
연산량(FLOPs) 상대적으로 작음. 문장 길이(토큰 수)×모델 차원. (예: 77 토큰×768 차원) 훨씬 큼. ViT‑B/32: 12-layer Transformer over 7×7 패치 → 수백 MFLOPs
실시간 병목 사전 계산 가능: 속성 문장(57개) 텍스트 임베딩은 실험 전에 오프라인으로 모두 생성 → 런타임엔 이미지 인코더 + 유사도 연산만 수행 런타임 필수: 실시간으로 입력 이미지를 임베딩해야 PAR 작동 → 이미지 인코더 최적화가 즉각적인 속도 개선으로 직결
성능 개선 폭 추론 속도 소폭 향상. 텍스트 임베딩 캐싱하면 런타임 이득 거의 없음 최대 2–3× CPU/GPU 추론 속도 향상  , 메모리 4× 절감
정확도 영향 매우 적음. 텍스트 임베딩 차이는 작은 변동. FP32→INT8 전환에도 zero‑shot 정확도 손실 최소화(≪1%) 
적용 난이도 비교적 간단: PyTorch dynamic quant 또는 Hugging Face bitsAndBytes 조금 복잡: ONNX/​OpenVINO/​NNCF/​TFLite 중 선택. 전처리·러닝 옵션 조정 필요

 

 


결론

  • 이미지 인코더 런타임 주요 연산 담당 -> 이미지 인코더 경량화(양자화)가 가장 큰 속도·메모리 이득 준다.
  • 텍스트 인코더는 오프라인 캐싱 가능 -> 우선순위 낮추기.
    1. 이미지 인코더 양자화 먼저
      • 런타임 병목이 이미지 인코더에 집중되어 있음 -> INT8로 변환하면 처리량(throughput)과 지연(latency) 크게 개선된다.
        • ONNX Runtime: onnxruntime.quantization.quantize_dynamic
        • OpenVINO + NNCF: FP16 → INT8 변환 후 nncf.quantize
        • TensorRT 혹은 TFLite: TensorRT INT8 빌드, TFLite Post‑Training Quantization
      • 이미지 인코더만 양자화한 뒤, PAR 파이프라인(이미지 임베딩 → 유사도 계산)에서 속도와 메모리 사용량 어떻게 바뀌는지 측정한다.
    2. 텍스트 인코더 양자화는 그 다음
      • 이미지 인코더 성능 충분히 개선되면 텍스트 인코더도 INT8로 바꿔보기. -> 전체 파이프라인의 메모리 풋프린트 더욱 줄고, 특히 CPU만 쓰는 엣지 디바이스에서 유리하다.
      • 텍스트 인코더는 한 번 캐싱해두고 재사용 가능 -> 실제 런타임 가속 효과는 이미지 인코더만큼 크지 않지만 메모리 절감과 약간의 속도 개선 가능

=> 높은 처리량과 낮은 지연시간을 확보하면서 정확도 손실은 최소화할 수 있다 !

 


  • PAR 파이프라인
    1. 오프라인: 속성 문장(예: “a person wearing a hat” 등 57개)을 텍스트 인코더에 통과 → 텍스트 임베딩(57×D) 캐싱
    2. 런타임: 이미지 인코더로 매 프레임/매 이미지를 임베딩 → 57개 속성 임베딩과 코사인 유사도 계산 → 속성별 확률
  • 이미지 인코더 경량화가 더 효과적인 이유
    • 실시간 처리에서 병목은 항상 이미지 인코더 → 여기가 느리면 PAR 전체 latency가 커짐
    • 텍스트 임베딩은 한 번만 계산 후 재사용 → 런타임 오버헤드 거의 없음
    • 기존 사례들(OpenVINO, ONNX, Android Demo)에서 이미지 인코더 양자화가 2–3× 속도 향상 및 메모리 4× 절감 효과 증명

 


실험 순서

  1. Baseline 측정
    • FP32 이미지 인코더 + FP32 텍스트 인코더로 PAR 전체 latency/ throughput 측정
  2. 이미지 인코더만 양자화
    • 이미지 인코더 → INT8, 텍스트 인코더 FP32
    • PAR 전체 latency/ throughput, 메모리 사용량 비교
  3. 텍스트 인코더만 양자화
    • 이미지 인코더 FP32, 텍스트 인코더→INT8
    • PAR 전체 latency/ throughput, 메모리 사용량 비교
  4. 둘 다 양자화
    • 이미지 + 텍스트 인코더 모두 INT8
    • 최종 PAR 전체 성능 및 메모리 사용량 확인

정확도(mAP, F1)도 함께 체크 -> 속도 vs. 정확도 trade‑off 정량적으로 분석하기 !

 

 


Tiny Star