Datasets documentation
배치 매핑
배치 매핑
Dataset.map()의 유용성을 배치 모드와 결합하면 매우 강력합니다. 이를 통해 처리 속도를 높이고 생성된 데이터셋의 크기를 자유롭게 제어할 수 있습니다.
속도가 필요할 때
배치 매핑의 주요 목적은 처리 속도를 높이는 것입니다. 단일 예시 대신 데이터 배치를 다루는 것이 더 빠른 경우가 많습니다. 자연스럽게, 배치 매핑은 토큰화에 적합합니다. 예를 들어, 🤗 Tokenizers 라이브러리는 배치 내 모든 예시의 토큰화를 병렬화하기 때문에 배치로 작업할 때 더 빠르게 동작합니다.
입력 크기 != 출력 크기
생성된 데이터셋의 크기를 제어할 수 있는 기능은 다양한 흥미로운 사용 사례에 활용할 수 있습니다. map 사용 방법 섹션에는 배치 매핑을 사용하여 다음을 수행하는 예제가 있습니다:
- 긴 문장을 더 짧은 조각으로 나눕니다.
- 데이터셋에 추가 토큰을 추가합니다.
이 동작 원리를 이해하면 batch mapping을 활용하는 다양한 방법을 직접 고안할 수 있습니다. 이 시점에서 생성된 dataset의 크기를 어떻게 제어할 수 있을지 궁금할 수 있습니다. 답은 다음과 같습니다: 매핑된 함수는 동일한 크기의 출력 batch를 반환할 필요가 없습니다.
즉, 매핑된 함수의 입력은 크기가 N인 배치일 수 있으며, 크기가 M인 배치를 반환할 수 있습니다. 출력 M은 N보다 크거나 작을 수 있습니다. 이는 예시를 연결하고, 나누고, 심지어 더 많은 예시를 추가할 수 있음을 의미합니다.
다만, 출력 사전의 모든 값은 출력 사전의 다른 필드와 동일한 개수의 요소를 포함해야 한다는 점을 기억하세요. 그렇지 않으면 매핑된 함수가 반환하는 출력의 예시 수를 정의할 수 없습니다. 매핑된 함수가 처리하는 연속 배치 간에는 이 수가 달라질 수 있습니다. 그러나 단일 배치의 경우, 출력 사전의 모든 값은 동일한 길이(즉, 요소의 개수)를 가져야 합니다.
예를 들어, 1열 3행의 데이터셋에서 map을 사용하여 행 수가 두 배인 새 열을 반환하면 오류가 발생합니다.
이 경우 3행인 열 하나와 6행인 열 하나가 생성됩니다. 보시는 바와 같이 테이블이 유효하지 않게 됩니다:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset.map(lambda batch: {"b": batch["a"] * 2}, batched=True) # new column with 6 elements: [0, 1, 2, 0, 1, 2]
'ArrowInvalid: Column 1 named b expected length 3 but got length 6'유효하게 만들려면 컬럼 중 하나를 제거해야 합니다:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset_with_duplicates = dataset.map(lambda batch: {"b": batch["a"] * 2}, remove_columns=["a"], batched=True)
>>> len(dataset_with_duplicates)
6대신 기존 열을 덮어써서 동일한 결과를 얻을 수도 있습니다.
예를 들어, 열 "a"를 덮어써 데이터셋의 모든 행을 복제하는 방법은 다음과 같습니다:
>>> from datasets import Dataset
>>> dataset = Dataset.from_dict({"a": [0, 1, 2]})
# overwrites the existing "a" column with duplicated values
>>> duplicated_dataset = dataset.map(
... lambda batch: {"a": [x for x in batch["a"] for _ in range(2)]},
... batched=True
... )
>>> duplicated_dataset
Dataset({
features: ['a'],
num_rows: 6
})
>>> duplicated_dataset["a"]
[0, 0, 1, 1, 2, 2]