اجزای تابع سفارشی پایتون

تعریف کامپوننت مبتنی بر تابع پایتون با صرفه جویی در تلاش شما برای تعریف یک کلاس مشخصات کامپوننت، کلاس اجراکننده و کلاس رابط کامپوننت، ایجاد مؤلفه های سفارشی TFX را برای شما آسان تر می کند. در این سبک تعریف کامپوننت، شما تابعی می نویسید که با نکات نوع حاشیه نویسی می شود. نکات نوع، مصنوعات ورودی، مصنوعات خروجی و پارامترهای جزء شما را توصیف می کنند.

مانند مثال زیر، نوشتن کامپوننت سفارشی شما در این سبک بسیار ساده است.

class MyOutput(TypedDict):
  accuracy: float

@component
def MyValidationComponent(
    model: InputArtifact[Model],
    blessing: OutputArtifact[Model],
    accuracy_threshold: Parameter[int] = 10,
) -> MyOutput:
  '''My simple custom model validation component.'''

  accuracy = evaluate_model(model)
  if accuracy >= accuracy_threshold:
    write_output_blessing(blessing)

  return {
    'accuracy': accuracy
  }

در زیر هود، این یک جزء سفارشی را تعریف می کند که زیر کلاس BaseComponent و کلاس های Spec و Executor آن است.

اگر می خواهید زیر کلاسی از BaseBeamComponent تعریف کنید که بتوانید از یک خط لوله پرتو با پیکربندی مشترک TFX-pipeline-wise استفاده کنید، به عنوان مثال beam_pipeline_args هنگام کامپایل خط لوله ( مثال خط لوله تاکسی شیکاگو ) می توانید use_beam=True در دکوراتور تنظیم کنید. BeamComponentParameter دیگری با مقدار پیش فرض None در تابع شما به عنوان مثال زیر:

@component(use_beam=True)
def MyDataProcessor(
    examples: InputArtifact[Example],
    processed_examples: OutputArtifact[Example],
    beam_pipeline: BeamComponentParameter[beam.Pipeline] = None,
    ) -> None:
  '''My simple custom model validation component.'''

  with beam_pipeline as p:
    # data pipeline definition with beam_pipeline begins
    ...
    # data pipeline definition with beam_pipeline ends

اگر با خطوط لوله TFX تازه کار هستید، درباره مفاهیم اصلی خطوط لوله TFX بیشتر بدانید .

ورودی ها، خروجی ها و پارامترها

در TFX، ورودی‌ها و خروجی‌ها به‌عنوان اشیاء مصنوع ردیابی می‌شوند که مکان و ویژگی‌های ابرداده مرتبط با داده‌های زیربنایی را توصیف می‌کنند. این اطلاعات در ML Metadata ذخیره می شود. مصنوعات می توانند انواع داده های پیچیده یا انواع داده های ساده را توصیف کنند، مانند: int، float، بایت ها یا رشته های یونیکد.

یک پارامتر یک آرگومان (int، float، بایت یا رشته یونیکد) برای یک جزء شناخته شده در زمان ساخت خط لوله است. پارامترها برای تعیین آرگومان ها و هایپرپارامترهایی مانند تعداد تکرار آموزش، نرخ انصراف و سایر تنظیمات در مؤلفه شما مفید هستند. هنگامی که در فراداده ML ردیابی می شود، پارامترها به عنوان ویژگی های اجرای اجزا ذخیره می شوند.

تعریف

