หน้านี้ได้รับการแปลโดย Cloud Translation API
Switch to English

สร้างชุดข้อมูลขนาดใหญ่ด้วย Apache Beam

ชุดข้อมูลบางชุดมีขนาดใหญ่เกินไปที่จะประมวลผลในเครื่องเดียว tfds รองรับการสร้างข้อมูลในหลาย ๆ เครื่องโดยใช้ Apache Beam

เอกสารนี้มีสองส่วน:

  • สำหรับผู้ใช้ที่ต้องการสร้างชุดข้อมูล 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
 

จากนั้นคุณจะต้องสร้างไฟล์เพื่อบอกให้ Dataflow ทำการติดตั้ง 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 Runner เริ่มต้นคำสั่งจะเหมือนกับชุดข้อมูลอื่น:

 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
  • ชุดข้อมูล Beam ควรใช้วิธีนามธรรม _build_pcollection(self, **kwargs) แทน method _generate_examples(self, **kwargs) _build_pcollection ควรส่งคืน beam.PCollection พร้อมกับตัวอย่างที่เกี่ยวข้องกับการแยก
  • การเขียนการทดสอบหน่วยสำหรับชุดข้อมูล Beam ของคุณเหมือนกับชุดข้อมูลอื่น ๆ

ข้อควรพิจารณาเพิ่มเติมบางประการ:

  • ใช้ tfds.core.lazy_imports เพื่อนำเข้า Apache Beam โดยการใช้การพึ่งพาแบบขี้เกียจผู้ใช้ยังคงสามารถอ่านชุดข้อมูลหลังจากที่สร้างขึ้นโดยไม่ต้องติดตั้ง Beam
  • ระวังด้วยการปิด Python เมื่อใช้ท่อที่ 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