Tutorial komponen fungsi TFX Python

Notebook ini berisi contoh tentang cara membuat dan menjalankan komponen fungsi Python dalam TFX InteractiveContext dan dalam pipeline TFX yang diatur secara lokal.

Untuk lebih banyak konteks dan informasi, lihat Kustom Python komponen fungsi halaman di situs dokumentasi TFX.

Mempersiapkan

Kami pertama-tama akan menginstal TFX dan mengimpor modul yang diperlukan. TFX membutuhkan Python 3.

Periksa versi sistem Python

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

Tingkatkan Pip

Untuk menghindari mengupgrade Pip di sistem saat berjalan secara lokal, periksa untuk memastikan bahwa kami berjalan di Colab. Sistem lokal tentu saja dapat ditingkatkan secara terpisah.

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

Instal TFX

pip install -U tfx

Apakah Anda me-restart runtime?

Jika Anda menggunakan Google Colab, pertama kali menjalankan sel di atas, Anda harus memulai ulang runtime (Runtime > Restart runtime ...). Ini karena cara Colab memuat paket.

paket impor

Kami mengimpor TFX dan memeriksa versinya.

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

Komponen fungsi Python khusus

Pada bagian ini, kita akan membuat komponen dari fungsi Python. Kami tidak akan melakukan masalah ML yang sebenarnya — fungsi sederhana ini hanya digunakan untuk mengilustrasikan proses pengembangan komponen fungsi Python.

Lihat fungsi Python berdasarkan panduan komponen untuk dokumentasi lebih.

Buat komponen kustom Python

Kita mulai dengan menulis sebuah fungsi yang menghasilkan beberapa data dummy. Ini ditulis ke file modul Python-nya sendiri.

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

Selanjutnya, kita menulis komponen kedua yang menggunakan data dummy yang dihasilkan. Kami hanya akan menghitung hash data dan mengembalikannya.

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

Jalankan di notebook dengan InteractiveContext

Sekarang, kami akan mendemonstrasikan penggunaan komponen baru kami di TFX InteractiveContext.

Untuk informasi lebih lanjut tentang apa yang dapat Anda lakukan dengan notebook TFX InteractiveContext, lihat di-notebook TFX Keras Komponen Tutorial .

from my_generator import MyGenerator
from my_consumer import MyConsumer

Bangun Konteks Interaktif

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

Jalankan komponen Anda secara interaktif dengan context.run()

Berikutnya, kami menjalankan komponen kami secara interaktif dalam notebook dengan context.run() . Komponen konsumen kami menggunakan output dari komponen generator.

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

Setelah eksekusi, kami dapat memeriksa konten artefak keluaran "hash" dari komponen konsumen pada disk.

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

Itu saja, dan Anda sekarang telah menulis dan mengeksekusi komponen kustom Anda sendiri!

Tulis definisi pipa

Selanjutnya, kami akan membuat pipeline menggunakan komponen yang sama ini. Sementara menggunakan InteractiveContext dalam notebook bekerja dengan baik untuk eksperimen, mendefinisikan pipa memungkinkan Anda menggunakan pipa Anda pada pelari lokal atau remote untuk penggunaan produksi.

Di sini, kami akan mendemonstrasikan penggunaan LocalDagRunner yang berjalan secara lokal di mesin Anda. Untuk eksekusi produksi, runner Airflow atau Kubeflow mungkin lebih cocok.

Membangun pipa

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

Jalankan pipa Anda dengan 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

Kita dapat memeriksa artefak keluaran yang dihasilkan oleh eksekusi pipa ini.

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

Anda sekarang telah menulis komponen kustom Anda sendiri dan mengatur eksekusinya di LocalDagRunner! Untuk langkah selanjutnya, lihat tutorial tambahan dan panduan di situs TFX .