Datasets documentation

Pemetaan batch

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

Pemetaan batch

Menggabungkan kegunaan Dataset.map() dengan mode batch sangat ampuh. Hal ini memungkinkan Anda mempercepat pemrosesan dan dengan bebas mengontrol ukuran dataset yang dihasilkan.

Kebutuhan akan kecepatan

Tujuan utama pemetaan batch adalah mempercepat pemrosesan. Sering kali, bekerja dengan batch data lebih cepat daripada dengan contoh tunggal. Secara alami, pemetaan batch cocok untuk tokenisasi. Misalnya, pustaka 🤗 Tokenizers bekerja lebih cepat dengan batch karena memparalelkan tokenisasi dari semua contoh dalam sebuah batch.

Ukuran input != ukuran output

Kemampuan untuk mengontrol ukuran dataset yang dihasilkan dapat dimanfaatkan untuk banyak kasus penggunaan yang menarik. Di bagian memetakan cara, terdapat contoh penggunaan pemetaan batch untuk:

  • Pecah kalimat panjang menjadi potongan yang lebih pendek.
  • Perkaya dataset dengan token tambahan.

Memahami cara kerjanya akan sangat membantu, sehingga Anda dapat menemukan cara Anda sendiri untuk menggunakan pemetaan batch. Pada titik ini, Anda mungkin bertanya-tanya bagaimana cara mengontrol ukuran dataset yang dihasilkan. Jawabannya adalah: fungsi yang dipetakan tidak harus mengembalikan batch output dengan ukuran yang sama.

Dengan kata lain, input fungsi terpetakan Anda dapat berupa batch berukuran N dan mengembalikan batch berukuran M. Output M dapat lebih besar atau lebih kecil dari N. Ini berarti Anda dapat menggabungkan contoh Anda, membaginya, dan bahkan menambahkan lebih banyak contoh!

Namun, ingatlah bahwa semua nilai dalam kamus output harus berisi jumlah elemen yang sama dengan bidang lain dalam kamus output. Jika tidak, tidak mungkin menentukan jumlah contoh dalam output yang dikembalikan oleh fungsi yang dipetakan. Jumlah ini dapat bervariasi antar batch yang diproses secara berurutan oleh fungsi yang dipetakan. Namun, untuk satu batch, semua nilai dalam kamus output harus memiliki panjang yang sama (yaitu, jumlah elemen).

Sebagai contoh, dari dataset dengan 1 kolom dan 3 baris, jika Anda menggunakan map untuk mengembalikan kolom baru dengan jumlah baris dua kali lipat, maka akan muncul error. Dalam kasus ini, Anda akan memiliki satu kolom dengan 3 baris, dan satu kolom dengan 6 baris. Seperti yang dapat Anda lihat, tabel tidak akan valid:

>>> 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'

Untuk membuatnya valid, Anda harus menghapus salah satu kolom:

>>> 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

Sebagai alternatif, Anda dapat menimpa kolom yang sudah ada untuk mencapai hasil yang sama. Sebagai contoh, berikut adalah cara menduplikasi setiap baris dalam dataset dengan menimpa kolom "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