Datasets documentation

배치 매핑

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

배치 매핑

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]
Update on GitHub