ระบบปฏิบัติการและประมวลผลโมเดล (Machine Learning & MLOps)
5.7 ระบบปฏิบัติการประมวลผลสมองกล (Machine Learning & MLOps)
ระบบ MLOps เป็นสะพานเชื่อมระหว่างวิศวกรข้อมูลและนักวิทยาศาสตร์ข้อมูล เพื่อบริหารจัดการวงจรชีวิตของโมเดล AI ตั้งแต่การสกัดฟีเจอร์ การลงทะเบียนโมเดล ไปจนถึงการเสิร์ฟเพื่อทำนายผลแบบเรียลไทม์
- Step 1: Data Ingestion & Event Processing
- Step 2: Distributed Computation & State Management
- Step 3: Orchestration & Resource Allocation
1. สถาปัตยกรรม MLOps Pipeline แบบ End-to-End
Learning Progression
- [BASIC] ปูพื้นฐานภาษาเข้าใจง่าย - เข้าใจคอนเซปต์ภาพรวมและการแก้ปัญหาเบื้องต้น
- [INTERMEDIATE] โค้ด/คอนฟิกไวยากรณ์จริง - การเขียนโค้ดเพื่อใช้งานจริงในระบบ
- [PROFESSIONAL] Under-the-hood & Performance/FinOps - กลไกเบื้องลึกและการรีดประสิทธิภาพ
Real-World Enterprise Scenario
เคสระบบการเงิน/Big Tech: การรองรับ Transaction จำนวนมหาศาลต่อวินาทีพร้อมประกัน Data Integrity สูงสุด โดยใช้สถาปัตยกรรมที่ยืดหยุ่นและการมอนิเตอร์ระดับสูง
ทฤษฎีและกลไกการทำงาน (How it works): การนำโมเดล AI ขึ้นระบบจริง (Production) ไม่ใช่แค่การรันสคริปต์ Jupyter Notebook แต่ต้องมี Pipeline ที่ทำซ้ำได้ (Reproducible): - **Data Pipeline**: ดึงข้อมูลและคลีนข้อมูล - **Feature Pipeline**: แปลงข้อมูลเป็นฟีเจอร์และเก็บลง Feature Store - **Training Pipeline**: ดึงฟีเจอร์มาเทรนโมเดลและเก็บเข้า Registry - **Inference Pipeline**: ดึงโมเดลมาให้บริการ (Serving)
# Conceptual architecture of ML pipeline orchestration
[Raw Data] -> [Feature Pipeline] -> [Feature Store] -> [Training Pipeline] -> [Model Registry] -> [Serving API]
Use Case ในชีวิตจริง (Real-world Scenario): ธนาคารรัน MLOps Pipeline ทุกสิ้นเดือนเพื่อประเมินความเสี่ยงหนี้เสีย ระบบจะดึงประวัติการโอนเงินลูกค้ามาสกัดเป็นฟีเจอร์ เทรนโมเดลใหม่ และสลับเวอร์ชันให้บริการโดยไม่มีใครต้องกดปุ่มรันมือ
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): โมเดลทำงานดีตอนทดสอบแต่แย่ตอนรันจริง (Training-Serving Skew) เพราะใช้โค้ดดึงข้อมูลตอนเทรนกับตอนทำนายจริงคนละเวอร์ชัน แก้ไขโดยต้องบังคับให้ระบบเทรนและระบบรันจริง ดึงตัวแปรผ่าน Feature Store ตัวเดียวกันเท่านั้น
2. Feature Store (Feast / Hopsworks): ลดความหน่วงและแก้ปัญหาโค้ดซ้ำซ้อน
ทฤษฎีและกลไกการทำงาน (How it works): **Feature Store** คือคลังเก็บตัวแปรที่คำนวณเสร็จแล้ว โดยจะแยกเป็น 2 ฐานข้อมูล: - **Offline Store (เช่น Iceberg, BigQuery)**: เก็บข้อมูลย้อนหลังมหาศาล เพื่อให้ Data Scientist ดึงไปเทรนโมเดล (Batch) - **Online Store (เช่น Redis)**: ซิงก์เฉพาะค่าล่าสุดจาก Offline มาเก็บไว้ เพื่อให้ API ดึงไปทำนายผล (Inference) ด้วยความเร็วหลักมิลลิวินาที
# Feast Feature View definition configuration
from datetime import timedelta
from feast import Entity, FeatureView, Field, ValueType
from feast.types import Int64, Float32
# Entity defines the primary key matching records
customer = Entity(name="customer_id", value_type=ValueType.INT64)
customer_fv = FeatureView(
name="customer_analytics_features",
entities=[customer],
ttl=timedelta(days=90),
schema=[
Field(name="monthly_orders_count", dtype=Int64),
Field(name="average_transaction_value", dtype=Float32)
],
source=None # Points to data lake source table
)
Use Case ในชีวิตจริง (Real-world Scenario): ระบบตรวจจับบัตรเครดิตโดนแฮก ต้องคำนวณ "ระยะทางระหว่างร้านค้าร้านแรกกับร้านที่สองใน 10 นาที" ถ้าระบบ API ต้องคำนวณสดๆ จะช้าเกินไปจนแฮกเกอร์รูดสำเร็จ ระบบจึงดึงฟีเจอร์ที่คำนวณเตรียมไว้แล้วใน Redis Feature Store ออกมาตัดสินใจได้ใน 10 มิลลิวินาที
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): Online Store ข้อมูลเก่าเกินไปจนทำนายผิดพลาด (Stale Features) แก้ไขโดยตั้งจ๊อบ Streaming (เช่น Flink) หรือรัน Airflow อัปเดตข้อมูลจาก Offline สู่ Online ทุกๆ นาที (Materialization)
3. Model Registry & Experiment Tracking (MLflow)
ทฤษฎีและกลไกการทำงาน (How it works): เมื่อเทรนโมเดลหลายร้อยรอบ เราต้องมีเครื่องมือจดบันทึกว่ารันไหนใช้พารามิเตอร์อะไรและได้ความแม่นยำเท่าไหร่ (Experiment Tracking) เมื่อได้โมเดลที่ดีที่สุด จะถูกอัปโหลดขึ้น **Model Registry** (เช่น MLflow) ซึ่งจะทำหน้าที่เหมือน Git แต่เป็นของโมเดล เพื่อประทับตราเวอร์ชัน (v1, v2) และจัดการสถานะ (Staging, Production)
# Python code to log metadata metrics and register model using MLflow
import mlflow
with mlflow.start_run():
# 1. Log Hyperparameters
mlflow.log_param("learning_rate", 0.01)
# 2. Log Metrics
mlflow.log_metric("accuracy", 0.94)
# 3. Log model artifacts to the registry repository
mlflow.sklearn.log_model(model, "churn-model-artifact", registered_model_name="CustomerChurnModel")
Use Case ในชีวิตจริง (Real-world Scenario): โมเดลแนะนำสินค้าเวอร์ชันใหม่ (v3) ทำยอดขายตก ทีม MLOps สามารถคลิกปุ่มบน MLflow เพื่อ Rollback หรือสลับโมเดลตัวเก่า (v2) กลับมาเป็นสถานะ Production ได้ทันทีภายในคลิกเดียว
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): ไม่รู้ว่าโมเดลเวอร์ชันนี้ใช้โค้ดชุดไหนเทรน (Lack of Reproducibility) แก้ไขโดยตอนที่รัน `mlflow.start_run()` ต้องส่งค่า Git Commit Hash ของโค้ด ณ เวลานั้นเข้าไปบันทึกคู่กับโมเดลเสมอ
4. การตรวจจับ Model Drift และ Automated Retraining
ทฤษฎีและกลไกการทำงาน (How it works): โมเดล AI จะ "โง่ลง" เมื่อเวลาผ่านไป (Model Decay) จาก 2 สาเหตุ: - **Data Drift**: ข้อมูลขาเข้าเปลี่ยนไปจากตอนเทรน (เช่น แคมเปญใหม่ดึงดูดลูกค้าวัยรุ่นเข้ามาเยอะขึ้น) - **Concept Drift**: พฤติกรรมเป้าหมายเปลี่ยนไป (เช่น ลูกค้าไม่ซื้อของออนไลน์หลังหมดช่วงโควิด) หากระบบจับได้ว่ามีการเบี่ยงเบนทางสถิติ (Drift) จะส่งสัญญาณแจ้งเตือน และเรียก Airflow ทริกเกอร์ให้ดึงข้อมูลล็อตใหม่มาสอนโมเดล (Automated Retraining) ทันที
# Concept check script triggering retraining on drift detection alert
def check_drift_and_retrain(reference_dataset, current_dataset):
# Perform Kolmogorov-Smirnov statistical test for drift detection
drift_detected = calculate_ks_test(reference_dataset, current_dataset)
if drift_detected:
print("Data Drift Detected! Launching retraining workflow pipeline.")
# trigger_airflow_dag("train_churn_model")
Use Case ในชีวิตจริง (Real-world Scenario): ในช่วงโปรลดราคา 11.11 ระบบแนะนำสินค้าพบว่า Data Drift พุ่งทะลุเกณฑ์ เพราะพฤติกรรมการคลิกของลูกค้าบ้าคลั่งกว่าปกติ ระบบจึงดึงข้อมูลคลิกของเมื่อวานมาเทรนโมเดลใหม่สดๆ และอัปเดตโมเดลรายวันเพื่อให้ทันกระแส
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): การเทรนโมเดลอัตโนมัติแล้วปล่อยขึ้นโปรดักชันทันทีอาจได้โมเดลที่ห่วยลง แก้ไขโดยต้องมีด่าน A/B Testing หรือ Shadow Mode กั้นไว้ก่อนเสมอ เพื่อเทียบว่าโมเดลใหม่ทำนายได้แม่นยำกว่าโมเดลเก่าจริงหรือไม่ก่อนอนุญาตให้สลับเวอร์ชัน
5. รูปแบบการนำโมเดลไปใช้งาน (Batch Inference vs. Real-Time API)
ทฤษฎีและกลไกการทำงาน (How it works): การนำโมเดลไปทำนายผล (Serving/Inference) มี 2 ท่าหลัก: - **Batch Inference**: โหลดข้อมูลมารันทำนายผลทีละหลายล้านแถวในช่วงกลางคืน (ใช้ Spark รัน) เหมาะกับงานที่ไม่รีบ ประหยัดค่าใช้จ่าย - **Real-time API**: รันโมเดลรอไว้บนเซิร์ฟเวอร์แบบ REST/gRPC ทันทีที่ผู้ใช้กดปุ่ม API จะรับฟีเจอร์และพ่นผลลัพธ์ออกไปในพริบตา
# Python FastAPI serving real-time machine learning predictions
from fastapi import FastAPI
import pickle
app = FastAPI()
# Load model from registry into memory
model = pickle.load(open("model.pkl", "rb"))
@app.post("/predict")
def predict_churn(customer_features: dict):
# Online real-time inference
prediction = model.predict([list(customer_features.values())])
return {"churn_risk": float(prediction[0])}
Use Case ในชีวิตจริง (Real-world Scenario): ระบบให้คะแนนความภักดีลูกค้า (Loyalty Score) รันประเมินแบบ Batch Inference ทุกคืนวันอาทิตย์เพื่ออัปเดตตารางฐานข้อมูล แต่ระบบอนุมัติสินเชื่อต้องใช้ Real-time API เพื่ออนุมัติเงินกู้ให้ลูกค้าผ่านหน้าแอปมือถือภายใน 3 วินาที
ข้อควรระวังและวิธีแก้ (Pitfalls & Mitigations): โมเดลขนาดใหญ่ (เช่น LLM หรือ Deep Learning) รันบน Real-time API ช้ามาก (High Latency) แก้ไขโดยแปลงฟอร์แมตโมเดลเป็น ONNX/TensorRT หรือเลือกใช้ฮาร์ดแวร์ GPU เร่งความเร็วตอนเสิร์ฟ
Weekend Sandbox Challenge: Setup Feast Feature View Schema
โจทย์ปฏิบัติการ: จงเขียนสเปคคอนฟิก Feast Feature View ของโมเดลคาดการณ์ Churn Risk โดยระบุคีย์หลัก (Entity) และจัดเตรียมคอลัมน์ฟีเจอร์สำหรับดึงใช้งานแบบเรียลไทม์
# local_feature_store.py
from datetime import timedelta
from feast import Entity, FeatureView, Field
from feast.types import Int64, Float32
# 1. Define Entity
customer = Entity(name="customer_id", value_type=Int64)
# 2. Define Feature View
customer_stats_fv = FeatureView(
name="customer_stats",
entities=[customer],
ttl=timedelta(days=30),
schema=[
Field(name="orders_count_30d", dtype=Int64),
Field(name="avg_spend_30d", dtype=Float32)
],
source=None # Points to Parquet source
)
Senior Technical Interview Q&A
Q1: Feature Store (เช่น Feast/Hopsworks) เข้ามาช่วยแก้ปัญหา Training-Serving Skew อย่างไร?
A1: Training-Serving Skew เกิดจากการที่ Data Scientist เขียนสคริปต์สกัดฟีเจอร์ตอนเทรนโมเดล (Offline) ด้วยสูตรหนึ่ง แต่ตอนนำขึ้นโปรดักชัน Data Engineer กลับเขียนโค้ด API เพื่อรับข้อมูลดึงสด (Online) ด้วยอีกสูตรหนึ่ง ทำให้ค่าที่ได้คลาดเคลื่อน Feature Store ทำหน้าที่เป็น "จุดศูนย์กลางความจริงเดียว" (Single Source of Truth) เพื่อประกันว่าโมเดลจะดึงตรรกะการแปลงฟีเจอร์ตัวเดียวกันเป๊ะๆ ทั้งในตอนเทรนและตอนทำนายจริง
Q2: ความแตกต่างเชิงกลไกระหว่าง Data Drift และ Concept Drift คืออะไร และเหตุใดเราจึงไม่ควรสั่ง Automated Retraining ทันทีที่พบ Drift?
A2: Data Drift คือการที่ Input Data เบี่ยงเบนไปจากอดีต (เช่น ลูกค้าวัยรุ่นเยอะขึ้น) ส่วน Concept Drift คือตัว Target แตกต่างไปจากเดิม (เช่น คนไม่ชอบซื้อของฟุ่มเฟือยแล้ว) เราไม่ควร Retrain และ Deploy อัตโนมัติทันที เพราะความเบี่ยงเบนอาจเกิดจากแค่บั๊กชั่วคราว (Transient anomalies) ของท่อส่งข้อมูลต้นทาง หรือ Data Pipeline พัง หากโมเดลไปเรียนรู้ข้อมูลผิดๆ เหล่านี้ ระบบทำนายผลจะพังพินาศ จึงต้องมีด่าน A/B Testing ประเมินโมเดลใหม่ก่อนสลับเวอร์ชันเสมอ
ข้อดี / จุดเด่น & ข้อเสีย / ข้อควรระวัง
ข้อดี / จุดเด่น
- ช่วยประหยัดเวลาการทำระบบบริการสมองกล AI ให้ขยายตัวสเกลได้ง่ายแบบระบบซอฟต์แวร์
- ระบบมีการประมวลผลและคำนวณสเกลภาพรวมประเมินประสิทธิภาพโมเดลตลอดเวลา
ข้อเสีย / ข้อควรระวัง
- มีสถาปัตยกรรมโครงสร้างพื้นฐานระบบประมวลผลที่ยุ่งยาก ซับซ้อน และใช้อุปกรณ์แรมสูงมาก
- หากมีข้อมูลแปลกปลอมหลุดเข้าไปในกระบวนการฝึกฝน อาจทำให้ผลพยากรณ์โมเดลเพี้ยนไปได้ยาวนาน
ปฏิบัติการจริง (Lab Practice)
แล็บ: สร้างท่อข้อมูลป้อนโมเดลฝึกประมวลผล AI
วิธีรันแล็บปฏิบัติการบนเครื่องจริง (Local Terminal Execution Blueprint)
เนื่องจากปฏิบัติการ Data Engineering / DevOps ระดับสูงต้องรันบน Environment จริง ขั้นตอนด้านล่างนี้คือคำสั่งสำหรับนำไปรันบน Terminal / Docker ในเครื่องของคุณ:
mkdir -p pipecraft-lab && cd pipecraft-lab python3 -m venv venv && source venv/bin/activate pip install --upgrade pip pandas polars pytest requests
# Run execution pipeline test
python3 -c "
import polars as pl
print(' [PipeCraft Lab] Running local pipeline engine...')
df = pl.DataFrame({'id': [1, 2, 3], 'status': ['SUCCESS', 'SUCCESS', 'AUDITED']})
print(df)
"
# Verify clean execution exit status echo " PipeCraft Local Lab Execution Completed Successfully!"
💡 คำแนะนำ & ทริกเด็ด
หลีกเลี่ยงการทำ Feature Engineering ซ้ำๆ ในหลายๆ โมเดล ให้ทำแบบระบบ Feature Store ร่วมศูนย์กลาง เพื่อประหยัดคอมพิวต์ประมวลผลและลดโอกาสการเกิดข้อผิดพลาดของข้อมูลฟีเจอร์ไม่ตรงกัน