برنامج تعليمي لمكون دالة 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 في نظام عند التشغيل محليًا ، تحقق للتأكد من أننا نعمل في Colab. يمكن بالطبع ترقية الأنظمة المحلية بشكل منفصل.

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

قم بتثبيت TFX

pip install -U tfx

هل أعدت تشغيل وقت التشغيل؟

إذا كنت تستخدم Google Colab ، في المرة الأولى التي تقوم فيها بتشغيل الخلية أعلاه ، يجب إعادة تشغيل وقت التشغيل (Runtime> Restart runtime ...). هذا بسبب الطريقة التي يقوم بها كولاب بتحميل الحزم.

حزم الاستيراد

نستورد TFX ونتحقق من نسخته.

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

مكونات دالة بايثون المخصصة

في هذا القسم ، سننشئ مكونات من دوال بايثون. لن نقوم بأي مشكلة حقيقية في تعلم الآلة - يتم استخدام هذه الوظائف البسيطة فقط لتوضيح عملية تطوير مكون دالة 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 .