Julie의 Tech 블로그

MLOps, 머신러닝 파이프라인 설계 - (2) TFX, Apache Beam 개요 본문

Tech/MLOps

MLOps, 머신러닝 파이프라인 설계 - (2) TFX, Apache Beam 개요

Julie's tech 2021. 9. 1. 22:08
728x90
$ pip install tfx

import tensorflow_data_validation as tfdv
import tesnorflow_transform as tft
import tensorflow_transform.beam as tft_beam

from tfx.components import ExampleValidator
from tfx.components import Evaluator
from tfx.components import Transform

본 글은 이전 시리즈에 이어 머신러닝 파이프라인 설계시 사용되는 주요 프레임워크, 툴들에 대해 개괄적으로 다뤄볼 것이다.

우선 파이프라인 설계시 사용되는 TFX와 Orchestration 툴 Apache Beam에 대해 알아보자.

Introduction to TFX

TFX, Tensorflow Extended 라이브러리는 머신러닝 파이프라인 구성시 필요한 요소들을 제공해준다.

앞선 글에서 다루었던 일반적인 머신러닝 파이프라인 구성요소별로 나누어서 살펴보자.

- Data Ingestion : ExampleGen

- Data Validation : StatisticsGen, SchemaGen

- Data Preprocessing : Transform

- Model Training : Trainer

- Trained Model : ResolverNode

- Model Analysis : Evaluator

- Model Deployments : Pusher

출처 : building machine learning - O'Reilly

TFX 라이브러리를 본격적으로 알아보기 전에 TFX를 사용할 수 있는 환경을 구성해야할 것이다.

터미널에서 라이브러리를 설치하고 import 해보자.

 

$ pip install tfx


import tensorflow_data_validation as tfdv
import tesnorflow_transform as tft
import tensorflow_transform.beam as tft_beam

from tfx.components import ExampleValidator
from tfx.components import Evaluator
from tfx.components import Transform

TFX의 각 구성요소들은 task를 수행하는 것 외에도 다른 일들을 한다.

단순하게 생각해보면 어떤 input을 받을 것이고, 그에 따라 일을 하고, 결과를 낼 것이다.

이를 TFX의 용어로 좀 더 다듬어보면, Driver, Executor, Publisher로 나뉜다.

Driver는 metastore로 부터 쿼리를 해오고(경로 등), Executor는 업무를 수행하고, Publisher는 그 결과를 metastore로 돌려준다.

Component Overview

이 때 Driver로 들어오는 input과 Publisher에서 나가는 output은 artifact 라고 부른다.

Artifact가 될 수 있는 사례로는 raw 데이터, 가공된 데이터, 학습된 모델 등이 있다.

이처럼 TFX의 구성요소(components)는 metadata와 지속적으로 주고받는 구조이다.

이 때 한 가지가 궁금할 수 있다. components 끼리 직접 소통하는 것이 아니라 metastore를 끼는 이유가 무엇일까?

정보를 한 군데로 집중적으로 모으기 위해서이다.

우리가 실제로 TFX라이브러리를 사용해보면 ML Metadata(MLMD) API 를 통하여 데이터를 저장하게 된다.

MLMD 데이터가 실제로 저장되는 곳은 DB 류인데, MySQL, SQLite, 인메모리 데이터베이스 3가지를 지원한다.

이러한 데이터로 여러 가지 유용한 기능을 제공할 수 있게 되는데, 예를 들어 학습된 데이터 결과를 매 실행마다 서로 비교하여 모델 성능이 개선되었는지를 트래킹할 수 있다.

Jupyter Notebook 환경에서 TFX 라이브러리를 사용해 간단한 머신러닝 파이프라인을 만들어보자.

주피터 노트북을 활용하면 매 셀 실행 결과를 바로 볼 수 있어 component가 어떻게 동작하는지를 볼 수 있다.

import tensorflow as tf
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext

context = InteractiveContext() // Component 실행을 조종하고, 각 artifact를 보여주는 기능
// 여기서 InteractiveContext는 인메모리 ML MetadataStore를 구성한다

여기서 Context는 각 component를 run하고, 그 부산물을 보여주는 instance이다.

component 하나를 구성하고, 아래와 같이 실행해볼 수 있다.

from tfx.components import StatisticsGen

statistics_gen = StatisticsGen(examples=example_gen.outputs['examples'])
context.run(statistics_gen) // 이와 같이 context에 component를 구성한 뒤 run 시키면 됨

Component 실행 결과는 두 가지로 볼 수 있는데, 우선 하나는 쉘 결과창으로 보는 것이다.

다른 하나는 URI를 통해 콘솔 화면에서 시각화된 부산물을 볼 수 있다는 것이다.

context.show(statistics_gen.outputs['statistics']) // context 의 결과물을 보여줌

// 아래 코드와 같이 artifact property에도 접근이 가능하다
for artifact in statistics_gen.outputs['statistics'].get():
    print(artifact.uri)

출처 :  https://blog.tensorflow.org/2019/11/introducing-tfx-interactive-notebook.html

 

이 때 우리는 interactive한 파이프라인(InteractiveContext)을 구성했기 때문에 위와 같이 시각적으로도 볼 수 있는 것이다.

