지금까지 머신러닝 모델을 학습하고 릴리스하는 방법에 대해 살펴봤다. 이번 포스팅 부터는 머신러닝을 통해 시스템을 만드는 여러가지 패턴을 정리하려고 한다.

시스템이 필요한 이유

하나의 머신러닝 모델을 만들어 내기 위해서는 다양한 데이터와 알고리즘, 파라미터를 조합해야 한다. 이 조합에 따라 만들어지는 모델의 성능은 달라지는데, 도대체 어떤 데이터나 파라미터를 통해 학습되었는지를 이미 학습된 모델 자체를 통해서 알아내기는 어렵다. 따라서 머신러닝을 활용하기 위해서는 어떤 설정을 바탕으로 모델을 학습했는지 철저히 관리하고 버저닝해야 한다.

머신러닝을 효과적인 프로덕트나 서비스의 형태로 활용하기 위해서는 시스템이 모델을 포함해야 한다. 머신러닝 모델을 로컬 PC에서만 추론할 수 있게 구성하는 것은 도움이 되지 않으며, 다른 소프트웨어들과 조합해 모델이 호출되는 구조를 갖춰야 한다.

학습한 모델을 추론기에 포함하는 방법은 여러가지가 있다. 어떤 방법으로 모델을 추론기에 포함해서 구현할지는 시스템의 목적이나 모델의 성능에 따라 달라진다. 예를 들어 모든 요청에 대해 즉시 추론 결과를 응답하기 위한 추론기는 동기적으로 만드는 것이 좋다. 여러 개의 모델을 포함한 추론기를 구성해야 하는 경우라면 각각의 모델을 MSA(Micro Service Architecture)로 배치하는 방법을 고려해야 하고, 데이터를 모아두었다가 야간이나 일정한 기간에 일괄적으로 추론하고 싶은 경우는 배치 시스템으로 개발하는 것이 바람직하다.

앞으로 정리할 추론 시스템 패턴을 요약하면 다음과 같다.

  • 웹 싱글 패턴: 하나의 작은 모델을 하나의 추론기로 동기적으로 추론
  • 동기 추론 패턴: 요청에 대해 동기적으로 추론
  • 비동기 추론 패턴: 요청에 대해 비동기적으로 추론
  • 배치 추론 패턴: 배치 작업으로 추론 실행
  • 전처리 추론 패턴: 전처리와 추론으로 서버를 분리
  • 직렬 MSA 패턴: 의존관계에 있는 추론을 차례로 실행
  • 병렬 MSA 패턴: 하나의 요청을 여러개의 추론기로 추론

웹 싱글 패턴

웹 싱글 패턴은 추론 시스템을 만들 때 가장 간단하면서도 기초적인 구성이다. 한대의 웹 API 서비스에 머신러닝 추론 모델을 포함한다. 다시말해, API에 데이터와 함께 요청을 보내면 추론 결과를 얻을 수 있는 구조를 지향한다.


Use Case

  • 가장 간단한 구성으로 추론기를 신속하게 릴리스해서 모델의 성능을 검증하고 싶은 경우


해결하려는 과제

웹 서비스에서 사용 중인 데이터는 시시각각 변하기 때문에 학습에 사용한 데이터는 점차 현재로부터 뒤쳐지는 경향을 보인다. 따라서 모델은 학습이 끝난 직후가 실제 데이터(비즈니스)를 가장 잘 반영한다고 볼 수 있다.

계절성이 짙은 서비스라면 3개월 전의 데이터로 학습한 모델은 현 시점에서는 맞지 않을 가능성이 높다. 가능하면 1개월 이내의 데이터로 모델을 학습하고, 데이터를 입수한 때로부터 시간이 크게 지나지 않았을 때 모델을 실제 비즈니스에 투입하고 가치를 창출해야 한다. 결국 비즈니스 관점에서는 모델을 신속하게 릴리스 하는 것이 하나의 중요한 목표인 셈이다.

이러한 상황에서 웹 싱글 패턴을 통해 가능한 한 빠르게 모델의 퍼포먼스를 확인해 볼 수 있다. 


