בניית רכיבים מבוססי מיכל

רכיבים מבוססי מיכל מספקים את הגמישות לשילוב קוד שנכתב בכל שפה בצינור שלך, כל עוד אתה יכול להפעיל את הקוד הזה בקונטיינר Docker.

אם אתה חדש בצינורות TFX, למד עוד על מושגי הליבה של צינורות TFX .

יצירת רכיב מבוסס מיכל

רכיבים מבוססי מיכל מגובים על ידי תוכניות שורת פקודה מכולות. אם כבר יש לך תמונת מיכל, אתה יכול להשתמש ב-TFX כדי ליצור ממנה רכיב על ידי שימוש בפונקציה create_container_component כדי להכריז על כניסות ופלט. פרמטרים של פונקציה:

  • שם: שם הרכיב.
  • קלט: מילון הממפה שמות קלט לסוגים. פלטים: מילון שממפה שמות פלט לפרמטרים מסוגים: מילון שממפה שמות פרמטרים לסוגים.
  • תמונה: שם תמונת מיכל, ותג תמונה אופציונלי.
  • פקודה: שורת הפקודה של נקודת הכניסה של מיכל. לא הוצא להורג בתוך מעטפת. שורת הפקודה יכולה להשתמש באובייקטי מיקום שמוחלפים בזמן ההידור בקלט, הפלט או הפרמטר. ניתן לייבא את אובייקטי המיקום מ- 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'),
    ],
)