การสร้างส่วนประกอบที่ใช้คอนเทนเนอร์

ส่วนประกอบที่ใช้คอนเทนเนอร์ให้ความยืดหยุ่นในการรวมโค้ดที่เขียนในภาษาใดๆ ลงในไปป์ไลน์ของคุณ ตราบใดที่คุณสามารถรันโค้ดนั้นในคอนเทนเนอร์ 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'),
    ],
)