ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

إنشاء مجموعات بيانات كبيرة باستخدام Apache Beam

بعض مجموعات البيانات كبيرة جدًا بحيث لا يمكن معالجتها على جهاز واحد. يدعم tfds توليد البيانات عبر العديد من الأجهزة باستخدام Apache 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 في حالة تحديث مجموعة البيانات منذ الإصدار الأخير.

 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 ، فإن واجهة برمجة التطبيقات هي نفسها كما في مجموعات البيانات الأخرى ، ولكن يجب عليك تمرير خيارات Beam أو العداء إلى 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,
)
 

تنفيذ مجموعة بيانات شعاع

المتطلبات الأساسية

لكتابة مجموعات بيانات Apache Beam ، يجب أن تكون على دراية بالمفاهيم التالية:

تعليمات

إذا كنت على دراية بدليل إنشاء مجموعة البيانات ، فإن إضافة مجموعة بيانات شعاع يتطلب فقط بعض التعديلات:

  • سيرث DatasetBuilder الخاص بك من tfds.core.BeamBasedBuilder بدلاً من tfds.core.GeneratorBasedBuilder .
  • يجب أن تطبق مجموعات بيانات الحزمة الطريقة المجردة _build_pcollection(self, **kwargs) بدلاً من الأسلوب _generate_examples(self, **kwargs) . _build_pcollection يجب أن beam.PCollection مع الأمثلة المرتبطة بالانقسام.
  • كتابة اختبار وحدة لمجموعة بيانات شعاعك هو نفسه كما هو الحال مع مجموعات البيانات الأخرى.

بعض الاعتبارات الإضافية:

  • استخدم tfds.core.lazy_imports لاستيراد Apache Beam. باستخدام تبعية كسولة ، لا يزال بإمكان المستخدمين قراءة مجموعة البيانات بعد إنشائها دون الحاجة إلى تثبيت Beam.
  • كن حذرا مع إغلاق بايثون. عند تشغيل خط الأنابيب، و beam.Map و beam.DoFn وتسلسل الوظائف باستخدام pickle وإرسالها إلى جميع العاملين. هذا يمكن أن يخلق أخطاء. على سبيل المثال ، إذا كنت تستخدم كائنًا قابل للتغيير في وظائفك تم الإعلان عنه خارج الوظيفة ، فقد تواجه أخطاء في pickle أو سلوكًا غير متوقع. عادةً ما يكون الإصلاح لتجنب تحوّل الكائنات المغلقة.
  • استخدام الطرق على DatasetBuilder في خط أنابيب الشعاع جيد. ومع ذلك ، فإن الطريقة التي يتم بها تسلسل الفصل أثناء التخليل ، سيتم تجاهل التغييرات التي تم إجراؤها على الميزات أثناء الإنشاء في أحسن الأحوال.

مثال

فيما يلي مثال لمجموعة بيانات شعاع. للحصول على مثال حقيقي أكثر تعقيدًا ، ألق نظرة على مجموعة بيانات 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