빌드와 로드

빌드와 로드 (Build and Load)

거의 모든 딥러닝 워크플로는 데이터셋을 불러오는 것에서 시작해요. 그래서 이 단계는 가장 중요한 단계 중 하나죠. 🤗 Datasets에는 NLP 태스크를 시작하는 데 도움이 되는 900개 이상의 데이터셋이 준비되어 있어요. load_dataset()만 호출하면 첫걸음을 뗄 수 있습니다. 이 함수는 우리가 쓰는 모든 데이터셋을 빌드하고 로드해 주는 말 그대로 만능 일꾼이에요.

ELI5: load_dataset

"다섯 살 아이에게 설명하듯" 기본부터 시작해 볼게요.

데이터셋은 다음을 담고 있는 디렉토리예요:

  • 일반적인 형식(JSON, CSV, Parquet, text 등)의 데이터 파일 몇 개
  • README.md라는 이름의 데이터셋 카드. 데이터셋 문서와 더불어 데이터셋 태그·설정을 정의하는 YAML 헤더를 담고 있어요.

load_dataset() 함수는 요청한 데이터셋을 로컬이나 Hugging Face Hub에서 가져와요. Hub는 모든 Hugging Face 데이터셋과 모델이 저장된 중앙 저장소예요.

데이터셋에 데이터 파일만 들어 있다면 load_dataset()이 파일 확장자(json, csv, parquet, txt 등)로부터 데이터 파일을 어떻게 불러올지 자동으로 추론해요. 내부적으로 🤗 Datasets은 데이터 파일 형식에 맞는 DatasetBuilder를 사용해요. 🤗 Datasets에는 데이터 파일 형식별로 빌더가 하나씩 있죠:

데이터셋을 공유하는 방법은 Share 섹션을 읽어보세요.

🤗 Datasets은 원본 URL에서 데이터셋 파일을 다운로드하고, 데이터셋을 생성한 뒤 디스크의 Arrow 테이블에 캐시해요. 이전에 데이터셋을 다운로드한 적이 있다면 🤗 Datasets이 캐시에서 다시 불러오므로 다시 다운로드하는 수고를 덜어줍니다.

이제 데이터셋이 어떻게 빌드되는지 전반적으로 이해했으니, 이 모든 게 어떻게 돌아가는지 좀 더 자세히 들여다볼게요.

데이터셋 빌드

데이터셋을 처음 불러오면 🤗 Datasets이 원시 데이터 파일을 가져와 행과 타입이 있는 열로 이루어진 테이블로 빌드해요. 데이터셋 빌드를 담당하는 주요 클래스는 BuilderConfigDatasetBuilder 두 가지예요.

BuilderConfig

BuilderConfigDatasetBuilder설정(configuration) 클래스예요. BuilderConfig는 데이터셋에 대한 다음 기본 속성들을 담고 있습니다.

속성 설명
name 데이터셋의 짧은 이름.
version 데이터셋 버전 식별자.
data_dir 데이터 파일이 들어 있는 로컬 폴더 경로 저장.
data_files 로컬 데이터 파일 경로 저장.
description 데이터셋 설명.

클래스 레이블 같은 추가 속성을 데이터셋에 더하고 싶다면 기본 BuilderConfig 클래스를 서브클래싱할 수 있어요. BuilderConfig 클래스(또는 서브클래스)의 속성을 채우는 방법은 두 가지예요:

  • DatasetBuilder.BUILDER_CONFIGS() 속성에 미리 정의된 BuilderConfig(또는 서브클래스) 인스턴스 리스트를 제공한다.
  • load_dataset()을 호출할 때 메서드에 특화되지 않은 키워드 인자들은 전부 BuilderConfig 클래스의 관련 속성을 설정하는 데 쓰인다. 특정 설정(configuration)이 선택되면 이 값들이 미리 정의된 속성을 덮어쓴다.

DatasetBuilder.BUILDER_CONFIG_CLASSBuilderConfig의 커스텀 서브클래스로 설정할 수도 있어요.

