프로젝트/캡스톤

[Deploy] AI 서빙을 어떻게 해야할까?

meteorfish 2025. 5. 29. 01:10
728x90

현재 상황

 

AI 기반의 필적 감정 서비스를 개발하게 되었다. 검사하려는 검증물과 비교 대상인 대조물 사이의 유사도 및 필적 특징을 추출하여 제공하는 서비스이다. 내가 담당하게 된 파트는 AI 서빙이었다. 평소 AI 기반 서비스가 어떻게 이루어지는지 많이 궁금하였고 이 참에 공부해보는 것도 좋겠다고 생각했다.

 

기술적 고민

현재 제공하는 AI 서빙 방법은 총 3가지이다. 

1. 웹 서버 프레임워크로 직접 서빙하기

2. TensorFlow Serving 이용하기

3. NVIDIA Triton

 

카카오 테크 블로그에서 비교된 아티클을 발견하여 참고하였다.

https://tech.kakaopay.com/post/model-serving-framework/

 

"FastAPI와 TensorFlowServing, Trioton과의 가장 큰 차이점은  Dynamic Batch Inference 지원 여부입니다. 해당 기능은 모델 서빙 속도에 가장 큰 영향을 미치는 기능 중 하나이지만, FastAPI의 경우 기본적으로 지원되지 않는 부분입니다."

 

Dynamic Batch Inference는 여러 요청을 실시간으로 모아서 배치 처리해 성능을 높이는 기술이다. 해당 기술이 적용되니 않아 대규모 요청에 대해 성능이 떨어질 수 있다.  

 

스트레스 테스트에서도 모두 준수한 성능을 나타내기 때문에 어떤 것을 선택하든지 성능적 큰 차이가 없다고 판단했다.

 

나는 결론적으로 FastAPI를 선택하기로 결정했다.

1. S3 버킷의 다운로드 API가 필요하다.

2. 코드가 간결하여 러닝커브가 낮다.

3. 손쉬운 Swagger이 가능하다.

 

결정

 

Spring Boot와 FastAPI와의 REST로 통신할 수 있도록 구현했다. 

 

고민한 점

AI 서빙 속도 최적화

처음 AI 모델 연산이 11초가 걸려 어떻게든 속도 최적화가 필요한 상태였다. 그러나 AI 모델의 연산 자체가 11초가 걸리기 때문에 서버 상에서 이를 줄일 수 있는 방법이 있을까 고민했다. 다행히 이미지를 한줄씩 대조하는 로직을 하나의 이미지 통채로 대조하는 로직으로 변경 후 3초로 줄일 수 있었지만, 추가적인 해결책이 있지 않을까 생각했다. 캐싱을 통해 중복된 요청에 대한 연산결과를 저장할까 고민했지만, 서비스 특성상 중복 요청이 존재하기 어렵다고 판단하여 일단 보류하기로 했다.

 

AI 모델과 서버의 분리

함께 협업하는 AI 개발자가 웹 서버에 대한 지식이 없어 내가 소스코드를 바탕으로 서빙하기로 결정했다. 만약 AI 소스코드가 변경될 경우, AI 개발자 분이 직접 서버에 반영할 수 있도록 AI 모델과 서버를 분리하려고 했다. Tensorflow Serving을 통해 웹 서버와 분리하여 서빙이 가능하지만, S3 이용이 어렵다는 문제점이 있다. 어쩔 수 없이 FastAPI를 통해 AI 모델과 통합 운영하는 방안으로 결정했다.

다만 AI 개발자가 쉽게 소스코드를 변경할 수 있도록 AI 패키지와 App 패키지를 구분하여 구현했다.

 

도커를 사용하지 않은 이유

도커를 통해 AI 모델을 서빙할 경우 매우 간편하다. 그러나 이번에는 이용하지 않기로 했다. EC2 프리티어를 사용하기 위해 t2.micro 인스턴스에 서버를 운영 중이다. 따라서 한정된 메모리와 램을 사용한다. 이번 서비스의 경우, 실시간 분석 기능이 포함되어 있어 CPU 및 메모리 사용량이 많을 것으로 예상된다. 조금이나마 자원 소모를 줄이기 위해 Docker의 컨테이너 레이어 사용없이 OS 단에서 실행될 수 있도록 구현했다.

추후

- Spring과 FastAPI 연동 과정에서 겪었던 트러블 슈팅들을 정리해볼까한다.

- Spring Boot에서 제공하는 RestTemplate 자체가 블로킹으로 작동하기 때문에 여러 요청에 대해 어떻게 작동할지 궁금해졌다.

728x90