Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Menghasilkan dataset besar dengan Apache Beam

Beberapa dataset terlalu besar untuk diproses pada satu mesin. tfds mendukung menghasilkan data di banyak mesin dengan menggunakan Apache Beam .

Dokumen ini memiliki dua bagian:

  • Untuk pengguna yang ingin membuat dataset Beam yang ada
  • Untuk pengembang yang ingin membuat dataset Beam baru

Daftar Isi:

Menghasilkan dataset Beam

Di bawah ini adalah beberapa contoh menghasilkan set data Beam, baik di cloud atau secara lokal.

Di Google Cloud Dataflow

Untuk menjalankan pipa menggunakan Google Cloud Dataflow dan memanfaatkan komputasi terdistribusi, pertama-tama ikuti instruksi Quickstart .

Setelah lingkungan Anda diatur, Anda dapat menjalankan skrip download_and_prepare menggunakan direktori data pada GCS dan menentukan opsi yang diperlukan untuk flag --beam_pipeline_options .

Untuk mempermudah peluncuran skrip, sebaiknya tetapkan variabel berikut menggunakan nilai aktual untuk pengaturan GCP / GCS Anda dan dataset yang ingin Anda hasilkan:

 DATASET_NAME=<dataset-name>
DATASET_CONFIG=<dataset-config>
GCP_PROJECT=my-project-id
GCS_BUCKET=gs://my-gcs-bucket
 

Anda kemudian perlu membuat file untuk memberi tahu tfds untuk menginstal tfds pada pekerja:

 echo "tensorflow_datasets[$DATASET_NAME]" > /tmp/beam_requirements.txt
 

Jika Anda menggunakan tfds-nightly , pastikan untuk mengulang dari tfds-nightly jika dataset telah diperbarui sejak rilis terakhir.

 echo "tfds-nightly[$DATASET_NAME]" > /tmp/beam_requirements.txt
 

Akhirnya, Anda dapat meluncurkan pekerjaan menggunakan perintah di bawah ini:

 python -m tensorflow_datasets.scripts.download_and_prepare \
  --datasets=$DATASET_NAME/$DATASET_CONFIG \
  --data_dir=$GCS_BUCKET/tensorflow_datasets \
  --beam_pipeline_options=\
"runner=DataflowRunner,project=$GCP_PROJECT,job_name=$DATASET_NAME-gen,"\
"staging_location=$GCS_BUCKET/binaries,temp_location=$GCS_BUCKET/temp,"\
"requirements_file=/tmp/beam_requirements.txt"
 

Secara lokal

Untuk menjalankan skrip Anda secara lokal menggunakan pelari Apache Beam default, perintahnya sama dengan dataset lainnya:

 python -m tensorflow_datasets.scripts.download_and_prepare \
  --datasets=my_new_dataset
 

Dengan skrip khusus

Untuk menghasilkan dataset pada Beam, API sama dengan set data lain, tetapi Anda harus meneruskan opsi atau runner Beam ke DownloadConfig .

 # If you are running on Dataflow, Spark,..., you may have to set-up runtime
# flags. Otherwise, you can leave flags empty [].
flags = ['--runner=DataflowRunner', '--project=<project-name>', ...]

# To use Beam, you have to set at least one of `beam_options` or `beam_runner`
dl_config = tfds.download.DownloadConfig(
    beam_options=beam.options.pipeline_options.PipelineOptions(flags=flags)
)

data_dir = 'gs://my-gcs-bucket/tensorflow_datasets'
builder = tfds.builder('wikipedia/20190301.en', data_dir=data_dir)
builder.download_and_prepare(
    download_dir=FLAGS.download_dir,
    download_config=dl_config,
)
 

Menerapkan dataset Beam

Prasyarat

Untuk menulis dataset Apache Beam, Anda harus terbiasa dengan konsep-konsep berikut:

Instruksi

Jika Anda terbiasa dengan panduan pembuatan dataset , menambahkan dataset Beam hanya memerlukan beberapa modifikasi:

  • DatasetBuilder Anda akan mewarisi dari tfds.core.BeamBasedBuilder alih-alih tfds.core.GeneratorBasedBuilder .
  • Kumpulan data Beam harus mengimplementasikan metode abstrak _build_pcollection(self, **kwargs) alih-alih metode _generate_examples(self, **kwargs) . _build_pcollection harus mengembalikan beam.PCollection dengan contoh yang terkait dengan pemisahan.
  • Menulis tes unit untuk dataset Beam Anda sama dengan set data lainnya.

Beberapa pertimbangan tambahan:

  • Gunakan tfds.core.lazy_imports untuk mengimpor Apache Beam. Dengan menggunakan ketergantungan yang malas, pengguna masih dapat membaca dataset setelah dihasilkan tanpa harus menginstal Beam.
  • Hati-hati dengan penutupan Python. Saat menjalankan pipa, fungsi beam.Map dan beam.DoFn diserialisasi menggunakan pickle dan dikirim ke semua pekerja. Ini dapat membuat bug; misalnya, jika Anda menggunakan objek yang bisa berubah di fungsi Anda yang telah dinyatakan di luar fungsi, Anda mungkin mengalami kesalahan pickle atau perilaku yang tidak terduga. Cara mengatasinya biasanya untuk menghindari mutasi objek tertutup.
  • Menggunakan metode pada DatasetBuilder dalam pipa Beam baik-baik saja. Namun, cara kelas serial selama acar, perubahan yang dilakukan pada fitur selama pembuatan akan diabaikan.

Contoh

Berikut adalah contoh dataset Beam. Untuk contoh nyata yang lebih rumit, lihat dataset Wikipedia .

 class DummyBeamDataset(tfds.core.BeamBasedBuilder):

  VERSION = tfds.core.Version('1.0.0')

  def _info(self):
    return tfds.core.DatasetInfo(
        builder=self,
        features=tfds.features.FeaturesDict({
            'image': tfds.features.Image(shape=(16, 16, 1)),
            'label': tfds.features.ClassLabel(names=['dog', 'cat']),
        }),
    )

  def _split_generators(self, dl_manager):
    ...
    return [
        tfds.core.SplitGenerator(
            name=tfds.Split.TRAIN,
            gen_kwargs=dict(file_dir='path/to/train_data/'),
        ),
        splits_lib.SplitGenerator(
            name=tfds.Split.TEST,
            gen_kwargs=dict(file_dir='path/to/test_data/'),
        ),
    ]

  def _build_pcollection(self, pipeline, file_dir):
    """Generate examples as dicts."""
    beam = tfds.core.lazy_imports.apache_beam

    def _process_example(filename):
      # Use filename as key
      return filename, {
          'image': os.path.join(file_dir, filename),
          'label': filename.split('.')[1],  # Extract label: "0010102.dog.jpeg"
      }

    return (
        pipeline
        | beam.Create(tf.io.gfile.listdir(file_dir))
        | beam.Map(_process_example)
    )

 

Menjalankan pipa Anda

Untuk menjalankan pipa, lihat bagian di atas.

 python -m tensorflow_datasets.scripts.download_and_prepare \
  --register_checksums \
  --datasets=my_new_dataset