اجزای مبتنی بر کانتینر انعطافپذیری را برای ادغام کد نوشته شده به هر زبانی در خط لوله شما فراهم میکنند، تا زمانی که بتوانید آن کد را در یک ظرف Docker اجرا کنید.
اگر با خطوط لوله TFX تازه کار هستید، درباره مفاهیم اصلی خطوط لوله TFX بیشتر بدانید .
ایجاد یک کامپوننت مبتنی بر کانتینر
اجزای مبتنی بر کانتینر توسط برنامه های خط فرمان کانتینری پشتیبانی می شوند. اگر قبلاً یک تصویر ظرف دارید، میتوانید از TFX برای ایجاد کامپوننت از آن با استفاده از تابع create_container_component
برای اعلام ورودیها و خروجیها استفاده کنید. پارامترهای تابع:
- name: نام جزء.
- ورودی ها: فرهنگ لغتی که نام ورودی ها را به انواع نگاشت می کند. خروجی ها: فرهنگ لغتی که نام های خروجی را به پارامترهای انواع نگاشت می کند: فرهنگ لغتی که نام پارامترها را به انواع نگاشت می کند.
- تصویر: نام تصویر ظرف، و به صورت اختیاری برچسب تصویر.
- فرمان: خط فرمان ورودی کانتینر. در یک پوسته اجرا نمی شود. خط فرمان می تواند از اشیاء مکان نگهدار استفاده کند که در زمان کامپایل با ورودی، خروجی یا پارامتر جایگزین می شوند. اشیاء مکان نگهدار را می توان از
tfx.dsl.component.experimental.placeholders
وارد کرد. توجه داشته باشید که قالب های Jinja پشتیبانی نمی شوند.
مقدار بازگشتی: یک کلاس Component که از base_component.BaseComponent به ارث میبرد که میتواند نمونهسازی شود و در داخل خط لوله استفاده شود.
متغیرهای
برای کامپوننتی که ورودی یا خروجی دارد، command
اغلب نیاز به نگهدارندههایی دارد که در زمان اجرا با دادههای واقعی جایگزین شوند. چندین متغیر برای این منظور ارائه شده است:
InputValuePlaceholder
: یک مکان نگهدار برای مقدار مصنوع ورودی. در زمان اجرا، این مکان نگهدار با نمایش رشته ای از مقدار مصنوع جایگزین می شود.InputUriPlaceholder
: یک مکان نگهدار برای URI آرگومان مصنوع ورودی. در زمان اجرا، این مکان نگهدار با URI داده های مصنوع ورودی جایگزین می شود.OutputUriPlaceholder
: یک مکان نگهدار برای URI آرگومان مصنوع خروجی. در زمان اجرا، این مکان نگهدار با URI جایگزین میشود، جایی که مؤلفه باید دادههای مصنوع خروجی را ذخیره کند.
درباره متغیرهای خط فرمان جزء TFX بیشتر بیاموزید.
نمونه کامپوننت مبتنی بر کانتینر
در زیر نمونه ای از یک مؤلفه غیر پایتون است که داده ها را دانلود، تبدیل و آپلود می کند:
import tfx.v1 as tfx
grep_component = tfx.dsl.components.create_container_component(
name='FilterWithGrep',
inputs={
'text': tfx.standard_artifacts.ExternalArtifact,
},
outputs={
'filtered_text': tfx.standard_artifacts.ExternalArtifact,
},
parameters={
'pattern': str,
},
# The component code uses gsutil to upload the data to Google Cloud Storage, so the
# container image needs to have gsutil installed and configured.
image='google/cloud-sdk:278.0.0',
command=[
'sh', '-exc',
'''
pattern="$1"
text_uri="$3"/data # Adding suffix, because currently the URI are "directories". This will be fixed soon.
text_path=$(mktemp)
filtered_text_uri="$5"/data # Adding suffix, because currently the URI are "directories". This will be fixed soon.
filtered_text_path=$(mktemp)
# Getting data into the container
gsutil cp "$text_uri" "$text_path"
# Running the main code
grep "$pattern" "$text_path" >"$filtered_text_path"
# Getting data out of the container
gsutil cp "$filtered_text_path" "$filtered_text_uri"
''',
'--pattern', tfx.dsl.placeholders.InputValuePlaceholder('pattern'),
'--text', tfx.dsl.placeholders.InputUriPlaceholder('text'),
'--filtered-text', tfx.dsl.placeholders.OutputUriPlaceholder('filtered_text'),
],
)