load_dataset('dataset', streaming=True) 를 사용하여 다운로드 없이 스트리밍 데이터를 한 줄의 코드만으로 가능하게 하여 성능을 크게 향상시켰습니다! 멀티 테라바이트 (multi-TB) 데이터셋에서 즉시 훈련 시작, 복잡한 설정 없이, 다운로드 없이, 디스크 공간 부족 (
Parquet prefetching: Parquet 데이터셋을 위한 prefetching 을 활성화했습니다. 이는 모델이 현재 데이터 청크를 처리하는 동안, 데이터셋 라이브러리가 배경에서 다음 청크를 이미 가져오고 있음을 의미합니다. 이는 데이터 파이프라인을 가득 차게 유지하고 GPU 가 데이터에 대한 대기 없이 작동하도록 보장합니다.
Configurable Buffering: 고급 사용자는 이제 자신의 특정 하드웨어 및 네트워크 설정에 맞게 스트리밍 성능을 미세 조정할 수 있습니다. 우리는 버퍼의 블록 크기 및 prefetch volume 을 구성할 옵션을 노출하여 I/O 를 최적화하기 위해 최대 제어권을 제공합니다.
이것이 스트리밍에서 기본값인 32MiB 에서 128MiB 로 최소 요청 크기를 증가시키고 prefetching 을 구성하는 방법입니다:
import pyarrow
import pyarrow.dataset
fragment_scan_options = pyarrow.dataset.ParquetFragmentScanOptions(
...
이러한 개선 사항들은 데이터 전송량을 두 배로 늘릴 수 있으며, 더 빠르고 효율적으로 훈련할 수 있게 합니다.
Hugging Face 는 Xet 을 사용합니다: 이는 빠른 중복 제거 업로드 및 다운로드를 가능하게 하는 중복 기반 저장소입니다. 기존 원격 저장소와 달리, Xet 에서 데이터 전송은 중복된 데이터가 한 번만 전송되므로 더 빠릅니다. 예를 들어: 대규모 데이터셋을 Hugging Face 에 업로드하는 것은 Xet 을 활용하여 업로드 속도를 가속화합니다. 데이터셋이 업로드되면 즉시 스트리밍할 수 있습니다.
Parquet CDC 를 통해 Parquet 의 중복 제거가 활성화됩니다. Parquet CDC 와 Xet 중복 제거 덕분에 Hugging Face 에서 데이터셋을 업로드하는 것은 기존 원격 저장소보다 더 빠릅니다.
이는 pyspark_huggingface 패키지를 통해 지원되며, 이는 HF 데이터셋을 읽기/쓰기 위한 Spark 데이터 소스입니다. 이에는 Parquet CDC 와 Xet 지원이 포함되어 있어 HF 의 데이터 전송을 급격히 가속화합니다.
일부 데이터 파일 형식은 datasets 에서 지원되지 않으며, 때로는 더 많은 제어권이 필요하므로 커스텀 스트리밍 파이프라인을 구축하는 것이 쉬워졌습니다. 이는 LeRobot 라이브러리에서 비디오 프레임을 샘플링하고 WebDataset 라이브러리에서 TAR 아카이브를 스트리밍하는 데 battle-tested 되었습니다.
우리는 huggingface_hub 라이브러리의 HfFileSystem 를 효율적으로 원격 Hugging Face 데이터셋 저장소에서 파일을 읽기 위해 데이터를 스트리밍하도록 개선했습니다:
from huggingface_hub import HfFileSystem
path = f"hf://datasets/{dataset_id}/{path_in_repo}"
with HfFileSystem().open(path) as f:
...
HfFileSystem 를 torch DataLoader 에 전달하면 .ls() 와 .glob() 에서 캐시된 결과를 재사용하여 데이터 파일을 나열할 때 추가 요청이 필요 없게 됩니다.
우리는 이제 nanoVLM 에서 다음 세대의 SmolVLMs 를 훈련하기 위해 이러한 스트리밍 향상 기능을 사용합니다. 이러한 튜닝으로, 우리는 클러스터의 계층적 하드 디스크 설정에서 스트리밍보다 더 나은 성능을 달성합니다. 사실, 스트리밍은 이제 로컬 SSD 에서 데이터를 읽는 것과 같은 속도로 빨라졌습니다! 이전에는 데이터 전송이 훈련을 3 시간 지연시키는 과정이었습니다. 자세한 내용은 GitHub 를 확인하세요.
이러한 강력한 새로운 기능은 datasets 와 huggingface_hub 라이브러리에 구현되었습니다. 이들을 활용하려면 라이브러리를 업데이트하고 문서를 확인하세요:
pip install --upgrade datasets huggingface_hub
이를 기념하기 위해, 우리는 FineVision 에서 모든 데이터 소스를 preconcatenated 및 shuffled 하여 FineVisionMax 로 만들었습니다. 이를 사용하여 VLM 을 훈련할 수 있습니다 - 여러 데이터셋을 수동으로 처리할 필요가 없습니다!
from datasets import load_dataset
데이터셋을 다운로드하는 대신 스트리밍으로 전송
dataset = load_dataset("HuggingFaceM4/FineVisionMax", split="train", streaming=True)
...
nanoVLM 에서 대규모로 어떻게 수행되는지 확인해 보세요!
스트리밍을 즐기세요! 🤗