TFX 외에도 대체가능한 여러 라이브러리들이 있다. TFX는 Tensorflow와 Keras를 머신러닝 프레임워크로 사용할 것이라 가정하기 때문이다.

예를 들어 AirBnb에서도 AeroSolve라는 프레임워크를 제공하고, Netflix에서도 Metaflow라는 프레임워크를 제공한다.

회사별로 프레임워크를 개발했기 때문에, 각 회사 특성마다 조금씩 프레임워크 환경이 다르다.


Introduction to Apache Beam

TFX Components와 라이브러리 중 대다수가 파이프라인을 효율적으로 프로세싱하는 데에 있어 Apache Beam을 사용하고 있다.

TFX를 설치할 때도 Apache Beam에 어느정도 의존성(dependency)이 있어 Apache Beam에 대해서도 함께 살펴보자.

이번에는 Apache Beam이 TFX의 뒤(back)에서 어떻게 동작하는지를 좀 더 초점에 두고 살펴볼 것이다.

https://ko.coursera.org/lecture/ml-pipelines-google-cloud/apache-beam-E1qHy

Apache beam은 배치 프로세스를 지원하고, 실시간 운영(Operation)을 원활하게 할 수 있도록 지원한다.

설치는 동일하게 아래와 같이 진행한다.

$ pip install apache-beam

만약 GCP나 AWS환경에서 apache-beam을 사용한다면 pip install apache-beam[gcp]와 같이 환경을 지정해서 설치가 가능하다.

아파치 빔은 두 가지 개념을 이해해야한다.

- Collections : 데이터를 읽었거나 쓰고 있는 operation에 대해 설명

- Transformations : 데이터를 조작하는 방법에 대해 설명

TFX가 뼈대를 만드는 거라면, 빔은 그 처리를 효율적으로 하기 위한 백단 환경이라고 볼 수 있다.

빔은 collection과 transformation을 정의하더라도 파이프라인을 실제로 실행하지 않는 이상 어떠한 데이터도 로드되거나 변형되지 않는다.

설명만으로 이해가 잘 안간다면 좀 더 예제로 살펴보자.

Collection 의 가장 베이직한 개념은 '파일을 읽는다' 혹은 '파일을 쓴다(write)' 이다. PCollections로 그 기능을 볼 수 있다.

collection이 변형되어 최종 결과물로 만들어지면, 그 결과물이 파일 시스템에 작성되는 것이다.

// basic Collections example
import apache_beam as beam

with beam.Pipeline() as p:
     lines = p | beam.io.ReadFromText(input_file)
...
     output | beam.io.WriteToText(output_file)

아파치 빔에서는 데이터가 Transformation을 거쳐 조작된다. Transformation 연산들은 pipe operator로 불리는 | 로 연결된다.

// basic Transformation example
counts = (
     lines
     | 'Split' >> beam.FlatMap(lambda x: re.findall(r'[A-Za-z\']+', x))
     | 'PairWithOne' >> beam.Map(lambda x: (x,1))
     | 'GroupAndSum' >> beam.CombinePerKey(sum)
)

위 예시는 간단하게 line별로 파일을 읽어들여 단어별 빈도수를 집계하는 코드이다.

아래는 Apache beam 독스에서 가져온 Apache beam 코드 snippet이다. 파일을 읽고 쓰는 과정에 있어 최소한의 코드라고 볼 수 있다.

import re

import apache_beam as beam
from apache_beam.io import ReadFromText
from apache_beam.io import WriteToText
from apache_beam.options.pipeline_options import PipelineOptions
from apache_beam.options.pipeline_options import SetupOptions

input_file = "gs://dataflow-samples/shakespeare/kinglear.txt" 1
output_file = "/tmp/output.txt"

# Define pipeline options object.
pipeline_options = PipelineOptions()

with beam.Pipeline(options=pipeline_options) as p: 2
    # Read the text file or file pattern into a PCollection.
    lines = p | ReadFromText(input_file) 3

    # Count the occurrences of each word.
    counts = ( 4
        lines
        | 'Split' >> beam.FlatMap(lambda x: re.findall(r'[A-Za-z\']+', x))
        | 'PairWithOne' >> beam.Map(lambda x: (x, 1))
        | 'GroupAndSum' >> beam.CombinePerKey(sum))

    # Format the counts into a PCollection of strings.
    def format_result(word_count):
        (word, count) = word_count
        return "{}: {}".format(word, count)

    output = counts | 'Format' >> beam.Map(format_result)

    # Write the output using a "Write" transform that has side effects.
    output | WriteToText(output_file)

Apache Beam 파이프라인을 통해 텍스트 파일을 읽어들이는 data collection을 만들고, 해당 collection에 transformation을 적용한다.

아래는 Beam 지원이 가능한 TFX Component 목록이다.

https://ko.coursera.org/lecture/ml-pipelines-google-cloud/apache-beam-E1qHy

다음 글에서는 본격적으로 머신러닝 파이프라인 각 단계별로 상세하게 다뤄볼 것이다.


참고자료

https://learning.oreilly.com/library/view/building-machine-learning/9781492053187/

반응형