בניית צינור TFX באופן מקומי

TFX מקל על תזמורת זרימת העבודה של למידת מכונה (ML) שלך כצינור, על מנת:

  • הפוך את תהליך ה-ML שלך לאוטומטי, המאפשר לך לאמן מחדש, להעריך ולפרוס את המודל שלך באופן קבוע.
  • צור צינורות ML הכוללים ניתוח מעמיק של ביצועי המודל ואימות של מודלים שהוכשרו לאחרונה כדי להבטיח ביצועים ואמינות.
  • עקוב אחר נתוני האימון לאיתור חריגות והסר הטיית ההגשה של האימון
  • הגדל את מהירות הניסוי על ידי הפעלת צינור עם קבוצות שונות של היפרפרמטרים.

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

  • התאם אישית תבנית צינור TFX כך שתתאים לצרכים של זרימת העבודה שלך ב-ML. תבניות צינור TFX הן זרימות עבודה מובנות מראש המדגימות שיטות עבודה מומלצות תוך שימוש ברכיבים הסטנדרטיים של TFX.
  • בניית צינור באמצעות TFX. במקרה שימוש זה, אתה מגדיר צינור מבלי להתחיל מתבנית.

בזמן שאתה מפתח את הצינור שלך, אתה יכול להפעיל אותו עם LocalDagRunner . לאחר מכן, לאחר שרכיבי הצינור הוגדרו ונבדקו היטב, תשתמש במתזמר ברמה הפקה כגון Kubeflow או Airflow.

לפני שאתה מתחיל

TFX היא חבילת Python, כך שתצטרכו להגדיר סביבת פיתוח של Python, כמו סביבה וירטואלית או קונטיינר Docker. לאחר מכן:

pip install tfx

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

בניית צינור באמצעות תבנית

TFX Pipeline Templates מקלים על תחילת העבודה עם פיתוח צינור על ידי מתן קבוצה בנויה מראש של הגדרות צינור שתוכל להתאים אישית למקרה השימוש שלך.

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

צור עותק של תבנית הצינור

  1. ראה רשימה של תבניות צינור TFX הזמינות:

    tfx template list
    
  2. בחר תבנית מהרשימה

    tfx template copy --model=template --pipeline_name=pipeline-name \
    --destination_path=destination-path
    

    החלף את הדברים הבאים:

    • template : שם התבנית שברצונך להעתיק.
    • pipeline-name : שם הצינור שיש ליצור.
    • destination-path : הנתיב שאליו יש להעתיק את התבנית.

    למידע נוסף על פקודת tfx template copy .

  3. עותק של תבנית הצינור נוצר בנתיב שציינת.

חקור את תבנית הצינור

חלק זה מספק סקירה כללית של הפיגומים שנוצרו על ידי תבנית.

  1. חקור את הספריות והקבצים שהועתקו לספריית הבסיס של הצינור שלך

    • ספריית צינור עם
      • pipeline.py - מגדיר את הצינור, ומפרט אילו רכיבים נמצאים בשימוש
      • configs.py - החזק את פרטי התצורה כגון מאיפה מגיעים הנתונים או באיזה מתזמר נעשה שימוש
    • ספריית נתונים
      • זה מכיל בדרך כלל קובץ data.csv , שהוא מקור ברירת המחדל עבור ExampleGen . אתה יכול לשנות את מקור הנתונים ב- configs.py .
    • ספריית מודלים עם קוד עיבוד מקדים והטמעת מודלים

    • התבנית מעתיקה את רנרי DAG לסביבה המקומית ול-Kubeflow.

    • תבניות מסוימות כוללות גם מחברות Python כך שתוכלו לחקור את הנתונים והחפצים שלכם עם MetaData של למידת מכונה.

  2. הפעל את הפקודות הבאות בספריית הצינור שלך:

    tfx pipeline create --pipeline_path local_runner.py
    
    tfx run create --pipeline_name pipeline_name
    

    הפקודה יוצרת ריצת צינור באמצעות LocalDagRunner , אשר מוסיפה את הספריות הבאות לצינור שלך:

    • ספריית tfx_metadata המכילה את מאגר ML Metadata בשימוש מקומי.
    • ספריית tfx_pipeline_output המכילה את פלטי הקבצים של הצינור.
  3. פתח את הקובץ pipeline/configs.py של הצינור שלך וסקור את התוכן. סקריפט זה מגדיר את אפשרויות התצורה המשמשות את הצינור ואת פונקציות הרכיבים. זה המקום שבו תציין דברים כמו מיקום מקור הנתונים או מספר שלבי האימון בריצה.

  4. פתח את הקובץ pipeline/pipeline.py של הצינור שלך וסקור את התוכן. סקריפט זה יוצר את צינור TFX. בתחילה, הצינור מכיל רק רכיב ExampleGen .

    • עקוב אחר ההוראות בהערות TODO ב- pipeline.py כדי להוסיף שלבים נוספים לצינור.
  5. פתח את הקובץ local_runner.py וסקור את התוכן. סקריפט זה יוצר ריצת צינור ומציין את הפרמטרים של הריצה, כגון data_path ו- preprocessing_fn .

  6. סקרת את הפיגומים שנוצרו על ידי התבנית ויצרת ריצת צינור באמצעות LocalDagRunner . לאחר מכן, התאם אישית את התבנית כך שתתאים לדרישות שלך.

