Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Apache Beam ile büyük veri setleri oluşturma

Bazı veri kümeleri tek bir makinede işlenemeyecek kadar büyük. tfds , Apache Beam kullanarak birçok makinede veri oluşturulmasını destekler.

Bu dokümanın iki bölümü vardır:

  • Mevcut bir Işın veri kümesi oluşturmak isteyen kullanıcılar için
  • Yeni bir Işın veri kümesi oluşturmak isteyen geliştirici için

İçerik tablosu:

Bir Işın veri kümesi oluşturma

Aşağıda, hem bulutta hem de yerel olarak bir Işın veri kümesi oluşturmanın farklı örnekleri verilmiştir.

Google Cloud Dataflow'da

Boru hattını Google Cloud Dataflow'u kullanarak çalıştırmak ve dağıtılmış hesaplamadan yararlanmak için, önce Hızlı Başlangıç ​​talimatlarını izleyin.

Ortamınızın ayarlandıktan sonra, Çalıştırabileceğiniz download_and_prepare üzerindeki bir veri dizinini kullanarak alfabenin GCS ve belirterek gerekli seçenekleri için --beam_pipeline_options bayrak.

Komut dosyasını başlatmayı kolaylaştırmak için, GCP / GCS kurulumunuz için gerçek değerleri ve oluşturmak istediğiniz veri kümesini kullanarak aşağıdaki değişkenleri tanımlamak yararlı olur:

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

Ardından, iş tfds yüklemesi için Dataflow'a bir dosya oluşturmanız gerekir:

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

tfds-nightly kullanıyorsanız, veri kümesinin son sürümden beri güncellenmiş olması durumunda tfds-nightly yankı aldığınızdan emin olun.

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

Son olarak, aşağıdaki komutu kullanarak işi başlatabilirsiniz:

 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"
 

lokal olarak

Komut dosyanızı varsayılan Apache Beam çalıştırıcısını kullanarak yerel olarak çalıştırmak için, komut diğer veri kümeleriyle aynıdır:

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

Özel bir komut dosyasıyla

Beam üzerinde veri kümesini oluşturmak için, API diğer veri kümeleriyle aynıdır, ancak Beam seçeneklerini veya çalıştırıcısını DownloadConfig iletmeniz gerekir.

 # 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,
)
 

Bir Işın veri kümesini uygulama

Ön şartlar

Apache Beam veri kümeleri yazmak için aşağıdaki kavramlara aşina olmalısınız:

Talimatlar

Veri kümesi oluşturma kılavuzuna aşina iseniz, bir Işın veri kümesi eklemek yalnızca birkaç değişiklik gerektirir:

  • DatasetBuilder , tfds.core.BeamBasedBuilder yerine tfds.core.GeneratorBasedBuilder .
  • Işın veri kümeleri soyut yöntem uygulamalıdır _build_pcollection(self, **kwargs) yerine yöntemi _generate_examples(self, **kwargs) . _build_pcollection bir beam.PCollection döndürmelidir. beam.PCollection ile ilişkili örneklerle beam.PCollection .
  • Beam veri kümeniz için birim testi yazmak, diğer veri kümeleriyle aynıdır.

Bazı ek noktalar:

  • Apache tfds.core.lazy_imports içe aktarmak için tfds.core.lazy_imports kullanın. Tembel bir bağımlılık kullanarak, kullanıcılar veri kümesini oluşturulduktan sonra Beam'i yüklemek zorunda kalmadan okuyabilirler.
  • Python kapaklarına dikkat edin. Boru hattını çalıştırırken, beam.Map ve beam.DoFn işlevleri pickle kullanılarak serileştirilir ve tüm çalışanlara gönderilir. Bu hatalar oluşturabilir; örneğin, işlevlerinizde işlev dışında bildirilen değişken bir nesne kullanıyorsanız, pickle hataları veya beklenmeyen davranışlarla karşılaşabilirsiniz. Düzeltme tipik olarak kapalı nesnelerin mutasyona uğramasını önlemek içindir.
  • Beam boru hattında DatasetBuilder üzerinde yöntemlerin kullanılması iyidir. Ancak, sınıfın turşu sırasında serileştirilme şekli, oluşturma sırasında özelliklerde yapılan değişiklikler en iyi şekilde göz ardı edilecektir.

Misal

Bir Beam veri kümesi örneği. Daha karmaşık gerçek bir örnek için Wikipedia veri kümesine bir göz atın.

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

 

Boru hattınızı çalıştırma

Boru hattını çalıştırmak için yukarıdaki bölüme bakın.

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