آموزش جز component توابع TFX Python

این نوت بوک حاوی مثال هایی در مورد نحوه نگارش و اجرای مولفه های تابع پایتون در TFX InteractiveContext و در خط لوله TFX با هماهنگی محلی است.

برای بافت ها و اطلاعات بیشتر، نگاه کنید به اجزای عملکرد سفارشی پایتون صفحه در سایت اسناد و مدارک TFX.

برپایی

ابتدا TFX را نصب کرده و ماژول های لازم را وارد می کنیم. TFX به پایتون 3 نیاز دارد.

نسخه پایتون سیستم را بررسی کنید

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

پیپ را ارتقا دهید

برای جلوگیری از ارتقاء Pip در سیستم هنگام اجرای محلی، بررسی کنید که در Colab در حال اجرا هستیم. البته سیستم های محلی را می توان به طور جداگانه ارتقا داد.

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

TFX را نصب کنید

pip install -U tfx

آیا زمان اجرا را مجدداً راه اندازی کردید؟

اگر از Google Colab استفاده می کنید، اولین باری که سلول بالا را اجرا می کنید، باید زمان اجرا را مجدداً راه اندازی کنید (Runtime > Restart runtime ...). این به دلیل روشی است که Colab بسته ها را بارگذاری می کند.

بسته های وارداتی

ما TFX را وارد کرده و نسخه آن را بررسی می کنیم.

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

اجزای تابع پایتون سفارشی

در این بخش کامپوننت هایی از توابع پایتون ایجاد می کنیم. ما هیچ مشکل واقعی ML را انجام نخواهیم داد - این توابع ساده فقط برای نشان دادن فرآیند توسعه مولفه تابع پایتون استفاده می شوند.

مشاهده تابع پایتون راهنمای جزء بر اساس و مدارک بیشتر است.

اجزای سفارشی پایتون را ایجاد کنید

ما با نوشتن تابعی شروع می کنیم که داده های ساختگی تولید می کند. این در فایل ماژول پایتون خودش نوشته شده است.

%%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 .