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
- Snapdragon 8+ Gen1 (Xiaomi 12S) 단일 스레드
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 (소폭 향상)
- CIFAR‑100 “linear probe” 검증 정확도
- 의의:
- 브라우저/클라이언트 사이드에서 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) 생성
- 흐름:
- OpenVINO IR(FP16) 생성
- NNCF nncf.quantize로 양자화
- openvino.runtime.serialize로 INT8 모델 저장
- 파일 크기·추론 속도 비교
- 결과:
- 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 중 선택. 전처리·러닝 옵션 조정 필요 |
결론
- 이미지 인코더는 런타임 주요 연산 담당 -> 이미지 인코더 경량화(양자화)가 가장 큰 속도·메모리 이득 준다.
- 텍스트 인코더는 오프라인 캐싱 가능 -> 우선순위 낮추기.
-
- 이미지 인코더 양자화 먼저
- 런타임 병목이 이미지 인코더에 집중되어 있음 -> INT8로 변환하면 처리량(throughput)과 지연(latency) 크게 개선된다.
- ONNX Runtime: onnxruntime.quantization.quantize_dynamic
- OpenVINO + NNCF: FP16 → INT8 변환 후 nncf.quantize
- TensorRT 혹은 TFLite: TensorRT INT8 빌드, TFLite Post‑Training Quantization
- 이미지 인코더만 양자화한 뒤, PAR 파이프라인(이미지 임베딩 → 유사도 계산)에서 속도와 메모리 사용량 어떻게 바뀌는지 측정한다.
- 런타임 병목이 이미지 인코더에 집중되어 있음 -> INT8로 변환하면 처리량(throughput)과 지연(latency) 크게 개선된다.
- 텍스트 인코더 양자화는 그 다음
- 이미지 인코더 성능 충분히 개선되면 텍스트 인코더도 INT8로 바꿔보기. -> 전체 파이프라인의 메모리 풋프린트 더욱 줄고, 특히 CPU만 쓰는 엣지 디바이스에서 유리하다.
- 텍스트 인코더는 한 번 캐싱해두고 재사용 가능 -> 실제 런타임 가속 효과는 이미지 인코더만큼 크지 않지만 메모리 절감과 약간의 속도 개선 가능
- 이미지 인코더 양자화 먼저
=> 높은 처리량과 낮은 지연시간을 확보하면서 정확도 손실은 최소화할 수 있다 !
- PAR 파이프라인
- 오프라인: 속성 문장(예: “a person wearing a hat” 등 57개)을 텍스트 인코더에 통과 → 텍스트 임베딩(57×D) 캐싱
- 런타임: 이미지 인코더로 매 프레임/매 이미지를 임베딩 → 57개 속성 임베딩과 코사인 유사도 계산 → 속성별 확률
- 이미지 인코더 경량화가 더 효과적인 이유
- 실시간 처리에서 병목은 항상 이미지 인코더 → 여기가 느리면 PAR 전체 latency가 커짐
- 텍스트 임베딩은 한 번만 계산 후 재사용 → 런타임 오버헤드 거의 없음
- 기존 사례들(OpenVINO, ONNX, Android Demo)에서 이미지 인코더 양자화가 2–3× 속도 향상 및 메모리 4× 절감 효과 증명
실험 순서
- Baseline 측정
- FP32 이미지 인코더 + FP32 텍스트 인코더로 PAR 전체 latency/ throughput 측정
- 이미지 인코더만 양자화
- 이미지 인코더 → INT8, 텍스트 인코더 FP32
- PAR 전체 latency/ throughput, 메모리 사용량 비교
- 텍스트 인코더만 양자화
- 이미지 인코더 FP32, 텍스트 인코더→INT8
- PAR 전체 latency/ throughput, 메모리 사용량 비교
- 둘 다 양자화
- 이미지 + 텍스트 인코더 모두 INT8
- 최종 PAR 전체 성능 및 메모리 사용량 확인
정확도(mAP, F1)도 함께 체크 -> 속도 vs. 정확도 trade‑off 정량적으로 분석하기 !
'Capstone' 카테고리의 다른 글
| 이쯤에서 다시 보는 목표 (0) | 2025.05.09 |
|---|---|
| [ Meeting ] 5월 1주차 - Baseline 측정(PyTorch FP32) (0) | 2025.05.05 |
| [ Meeting ] 4월 2주차 - 데이터셋 구성, 모델별 Inference Time 측정 (0) | 2025.04.11 |
| [ Meeting ] 4월 1주차 - 경량 CLIP 모델 선정 및 실험 환경 최적화 (0) | 2025.04.07 |
| [ Meeting ] 3월 3, 4주차 - Roadmap, 논문리뷰 (0) | 2025.04.07 |