กวดวิชาองค์ประกอบฟังก์ชัน TFX Python

สมุดบันทึกนี้มีตัวอย่างเกี่ยวกับวิธีการเขียนและเรียกใช้ส่วนประกอบฟังก์ชัน Python ภายใน TFX InteractiveContext และในไปป์ไลน์ TFX ที่ปรับแต่งในเครื่อง

สำหรับบริบทและข้อมูลเพิ่มเติมโปรดดูที่ กำหนดเองหลามส่วนประกอบฟังก์ชั่น หน้าในเว็บไซต์เอกสาร TFX

ติดตั้ง

ก่อนอื่นเราจะติดตั้ง TFX และนำเข้าโมดูลที่จำเป็น TFX ต้องการ Python 3

ตรวจสอบเวอร์ชันของระบบ Python

import sys
sys.version
'3.7.5 (default, Feb 23 2021, 13:22:40) \n[GCC 8.4.0]'

อัพเกรด Pip

เพื่อหลีกเลี่ยงการอัพเกรด Pip ในระบบเมื่อรันในเครื่อง ให้ตรวจสอบว่าเรากำลังทำงานใน Colab แน่นอนว่าระบบในพื้นที่สามารถอัพเกรดแยกกันได้

try:
  import colab
  !pip install --upgrade pip
except:
  pass

ติดตั้ง TFX

pip install -U tfx

คุณรีสตาร์ทรันไทม์หรือไม่

หากคุณกำลังใช้ Google Colab ในครั้งแรกที่คุณเรียกใช้เซลล์ด้านบน คุณต้องเริ่มรันไทม์ใหม่ (รันไทม์ > รีสตาร์ทรันไทม์ ...) นี่เป็นเพราะวิธีที่ Colab โหลดแพ็คเกจ

นำเข้าแพ็คเกจ

เรานำเข้า TFX และตรวจสอบเวอร์ชัน

# Check version
from tfx import v1 as tfx
tfx.__version__
'1.4.0'

ส่วนประกอบฟังก์ชัน Python แบบกำหนดเอง

ในส่วนนี้ เราจะสร้างส่วนประกอบจากฟังก์ชัน Python เราจะไม่ทำปัญหา ML จริง ๆ — ฟังก์ชันง่าย ๆ เหล่านี้ใช้เพื่อแสดงกระบวนการพัฒนาคอมโพเนนต์ของฟังก์ชัน Python

ดู ฟังก์ชั่นหลามคู่มือตามองค์ประกอบ สำหรับเอกสารเพิ่มเติม

สร้างส่วนประกอบที่กำหนดเองของ Python

เราเริ่มต้นด้วยการเขียนฟังก์ชันที่สร้างข้อมูลจำลอง สิ่งนี้ถูกเขียนลงในไฟล์โมดูล Python ของตัวเอง

%%writefile my_generator.py

import os
import tensorflow as tf  # Used for writing files.

from tfx import v1 as tfx

# Non-public APIs, just for showcase.
from tfx.types.experimental.simple_artifacts import Dataset

@tfx.dsl.components.component
def MyGenerator(data: tfx.dsl.components.OutputArtifact[Dataset]):
  """Create a file with dummy data in the output artifact."""
  with tf.io.gfile.GFile(os.path.join(data.uri, 'data_file.txt'), 'w') as f:
    f.write('Dummy data')

  # Set metadata and ensure that it gets passed to downstream components.
  data.set_string_custom_property('my_custom_field', 'my_custom_value')
Writing my_generator.py

ต่อไป เราเขียนองค์ประกอบที่สองที่ใช้ข้อมูลจำลองที่สร้างขึ้น เราจะคำนวณแฮชของข้อมูลและส่งคืน

%%writefile my_consumer.py

import hashlib
import os
import tensorflow as tf

from tfx import v1 as tfx

# Non-public APIs, just for showcase.
from tfx.types.experimental.simple_artifacts import Dataset
from tfx.types.standard_artifacts import String

@tfx.dsl.components.component
def MyConsumer(data: tfx.dsl.components.InputArtifact[Dataset],
               hash: tfx.dsl.components.OutputArtifact[String],
               algorithm: tfx.dsl.components.Parameter[str] = 'sha256'):
  """Reads the contents of data and calculate."""
  with tf.io.gfile.GFile(
      os.path.join(data.uri, 'data_file.txt'), 'r') as f:
    contents = f.read()
  h = hashlib.new(algorithm)
  h.update(tf.compat.as_bytes(contents))
  hash.value = h.hexdigest()

  # Read a custom property from the input artifact and set to the output.
  custom_value = data.get_string_custom_property('my_custom_field')
  hash.set_string_custom_property('input_custom_field', custom_value)
Writing my_consumer.py

เรียกใช้ในโน้ตบุ๊กด้วย InteractiveContext

ตอนนี้ เราจะสาธิตการใช้งานส่วนประกอบใหม่ของเราใน TFX InteractiveContext

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่คุณสามารถทำอะไรกับ TFX โน้ตบุ๊ค InteractiveContext ดูในโน้ตบุ๊ค TFX Keras ตัวแทนกวดวิชา

from my_generator import MyGenerator
from my_consumer import MyConsumer

สร้าง InteractiveContext

# Here, we create an InteractiveContext using default parameters. This will
# use a temporary directory with an ephemeral ML Metadata database instance.
# To use your own pipeline root or database, the optional properties
# `pipeline_root` and `metadata_connection_config` may be passed to
# InteractiveContext. Calls to InteractiveContext are no-ops outside of the
# notebook.
from tfx.orchestration.experimental.interactive.interactive_context import InteractiveContext
context = InteractiveContext()
WARNING:absl:InteractiveContext pipeline_root argument not provided: using temporary directory /tmp/tfx-interactive-2021-12-05T10_37_04.715534-3q0k1y0m as root for pipeline outputs.
WARNING:absl:InteractiveContext metadata_connection_config not provided: using SQLite ML Metadata database at /tmp/tfx-interactive-2021-12-05T10_37_04.715534-3q0k1y0m/metadata.sqlite.

