빌드와 로드
빌드와 로드 (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에는 데이터 파일 형식별로 빌더가 하나씩 있죠:
- 텍스트용 datasets.packaged_modules.text.Text
- CSV·TSV용 datasets.packaged_modules.csv.Csv
- JSON·JSONL용 datasets.packaged_modules.json.Json
- Parquet용 datasets.packaged_modules.parquet.Parquet
- Arrow(스트리밍 파일 형식)용 datasets.packaged_modules.arrow.Arrow
- SQL 데이터베이스용 datasets.packaged_modules.sql.Sql
- 이미지 폴더용 datasets.packaged_modules.imagefolder.ImageFolder
- 오디오 폴더용 datasets.packaged_modules.audiofolder.AudioFolder
데이터셋을 공유하는 방법은 Share 섹션을 읽어보세요.
🤗 Datasets은 원본 URL에서 데이터셋 파일을 다운로드하고, 데이터셋을 생성한 뒤 디스크의 Arrow 테이블에 캐시해요. 이전에 데이터셋을 다운로드한 적이 있다면 🤗 Datasets이 캐시에서 다시 불러오므로 다시 다운로드하는 수고를 덜어줍니다.
이제 데이터셋이 어떻게 빌드되는지 전반적으로 이해했으니, 이 모든 게 어떻게 돌아가는지 좀 더 자세히 들여다볼게요.
데이터셋 빌드
데이터셋을 처음 불러오면 🤗 Datasets이 원시 데이터 파일을 가져와 행과 타입이 있는 열로 이루어진 테이블로 빌드해요. 데이터셋 빌드를 담당하는 주요 클래스는 BuilderConfig와 DatasetBuilder 두 가지예요.
BuilderConfig
BuilderConfig는 DatasetBuilder의 설정(configuration) 클래스예요. BuilderConfig는 데이터셋에 대한 다음 기본 속성들을 담고 있습니다.
| 속성 | 설명 |
|---|---|
name |
데이터셋의 짧은 이름. |
version |
데이터셋 버전 식별자. |
data_dir |
데이터 파일이 들어 있는 로컬 폴더 경로 저장. |
data_files |
로컬 데이터 파일 경로 저장. |
description |
데이터셋 설명. |
클래스 레이블 같은 추가 속성을 데이터셋에 더하고 싶다면 기본 BuilderConfig 클래스를 서브클래싱할 수 있어요. BuilderConfig 클래스(또는 서브클래스)의 속성을 채우는 방법은 두 가지예요:
DatasetBuilder.BUILDER_CONFIGS()속성에 미리 정의된 BuilderConfig(또는 서브클래스) 인스턴스 리스트를 제공한다.- load_dataset()을 호출할 때 메서드에 특화되지 않은 키워드 인자들은 전부 BuilderConfig 클래스의 관련 속성을 설정하는 데 쓰인다. 특정 설정(configuration)이 선택되면 이 값들이 미리 정의된 속성을 덮어쓴다.
DatasetBuilder.BUILDER_CONFIG_CLASS를 BuilderConfig의 커스텀 서브클래스로 설정할 수도 있어요.
DatasetBuilder
DatasetBuilder는 BuilderConfig 안의 모든 속성에 접근해 실제 데이터셋을 빌드해요.
DatasetBuilder에는 세 가지 주요 메서드가 있어요.
-
DatasetBuilder._info()는 데이터셋 속성을 정의하는 역할을 해요.dataset.info를 호출하면 🤗 Datasets이 여기에 저장된 정보를 반환해요. 마찬가지로 Features도 여기서 지정됩니다. 기억하세요, Features는 데이터셋의 뼈대와 같아요. 각 컬럼의 이름과 타입을 제공해 주거든요. -
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의 데이터 파일 로컬 경로를 포함합니다. -
DatasetBuilder._generate_examples는 split의 데이터 파일을 읽고 파싱해요. 그다음DatasetBuilder._info()의features에 지정된 형식에 따라 데이터셋 예시를 산출(yield)합니다.DatasetBuilder._generate_examples의 입력은 사실 마지막 메서드의 키워드 인자로 제공된filepath예요.
데이터셋은 모든 데이터를 메모리에 불러오지 않는 파이썬 제너레이터로 생성돼요. 그래서 제너레이터는 큰 데이터셋도 처리할 수 있어요. 다만 생성된 샘플이 디스크의 데이터셋 파일로 플러시되기 전에는 ArrowWriter 버퍼에 저장되는데, 이는 생성된 샘플이 배치 단위로 쓰인다는 뜻이에요. 데이터셋 샘플이 이미지·비디오처럼 메모리를 많이 먹는다면 DatasetBuilder의 DEFAULT_WRITER_BATCH_SIZE 속성에 낮은 값을 지정해야 해요. 200MB를 넘지 않는 것을 권장합니다.
무결성 유지
load_dataset()은 데이터셋이 완전한지 확인하기 위해 다운로드한 파일에 일련의 검사를 수행해요. 그래야 요청한 데이터셋이 예상대로 생성되지 않을 때 뜻밖의 일을 겪지 않거든요. load_dataset()은 다음을 검증합니다.
- 생성된
DatasetDict의 split 수. - 생성된
DatasetDict의 각 split 내 샘플 수. - 다운로드한 파일 목록.
- 다운로드한 파일의 SHA256 체크섬(기본적으로 비활성화).
데이터셋이 검증을 통과하지 못하면 데이터셋 작성자가 데이터 파일을 뭔가 변경했을 가능성이 높아요.
이 경우 데이터셋이 변경되었다는 것을 알리는 오류가 발생합니다. 이 오류를 무시하려면 load_dataset()에 verification_mode="no_checks"를 지정하면 돼요. 검증 오류가 보일 때마다 해당 데이터셋의 "Community" 탭에서 토론이나 풀 리퀘스트를 열어 무결성 검사가 갱신되도록 해 주세요.
보안
Hub의 데이터셋 저장소는 악성코드 검사를 거칩니다. 자세한 내용은 여기를 참고하세요.
출처: 공식문서