مكونات وظيفة بايثون المخصصة

يسهل تعريف المكونات المستندة إلى وظيفة Python عليك إنشاء مكونات 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 وفئتي المواصفات والمنفذ.

إذا كنت تريد تحديد فئة فرعية من BaseBeamComponent بحيث يمكنك استخدام خط أنابيب شعاع مع تكوين مشترك لخط أنابيب TFX، على سبيل المثال، 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. يمكن أن تصف العناصر الاصطناعية أنواع البيانات المعقدة أو أنواع البيانات البسيطة، مثل: سلاسل int أو float أو bytes أو unicode.

المعلمة هي وسيطة (int، أو float، أو bytes، أو سلسلة unicode) لمكون معروف في وقت إنشاء خط الأنابيب. تعد المعلمات مفيدة في تحديد الوسائط والمعلمات الفائقة مثل عدد تكرارات التدريب ومعدل التسرب والتكوينات الأخرى للمكون الخاص بك. يتم تخزين المعلمات كخصائص لعمليات تنفيذ المكونات عند تعقبها في بيانات تعريف ML.

تعريف

لإنشاء مكون مخصص، اكتب دالة تنفذ منطقك المخصص وقم بتزيينها باستخدام الديكور @component من الوحدة tfx.dsl.component.experimental.decorators . لتحديد مخطط الإدخال والإخراج للمكون الخاص بك، قم بتعليق وسيطات وظيفتك وقيمة الإرجاع باستخدام التعليقات التوضيحية من الوحدة النمطية tfx.dsl.component.experimental.annotations :

  • لكل إدخال قطعة أثرية ، قم بتطبيق التعليق التوضيحي لتلميح نوع InputArtifact[ArtifactType] . استبدل ArtifactType بنوع القطعة الأثرية، وهو فئة فرعية من tfx.types.Artifact . يمكن أن تكون هذه المدخلات وسيطات اختيارية.

  • لكل قطعة أثرية مخرجات ، قم بتطبيق التعليق التوضيحي لتلميح النوع OutputArtifact[ArtifactType] . استبدل ArtifactType بنوع القطعة الأثرية، وهو فئة فرعية من 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 كتعليق توضيحي لنوع الإرجاع، وإرجاع كائن الإملاء المناسب.

في نص وظيفتك، يتم تمرير عناصر الإدخال والإخراج ككائنات tfx.types.Artifact ؛ يمكنك فحص .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 بأنه مكون مخصص قائم على وظيفة Python. يستهلك هذا المكون قطعة أثرية examples كمدخل له، وينتج قطعة أثرية model كمخرجاته. يستخدم المكون artifact_instance.uri لقراءة العنصر أو كتابته في موقعه المُدار بواسطة النظام. يأخذ المكون معلمة إدخال num_iterations وقيمة نوع بيانات بسيطة dropout_hyperparameter ، ويخرج المكون مقاييس loss accuracy كقيم إخراج بسيطة لنوع البيانات. يتم بعد ذلك استخدام قطعة أثرية model الإخراج بواسطة مكون Pusher .