머신러닝 디자인패턴

디자인패턴 17 : 배치서빙

판교데싸 2022. 6. 1. 12:27

05.2-디자인패턴 17-배치서빙

배치서빙

  • 분산 데이터 처리에 일반적으로 사용되는 소프트웨어 인프라를 사용하여 한번에 많은 인스턴스에 대한 추론을 수행하는 것

5.2.1 문제

보통 ML 서비스 프레임워크에 모델을 배포하면 단일 요청에 포함된 하나의 인스턴스 또는 수천개의 인스턴스를 처리하도록 설정되어 있고 서빙 프레임워크는 5.1절에서 논의 된 것처럼 개별 요청을 가능한 한 빨리 동기적으로 처리하도록 설계되어 있음

서빙 인프라는 일반적으로 많은 연산을 TPU 또는 GPU 같은 고성능 하드웨어에서 처리하고 여러 데이터와 관련된 비효율성을 최소화하는 마이크로서비스로 설계됨

그러나 대량의 데이터에 대해 비동기적으로 예측을 수행해야하는 상황도 있는데 예를들어 SKU의 재주문 여부를 결정하느 것은 이를 구매할 때마다 수행되는 작업이 아니라 매시간 수행되는 작업일 수 있음

음악 서비스의 경우 모든 개별 사용자를 위해 최적화 된 일일 재생목록을 만들어 푸시 알림을 보낼 수 있음. 개인화 된 재생 목록은 사용자가 음악 소프트웨어를 사용하는 모든 상호작용에 대한 개별 응답으로 생성되는 것은 아니라 ML모델은 한 번에 하나의 인스턴스가 아니라 한번에 수백만개의 인스턴스에 대한 예측을 수행해야 함.

한번에 하나의 요청을 처리하도록 설계된 소프트웨어 엔드포인트를 사용하여 수백만 SKU 또는 수십억명의 사용자에게 응답을 보내려고 하면 ML 모델이 제대로 동작하지 않음


5.2.2 솔루션

배치 서빙 디자인 패턴은 분산 데이터 처리 인프라 ( ex) 맵리듀스 ,아파치스파크 , 빅쿼리 ,아파치 빔) 을 사용하여 많은 수의 인스턴슬에서 비동기식으로 ML 인퍼런스를 수행

앞선 스테이트리스 서빙 함수 디자인 패턴에 대한 논의에 리뷰가 긍정적인지 부정적인지 여부를 출력하도록 하는 텍스트 분류 모델을 학습 하여

미국 소비자 금융보호국에 제기된 모든 불만 사항에 이 모델을 적용하고 싶다고 가정해보자

  • 밑의 코드가 예시
