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

캐시

캐시는 🤗 Datasets가 매우 효율적인 이유 중 하나입니다. 이전에 다운로드하고 처리한 데이터셋을 저장해 두므로, 다시 사용해야 할 때 캐시에서 직접 로드합니다. 이를 통해 데이터셋을 처음부터 다시 다운로드하거나 처리 함수를 다시 적용할 필요가 없습니다. Python 세션을 종료하고 다시 시작하더라도 🤗 Datasets는 캐시에서 데이터셋을 직접 로드합니다!

지문

캐시는 데이터셋에 적용된 변환을 어떻게 추적하나요? 🤗 Datasets는 캐시 파일에 지문(fingerprint)을 할당합니다. 지문은 데이터셋의 현재 상태를 추적합니다. 초기 지문은 Arrow 테이블의 해시, 또는 데이터셋이 디스크에 있는 경우 Arrow 파일의 해시를 사용하여 계산됩니다. 이후의 지문은 이전 상태의 지문과 가장 최근에 적용된 변환의 해시를 결합하여 계산됩니다.

Transforms는 Dataset.map() 또는 Dataset.shuffle()와 같은 How-to Process 가이드의 처리 방법 중 하나입니다.

실제 지문은 다음과 같습니다:

>>> from datasets import Dataset
>>> dataset1 = Dataset.from_dict({"a": [0, 1, 2]})
>>> dataset2 = dataset1.map(lambda x: {"a": x["a"] + 1})
>>> print(dataset1._fingerprint, dataset2._fingerprint)
d19493523d95e2dc 5b86abacd4b42434

transform이 해시 가능하려면 dill 또는 pickle로 pickling 가능해야 합니다.

비해시 가능한(non-hashable) 변환을 사용할 때, 🤗 Datasets는 대신 무작위 지문(fingerprint)을 사용하고 경고를 발생시킵니다. 비해시 가능한 변환은 이전 변환과 다르다고 간주됩니다. 그 결과, 🤗 Datasets는 모든 변환을 다시 계산합니다. 이를 피하려면 변환이 pickle 또는 dill로 직렬화(serializable)될 수 있는지 확인하세요!

🤗 Datasets가 모든 것을 다시 계산하는 경우의 예로, 캐싱이 비활성화되어 있을 때를 들 수 있습니다. 이 경우 캐시 파일은 매번 생성되며 임시 디렉토리에 기록됩니다. Python 세션이 종료되면 임시 디렉토리의 캐시 파일은 삭제됩니다. 이러한 캐시 파일에는 지문 대신 무작위 해시가 할당됩니다.

캐싱이 비활성화된 경우, Dataset.save_to_disk()를 사용하여 변환된 데이터셋을 저장해야 합니다. 세션이 종료되면 데이터셋이 삭제됩니다.

해싱

데이터셋의 지문은 map에 전달된 함수와 map 매개변수(batch_size, remove_columns 등)를 해시하여 업데이트됩니다.

fingerprint.Hasher를 사용하여 Python 객체의 해시를 확인할 수 있습니다:

>>> from datasets.fingerprint import Hasher
>>> my_func = lambda example: {"length": len(example["text"])}
>>> print(Hasher.hash(my_func))
'3d35e2b3e94c81d6'

해시는 dill pickler를 사용하여 객체를 덤프한 후, 덤프된 바이트를 해시화하여 계산됩니다. pickler는 함수에서 사용되는 모든 변수를 재귀적으로 덤프하므로, 함수에서 사용되는 객체에 변경 사항을 가하면 해시가 변경됩니다.

함수 중 하나가 세션 간에 동일한 해시를 갖지 않는 것처럼 보인다면, 해당 함수의 변수 중 적어도 하나는 결정론적이지 않은 Python 객체를 포함하고 있음을 의미합니다. 이런 경우, 의심스러운 객체의 해시를 계산해 해시가 변경된 원인이 된 객체를 찾아보시기 바랍니다. 예를 들어, 요소의 순서가 세션 간에 결정론적이지 않은 리스트를 사용하는 경우, 해시 역시 세션 간에 동일하지 않습니다.

Update on GitHub