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