Hướng dẫn thành phần hàm TFX Python

Sổ tay này chứa một ví dụ về cách tạo và chạy các thành phần hàm Python trong TFX InteractiveContext và trong một đường dẫn TFX được điều phối cục bộ.

Đối với hoàn cảnh và thông tin, xem các thành phần chức năng Custom Python trang trên các trang web tài liệu TFX.

Thành lập

Trước tiên, chúng tôi sẽ cài đặt TFX và nhập các mô-đun cần thiết. TFX yêu cầu Python 3.

Kiểm tra phiên bản Python hệ thống

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

Nâng cấp Pip

Để tránh nâng cấp Pip trong hệ thống khi chạy cục bộ, hãy kiểm tra để đảm bảo rằng chúng tôi đang chạy trong Colab. Hệ thống cục bộ tất nhiên có thể được nâng cấp riêng.

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

Cài đặt TFX

pip install -U tfx

Bạn có khởi động lại thời gian chạy không?

Nếu bạn đang sử dụng Google Colab, lần đầu tiên bạn chạy ô ở trên, bạn phải khởi động lại thời gian chạy (Runtime> Restart runtime ...). Điều này là do cách Colab tải các gói.

Nhập gói

Chúng tôi nhập TFX và kiểm tra phiên bản của nó.

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

Các thành phần chức năng Python tùy chỉnh

Trong phần này, chúng ta sẽ tạo các thành phần từ các hàm Python. Chúng tôi sẽ không thực hiện bất kỳ vấn đề ML thực sự nào - các hàm đơn giản này chỉ được sử dụng để minh họa quy trình phát triển thành phần hàm Python.

Xem Python chức năng dựa hướng dẫn thành phần cho các tài liệu hơn.

Tạo các thành phần tùy chỉnh Python

Chúng ta bắt đầu bằng cách viết một hàm tạo một số dữ liệu giả. Điều này được ghi vào tệp mô-đun Python của riêng nó.

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

Tiếp theo, chúng tôi viết một thành phần thứ hai sử dụng dữ liệu giả được tạo ra. Chúng tôi sẽ chỉ tính toán băm của dữ liệu và trả về nó.

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

Chạy trong sổ ghi chép với InteractiveContext

Bây giờ, chúng tôi sẽ trình bày cách sử dụng các thành phần mới của chúng tôi trong TFX InteractiveContext.

Để biết thêm thông tin về những gì bạn có thể làm với máy tính xách tay TFX InteractiveContext, xem trong máy tính xách tay TFX Keras Component Tutorial .

from my_generator import MyGenerator
from my_consumer import MyConsumer

Xây dựng 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.

Chạy thành phần của bạn tương tác với context.run()

Tiếp theo, chúng tôi chạy các thành phần của chúng tôi một cách tương tác trong máy tính xách tay với context.run() . Thành phần người tiêu dùng của chúng tôi sử dụng đầu ra của thành phần máy phát điện.

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

Sau khi thực thi, chúng ta có thể kiểm tra nội dung của tạo tác đầu ra "băm" của thành phần tiêu dùng trên đĩa.

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

Vậy là xong, và bây giờ bạn đã viết và thực thi các thành phần tùy chỉnh của riêng mình!

Viết định nghĩa đường ống

Tiếp theo, chúng tôi sẽ tạo một đường dẫn sử dụng các thành phần tương tự này. Trong khi sử dụng InteractiveContext trong một máy tính xách tay hoạt động tốt cho thử nghiệm, xác định một đường ống cho phép bạn triển khai đường ống của bạn trên vận động viên cục bộ hoặc từ xa để sử dụng sản xuất.

Ở đây, chúng tôi sẽ trình bày cách sử dụng LocalDagRunner đang chạy cục bộ trên máy của bạn. Để thực hiện sản xuất, máy chạy Airflow hoặc Kubeflow có thể phù hợp hơn.

Xây dựng một đường ống

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

Chạy đường ống của bạn với 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

Chúng tôi có thể kiểm tra các tạo tác đầu ra được tạo ra bởi quá trình thực thi đường ống này.

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

Bây giờ bạn đã viết các thành phần tùy chỉnh của riêng mình và sắp xếp việc thực thi của chúng trên LocalDagRunner! Đối với các bước tiếp theo, hãy kiểm tra hướng dẫn bổ sung và hướng dẫn trên trang web của TFX .