Hub documentation
WebDataset
WebDataset
WebDataset là một thư viện để viết các pipeline I/O cho các bộ dữ liệu lớn. Các tính năng I/O tuần tự và sharding của nó đặc biệt hữu ích để stream các bộ dữ liệu quy mô lớn đến một DataLoader.
Định dạng WebDataset
Một tệp WebDataset là một lưu trữ TAR chứa một loạt các tệp dữ liệu. Tất cả các tệp dữ liệu liên tiếp có cùng tiền tố được coi là một phần của cùng một ví dụ (ví dụ: tệp ảnh/âm thanh và nhãn hoặc siêu dữ liệu của nó):

Nhãn và metadata có thể nằm trong tệp .json, trong tệp .txt (cho chú thích, mô tả), hoặc trong tệp .cls (cho chỉ số lớp).
Một WebDataset quy mô lớn được tạo thành từ nhiều tệp gọi là shards, trong đó mỗi shard là một lưu trữ TAR. Mỗi shard thường có dung lượng ~1GB nhưng toàn bộ bộ dữ liệu có thể lên tới nhiều terabyte!
Hỗ trợ đa phương thức
WebDataset được thiết kế cho các bộ dữ liệu đa phương thức, tức là các bộ dữ liệu hình ảnh, âm thanh và/hoặc video.
Thật vậy, do các tệp phương tiện thường khá lớn, I/O tuần tự của WebDataset cho phép đọc và đệm với kích thước lớn, từ đó mang lại tốc độ nạp dữ liệu tốt nhất.
Dưới đây là danh sách không đầy đủ các định dạng dữ liệu được hỗ trợ:
- image: jpeg, png, tiff
- audio: mp3, m4a, wav, flac
- video: mp4, mov, avi
- other: npy, npz
Danh sách đầy đủ thay đổi theo thời gian và phụ thuộc vào cách triển khai. Ví dụ, bạn có thể tìm thấy các định dạng mà gói webdataset hỗ trợ trong mã nguồn tại đây.
Streaming
Việc phát trực tiếp các tệp lưu trữ TAR nhanh vì nó đọc các khối dữ liệu liên tục. Nó có thể nhanh hơn gấp nhiều lần so với việc đọc các tệp dữ liệu riêng lẻ từng cái một.
WebDataset streaming mang lại hiệu suất cao cả khi đọc từ ổ đĩa và từ bộ nhớ lưu trữ đám mây, khiến nó trở thành định dạng lý tưởng để cung cấp dữ liệu cho một DataLoader:

Ví dụ, đây là cách để stream trực tiếp dataset timm/imagenet-12k-wds từ Hugging Face:
Trước tiên, bạn cần Đăng nhập bằng tài khoản Hugging Face, ví dụ bằng cách sử dụng:
hf auth loginSau đó, bạn có thể stream bộ dữ liệu bằng WebDataset:
>>> import webdataset as wds
>>> from huggingface_hub import get_token
>>> from torch.utils.data import DataLoader
>>> hf_token = get_token()
>>> url = "https://huggingface.co/datasets/timm/imagenet-12k-wds/resolve/main/imagenet12k-train-{{0000..1023}}.tar"
>>> url = f"pipe:curl -s -L {url} -H 'Authorization:Bearer {hf_token}'"
>>> dataset = wds.WebDataset(url).decode()
>>> dataloader = DataLoader(dataset, batch_size=64, num_workers=4)Xáo trộn
Nhìn chung, các bộ dữ liệu ở định dạng WebDataset đã được trộn sẵn và sẵn sàng để nạp vào DataLoader. Tuy nhiên, bạn vẫn có thể trộn lại dữ liệu bằng tính năng trộn xấp xỉ của WebDataset.
Ngoài việc xáo trộn danh sách các shard, WebDataset sử dụng một bộ đệm để xáo trộn tập dữ liệu mà không gây tốn kém về tốc độ:

Để xáo trộn danh sách các tệp phân mảnh và lấy mẫu ngẫu nhiên từ bộ đệm xáo trộn:
>>> buffer_size = 1000
>>> dataset = (
... wds.WebDataset(url, shardshuffle=True)
... .shuffle(buffer_size)
... .decode()
... )