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