TFX Python işlev bileşeni öğreticisi

Bu not defteri, TFX InteractiveContext içinde ve yerel olarak düzenlenmiş bir TFX ardışık düzeninde Python işlev bileşenlerinin nasıl yazılacağına ve çalıştırılacağına ilişkin bir örnek içerir.

Daha fazla içerik ve bilgi için bkz Özel Python fonksiyon bileşenleri TFX dokümantasyon sitesinde sayfa.

Kurmak

Önce TFX'i yükleyeceğiz ve gerekli modülleri içe aktaracağız. TFX, Python 3 gerektirir.

Sistem Python sürümünü kontrol edin

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

Pip'i Yükselt

Yerel olarak çalışırken bir sistemde Pip'i yükseltmekten kaçınmak için Colab'da çalıştığımızdan emin olun. Yerel sistemler elbette ayrı ayrı yükseltilebilir.

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

TFX'i yükleyin

pip install -U tfx

Çalışma zamanını yeniden başlattınız mı?

Google Colab kullanıyorsanız, yukarıdaki hücreyi ilk kez çalıştırdığınızda, çalışma zamanını yeniden başlatmanız gerekir (Çalışma Zamanı > Çalışma zamanını yeniden başlat...). Bunun nedeni Colab'ın paketleri yükleme şeklidir.

Paketleri içe aktar

TFX'i içe aktarıyoruz ve sürümünü kontrol ediyoruz.

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

Özel Python işlevi bileşenleri

Bu bölümde Python işlevlerinden bileşenler oluşturacağız. Gerçek bir ML problemi yapmayacağız - bu basit fonksiyonlar sadece Python fonksiyon bileşeni geliştirme sürecini göstermek için kullanılır.

Bkz Python fonksiyonu tabanlı bileşen rehber daha fazla belge için.

Python özel bileşenleri oluşturun

Bazı yapay veriler üreten bir fonksiyon yazarak başlıyoruz. Bu, kendi Python modül dosyasına yazılır.

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

Ardından, üretilen yapay verileri kullanan ikinci bir bileşen yazıyoruz. Sadece verilerin hash değerini hesaplayıp geri göndereceğiz.

%%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 ile dizüstü bilgisayarda çalıştırın

Şimdi, TFX InteractiveContext'te yeni bileşenlerimizin kullanımını göstereceğiz.

Eğer TFX notebook InteractiveContext ile yapabilecekleriniz hakkında daha fazla bilgi için in-notebook bkz TFX Keras Bileşen Eğitimi .

from my_generator import MyGenerator
from my_consumer import MyConsumer

InteractiveContext'i oluşturun

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

İle etkileşimli bileşeni Run context.run()

Sonra, birlikte dizüstü dahilinde interaktif bizim bileşenleri çalıştırmak context.run() . Tüketici bileşenimiz, jeneratör bileşeninin çıktılarını kullanır.

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

Yürütmeden sonra, diskteki tüketici bileşeninin "karma" çıktı yapaylığının içeriğini inceleyebiliriz.

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

İşte bu kadar ve şimdi kendi özel bileşenlerinizi yazdınız ve uyguladınız!

Bir işlem hattı tanımı yazın

Ardından, aynı bileşenleri kullanarak bir işlem hattı yazacağız. Kullanırken InteractiveContext bir defter içinde deney için iyi çalışıyor, bir boru hattı tanımlayan Eğer üretim kullanımı için yerel veya uzak rayları üzerinde boru hattını dağıtmasına olanak tanır.

Burada, makinenizde yerel olarak çalışan LocalDagRunner'ın kullanımını göstereceğiz. Üretim uygulaması için Airflow veya Kubeflow rayları daha uygun olabilir.

Bir boru hattı inşa et

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()

İle boru hattı çalıştırın 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

Bu işlem hattı yürütmesi tarafından oluşturulan çıktı yapılarını inceleyebiliriz.

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

Artık kendi özel bileşenlerinizi yazdınız ve bunların yürütülmesini LocalDagRunner'da düzenlediniz! Bir sonraki adımlar için ek dersler ve kılavuzları kontrol TFX web .