DatasetBuilder

DatasetBuilderBuilderConfig 안의 모든 속성에 접근해 실제 데이터셋을 빌드해요.

DatasetBuilder에는 세 가지 주요 메서드가 있어요.

  1. DatasetBuilder._info()는 데이터셋 속성을 정의하는 역할을 해요. dataset.info를 호출하면 🤗 Datasets이 여기에 저장된 정보를 반환해요. 마찬가지로 Features도 여기서 지정됩니다. 기억하세요, Features는 데이터셋의 뼈대와 같아요. 각 컬럼의 이름과 타입을 제공해 주거든요.

  2. DatasetBuilder._split_generator는 요청된 데이터 파일을 다운로드하거나 가져오고, split으로 정리하며, 생성 프로세스의 특정 인자들을 정의해요. 이 메서드에는 파일을 다운로드하거나 로컬 파일시스템에서 가져오는 DownloadManager가 있어요. DownloadManager 안에는 원본 데이터 파일 URL의 딕셔너리를 받아 요청한 파일을 다운로드하는 DownloadManager.download_and_extract() 메서드가 있죠. 입력으로 단일 URL·경로, 혹은 URL·경로의 리스트/딕셔너리를 받을 수 있어요. TAR, GZIP, ZIP 같은 압축 파일 형식은 자동으로 해제됩니다.

    파일이 다운로드되면 SplitGenerator가 파일을 split으로 정리해요. SplitGenerator는 split의 이름과 DatasetBuilder._generate_examples 메서드에 제공되는 키워드 인자를 담고 있어요. 키워드 인자는 각 split에 특화될 수 있고, 보통 각 split의 데이터 파일 로컬 경로를 포함합니다.

  3. DatasetBuilder._generate_examples는 split의 데이터 파일을 읽고 파싱해요. 그다음 DatasetBuilder._info()features에 지정된 형식에 따라 데이터셋 예시를 산출(yield)합니다. DatasetBuilder._generate_examples의 입력은 사실 마지막 메서드의 키워드 인자로 제공된 filepath예요.

데이터셋은 모든 데이터를 메모리에 불러오지 않는 파이썬 제너레이터로 생성돼요. 그래서 제너레이터는 큰 데이터셋도 처리할 수 있어요. 다만 생성된 샘플이 디스크의 데이터셋 파일로 플러시되기 전에는 ArrowWriter 버퍼에 저장되는데, 이는 생성된 샘플이 배치 단위로 쓰인다는 뜻이에요. 데이터셋 샘플이 이미지·비디오처럼 메모리를 많이 먹는다면 DatasetBuilderDEFAULT_WRITER_BATCH_SIZE 속성에 낮은 값을 지정해야 해요. 200MB를 넘지 않는 것을 권장합니다.

무결성 유지

load_dataset()은 데이터셋이 완전한지 확인하기 위해 다운로드한 파일에 일련의 검사를 수행해요. 그래야 요청한 데이터셋이 예상대로 생성되지 않을 때 뜻밖의 일을 겪지 않거든요. load_dataset()은 다음을 검증합니다.

  • 생성된 DatasetDict의 split 수.
  • 생성된 DatasetDict의 각 split 내 샘플 수.
  • 다운로드한 파일 목록.
  • 다운로드한 파일의 SHA256 체크섬(기본적으로 비활성화).

데이터셋이 검증을 통과하지 못하면 데이터셋 작성자가 데이터 파일을 뭔가 변경했을 가능성이 높아요.

이 경우 데이터셋이 변경되었다는 것을 알리는 오류가 발생합니다. 이 오류를 무시하려면 load_dataset()verification_mode="no_checks"를 지정하면 돼요. 검증 오류가 보일 때마다 해당 데이터셋의 "Community" 탭에서 토론이나 풀 리퀘스트를 열어 무결성 검사가 갱신되도록 해 주세요.

보안

Hub의 데이터셋 저장소는 악성코드 검사를 거칩니다. 자세한 내용은 여기를 참고하세요.

출처: 공식문서