6월 14-15일 우크라이나 DevFest에 참여하세요. 지금 온라인 등록

TFX Python 함수 구성 요소 자습서

이 노트북에는 TFX InteractiveContext 및 로컬로 조정된 TFX 파이프라인에서 Python 함수 구성 요소를 작성하고 실행하는 방법에 대한 예제가 포함되어 있습니다.

더 상황과 내용은 참조 정의 파이썬 기능 구성 요소 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을 사용하는 경우 위의 셀을 처음 실행할 때 런타임을 다시 시작해야 합니다(런타임 > 런타임 다시 시작...). Colab이 패키지를 로드하는 방식 때문입니다.

패키지 가져오기

TFX를 가져오고 버전을 확인합니다.

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

사용자 정의 Python 함수 구성 요소

이 섹션에서는 Python 함수에서 구성 요소를 만듭니다. 우리는 실제 ML 문제를 수행하지 않을 것입니다. 이 간단한 함수는 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 웹 사이트 .