본문 바로가기

프로그래밍/스프링

스프링에서의 ML 서빙

이 글은 스프링캠프2025에서 사이오닉AI의 김수원님의 발표를 바탕으로 정리하여 작성한 글 입니다. 해당 과정에서 제 실수로 잘못된 정보를 기재 하였을 수도 있는 점 양해 부탁 드립니다.

배경: ML 서빙의 어려움

파이썬 ML 서빙의 문제점

  • 성능 이슈: GIL(Global Interpreter Lock)로 인한 멀티스레딩 제약
  • 대규모 서비스 난이도: 메모리 관리 및 확장성 문제
  • 운영 복잡성: 패키지 의존성 관리 및 배포 복잡도

클라우드 엔진 서빙의 어려움

  • 네이티브 언어 사용 필요: C++, Rust 등 저수준 언어 요구
  • 복잡한 파라미터 설정: GPU 메모리, 배치 크기 등 세밀한 튜닝 필요
  • 구축 및 운영 비용: 인프라 설정 및 유지보수 부담

JVM 기반 ML 서빙 솔루션

저수준 라이브러리

  • ONNX Runtime: 크로스 플랫폼 추론 엔진
  • TensorFlow Java: 구글의 TensorFlow JVM 바인딩
  • 특징: 세밀한 튜닝을 통한 고성능 달성 가능

DJL (Deep Java Library)

  • 고수준 추상화: ML 전문 지식 없이도 서빙 가능
  • Java 개발자 친화적: 기존 스프링 생태계와 자연스러운 통합
  • Hugging Face 생태계 연동: 사전 훈련된 모델 쉽게 활용
  • Netflix 등 대기업 도입: 검증된 안정성

실제 활용 사례: 커머스 리뷰 감정 분석

구현 과정

  1. 모델 선정: Hugging Face에서 감정 분석 모델 선택
  2. 추론 요청: 리뷰 텍스트 → 모델 → 긍정/부정 결과
  3. 단순한 워크플로우: 모델 로드 → 추론 실행, 단 두 스텝으로 완성

DJL의 한계점

  • 저수준 제어 불가: 하드웨어 최적화 튜닝 제약
  • 리소스 활용도 제한: 수십 코어와 수백 GB 메모리의 완전 활용 어려움
  • 비용 효율성: 하드웨어 투자 대비 성능 최적화 한계

TensorFlow를 통한 고성능 최적화

세밀한 제어 기능

  • GPU 메모리 관리: 동적 메모리 할당 및 제한 설정
  • 병렬 처리 최적화: 스레드 풀 및 연산 병렬화 제어
  • 동적 배치 처리: 실시간 배치 크기 조정으로 처리량 극대화

메모리 및 연산 최적화

  • 제로카피 최적화: 메모리 복사 오버헤드 최소화
  • 코사인 유사도 임계값: 검색 정확도와 성능 균형 조정
  • 상위 K개 결과 필터링: 불필요한 연산 제거
  • 성능 결과: 1천만 개 문서를 1초 미만으로 검색 가능

RAG (Retrieval-Augmented Generation) 아키텍처

워크플로우

사용자 질의 → 관련 문서 벡터 검색 → 검색된 문서 + 질의를 LLM에 전달 → 최종 답변 생성

성능 포인트

  • 벡터 검색 속도: 임베딩 모델과 벡터 DB 최적화가 핵심
  • 컨텍스트 윈도우: LLM 토큰 제한 내에서 관련성 높은 문서 선별

JVM ML 서빙의 현실적 제약사항

생태계 지원 속도

  • 최신 모델 지원 지연: Python 생태계 대비 느린 업데이트
  • 커뮤니티 규모: 상대적으로 작은 개발자 커뮤니티
  • 튜닝 전문성 요구: 고성능 달성을 위한 깊은 이해 필요

Spring AI의 역할

  • 직접 모델 서빙 X: 모델 추론 엔진이 아닌 API 통합 라이브러리
  • 외부 LLM 서비스 연동: ChatGPT, Claude, Gemini 등과의 통합 제공
  • 추상화 레이어: 다양한 AI 서비스를 통일된 인터페이스로 활용

성능 최적화 전략

스케일업 vs 스케일아웃

  • 단순 서빙: 스케일업(더 강력한 하드웨어) 전략이 효율적
  • 복잡한 워크로드: 분산 처리를 통한 스케일아웃 고려

하드웨어 선택의 중요성

  • 작업 유형별 최적화: NLP vs Computer Vision vs 추천 시스템
  • 모델 크기별 전략: 경량 모델 vs 대형 언어 모델
  • 비용 대비 성능: GPU 타입, 메모리 용량, CPU 코어 수 균형

추가 고려사항

모델 최적화 기법

  • 양자화(Quantization): 모델 크기 및 추론 속도 개선
  • 지식 증류(Knowledge Distillation): 큰 모델의 성능을 작은 모델로 전이
  • 모델 압축: 프루닝을 통한 불필요한 가중치 제거

실시간 서빙 고려사항

  • 레이턴시 vs 처리량: 실시간 응답이 필요한지 배치 처리가 가능한지
  • 모델 버전 관리: A/B 테스트 및 점진적 배포 전략
  • 모니터링 및 로깅: 모델 성능 지표 추적 및 이상 탐지