데이터 준비
ExampleGen 컴포넌트를 이용하여 데이터셋의 입력 설정(input_config)과 출력 설정(output_config)을 구성할 수 있다. 이외에도 데이터셋을 점진적으로 수집하는 스패닝(spanning)과 데이터셋 분할 방법 또한 정의할 수 있다.
1) 데이터셋 분할
머신러닝 파이프라인의 후반부에는 모델을 학습시키고 이를 검증시키는 단계가 포함되어 있다. 이를 위해서는 데이터셋을 이에 필요한 하위 집합(학습 세트, 검증 세트 등)으로 분할을 해두는 것이 좋다.
단일 데이터셋을 하위 집합으로 분할
다음 코드는 데이터 수집 단계에서 데이터셋을 학습, 검증, 테스트 세트로 나누는 방법을 보여준다. 여기서 각 세트 별 비율 hash_buckets로 정의한다.
import os
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
from tfx.components import CsvExampleGen
from tfx.proto import example_gen_pb2
context = InteractiveContext()
dir_path = os.getcwd()
data_dir = os.path.join(dir_path, "..", "..", "data", "taxi")
output = example_gen_pb2.Output(
# 분할 정의
split_config = example_gen_pb2.SplitConfig.Split(splits=[
# 비율 지정
example_gen_pb2.SplitConfig.Split(name='train', hash_buckets=6),
example_gen_pb2.SplitConfig.Split(name='eval', hash_buckets=2),
example_gen_pb2.SplitConfig.Split(name='test', hash_buckets=2)
])
)
# output_config 파라미터 추가
example_gen = CsvExampleGen(input_base=data_dir, output_config=output)
context.run(example_gen)
# 생성 아티팩트 검사
for artifact in example_gen.outputs['examples'].get():
print(artifact)
NOTE: 기본 분할
출력 구성을 따로 지정하지 않을 경우 ExampleGen 컴포넌트는 데이터셋을 학습 및 평가 데이터셋으로만 분할하며, 이때의 비율은 2:1이다.
기존 분할 보존
어떤 데이터셋은 이미 잘 분할되어 있어, 이를 그대로 보존하고 싶은 경우가 있을 수 있다, 이때는 입력 구성을 정의함으로써 이를 보존할 수 있다.
데이터셋의 예시 위치가 다음과 같다고 가정할 때,
ㄴㅡ data
ㄴㅡ train
ㄴㅡ 20k-consumer-complaints-training.csv
ㄴㅡ eval
ㄴㅡ 4k-consumer-complaints-eval.csv
ㄴㅡ test
ㄴㅡ 4k-consumer-complaints-test.csv
기존 분할을 유지하기 위한 입력 구성 정의 방법은 다음과 같다. 입력 구성을 정의하여 input_config 파라미터에 해당 설정을 전달해주는 방식으로 사용한다.
import os
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
from tfx.components import CsvExampleGen
from tfx.proto import example_gen_pb2
context = InteractiveContext()
dir_path = os.getcwd()
data_dir = os.path.join(dir_path, "..", "..", "data", "tfrecord")
tfrecord_filename = "consumer-complaints.tfrecord"
tfrecord_filepath = os.path.join(data_dir, tfrecord_filename)
# 기존 하위 디렉터리 설정
input = example_gen_pb2.Input(splits=[
example_gen_pb2.SplitConfig.Split(name='train', pattern='train/*'),
example_gen_pb2.SplitConfig.Split(name='eval', pattern='eval/*'),
example_gen_pb2.SplitConfig.Split(name='test', pattern='test/*')
])
# input_config 파라미터 추가
example_gen = CsvExampleGen(input_base=data_dir, input_config=input)
context.run(example_gen)
2) 데이터셋 스패닝
새로운 데이터가 제공될 때, 이를 머신러닝 모델에 지속적으로 업데이트하는 것은 중요하다. 머신러닝 파이프라인은 이를 지원하여 머신러닝 모델의 갱신을 자동화할 수 있도록 하는데 이때 사용되는 기법이 데이터셋 스패닝(dataset spanning)이다.
데이터셋을 일종의 '스냅샷'으로 보고 이를 일정 주기마다 배치 추출, 변환, 로드(extract-transform-load, ETL)하는 프로세스를 스패닝이라고 하며 이 과정을 통해 만들어지는 새로운 데이터셋 스냅샷을 스팬이라고 한다. 스패닝은 ExampleGen 컴포넌트를 사용하여 수행할 수 있다.
각 스팬은 기존의 데이터 레코드를 복제하여 새로운 데이터를 덧붙이는 식으로 만들어지며, 이는 다음과 같은 구조로 저장된다.
ㄴㅡ data
ㄴㅡ export-0
ㄴㅡ 20k-consumer-complaints.csv
ㄴㅡ export-1
ㄴㅡ 24k-consumer-complaints.csv
ㄴㅡ export-2
ㄴㅡ 26k-consumer-complaints.csv
스팬의 패턴은 입력 구성의 pattern에서 {SPAN} 표시자를 이용하여 지정할 수 있으며, 해당 부분에는 스팬을 구분하는 번호가 기입된다(위 예시의 경우, 0, 1, 2). 이렇게 만들어진 스팬들 중 최신 스팬을 ExampleGen 컴포넌트가 선택할 수 있도록 입력 구성을 정의하면 새로운 데이터로 모델을 업데이트하는 스패닝 프로세스를 사용할 수 있게 된다.
import os
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
from tfx.components import CsvExampleGen
from tfx.proto import example_gen_pb2
context = InteractiveContext()
base_dir = os.getcwd()
data_dir = os.path.join(os.pardir, "data")
input_dir = os.path.join(base_dir, data_dir)
input = example_gen_pb2.Input(splits=[
example_gen_pb2.Input.Split(pattern='export-{SPAN}/*')
])
example_gen = CsvExampleGen(input_base=input_dir, input_config=input)
context.run(example_gen)
이미 분할된 데이터라면 입력 정의에서 하위 디렉토리를 정의할 수도 있다.
input = example_gen_pb2.Input(splits=[
example_gen_pb2.Input.Split(name='train', pattern='export-{SPAN}/train/*'),
example_gen_pb2.Input.Split(name='eval', pattern='export-{SPAN}/eval/*'),
example_gen_pb2.Input.Split(name='test', pattern='export-{SPAN}/test/*')
])
3) 데이터셋 버전 관리
머신러닝 모델은 모델의 구조는 물론이고, 학습에 사용된 데이터 또한 모델에 큰 영향을 미칠 수 있기 때문에, 모델 추적 관리를 위해서는 데이터셋의 버전 또한 파이프라인을 통해서 관리되는 것이 바람직하다.
TFX 컴포넌트는 수집한 데이터의 파일 이름과 경로를 ML 데이터스토어에 저장할 수 있도록 지원하며, 이를 통해 수집한 데이터의 해시 등 많은 메타 정보를 추적할 수 있다. 버전 추적을 통해 모델 학습에 사용된 데이터셋이 현재 최신 상태의 데이터셋과 같은지를 확인할 수 있고, 다를 경우 모델을 업데이트할 수 있도록 한다. 이러한 특성은 엔드 투 엔드(end-to-end) ML reproducivility에서 매우 중요하다.
데이터셋을 버전화하기 위해서는 다음과 같은 도구를 사용할 수 있다.
- 데이터 버전 제어 (DVC)
DVC는 머신러닝 프로젝트용 오픈소스 버전 제어 시스템이다. DVC는 git-lfs와 유사하나, 실제 데이터는 remote storage에 저장되고 해당 storage 내 데이터의 위치를 메타데이터에 저장하는 방식이다. 데이터를 가져올 때도 마찬가지로, 메타데이터에서 데이터의 위치를 불러와 remote storage 내 데이터를 조회하고 가져온다. 따라서 데이터셋의 상태는 git 등을 통해 추적되지만 repository는 전체 데이터셋 단위로 적재되지 않아 비교적 가볍게 이용할 수 있다. - 파키덤 (Pachyderm)
파키덤은 쿠버네티스에서 운영하는 오픈 소스 머신러닝 플랫폼이다. 데이터 버전 관리 툴로써 만들어졌지만 현재는 데이터 버전을 기반으로 하는 파이프라인 조정 등 전체 파이프라인을 관리하는 플랫폼으로 확장되었다.
댓글