Apache Beam과 Dataflow로 추론을 위한 실시간 데이터 파이프라인 만들기
AI/ML 모델이 사용자에게 다양한 편의를 제공하기 위해서는 훈련을 마치고 모델을 배포하여 앱이나 장치 수준에서 추론을 수행하는 단계에 이르러야 합니다.
- 추론: 훈련된 AI 모델을 사용하여 새로운 데이터에 대한 예측이나 결정을 내리는 과정
추론 단계에서 모델을 배포한 앱이나 장치는 사용자의 입력에 대한 즉각적인 피드백을 제공하고 사용자 데이터를 분석하여 개인 맞춤형 콘텐츠를 추천합니다. 또한 반복 업무, 시간이 많이 걸리는 작업을 자동화하고 데이터를 분석하고 의미 있는 통찰을 제공하여 사용자가 더 나은 결정을 내릴 수 있도록 돕습니다. 이처럼 추론은 새로운 데이터를 모델에 제공하여 예측이나 분석을 얻는 과정으로, 모델 훈련에 들인 모든 노력이 결실을 맺는 순간입니다.
🫤 추론을 위한 실시간 데이터 파이프라인 구축이 어려운 이유
추론 단계에서 데이터 처리는 매우 중요한데요. 데이터가 들어올 때 이를 신속하게 처리하고 모델로부터 결과를 도출하기 위해서는 단순하면서도 견고하고 확장 가능한 스트리밍 또는 실시간 데이터 파이프라인을 구축해야 합니다. 이런 파이프라인은 데이터를 빠르게 변환하고 강화하여, 모델이 예측을 수행하는 데 필요한 입력으로 제공합니다.
추론을 위한 실시간 데이터 파이프라인 구축은 쉽지 않은 과제입니다. 실시간 추론 파이프라인을 직접 구축하는 것은 복잡하고 시간이 많이 소요되며 효율적이고 확장 가능한 솔루션을 만들기 위해 고려해야 할 사항이 많습니다. 첫째, 모델 객체를 처리하기 위해 많은 코드를 작성해야 할 수도 있습니다. 둘째, 메모리 관리도 올바르게 처리해야 합니다. 프레임워크를 사용하지 않으면 자체 솔루션을 구축해야 하며, 이 과정에서 하드웨어와 소프트웨어 측면 모두를 신경 써야 합니다.
다양한 경우의 수가 존재하지만, 최적화된 솔루션을 찾는 것은 종종 어렵습니다. 병렬 처리를 추가하면 상황은 더욱 복잡해집니다. 병렬 방식으로 추론을 수행할 때는 메모리 제약 문제가 자주 발생하며 하나 이상의 모델을 사용할 때 선택할 수 있는 세 가지 옵션이 있습니다.
- 각 모델의 여러 사본을 메모리에 넣는 방법.
- 각 모델의 단일 사본만 메모리에 넣는 방법.
- 여러 모델 중 일부만 한 번에 메모리에 넣는 방법.
병렬 처리 플랫폼을 구축할 때는 효율적으로 확장하는 방법을 고려해야 합니다. 동일한 파이프라인을 여러 개 병렬로 구축할 수 있지만, 이 경우 데이터 공유가 어려울 수 있습니다. 이런 복잡한 시스템을 효과적으로 구축하려면 다양한 고려 사항이 필요합니다.
여기서 데이터 처리 프레임워크인 Apache Beam이 큰 도움이 될 수 있습니다. Beam은 대규모 데이터 처리를 지원하는 여러 구성 요소를 제공합니다. Beam 파이프라인은 Directed Acyclic Graphs(DAG)로 작성됩니다. 이는 데이터를 결정론적이고 견고한 방식으로 처리하며, 데이터 간의 관계와 상태를 명확하게 이해할 수 있게 합니다. DAG의 각 단계는 PTransform이라고 불리며, 각 단계는 데이터에 하나 이상의 작업을 수행합니다.
PTransform 중 하나인 RunInference 변환은 예측을 위한 간단한 변환입니다. 이 변환은 목표를 달성하기 위해 작성해야 하는 코드의 양을 줄이는 것을 목표로 합니다. RunInference PTransform은 모델 핸들러 객체를 사용하여 예측을 처리합니다.
예를 들어 키 모델 핸들러를 사용하여 Gemma 모델을 로드할 수 있습니다. Gemma는 구글에서 제공하는 경량의 최신 공개 모델 모음입니다. 본 포스팅에서 소개하는 내용에서는 Keras를 사용하지만, PyTorch나 다른 API도 사용할 수 있습니다.
이제 파이프라인을 구축해 보겠습니다. 이 예제는 PubSub에서 데이터를 읽고, 이를 RunInference PTransform으로 전달하여 예측을 수행하는 스트리밍 파이프라인입니다. 결과는 파싱되어 출력됩니다. 우리는 PubSub에 출력을 설정했지만, 계속해서 데이터를 처리하거나 다른 곳으로 전송할 수도 있습니다.
Beam을 사용하면 파이프라인의 다양한 단계에서 여러 입력과 출력을 가질 수 있습니다. 여러 입력과 출력은 보통 단계를 통합하거나 분할하는 것을 의미하며, 단계를 조직하는 한 가지 방법은 키를 사용하는 것입니다. Beam ML에는 모델 핸들러 주위에 키 모델 핸들러라는 래퍼가 있어 키를 사용하여 태그된 데이터 조각을 처리할 수 있습니다.
또한, Dataflow를 사용하여 배포를 더욱 단순화할 수 있습니다. Dataflow는 오픈 소스 Apache Beam 프레임워크로 작성된 파이프라인을 실행하는 완전 관리형 스트리밍 분석 서비스로, 여러 아키텍처 및 확장 문제를 해결하는 데 도움이 됩니다.
백엔드에서 어떤 일이 일어나고 있는지 자세히 살펴보겠습니다. Beam은 모델 관리자 클래스를 도입했으며, 이 클래스는 모델을 로드하고 언로드하는 역할을 합니다. 예를 들어 워커 1이 모델 관리자에게 모델을 요청하면, 모델 관리자는 해당 모델이 로드되지 않은 경우 전용 프로세스에 모델을 로드합니다. 그런 다음 모델의 참조를 워커에게 반환합니다. 워커는 데이터를 모델 프로세스에 보내 추론을 수행하고, 그 결과를 다시 워커에게 반환하여 이후의 변환 단계에서 사용할 수 있게 합니다.
병렬 처리의 수는 해당 머신에 로드한 모델 수와 같으며, 로드할 모델 수는 구성할 수 있습니다. Dataflow를 사용하면 리소스 관리도 가능합니다. Dataflow는 파이프라인의 각 단계에 대해 적절한 사양을 선택할 수 있는 적합 설정을 제공하여 리소스를 효율적으로 사용할 수 있도록 도와줍니다. 이를 통해 GPU나 메모리에 과도한 지출을 피하면서도 안정적인 실행을 보장할 수 있습니다.
이러한 기능을 통해 Dataflow의 강력한 데이터 처리 기능을 결합하고, Beam의 단순화된 모델 핸들러와 RunInference PTransform을 사용하여 그 데이터에 대한 추론을 수행할 수 있습니다. 본 포스팅에서 소개한 내용에 대한 더 자세한 내용은 Apache Beam의 RunInference 변환을 사용하는 방법과 ModelHandler 구현을 위한 다양한 사용 사례를 보여주는 깃허브의 ML 샘플 노트북 페이지를 참조 바랍니다.
구글 클라우드 더 자세한 내용은 메가존소프트에 문의해 주세요. 😎 [ 문의하기 ]