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

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

بعض مجموعات البيانات أكبر من أن تتم معالجتها على جهاز واحد. يدعم tfds البيانات عبر العديد من الأجهزة باستخدام Apache Beam .

يحتوي هذا المستند على قسمين:

  • للمستخدم الذي يريد إنشاء مجموعة بيانات شعاع موجودة
  • للمطورين الذين يرغبون في إنشاء مجموعة بيانات Beam جديدة

إنشاء مجموعة بيانات الحزمة

فيما يلي أمثلة مختلفة لإنشاء مجموعة بيانات Beam ، سواء على السحابة أو محليًا.

على Google Cloud Dataflow

لتشغيل خط الأنابيب باستخدام Google Cloud Dataflow والاستفادة من الحساب الموزع ، اتبع أولاً تعليمات Quickstart .

بمجرد إعداد بيئتك ، يمكنك تشغيل tfds build CLI باستخدام دليل بيانات على 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

أخيرًا ، يمكنك بدء المهمة باستخدام الأمر أدناه:

tfds build $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 الافتراضي ، يكون الأمر هو نفسه بالنسبة لمجموعات البيانات الأخرى:

tfds build my_dataset

مع نص مخصص

لإنشاء مجموعة البيانات على Beam ، تكون واجهة برمجة التطبيقات هي نفسها لمجموعات البيانات الأخرى. يمكنك تخصيص beam.Pipeline خط beam.Pipeline باستخدام beam_optionsbeam_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>', ...]

# `beam_options` (and `beam_runner`) will be forwarded to `beam.Pipeline`
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_config=dl_config)

تنفيذ مجموعة بيانات الحزمة

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

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

تعليمات

إذا كنت معتادًا على دليل إنشاء مجموعة البيانات ، فإن إضافة مجموعة بيانات Beam لا تتطلب سوى تعديل وظيفة _generate_examples . يجب أن تقوم الوظيفة بإرجاع كائن شعاع بدلاً من مولد:

مجموعة البيانات غير الشعاعية:

def _generate_examples(self, path):
  for f in path.iterdir():
    yield _process_example(f)

مجموعة بيانات الشعاع:

def _generate_examples(self, path):
  return (
      beam.Create(path.iterdir())
      | beam.Map(_process_example)
  )

يمكن أن يكون الباقي متطابقًا بنسبة 100٪ ، بما في ذلك الاختبارات.

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

  • استخدم tfds.core.lazy_imports لاستيراد حزمة Apache. باستخدام التبعية البطيئة ، لا يزال بإمكان المستخدمين قراءة مجموعة البيانات بعد إنشائها دون الحاجة إلى تثبيت Beam.
  • كن حذرًا مع عمليات إغلاق بايثون. عند تشغيل خط الأنابيب ، يتم beam.Map ، beam.DoFn beam.Map ، وظائف beam.DoFn باستخدام pickle وإرسالها إلى جميع العمال. لا تقم beam.PTransform الكائنات داخل beam.PTransform ، قم beam.PTransform إذا كان يجب مشاركة الحالة بين العمال.
  • نظرًا لطريقة تسلسل tfds.core.DatasetBuilder باستخدام مخلل ، سيتم تجاهل tfds.core.DatasetBuilder أثناء إنشاء البيانات على العمال (على سبيل المثال ، لا يمكن تعيين self.info.metadata['offset'] = 123 في _split_generators والوصول إليها من العاملين مثل beam.Map(lambda x: x + self.info.metadata['offset']) )
  • إذا كنت بحاجة إلى مشاركة بعض خطوات خط الأنابيب بين الانقسامات ، فيمكنك إضافة pipeline: beam.Pipeline إضافي pipeline: beam.Pipeline kwarg إلى _split_generator والتحكم في خط أنابيب التوليد الكامل. انظر _generate_examples توثيق tfds.core.GeneratorBasedBuilder .

مثال

فيما يلي مثال على مجموعة بيانات Beam.

class DummyBeamDataset(tfds.core.GeneratorBasedBuilder):

  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 {
        'train': self._generate_examples(file_dir='path/to/train_data/'),
        'test': self._generate_examples(file_dir='path/to/test_data/'),
    }

  def _generate_examples(self, file_dir: str):
    """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 (
        beam.Create(tf.io.gfile.listdir(file_dir))
        | beam.Map(_process_example)
    )

تشغيل خط الأنابيب الخاص بك

لتشغيل خط الأنابيب ، ألق نظرة على القسم أعلاه.

tfds build my_dataset --register_checksums