Tham gia cộng đồng SIG TFX-Addons và giúp cải thiện TFX tốt hơn nữa!

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

Để biết thêm ngữ cảnh và thông tin, hãy xem trang Thành phần chức năng Python tùy chỉnh trên trang tài liệu TFX.

Thiết lập

Đầu 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 -q --upgrade pip
except:
  pass

Cài đặt TFX

pip install -q -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__
WARNING:absl:RuntimeParameter is only supported on Cloud-based DAG runner currently.
'0.30.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 quá trình phát triển thành phần hàm Python.

Xem hướng dẫn thành phần dựa trên hàm Python để biết thêm tài liệu.

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 ra 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ổ tay 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 InteractiveContext của máy tính xách tay TFX, hãy xem Hướng dẫn về thành phần TFX Keras trong máy tính xách tay.

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-05-19T21_06_14.642885-8dzuv3xn as root for pipeline outputs.
WARNING:absl:InteractiveContext metadata_connection_config not provided: using SQLite ML Metadata database at /tmp/tfx-interactive-2021-05-19T21_06_14.642885-8dzuv3xn/metadata.sqlite.

Chạy thành phần của bạn một cách 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 mình một cách tương tác trong sổ ghi chép 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)
consumer = MyConsumer(
    data=generator.outputs['data'],
    algorithm='md5')
context.run(consumer)

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-05-19T21_06_14.642885-8dzuv3xn/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 để thử nghiệm, việc xác định đường dẫn cho phép bạn triển khai đường dẫn của mình trên các trình chạy cục bộ hoặc từ xa để sử dụng trong sản xuất.

Ở đây, chúng tôi sẽ trình bày cách sử dụng LocalDagRunner 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 dẫn của bạn với LocalDagRunner

tfx.orchestration.LocalDagRunner().run(my_pipeline)
WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['-f', '/tmp/tmpascn04df.json', '--HistoryManager.hist_file=:memory:']
WARNING:apache_beam.options.pipeline_options:Discarding unparseable args: ['-f', '/tmp/tmpascn04df.json', '--HistoryManager.hist_file=:memory:']

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

find {PIPELINE_ROOT}
/tmp/tmpdui18w8v
/tmp/tmpdui18w8v/metadata.sqlite
/tmp/tmpdui18w8v/MyConsumer
/tmp/tmpdui18w8v/MyConsumer/.system
/tmp/tmpdui18w8v/MyConsumer/.system/executor_execution
/tmp/tmpdui18w8v/MyConsumer/.system/executor_execution/2
/tmp/tmpdui18w8v/MyConsumer/hash
/tmp/tmpdui18w8v/MyConsumer/hash/2
/tmp/tmpdui18w8v/MyConsumer/hash/2/value
/tmp/tmpdui18w8v/MyGenerator
/tmp/tmpdui18w8v/MyGenerator/data
/tmp/tmpdui18w8v/MyGenerator/data/1
/tmp/tmpdui18w8v/MyGenerator/data/1/data_file.txt
/tmp/tmpdui18w8v/MyGenerator/.system
/tmp/tmpdui18w8v/MyGenerator/.system/executor_execution
/tmp/tmpdui18w8v/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 chúng trên LocalDagRunner! Đối với các bước tiếp theo, hãy xem các hướng dẫn và hướng dẫn bổ sung trên trang web TFX .