สมุดบันทึกนี้มีตัวอย่างเกี่ยวกับวิธีการเขียนและเรียกใช้ส่วนประกอบฟังก์ชัน 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