بعض مجموعات البيانات أكبر من أن تتم معالجتها على جهاز واحد. يدعم 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_options
(و 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>', ...]
# `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 ، يجب أن تكون على دراية بالمفاهيم التالية:
- كن على دراية
tfds
إنشاء مجموعة بياناتtfds
لأن معظم المحتوى لا يزال ساريًا على مجموعات بيانات Beam. - احصل على مقدمة حول Apache Beam مع دليل برمجة Beam .
- إذا كنت ترغب في إنشاء مجموعة البيانات الخاصة بك باستخدام Cloud Dataflow ، فاقرأ Google Cloud Documentation ودليل تبعية 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