CREATE OR REPALCE MODEL mlpatterns.imdb_sentiment
OPTIONS(model_type='tensorflow', model_path='gs://.../*)

이 코드에서는 단순히 외부에서 학습된 모델을 로드하지만, 일반적으로 빅쿼리의 데이터를 사용히여 모델을 학습

이를 통해 ML 예측을 수행하면

SELECT * FROM ML>PREDICT(MODEL mlpattens.imdb_sentiment,
    (select 'this was very well done' AS reviews))

0.82의 positive_review_probability를 반환

빅쿼리와 같은 분산 데이터 처리 시스템을 사용하여 일회성 예측을 수행하는 것은 그다지 효율적이지 않음. 그러나 CFPB 데이터베이스의 모든 불만 사항에 머신러닝 모델을 적용하려면 어떻게 하면 될까? 위의 쿼리를 수정해 평가할 내부 select 절의 consumer_complaint_narrative 열을 reviews로 별칭을 지정해보자

SELECT * FROM ML>PREDICT(MODEL mlpattens.imdb_sentiment,
    (select consumer_complaint_narrative AS reviews
    from `bigquery-public-data`.cfpb_complaints.complaint_database
    where consumer_complaint_narrative IS NOt NULL)
    )

데이터 베이스에는 150만 건 이상의 불만이 있지만 약 30초만에 처리되므로 분산데이터 처리 프레임 워크를 사용할 때 이점을 충분히 활용할 수 있다.

5.2.3 작동원리

스테이트리스 서빙함수 디자인 패턴은 수천개의 쿼리에 대해 낮은 지연(?) 제공을 동시에 하기 위해 설정된다. 수백만 개의 항목을 주기적으로 처리하는데 이런 프레임워크를 사용하면 많은 비용이 들 수 있다. 이처럼 요청에 대한 지연 시간에 민감하지 않은 경우 분산 데이터 처리 아키텍처를 사용하여 수백만 개의 항목에 대해 머신러닝 모델을 호출하는 것이 비용면에서 더욱 효율적이다

%%bigquery preds
SELECT * FROM ML.PREDICT(MODEL mlpatterns.imdb_sentiment,
  (SELECT consumer_complaint_narrative AS reviews 
   FROM `bigquery-public-data`.cfpb_complaints.complaint_database
   WHERE consumer_complaint_narrative IS NOT NULL
   )
SELECT * FROM all_complaints
ORDER BY positive_review_probability DESC LIMIT 5
)

첫번째 단계는 빅쿼리 공개 데이터셋인 consumer_complaint_narrative 열에서 읽어옵니다.

두번째 단계는 이샤드에서 데이터를 읽지만 머신러닝 모델 imdb_sentiment의 file_path 및 file_contents 도 가져와서 각 샤드의 데이터에 모델을 적용한다

세번 째 단계는 데이터셋을 내림차순으로 정렬하고 그중 5개를 사용합니다 (두번째 그림)

나머지 단계에서는 데이터의 나머지 비트를 검색 및 포맷하고 출력에 기록합니다.

이러한 방식으로 많은 워커에 걸쳐 작업을 분리할수 있는 기능을 통해 빅쿼리가 35초안에 전체 150만 개의 불만사항에 대한 작업을

수행할수 있도록 한다.

--- 샤드 관련 개념 정리하기

5.2.4 트레이드 오프와 대안

배치 서빙 디자인 패턴은 작업을 여러 워커로 분할하는 기능에 따라 달라지므로 SQL 데이터 웨어하우스에만 국한되지 않고 모든 맵 리듀스 프레임워크에서 잘 작동함

일반적으로는 지연 시간이 문제가 되지 않을 때 배치 서빙을 사용하지만 특정 상황에서는 지연 시간이 중요해도 사용 할 수 있음 -> 예측 입력 공간이 제한된 시나리오에서 사전 계산된 결과를 주기적으로 새로 고침한다면 배치 서빙을 사용 할 수있음

배치 및 스트림 파이프라인

아파치 스파크 또는 아파치 빔과 같은 프레임워크는 입력에 전처리가 필요하거나 출력에 후처리가 필요한 경우 전처리나 후처리를 SQL로 표현하기 어려운 경우에 유용하다

아파치 빔을 활용해 유명인에 대한 언급을 식별하기 위해 ML 모델을 호출하고 이를 표준 지식 그래프에 연결 할 수있다.
(예: 오바마에 대한 언급과 오바마 대통령에 대한 언급이 모두 en.wikipedia.org/wiki/barack_obama에 연결 되도록 할 수있다)

beam.MAP(lambda x: nlp.Document(x,type='PLAIN_TEXT'))
nlp.AnnotateText(features)
beam.Map(parse_nlp_result)

여기서 parse_nlp_result는 NLP API를 호출하고 AnnotateText 변환을 통과하는 Json 요청의 구문 분석을 수행한다.

람다 아키텍처

온라인 서빙과 배치서빙을 모두 지원하는 프로덕션 ML 시스템을 람다 아키텍쳐라고 칭함 해당 ML 시스템을 사용하면 ML실무자가 지연시간과 처리량간의 균형을 맞출 수 있음 (AWS 람다는 이름과는 달리 람다 아키텍처가 아님)

일반적으로 람다 아키텍처는 온라인 서빙 및 배치서빙을 위한 별도의 시스템을 통해 지원된다. 예를들어 구글클라우드 플랫폼에서 온라인 서빙 인프라는 클라우드 AI 플랫폼 예측에서 제공하고 , 배치 서빙 인프라는 빅쿼리 및 클라우드 데이터 플로에서 제공.

텐서플로 모델을 불러와서 빅쿼리로 가져올수도 있고 학습된 빅쿼리 ML 모델을 가져와 온라인 제공을 위해 텐서플로 SAVED MODEL로 내보낼 수도 있다. 이 양방향의 호환성을 통해 구글 클라우드 사용자는 지연 시간 - 처리량 트레이드 오프 스펙트럼의 모든 지점에 도달 할 수 있다.

반응형
반응형