소속: 4by4 Inc. · Pixell Lab 역할: ML Engineer 기간: 2023.08 – 2023.10 산업 도메인: 미디어 AI (Image Editing)
Situation
4by4의 키컷스톡 부서에서 AI Image Editor 서비스를 출범하고자 했다. 키컷스톡이 판매하고 있는 이미지에서 특정 오브젝트를 선택하여 지울 수 있는 기능이 핵심 요구사항이었다. 그러나 키컷스톡 부서는 자체적으로 ML 인프라를 구성하거나 유지할 수 없는 상황이었고, 학습에 사용할 데이터셋도 존재하지 않았다. 투입할 수 있는 자원이 많지 않았기 때문에, 별도 튜닝 없이도 대부분의 경우에 무난하게 오브젝트를 지워줄 수 있는 성능이 필요했다.
때마침 Meta에서 세계 최초의 Computer Vision 파운데이션 모델 SAM(Segment Anything)을 출시한 직후여서, Object Segmentation에 대한 부담이 크게 줄었다. Inpainting(Object Remove)에는 주파수 도메인에서 마스킹 영역을 처리하는 LaMa를 선정했다. LaMa는 주변 배경 기반으로 마스킹 영역을 채워주기 때문에, 다양한 케이스에서 오브젝트를 지우고 배경으로 채워야 하는 요구사항에 적합했다.
Task
- 팀 구성:
- ML Engineer(본인) ×1: 모델 분석, ONNX 변환, 추론 API 서버 개발
- Frontend Engineer ×1: 에디터 UI 개발
- 담당 영역:
- SAM 모델 구조 분석 및 ONNX 변환
- LaMa 모델 ONNX 변환 시도 및 실패 원인 분석
- FastAPI 기반 추론 API 서버 개발
- Docker 이미지 배포
- 목표: 키컷스톡 이미지에서 오브젝트 선택(SAM) → 제거(LaMa) 파이프라인 구축
Action
기술 스택 & 시스템 구성
| 분류 | 기술 |
|---|---|
| Language | Python |
| Model | SAM (Meta), LaMa |
| Inference | ONNX Runtime (SAM), PyTorch (LaMa) |
| API | FastAPI |
| Deployment | Docker |
핵심 구현 사례
1. SAM 모델 구조 분석 및 ONNX 변환
구현: SAM은 이미지 임베딩 파트(ViT 기반)와 프롬프트 파트로 구성되어 있다. 임베딩 파트는 ViT 구조여서 ONNX 변환이 어렵지 않았다. 그러나 ViT 임베딩 결과를 입력으로 받는 프롬프트 파트는 좌표 위치, 좌표의 의미(foreground/background), bounding box 좌표 등을 추가 입력으로 받는 생소한 모델 형식이었다. 정확히 어떤 값을 어떤 형태로 전달해야 하는지 정리된 문서가 없었기 때문에, 직접 값을 넣어보며 시행착오를 통해 입출력 스펙을 파악하고 ONNX 변환을 완료했다.
2. LaMa ONNX 변환 실패 원인 분석
문제: LaMa 모델의 ONNX 변환을 시도했으나 실패했다.
분석: ONNX 변환 실패 시 경험적으로 지원하지 않는 레이어가 원인인 경우가 많다는 것을 알고 있었다. LaMa가 FFT(Fast Fourier Transform) 도메인에서 처리한다는 것을 알고 있었기 때문에, FFT 변환 또는 역변환 시 사용하는 연산과 관련이 있을 것으로 추정했다. LaMa의 PyTorch Class를 분석하고 의심되는 모듈들에 대해 ONNX 문서에서 연산자 지원 여부를 확인한 결과, FFT 관련 연산자가 ONNX에서 지원되지 않는다는 것을 확인했다. 이에 따라 LaMa는 PyTorch 기반으로 서빙하는 방식을 채택했다.
3. FastAPI 기반 추론 API 서버 및 Docker 배포
SAM(ONNX Runtime)과 LaMa(PyTorch)를 통합하는 FastAPI 기반 추론 API 서버를 개발하고, Docker 이미지로 배포했다. 사용자가 이미지에서 좌표를 클릭하면 SAM이 해당 오브젝트를 세그멘테이션하고, LaMa가 해당 영역을 주변 배경으로 채워 오브젝트를 제거하는 파이프라인을 구현했다.
Result
기술 성과
- SAM 구조 분석 및 ONNX 변환 직접 구현 (임베딩 + 프롬프트 파트)
- LaMa ONNX 변환 실패 원인 분석 (FFT 연산자 미지원 확인)
- SAM(ONNX) + LaMa(PyTorch) 통합 추론 파이프라인 구축
- FastAPI 기반 추론 API 서버 및 Docker 이미지 배포
비즈니스 임팩트
- 서비스 미출시: 협업하던 프론트엔드 엔지니어의 퇴사로 프로젝트가 중단됨
회고
잘한 점
단기간에 필요한 결과물(모델 분석, ONNX 변환, 추론 API 서버, Docker 배포)을 모두 만들어냈다. SAM이 출시된 지 얼마 되지 않은 시점에서 공식 문서가 불충분한 상태였음에도, 직접 모델 코드를 분석하고 시행착오를 통해 ONNX 변환을 성공시켰다. LaMa의 ONNX 변환 실패 시에도 근본 원인(FFT 연산자 미지원)을 체계적으로 분석하여 빠르게 PyTorch 서빙으로 전환 결정을 내릴 수 있었다.
아쉬운 점 / 다시 한다면
기술적으로는 목표를 달성했으나, 프론트엔드 엔지니어의 퇴사로 프로젝트가 중단되어 서비스 출시로 이어지지 못한 것이 아쉽다. 단기간에 필요한 결과물을 모두 만들어낸 경우여서 개인적으로 아쉬움이 큰 프로젝트이다.
배운 점
새로운 모델(SAM)이 출시된 직후 문서화가 불충분한 상황에서, 모델 코드를 직접 읽고 분석하여 프로덕션에 적용하는 경험을 했다. 또한 ONNX 변환 실패 시 원인을 체계적으로 추적하는 방법론(모델 아키텍처 분석 → 의심 모듈 특정 → ONNX 연산자 지원 여부 확인)을 확립할 수 있었다. 이 경험은 이후 PMS에서 다양한 모델의 TensorRT 변환 작업을 수행할 때 기반이 되었다.