TFT를 이용한 데이터 전처리
TFT는 텐서플로우 생태계 내에서 데이터를 전처리하는 라이브러리로, TFDV와 마찬가지로 TFX의 일부이다.
TFT는 이전에 생성한 데이터셋 스키마를 사용하여 파이프라인에 수집된 데이터를 처리하고 다음 두 가지 아티팩트를 출력한다.
- TFRecord 형식의 전처리된 데이터셋:
파이프라인의 Trainer 컴포넌트에서 사용 - 전처리 그래프 (에셋 파일 포함):
머신러닝 모델을 내보낼 때 사용
TFT의 핵심 함수는 preprocessing_fn()으로, 원시 데이터에 적용할 모든 변환을 정의할 수 있다. Transform 컴포넌트를 실행하면 preprocessing_fn은 Tensor 혹은 SparseTensor 형태의 원시 데이터를 받아, 정의된 변환을 적용 후(이때 적용되는 변환은 모두 텐서플로우 작업이어야 한다.) 처리된 데이터를 반환한다.
이러한 과정을 통해 TFT는 전처리 단계의 효율적인 배포를 가능하게 한다.
또한 TFT는 자체적으로 tft.bucketize, tft.compute_and_apply_vocabulary 등 다양한 기능을 제공하기도한다. 이는 뒤에서 다시 보도록 하겠다.
TFT 설치
TFT는 TFX의 일부이기 때문에 TFX를 설치할 때 dependency로 설치가 되었을 것이다. TFT만을 독립적으로 설치하고자 할 경우 다음 명령어를 이용하면 된다.
pip install -q tensorflow-transform
설치가 완료되면 머신러닝 파이프라인에 전처리 단계를 통합할 수 있다.
전처리 전략
preprocessing_fn() 함수에서 변환을 정의한 후, Transform 파이프라인 구성요소나 standalone TFT 설정에서 해당 피처를 사용한다.
import tensorflow_transform as tft
def preprocessing_fn(inputs):
x = inputs['x']
x_normalized = tft.scale_to_0_1(x)
return {
'x_xf': x_normalized
}
해당 함수는 파이썬 딕셔너리를 입력으로 받는다. 키 'x'는 피처의 이름이며, 전처리를 적용하기 전 원시 데이터를 나타내는 값이다.
위에서 사용된 scale_to_0_1은 먼저 데이터 분석을 통해 피처의 최솟값과 최댓값을 결정하고, 이를 이용해 피처 값을 0과 1 사이로 스케일링한다. 기본적으로 데이터는 전체가 전달되어 분석이 수행되지만, 아파치 빔에서는 분산 방식으로 수행할 수 있다.
TFT 내장 함수
TFT는 다양한 내장 함수를 제공하여 효율적인 feature engineering을 지원한다. 이중 어휘 생성, 정규화 등 자주 사용되는 중요한 피처 몇 가지를 살펴보자.
- tft.scale_to_z_score()
평균이 0이고 표준편차가 1인 피처를 정규화할 때 유용하다. - tft.bucketize()
피처를 bin으로 버킷화하며, bin 또는 버킷 인덱스를 반환한다. num_buckets로 버킷 수를 지정할 수 있다. - tft.pca()
특정 피처에 대한 PCA를 수행한다. output_dim으로 PCA 차원을 설정한다. - tft.compute_and_apply_vocabulary()
피처 열의 모든 unique value를 계산 후 최빈값을 인덱스에 매핑한 후 이를 이용해 피처를 숫자 표현으로 변환한다. top_k 혹은 frequency_threshold를 사용하여 최빈값을 검출할 수 있다. - tft.apply_saved_model()
전체 텐서플로우 모델을 피처에 적용하는 함수이다. 저장된 모델을 지정 태그와 signature_name으로 로드하면 피처 값이 입력으로 모델에 전달되고, 모델의 실행 값이 반환된다. - tft.ngrams()
문자열 값의 SparseTensor를 입력으로 하여 n-gram을 생성한다. ngram_range로 n-gram의 범위를 지정하고 separator로 조인 문자열을 지정할 수 있다. - tft.bag_of_words()
tft.ngrams를 사용하여 각 n-gram에 대한 행이 있는 bag-of-words 벡터를 생성한다. - tft.tfidf()
토큰 인덱스가 있는 벡터와 해당 TF-IDF 가중치를 나타내는 벡터를 생성한다. vocab_size로 입력되는 Sparse vector의 치수를 설정한다.
이 외에도 텐서플로우 Text를 사용하면 텍스트 정규화 및 토큰화부터 BERT 등 최신 NLP 모델에 까지 이르는 피처들을 사용할 수 있다.
컴퓨터 비전 문제의 이미지 데이터
컴퓨터 비전에서 사용되는 이미지 데이터 또한 TFT로 전처리될 수 있다. 텐서플로우는 tf.dll과 tf.io와 같은 API를 통해 다양한 이미지 전처리 작업을 제공한다.
tf.dll은 이미지의 간단한 변환(자르기, 회전, 색 조정 등)을 수행하는 피처를 제공하며, tf.io는 이미지를 모델 그래프의 일부로 가져오기에 유용한 피처(tf.io.dll_jpeg 등)를 제공한다.
# 예시 import tensorflow as tf def preprocessing_fn(raw_image): raw_image = tf.reshape(raw_image, [-1]) # JPEG Decoding img_rgb = tf.io.decode_jpeg(raw_image, channels=3) # RGB to Gray img_gray = tf.image.rgb_to_grayscale(img_rgb) img = tf.image.convert_image_dtype(img_gray, tf.float32) # Re-sizing the image to 300*300 resized_img = tf.image.resize_with_pad( img, target_height=300, target_width=300 ) img_grayscale = tf.image.rgb_to_grayscale(resized_img) return tf.reshape(img_grayscale, [-1, 300, 300, 1])
TFT 사용 시 유의사항
TFT로 작업을 할 때 몇 가지 숙지해야 하는 것이 있다.
출력되는 피처를 잘 정의하자.
출력 피처는 다른 곳에서 입력 피처로 사용될 수 있기 때문에, 출력 피처의 데이터 타입은 물론 피처의 이름 등 작은 것까지도 잘 관리하는 것이 필요하다. 또한 Transform 컴포넌트의 콘텍스트에서 preprocessing_fn() 함수의 출력은 Tensor 또는 SparseTensor로 재구성되어야 한다.
텐서플로우의 eager execution 사용을 지양하자.
preprocessing_fn() 함수의 내부 함수는 텐서플로우 내장 함수로 수행되어야 하며, eager execution은 지원되지 않을 수 있다.
'MLOps' 카테고리의 다른 글
TFT를 머신러닝 파이프라인에 통합하기 (0) | 2022.01.08 |
---|---|
TFT 독립 실행형으로 실행하기 (0) | 2022.01.06 |
데이터 전처리 (0) | 2022.01.04 |
머신러닝 파이프라인에 TFDV 통합하기 (0) | 2022.01.03 |
GCP를 사용한 대용량 데이터셋 처리 (0) | 2022.01.02 |
댓글