반응형

온라인 서빙

고려사항

온라인 서빙은 실시간으로 클라이언트 요청에 대한 서비스를 제공해야 하는 구조 입니다. 따라서 고객 경험을 좋게 하기 위해서는 지연 시간(Latency)를 최소화할 필요가 있습니다. 이를 위해 고려할만한 사항은 다음과 같은 방법을 고려할 수 있습니다.

  • 데이터 전처리 서버 분리 (Feature를 미리 가공 등)
  • 모델 경량화
  • 병렬 처리
  • 예측 결과 캐싱

 

방법론

온라인 서빙을 구현하기 위해서는 크게 3가지 방법론이 있습니다. 먼저 직접 웹서버를 구축하는 방식입니다. 머신러닝, 딥러닝은 보통 파이썬을 통해 구현되므로 파이썬의 대표적인 웹 프레임워크인 Flask나 FastAPI를 활용하는 것입니다. 자체적으로 서비스를 빠르게 만들 필요가 있을 때 고려해볼만한 방법입니다.

 

다음으로는 클라우드 서비스를 활용하는 것입니다. AWS의 SageMaker나 GCP의 Vertex AI 등이 대표적인 사례입니다. 이러한 서비스들은 클라우드 회사에서 구축해놓은 기능을 활용하는 것이기 때문에 인력이 부족한 경우 사용을 고려할 수 있습니다만, 이미 만들어놓은 서비스를 활용하는 만큼 많은 비용이 청구될 수 있습니다. 또 이미 만들어진 기능이기 때문에 자유도가 떨어지는 문제도 있습니다.

 

마지막으로 오픈소스를 활용하는 방식입니다. Tensorflow Serving, Torch Serve, MLFlow, BentoML 등을 활용하는 방식입니다. 모든 방식에 장단점이 존재하므로 잘 비교해서 활용하는 것이 필요합니다.

 

서버 아키텍처

모놀리스 아키텍처

모놀리스 아키텍처, 영어로는 Monolithic Architecture는 하나의 큰 서버로 모든 로직들이 거대한 코드 베이스 하나로 개발되고 저장됩니다. 클라이언트는 서버(또는 로드 밸런서)에 요청하고 서버 내부에서 처리하는 방식입니다. 이 아키텍처는 배포해야 할 코드 프로젝트는 하나이기 때문에 초기에는 편리하나, 향후에는 복잡도가 증가하기 때문에 규모나 단계에 따라 바뀌어야 할 수도 있는 방식입니다.

 

마이크로 서비스 아키텍처

Micro Service Architecture는 작은 여러 개의 서버로 개발되고, 모든 로직이 개별 코드에 저장되는 방식입니다. 클라이언트는 하나의 서버에 요청하고 이 요청을 내부 (기능) 서버로 요청한 후에 내부 서버에서 처리하고 요청했던 서버로 반환합니다. 머신러닝, 딥러닝은 이 경우를 채택하는 경우가 많을 수 있습니다.

 

REST API

Representational State Transfer(REST) API는 통신 규약인 HTTP을 기반으로 하는 웹 기술을 기반으로 하는 인터페이스인 Web API 중 하나입니다. REST API는 자원을 표현하고 상태를 전송하는 것에 중점을 둔 Web API입니다.

 

REST API의 사용

REST API는 서버에 요청을 보내는 메서드와 대상인 URL로 구성되어 있습니다. 메서드는 서버에 요청을 보내는 방식으로 GET(조회), POST(생성), PUT(전체 업데이트), PATCH(부분 업데이트), DELETE(삭제)가 있습니다.

 

URL은 인터넷 상 자원을 식별하기 위한 위치를 찾는 방식으로 프로토콜(HTTP와 같이 표기), 호스트(IP나 도메인으로 표기), 포트, URL 파라미터로 이뤄져 있습니다.

 

여기서 IP는 네트워크에 연결된 특정 PC의 주소 체계(Internet Protocl)을 말하며, 숫자 덩어리의 숫자에 따라 IPv4, IPv6로 구분됩니다. 그리고 IP 주소 뒤에 나오는 숫자인 포트는 PC에 접속할 수 있는 통로를 의미합니다.

 

URL 파라미터

URL 파라미터는 인터넷 상 자원의 위치를 찾기 위한 URL 내에서 특정 자원을 구분짓기 위한 방법입니다. 크게 쿼리 파라미터와 패스 파라미터가 있으며, 우선 쿼리 파라미터부터 살펴보겠습니다.

 

쿼리 파라미터는 URL 끝에 추가하면서 특정 리소스의 추가 정보 제공 또는 데이터를 필터링할 때 사용합니다. 이는 선택적 정보를 정렬, 필터링해야 하는 경우에 사용하면 좋습니다. 쿼리 파라미터는 아래와 같이 표현됩니다.

패스(Path) 파라미터는 리소스의 정확한 위치나 특정 리소스를 찾을 때 사용합니다. 패스 파라미터는 필수적인 정보에 대해 식별해야 하는 경우 사용하면 좋습니다. 패스 파라미터는 아래와 같이 표현됩니다.

 

HTTP 헤더와 페이로드

헤더는 클라이언트와 서버의 요청과 응답에서 주고받는 문자열의 리스트를 말합니다.[2] 페이로드(Payload)란 전송되는 데이터를 말합니다.[3] 아래 이미지에서 보면 헤더를 확인할 수 있습니다. 방법은 참고 자료를 보시면서 따라하면 됩니다. [4]

 

 

앞서 말한 메서드와 URL 외에도 헤더와 페이로드를 사용해서 요청도 가능합니다. 한번 예시를 들어보겠습니다. 각 요소들에 대한 설명은 아래에 첨부하겠습니다.

 

curl -X POST -H "Content-Type: application/json" -d '{"name":"who"}' http://localhost:8080/users

 

  • curl : 터미널에서 HTTP 요청할 때 사용하는 도구
  • -X POST : HTTP 메서드로 POST 사용
  • -H "Content-Type: application/json" : 헤더에 Content-Type: application/json 라는 key: value를 추가 
  • -d '{"name":"who"}' : 페이로드로 json을 추가 
  • http://localhost:8080/users : URL로 어디로 요청을 보낼까를 명시

 

참고자료

[1] 변성윤. "[Product Serving] 웹 프로그래밍 지식". boostcamp AI Tech.
[2] https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

[3] https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-http-%ED%8E%98%EC%9D%B4%EB%A1%9C%EB%93%9C-payload%EB%9E%80/

[4] https://www.kyumin.blog/6

 

반응형