본문 바로가기
FullStack/50. ML

[BOOK] Building Machine Learning Pipelines #3 데이터 수집

by nakanara 2023. 1. 12.
반응형

O`REILLY Building Machine Learning Pipelines #3. 데이터 수집

 

* 데이터 수집

TFX는 파일이나 서비스에서 데이터를 수집하는 컴포넌트 제공.

  • TFRecord
    대용량 데이터셋 스트리밍에 최적화된 경량 형식, 텐서플로 사용자는 대부분 직렬화된 프로토콜 버퍼를 TFRecord를 통해 일련의 이진 레코드를 저장 (https://www.tensorflow.org/tutorials/load_data/tfrecord)
  • 원격지 데이터 파일 수집

ExmampleGen 컴포넌트를 사용하여 구글 클라우드 스토리지, AWS S3와 같은 원격 클라우드 저장소 버킷에서 파일 읽는 수 있음.

from tfx.components import CsvExampleGen
example_gen = CsvExampleGen(input_base=("gs://example_compliance_data/")
  • 데이터베이스에서 직접 데이터 수집

구글 클라우드 빅쿼리를 통해 수집

from tfx.extensions.google_cloud_big_query.example_gem.component import BizQueryExampleGen

query = """  
SELECT * FROM `<project_id>.<database>.<table_name>`  
"""

example_gen = BigQueryExampleGen(query=query)

 

* 데이터 준비

ExampleGen 컴포넌트를 사용하여 데이터셋 입력 설정과 출력 설정을 구성할 수 있으며, 데이터셋을 점진적으로 수집하려면 스팬(span = 데이터 스냅샷) 구성을 정의하여 관리

  • 데이터셋 스패닝

새로운 데이터가 제공될 때 머신러닝 모델을 업데이트할 수 있는 점은 중요. ExampleGen 컴포넌트를 사용하여 스팬을 데이터 셋 스냅샷을 만드는 프로세스를 구성(ETL), 주기적 데이터 생성 버전 관리

  • 데이터 버전관리

머신러닝에서는 데이터셋 버전 관리 중요, 데용량의 데이터라서 git 통해 하기는 어려움.

머신 러닝 데이터용 버전 관리 도구
- 데이터 버전 제어(DVC): https://dvc.org 머신러닝 프로젝트용 오픈 소스 버전 제어 시스템
- 파키덤: https://www.pachyderm.com 쿠버네티스에서 운영하는 오픈 소스 머신러닝 플랫폼,

* 수집 전략

  • 정형 데이터
    정형 데이터는 데이터베이스나 디스크에 파일 형식으로 저장이 많으며, 데이터양이 수백 메가바이트 이상으로 증가할 때는 TFRecord 파일로 변환하거나, 아파치 파케이로 저장 검토
  • 자연어 처리를 위한 텍스트 데이터
    텍스트 말뭉치는 상당한 크기로 커질 가능성이 있음, 효율적 관리를 위해서는 TFReocrd나 아파치 파케이 포맷으로 변환 관리가 좋음, 데이터베이스에서 말뭉치를 수집할 수도 있지만 데이터량이 커서 네트워크 트래픽 등 문제 발생 가능성
  • 이미지 데이터
    이미지 파일을 TFRecord로 변환해도 좋지만, 이미지 디코딩은 권장하지 않음, 고도로 압축된 이미지를 디코딩하여 tf.Example 레코드를 저장하는 과정에서 필요한 디스크 공간만 증가, 압축한 이미지를 tf.Example 레코드에 바이트 문자열로 저장
# 이미지 데이터 처리

import os  
import tensorflow as tf

base_path = "/path/to/images"  
filenames = os.listdir(base_path)

def generate_label_from_path(image_path):  
    pass  
    # ...

def _bytes_feature(value):  
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value])

def _int64_feature(value):  
    return tf.train.Feature(bytes_list=tf.train.Int64List(value=[value])

tfrecord_filename = 'data/image_dataset.tfrecord'

with tf.io.TFRecordWriter(tfrecord_filename) as writer:  
    for img_path in filenames:  
        image_path = os.path.join(base_path, img_path)  
        try:  
            raw_file = tf.io.read_file(image_path)  
        except FileNotFoundError:  
            print("File {} could not be found".format(image_path))  
            continue  
        example = tf.train.Example(features=tf.train.Features(feature={  
            'image_raw': _bytes_feature(raw_file.numpy()),  
            'label': _int64_feature(generate_label_from_path(image_path))  
        }))

        write.write(example.SerializeToString())

 

* 참고 사이트

Open-source Version Control System for Machine Learning Projects : https://dvc.org

Data-driven pipelines for unstructured data: https://www.pachyderm.com/

반응형