Architecture

모델을 신속하게 릴리스하기 위해서는 추론기를 빠르게 개발하고 구축해야 한다. 개발을 신속하게 진행하는 가장 쉬운 방법 중 하나는 쓸데없는 것을 만들지 않는 것이다. 한 대의 서버가 필요로 하는 최소한의 기능만을 개발하고, 외부 인터페이스도 대부분의 시스템에서 사용이 가능한 REST API로 구성하는 것이 좋다.(+ gRPC)

웹 싱글 패턴은 웹 애플리케이션 서버에 모델을 포함시키는 패턴이다. 동일 서버에 REST 인터페이스와 전처리, 학습이 끝난 모델을 install 해서 아주 간단한 추론기를 구현한다. 머신러닝의 추론은 대부분 Stateless 이기 때문에 DB나 스토리지 등의 데이터를 영속적으로 보존하는 Persistent 계층을 준비하지 않고 웹 서버 한 대로 구성할 수 있다. 가용성을 위해 여러 대의 웹 서버로 운용하는 경우는 로드 밸런서를 도입해 부하를 분산시키기도 한다.


구현

지난 모델 인 이미지 패턴 포스팅 코드가 웹 싱글 패턴이기 때문에 코드 설명은 넘어가고 구현 소프트웨어에 대한 설명을 짧게만 하려고 한다.

우선 웹 싱글 패턴에서 소프트웨어 간의 관계는 다음과 같다.

FastAPI는 파이썬 기반의 웹 프레임워크로 Uvicorn을 통한 비동기 처리와 Pydantic을 통한 구조적인 데이터 정의를 지원한다. Uvicorn은 ASGI(Asynchronous Server Gateway Interface)라 불리는 표준 인터페이스를 지원하는 프레임워크로서, 비동기 싱글 프로세스로 작동한다. 또한 Uvicorn을 Gunicorn에서 기동해 멀티 프로세스로 사용하는 것도 가능하다.

Gunicorn은 WSGI(Web Server Gateway Interface)라 불리는 동기적인 애플리케이션 인터페이스를 제공한다. Uvicorn을 Gunicorn에서 기동하면 ASGI의 비동기 처리와 WSGI의 멀티 프로세스의 조합이 가능하다. Pydantic은 파이썬의 type annotation을 이용한 데이터 관리 라이브러리이며, 런타임 레벨에서 엄밀하게 타입 지정을 강제할 수 있다.


이점

웹 싱글 패턴의 장점은 추론기를 가볍고 신속하게 가동시킬 수 있다는 점이다. API와 추론기만으로 구성된 범용적이면서 심플한 구조를 갖추고 있기 때문에 가동시키는 기반의 선택지도 다양하고, 특수한 설정이나 설계도 필요하지 않다.

또한 장애 대응이나 복구도 간단하다. 애초에 장애가 일어날 수 있는 부분도 많지 않기에 장기간에 걸친 복구 작업을 필요로 하는 복잡한 장애가 발생하는 경우는 매우 드물다. 가벼운 모델을 하나 정도 가지고 있다면 웹 싱글 패턴으로 릴리스해보고 실용상 가치를 측정해 보는 것도 나쁘지 않다.


검토사항

웹 싱글 패턴은 애초에 복잡한 처리를 고려하지 않았다는 것 자체가 단점이 될 수 있다. 머신러닝 모델이 추가되면서 여러 개의 모델과 복잡한 workflow를 통해 가치를 극대화하려는 경우 웹 싱글 패턴으로는 해결이 어렵다.


End

이번 포스팅에서는 웹 싱글 패턴에 대해 간단히 알아보았다. 이전까지의 모델 릴리스 패턴의 코드들이 전부 웹 싱글 패턴에 해당하기 때문에 짧게 끝냈고 다음 포스팅부터는 동기, 비동기 추론 패턴부터 보다 복잡한 머신러닝 시스템을 구성하기 위한 패턴에 관해 정리 할 것이다.

Keep Going

Reference

Book: AI 엔지니어를 위한 머신러닝 시스템 디자인 패턴

업데이트:

댓글남기기