인공지능/Tensorflow Extended

[살아 움직이는 머신러닝 파이프라인 설계] 3. 데이터 수집

데이터 수집

데이터 수집이란 외부나 내부 파일에서 학습할 데이터를 모으는 단계다. 다양한 곳에서 데이터를 수집해 이를 데이터가 tf.train.Example로 표현된 TFRecord 파일 형식으로 변환한다. tf.train.Example은 한 데이터의 특성(feature)값이 저장된 배열 텐서를 말한다. 일종의 텐서이므로 텐서 플로우로 만들어진 모델이 학습하거나 예측할 수 있다.

ExampleGen

ExampleGen은 이 데이터 수집 단계를 책임지는 TFX 컴포넌트다. 데이터 수집부터 데이터셋 분할, 데이터셋 스패닝까지 처리할 수 있다.

데이터 수집

데이터는 꽤 다양한 곳에서 수집할 수 있다. 내부 파일을 직접 다운로드한 다음 이를 파이프라인으로 가져오는 방식부터 클라우드 스토리지나 데이터베이스에서 네트워크를 통해 직접 가져오는 방법까지 지원한다.
내부 파일에서 데이터를 수집한다면 해당 파일의 형식을 확인해야 한다. 일반적으로 자주 사용되는 CSV 파일부터 TFRecord 파일, Apache Arvo를 통해 직렬화한 파일까지 사용할 수 있다. 사용자가 직접 고안한 파일 형식도 ExampleGen의 실행자를 수정하는 방식으로 데이터를 불러오는 방식을 전달할 수 이다.
구글 클라우드 스토리지나 AWS S3와 같은 원격 클라우드 스토리지에서도 데이터를 직접 가져올 수 있다. 해당 클라우드 스토리지의 계정 정보를 작성하면 이를 통해 편하게 데이터를 받아올 수 있다.
마지막으로 구글 클라우드 빅쿼리나 프레스토처럼 데이터베이스에서도 가져올 수 있다. 이때 ExampleGen은 사용자가 지정한 쿼리문을 바탕으로 데이터를 가져오게 된다.

데이터셋 분할

데이터가 충분히 쌓였다면 해당 데이터 뭉치를 학습용, 검증용, 테스트용으로 분리할 수 있어야 한다. 이때 데이터셋을 분할하는 두가지 방법이 있는데, 첫번째는 데이터를 수집해 모아온 데이터를 ExampleGen의 output_conf를 통해 조절할 수 있다. 만약 가져온 데이터셋이 이미 학습용과 테스트용으로 분리되어 있다면 input_conf를 통해 전달하여 분리된 상태로 가져온다.

데이터셋 스패닝

데이터는 일정 시간동안만 수집하지 않는다. 계속 실시간으로 모으다보면 1시간, 1일, 1주일마다 새로운 데이터가 쌓인다. 그렇기 때문에 데이터를 수집하고 나서 데이터셋 스패닝을 통해 시간대별로 가져온 데이터를 분리한다. 예를 들어, 맨 처음 수집한 데이터를 span-0에 저장되어 있고 이 이후로 수집한 새로운 데이터는 span-0의 데이터와 함께 span-1로 묶기게 된다. ExampleGen은 이렇게 모인 스펜들 중 가장 최신의 스펜을 가져온다.

데이터셋 버전관리

데이터셋이 달라진다면 이를 학습한 데이터에 영향을 끼친다. 그렇기 때문에 데이터셋과 해당 데이터로 학습한 모델을 하나로 묶고 추적해야한다. 하지만 아쉽게도 TFX에는 데이터셋 버전관리 기능을 도입하지 않았다. 대신 책에서는 DVC나 파키덤과 같은 외부 도구를 권장한다.
하지만 0.24 버전에서는 ExampleGen에 Version 기능이 추가되었는데 이는 기존 스펜에서 데이터 정제를 이유로 데이터를 변환하거나 삭제한 경우 수정 전 데이터셋과 구분하기 위해 사용하는 것 같다.

데이터 수집 전략

수집하는 데이터들도 종류에 따라 유리한 수집 방식이 존재한다. 다양한 데이터 종류들 중에서도 정형 데이터, 자연어 텍스트, 이미지의 경우로 나눠 Best Practice를 확인한다.
정형 데이터의 경우 특성값을 가진 리스트이므로 간단한 표형태로는 CSV 파일로, 그 외의 경우에는 TFRecord나 Apache Avro로 저장해 불러올 수 있다.
자연어 텍스트의 경우에는 졍헝 데이터보다 데이터셋 크기가 크기 때문에 문자열들을 바이트 열로 변환한 TFRecord로 저장해두는 편이 좋다. 물론 데이터베이스에 저장한 후 불러올 수 있지만 네트워크를 통하는 방식인 만큼 트래픽 제한 문제가 발생하는지 확인해야 한다.
마지막으로 이미지의 경우에는 파일 그대로 이진화한 후 TFRecord에 저장하는 방식을 추천한다. 여기서 주의할 점은 이미지 디코딩은 거치지 않는 편이 낫다. 압축된 이미지를 디코딩하면 저장하는 데 필요한 용량이 늘어날 뿐, 이로 인해 얻는 혜택은 작은 편이다. 그렇기 때문에 바이트열로 저장해둔다.