התאם אישית את הצינור שלך

חלק זה מספק סקירה כללית כיצד להתחיל בהתאמה אישית של התבנית שלך.

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

  2. לאחר שתכננת את הצינור שלך, התאם באופן איטרטיבי את הצינור באמצעות התהליך הבא. התחל מהרכיב שמכניס נתונים לתוך הצינור שלך, שהוא בדרך כלל רכיב ExampleGen .

    1. התאם אישית את הצינור או רכיב כך שיתאים למקרה השימוש שלך. התאמות אישיות אלו עשויות לכלול שינויים כמו:

      • שינוי פרמטרים של צינור.
      • הוספת רכיבים לצינור או הסרתם.
      • החלפת מקור קלט הנתונים. מקור נתונים זה יכול להיות קובץ או שאילתות לשירותים כגון BigQuery.
      • שינוי תצורה של רכיב בצנרת.
      • שינוי פונקציית ההתאמה האישית של רכיב.
    2. הפעל את הרכיב באופן מקומי באמצעות הסקריפט local_runner.py , או רץ אחר DAG מתאים אם אתה משתמש בתזמור אחר. אם הסקריפט נכשל, נפה באגים בכשל ונסה שוב להפעיל את הסקריפט.

    3. לאחר שהתאמה אישית זו פועלת, עברו להתאמה אישית הבאה.

  3. בעבודה איטרטיבית, אתה יכול להתאים אישית כל שלב בזרימת העבודה של התבנית כדי לענות על הצרכים שלך.

בניית צינור מותאם אישית