برای ایجاد یک کامپوننت سفارشی، تابعی بنویسید که منطق سفارشی شما را پیاده سازی کند و آن را با دکوراتور @component از ماژول tfx.dsl.component.experimental.decorators تزئین کنید. برای تعریف طرحواره ورودی و خروجی جزء خود، آرگومان های تابع خود را با استفاده از حاشیه نویسی از ماژول tfx.dsl.component.experimental.annotations حاشیه نویسی کنید:

  • برای هر ورودی مصنوع ، حاشیه نویسی نوع InputArtifact[ArtifactType] را اعمال کنید. ArtifactType با نوع مصنوع جایگزین کنید، که زیر کلاس tfx.types.Artifact است. این ورودی ها می توانند آرگومان های اختیاری باشند.

  • برای هر مصنوع خروجی ، حاشیه‌نویسی نوع OutputArtifact[ArtifactType] را اعمال کنید. ArtifactType با نوع artifact جایگزین کنید، که زیر کلاس tfx.types.Artifact است. مصنوعات خروجی مؤلفه باید به عنوان آرگومان های ورودی تابع ارسال شوند، به طوری که مؤلفه شما بتواند خروجی ها را در یک مکان مدیریت شده توسط سیستم بنویسد و ویژگی های فراداده آرتیفکت مناسب را تنظیم کند. این آرگومان می تواند اختیاری باشد یا این آرگومان با مقدار پیش فرض تعریف شود.

  • برای هر پارامتر ، از نوع حاشیه نویسی اشاره Parameter[T] استفاده کنید. نوع پارامتر را جایگزین T کنید. ما در حال حاضر فقط از انواع اولیه پایتون پشتیبانی می کنیم: bool ، int ، float ، str ، یا bytes .

  • برای خط لوله پرتو ، از نوع حاشیه نویسی اشاره BeamComponentParameter[beam.Pipeline] استفاده کنید. مقدار پیش فرض را روی None قرار دهید. مقدار None با خط لوله پرتو نمونه ایجاد شده توسط _make_beam_pipeline() BaseBeamExecutor جایگزین می شود.

  • برای هر ورودی نوع داده ساده ( int ، float ، str یا bytes ) که در زمان ساخت خط لوله شناخته نشده است، از نوع اشاره T استفاده کنید. توجه داشته باشید که در نسخه TFX 0.22، مقادیر بتن را نمی توان در زمان ساخت خط لوله برای این نوع ورودی ارسال کرد (به جای آن از حاشیه نویسی Parameter همانطور که در بخش قبل توضیح داده شد استفاده کنید). این آرگومان می تواند اختیاری باشد یا این آرگومان با مقدار پیش فرض تعریف شود. اگر کامپوننت شما دارای خروجی‌های نوع داده ساده است ( int ، float ، str یا bytes )، می‌توانید این خروجی‌ها را با استفاده از TypedDict به عنوان حاشیه‌نویسی نوع برگشتی و برگرداندن یک شی dict مناسب برگردانید.

در بدنه تابع شما، مصنوعات ورودی و خروجی به عنوان اشیاء tfx.types.Artifact ارسال می شوند. می توانید uri .uri آن را بررسی کنید تا مکان مدیریت شده توسط سیستم را دریافت کنید و هر ویژگی را بخوانید/تنظیم کنید. پارامترهای ورودی و ورودی های نوع داده ساده به عنوان اشیایی از نوع مشخص شده ارسال می شوند. خروجی‌های نوع داده ساده باید به‌عنوان یک فرهنگ لغت بازگردانده شوند، جایی که کلیدها نام‌های خروجی مناسب و مقادیر مقادیر بازگشتی مورد نظر هستند.

کامپوننت تابع تکمیل شده می تواند به شکل زیر باشد:

from typing import TypedDict
import tfx.v1 as tfx
from tfx.dsl.component.experimental.decorators import component

class MyOutput(TypedDict):
  loss: float
  accuracy: float

@component
def MyTrainerComponent(
    training_data: tfx.dsl.components.InputArtifact[tfx.types.standard_artifacts.Examples],
    model: tfx.dsl.components.OutputArtifact[tfx.types.standard_artifacts.Model],
    dropout_hyperparameter: float,
    num_iterations: tfx.dsl.components.Parameter[int] = 10
) -> MyOutput:
  '''My simple trainer component.'''

  records = read_examples(training_data.uri)
  model_obj = train_model(records, num_iterations, dropout_hyperparameter)
  model_obj.write_to(model.uri)

  return {
    'loss': model_obj.loss,
    'accuracy': model_obj.accuracy
  }

# Example usage in a pipeline graph definition:
# ...
trainer = MyTrainerComponent(
    examples=example_gen.outputs['examples'],
    dropout_hyperparameter=other_component.outputs['dropout'],
    num_iterations=1000)
pusher = Pusher(model=trainer.outputs['model'])
# ...

مثال قبلی MyTrainerComponent به عنوان یک جزء سفارشی مبتنی بر تابع پایتون تعریف می کند. این مولفه یک مصنوع examples را به عنوان ورودی خود مصرف می کند و یک مصنوع model را به عنوان خروجی خود تولید می کند. مؤلفه از artifact_instance.uri برای خواندن یا نوشتن مصنوع در مکان مدیریت شده توسط سیستم خود استفاده می کند. کامپوننت یک پارامتر ورودی num_iterations و یک مقدار نوع داده ساده dropout_hyperparameter را می گیرد و کامپوننت معیارهای loss و accuracy را به عنوان مقادیر خروجی نوع داده ساده خروجی می گیرد. سپس آرتیفکت model خروجی توسط مولفه Pusher استفاده می شود.