این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

ایجاد مجموعه داده های بزرگ با پرتوی Apache

برخی از مجموعه داده ها برای پردازش در یک دستگاه واحد بسیار بزرگ هستند. tfds از تولید داده ها در بسیاری از دستگاه ها با استفاده از پرتو Apache پشتیبانی می کند .

این سند دارای دو بخش است:

  • برای کاربرانی که مایل به تولید یک مجموعه داده موجود Beam هستند
  • برای برنامه نویسانی که می خواهند یک مجموعه داده جدید Beam ایجاد کنند

جدول محتویات:

تولید یک مجموعه داده Beam

در زیر مثالهای مختلفی از تولید مجموعه داده Beam ، چه در ابر و چه به صورت محلی وجود دارد.

در Google Cloud Dataflow

برای اجرای خط لوله با استفاده از Google Cloud Dataflow و بهره گیری از محاسبه توزیع شده ، ابتدا دستورالعمل های Quickstart را دنبال کنید.

پس از تنظیم محیط ، می توانید اسکریپت download_and_prepare را با استفاده از یک دایرکتوری داده روی GCS و مشخص کردن گزینه های لازم برای پرچم --beam_pipeline_options .

برای سهولت در اجرای اسکریپت ، تعریف متغیرهای زیر با استفاده از مقادیر واقعی برای تنظیم GCP / GCS و مجموعه داده مورد نظر برای تولید آسان است:

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

پس از آن شما نیاز به ایجاد پرونده ای برای گفتن به tfds برای نصب tfds بر روی کارگران دارید:

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

اگر از tfds-nightly استفاده می کنید ، مطمئن شوید که از tfds-nightly در صورت بروزرسانی مجموعه داده ها از آخرین نسخه ، از tfds-nightly .

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

در آخر ، می توانید کار را با استفاده از دستور زیر راه اندازی کنید:

 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"
 

محلی

برای اجرای اسکریپت به صورت محلی با استفاده از پیشفرض پیشفرض Apache Beam ، دستور همانند سایر مجموعه داده ها است:

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

با یک اسکریپت سفارشی

برای تولید مجموعه داده در Beam ، API همانند سایر مجموعه داده ها است ، اما شما باید گزینه های Beam یا runner را به 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,
)
 

پیاده سازی مجموعه داده Beam

پیش نیازها

برای نوشتن مجموعه داده های Apache Beam ، باید با مفاهیم زیر آشنا باشید:

دستورالعمل ها

اگر با راهنمای ایجاد مجموعه داده آشنا هستید ، اضافه کردن مجموعه داده Beam فقط به چند تغییر نیاز دارد:

  • شما DatasetBuilder از به ارث می برند tfds.core.BeamBasedBuilder جای tfds.core.GeneratorBasedBuilder .
  • مجموعه داده های پرتو باید به جای روش _generate_examples(self, **kwargs) روش انتزاعی _build_pcollection(self, **kwargs) را پیاده سازی کنند. _build_pcollection باید یک _build_pcollection را برگرداند. جمع beam.PCollection با مثال های مرتبط با تقسیم.
  • نوشتن تست واحد برای مجموعه داده Beam همانند سایر مجموعه های داده است.

برخی ملاحظات اضافی:

  • از tfds.core.lazy_imports برای وارد کردن پرتوی Apache استفاده کنید. با استفاده از یک وابستگی تنبل ، کاربران می توانند بعد از تولید بدون نیاز به نصب Beam ، مجموعه داده را بخوانند.
  • مراقب بسته شدن پایتون باشید. هنگام اجرای خط لوله، beam.Map و beam.DoFn توابع با استفاده از مرتب pickle و به تمام کارگران ارسال می شود. این می تواند اشکالات ایجاد کند. به عنوان مثال ، اگر شما در عملکردهای خود از یک شیء قابل تغییر استفاده می کنید که خارج از عملکرد اعلام شده است ، ممکن است با خطاهای pickle یا رفتار غیر منتظره روبرو شوید. این اصلاح معمولاً برای جلوگیری از جهش اشیاء بسته است.
  • استفاده از روش های DatasetBuilder در خط لوله Beam خوب است. با این حال ، نحوه سریال شدن کلاس در طول ترشی ، تغییراتی که در زمان ایجاد ایجاد می شود در بهترین حالت ممکن است نادیده گرفته شود.

مثال

در اینجا نمونه ای از مجموعه داده Beam آورده شده است. برای یک مثال واقعی پیچیده تر ، به مجموعه داده های 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)
    )

 

خط لوله خود را اجرا کنید

برای اجرای خط لوله ، نگاهی به بخش فوق بیندازید.

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