Datasets documentation
Ánh xạ theo lô
Ánh xạ theo lô
Việc kết hợp tiện ích của Dataset.map() với chế độ batch rất mạnh mẽ. Nó cho phép bạn tăng tốc xử lý và tự do kiểm soát kích thước của tập dữ liệu được tạo ra.
Cần tốc độ
Mục tiêu chính của batch mapping là tăng tốc độ xử lý. Trong nhiều trường hợp, việc làm việc với các lô dữ liệu (batches) nhanh hơn so với xử lý từng ví dụ riêng lẻ. Tự nhiên, batch mapping rất phù hợp cho quá trình tokenization. Ví dụ, thư viện 🤗 Tokenizers hoạt động nhanh hơn với các lô dữ liệu vì nó song song hóa quá trình tokenization của tất cả các ví dụ trong một lô.
Kích thước đầu vào != kích thước đầu ra
Khả năng kiểm soát kích thước của tập dữ liệu được tạo ra có thể được tận dụng cho nhiều trường hợp sử dụng thú vị. Trong phần map của hướng dẫn, có các ví dụ về việc sử dụng ánh xạ theo lô để:
- Chia các câu dài thành các đoạn ngắn hơn.
- Bổ sung thêm các token vào bộ dữ liệu.
Việc hiểu cách thức hoạt động của cơ chế này sẽ giúp bạn tự nghĩ ra các cách sử dụng ánh xạ theo lô (batch mapping) của riêng mình. Đến đây, bạn có thể đang tự hỏi làm thế nào để kiểm soát kích thước của bộ dữ liệu được tạo ra. Câu trả lời là: hàm được ánh xạ không nhất thiết phải trả về một lô đầu ra có cùng kích thước.
Nói cách khác, đầu vào của hàm đã ánh xạ của bạn có thể là một batch có kích thước N và trả về một batch có kích thước M. Đầu ra M có thể lớn hơn hoặc nhỏ hơn N. Điều này có nghĩa là bạn có thể nối các ví dụ của mình, chia nhỏ chúng và thậm chí thêm nhiều ví dụ hơn!
Tuy nhiên, hãy nhớ rằng tất cả các giá trị trong từ điển đầu ra phải chứa cùng số lượng phần tử với các trường khác trong từ điển đầu ra. Nếu không, sẽ không thể xác định được số lượng ví dụ trong đầu ra được trả về bởi hàm đã ánh xạ. Số lượng này có thể thay đổi giữa các lô (batch) liên tiếp được xử lý bởi hàm đã ánh xạ. Tuy nhiên, đối với một lô duy nhất, tất cả các giá trị của từ điển đầu ra phải có cùng độ dài (tức là cùng số lượng phần tử).
Ví dụ, từ một tập dữ liệu có 1 cột và 3 hàng, nếu bạn dùng map để trả về một cột mới có số hàng gấp đôi, thì bạn sẽ gặp lỗi.
Trong trường hợp này, bạn sẽ có một cột với 3 hàng và một cột với 6 hàng. Như bạn thấy, bảng sẽ không hợp lệ:
>>> 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'Để hợp lệ, bạn phải bỏ một trong các cột:
>>> 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)
6Ngoài ra, bạn có thể ghi đè lên cột hiện có để đạt được kết quả tương tự.
Ví dụ, đây là cách nhân đôi mọi hàng trong bộ dữ liệu bằng cách ghi đè lên cột "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]