השתמש בהוראות הבאות כדי ללמוד עוד על בניית צינור מותאם אישית ללא שימוש בתבנית.

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

  2. צור קובץ סקריפט כדי להגדיר את הצינור שלך באמצעות הדוגמה הבאה. מדריך זה מתייחס לקובץ זה בשם my_pipeline.py .

    import os
    from typing import Optional, Text, List
    from absl import logging
    from ml_metadata.proto import metadata_store_pb2
    import tfx.v1 as tfx
    
    PIPELINE_NAME = 'my_pipeline'
    PIPELINE_ROOT = os.path.join('.', 'my_pipeline_output')
    METADATA_PATH = os.path.join('.', 'tfx_metadata', PIPELINE_NAME, 'metadata.db')
    ENABLE_CACHE = True
    
    def create_pipeline(
      pipeline_name: Text,
      pipeline_root:Text,
      enable_cache: bool,
      metadata_connection_config: Optional[
        metadata_store_pb2.ConnectionConfig] = None,
      beam_pipeline_args: Optional[List[Text]] = None
    ):
      components = []
    
      return tfx.dsl.Pipeline(
            pipeline_name=pipeline_name,
            pipeline_root=pipeline_root,
            components=components,
            enable_cache=enable_cache,
            metadata_connection_config=metadata_connection_config,
            beam_pipeline_args=beam_pipeline_args, 
        )
    
    def run_pipeline():
      my_pipeline = create_pipeline(
          pipeline_name=PIPELINE_NAME,
          pipeline_root=PIPELINE_ROOT,
          enable_cache=ENABLE_CACHE,
          metadata_connection_config=tfx.orchestration.metadata.sqlite_metadata_connection_config(METADATA_PATH)
          )
    
      tfx.orchestration.LocalDagRunner().run(my_pipeline)
    
    if __name__ == '__main__':
      logging.set_verbosity(logging.INFO)
      run_pipeline()
    

    בשלבים הבאים, אתה מגדיר את הצינור שלך ב- create_pipeline ומפעיל את הצינור שלך באופן מקומי באמצעות הרץ המקומי.

    בנה באופן איטרטיבי את הצינור שלך באמצעות התהליך הבא.

    1. התאם אישית את הצינור או רכיב כך שיתאים למקרה השימוש שלך. התאמות אישיות אלו עשויות לכלול שינויים כמו:

      • שינוי פרמטרים של צינור.
      • הוספת רכיבים לצינור או הסרתם.
      • החלפת קובץ קלט נתונים.
      • שינוי תצורה של רכיב בצנרת.
      • שינוי פונקציית ההתאמה האישית של רכיב.
    2. הפעל את הרכיב באופן מקומי באמצעות הראנר המקומי או על ידי הפעלת הסקריפט ישירות. אם הסקריפט נכשל, נפה באגים בכשל ונסה שוב להפעיל את הסקריפט.

    3. לאחר שהתאמה אישית זו פועלת, עברו להתאמה אישית הבאה.

    התחל מהצומת הראשון בזרימת העבודה של הצינור שלך, בדרך כלל הצומת הראשון קולט נתונים לתוך הצינור שלך.

  3. הוסף את הצומת הראשון בזרימת העבודה שלך לצינור שלך. בדוגמה זו, הצינור משתמש ברכיב הסטנדרטי ExampleGen כדי לטעון CSV מספרייה בכתובת ./data .

    from tfx.components import CsvExampleGen
    
    DATA_PATH = os.path.join('.', 'data')
    
    def create_pipeline(
      pipeline_name: Text,
      pipeline_root:Text,
      data_path: Text,
      enable_cache: bool,
      metadata_connection_config: Optional[
        metadata_store_pb2.ConnectionConfig] = None,
      beam_pipeline_args: Optional[List[Text]] = None
    ):
      components = []
    
      example_gen = tfx.components.CsvExampleGen(input_base=data_path)
      components.append(example_gen)
    
      return tfx.dsl.Pipeline(
            pipeline_name=pipeline_name,
            pipeline_root=pipeline_root,
            components=components,
            enable_cache=enable_cache,
            metadata_connection_config=metadata_connection_config,
            beam_pipeline_args=beam_pipeline_args, 
        )
    
    def run_pipeline():
      my_pipeline = create_pipeline(
        pipeline_name=PIPELINE_NAME,
        pipeline_root=PIPELINE_ROOT,
        data_path=DATA_PATH,
        enable_cache=ENABLE_CACHE,
        metadata_connection_config=tfx.orchestration.metadata.sqlite_metadata_connection_config(METADATA_PATH)
        )
    
      tfx.orchestration.LocalDagRunner().run(my_pipeline)
    

    CsvExampleGen יוצר רשומות לדוגמה בסידרה תוך שימוש בנתונים ב-CSV בנתיב הנתונים שצוין. על ידי הגדרת הפרמטר input_base של רכיב CsvExampleGen עם שורש הנתונים.

  4. צור ספריית data באותה ספרייה כמו my_pipeline.py . הוסף קובץ CSV קטן לספריית data .

  5. השתמש בפקודה הבאה כדי להפעיל את הסקריפט my_pipeline.py שלך.

    python my_pipeline.py
    

    התוצאה צריכה להיות משהו כמו הבא:

    INFO:absl:Component CsvExampleGen depends on [].
    INFO:absl:Component CsvExampleGen is scheduled.
    INFO:absl:Component CsvExampleGen is running.
    INFO:absl:Running driver for CsvExampleGen
    INFO:absl:MetadataStore with DB connection initialized
    INFO:absl:Running executor for CsvExampleGen
    INFO:absl:Generating examples.
    INFO:absl:Using 1 process(es) for Local pipeline execution.
    INFO:absl:Processing input csv data ./data/* to TFExample.
    WARNING:root:Couldn't find python-snappy so the implementation of _TFRecordUtil._masked_crc32c is not as fast as it could be.
    INFO:absl:Examples generated.
    INFO:absl:Running publisher for CsvExampleGen
    INFO:absl:MetadataStore with DB connection initialized
    INFO:absl:Component CsvExampleGen is finished.
    
  6. המשך להוסיף באופן איטרטיבי רכיבים לצינור שלך.