เรียกใช้คอมโพเนนต์ของคุณโต้ตอบกับ context.run()

ต่อไปเราจะใช้องค์ประกอบของเราโต้ตอบภายในโน๊ตบุ๊คที่มี context.run() องค์ประกอบผู้บริโภคของเราใช้ผลลัพธ์ของส่วนประกอบเครื่องกำเนิดไฟฟ้า

generator = MyGenerator()
context.run(generator)
WARNING: Logging before InitGoogleLogging() is written to STDERR
I1205 10:37:04.765872 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
consumer = MyConsumer(
    data=generator.outputs['data'],
    algorithm='md5')
context.run(consumer)
I1205 10:37:04.808555 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type

หลังจากดำเนินการ เราสามารถตรวจสอบเนื้อหาของอาร์ติแฟกต์เอาต์พุต "แฮช" ของคอมโพเนนต์ผู้บริโภคบนดิสก์ได้

tail -v {consumer.outputs['hash'].get()[0].uri}
==> /tmp/tfx-interactive-2021-12-05T10_37_04.715534-3q0k1y0m/MyConsumer/hash/2/value <==
0015fe7975d1a2794b59aa12635703f1

แค่นั้นแหละ และตอนนี้คุณได้เขียนและดำเนินการส่วนประกอบที่คุณกำหนดเองแล้ว!

เขียนนิยามไปป์ไลน์

ต่อไป เราจะสร้างไปป์ไลน์โดยใช้ส่วนประกอบเดียวกันนี้ ขณะที่ใช้ InteractiveContext ภายในโน้ตบุ๊คทำงานได้ดีสำหรับการทดลองกำหนดท่อช่วยให้คุณสามารถปรับใช้ท่อของคุณในนักวิ่งท้องถิ่นหรือระยะไกลสำหรับการใช้งานการผลิต

ที่นี่ เราจะสาธิตการใช้งาน LocalDagRunner ที่ทำงานอยู่ในเครื่องของคุณ สำหรับการดำเนินการผลิต รันเนอร์ Airflow หรือ Kubeflow อาจเหมาะสมกว่า

สร้างไปป์ไลน์

import os
import tempfile
from tfx import v1 as tfx

# Select a persistent TFX root directory to store your output artifacts.
# For demonstration purposes only, we use a temporary directory.
PIPELINE_ROOT = tempfile.mkdtemp()
# Select a pipeline name so that multiple runs of the same logical pipeline
# can be grouped.
PIPELINE_NAME = "function-based-pipeline"
# We use a ML Metadata configuration that uses a local SQLite database in
# the pipeline root directory. Other backends for ML Metadata are available
# for production usage.
METADATA_CONNECTION_CONFIG = tfx.orchestration.metadata.sqlite_metadata_connection_config(
    os.path.join(PIPELINE_ROOT, 'metadata.sqlite'))

def function_based_pipeline():
  # Here, we construct our generator and consumer components in the same way.
  generator = MyGenerator()
  consumer = MyConsumer(
      data=generator.outputs['data'],
      algorithm='md5')

  return tfx.dsl.Pipeline(
      pipeline_name=PIPELINE_NAME,
      pipeline_root=PIPELINE_ROOT,
      components=[generator, consumer],
      metadata_connection_config=METADATA_CONNECTION_CONFIG)

my_pipeline = function_based_pipeline()

เรียกใช้ท่อของคุณด้วย LocalDagRunner

tfx.orchestration.LocalDagRunner().run(my_pipeline)
I1205 10:37:04.983860 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:04.990442 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:04.996665 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:05.003470 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:05.013659 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:05.031374 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:05.048280 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type
I1205 10:37:05.067972 28682 rdbms_metadata_access_object.cc:686] No property is defined for the Type

เราสามารถตรวจสอบสิ่งประดิษฐ์เอาต์พุตที่สร้างขึ้นโดยการดำเนินการไปป์ไลน์นี้

find {PIPELINE_ROOT}
/tmp/tmpydmun02b
/tmp/tmpydmun02b/metadata.sqlite
/tmp/tmpydmun02b/MyConsumer
/tmp/tmpydmun02b/MyConsumer/.system
/tmp/tmpydmun02b/MyConsumer/.system/executor_execution
/tmp/tmpydmun02b/MyConsumer/.system/executor_execution/2
/tmp/tmpydmun02b/MyConsumer/hash
/tmp/tmpydmun02b/MyConsumer/hash/2
/tmp/tmpydmun02b/MyConsumer/hash/2/value
/tmp/tmpydmun02b/MyGenerator
/tmp/tmpydmun02b/MyGenerator/data
/tmp/tmpydmun02b/MyGenerator/data/1
/tmp/tmpydmun02b/MyGenerator/data/1/data_file.txt
/tmp/tmpydmun02b/MyGenerator/.system
/tmp/tmpydmun02b/MyGenerator/.system/executor_execution
/tmp/tmpydmun02b/MyGenerator/.system/executor_execution/1

ตอนนี้คุณได้เขียนส่วนประกอบที่กำหนดเองและจัดการการดำเนินการบน LocalDagRunner แล้ว! สำหรับขั้นตอนต่อไปให้ตรวจสอบเพิ่มเติมบทเรียนและคำแนะนำใน เว็บไซต์ TFX