การจัดระเบียบโค้ดและการ refactor

การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

Ravi Bhadauria

Machine Learning Engineer

โค้ด prototype กับโค้ด production

  • การเขียนโค้ดแบบ prototype ช่วยให้ทดลองได้รวดเร็ว
  • แต่ไม่เหมาะสำหรับ production
    • ยังไม่ผ่านการทดสอบและเกิดข้อผิดพลาดได้ง่าย
    • ไม่เป็นโมดูล มีโค้ดซ้ำซ้อนหลายจุด
    • มักไม่สามารถทำซ้ำผลลัพธ์ได้
การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

คุณสมบัติของโค้ด production ที่ดี

  • ทำซ้ำได้ (Reproducible): สร้างผลลัพธ์เดิมได้ในสภาพแวดล้อมและเวลาที่ต่างกัน

  • เป็นโมดูล (Modular): เขียนเป็นโมดูลอิสระที่ทดสอบได้แยกกัน

  • สอดคล้องกัน (Consistent): มีแหล่งข้อมูลเดียวสำหรับพารามิเตอร์ทั้งหมด

    • ใช้ไฟล์ configuration/parameter

แผนภาพแสดงคุณสมบัติ 3 ประการของโค้ด production

การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

ไฟล์ configuration และ YAML

  • ไฟล์ต้องอยู่ในรูปแบบที่รองรับ

    • YAML, JSON, TOML, Python
    • ค่าเริ่มต้นคือ params.yaml
  • จะใช้งาน YAML ในบทนี้

    • YAML Ain't Markup Language
    • รองรับรูปแบบมาตรฐานสำหรับถ่ายโอนข้อมูลระหว่างภาษาหรือแอปพลิเคชัน
    • รูปแบบเรียบง่ายและอ่านง่าย
    • นามสกุลไฟล์ที่ใช้ได้: .yaml หรือ .yml
1 https://dvc.org/doc/command-reference/params#description
การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

ไวยากรณ์ YAML

  • กำหนดพารามิเตอร์เป็น dictionary

    • key และ value คั่นด้วย :
  • คอมเมนต์เริ่มต้นด้วย #

  • ชนิดข้อมูล:

    • Integer, Floats, Strings
  • โครงสร้างข้อมูล:

    • Arrays
    • Nested Dictionaries
  • การย่อหน้ามีความสำคัญ

# Key-value pairs
a: 1
b: 1.2
c: "String value"
# Arrays
a: [1, 2.2, 3, 4.8]
b:
  - 5
  - "String value"
# Nested dictionaries
a:
  b: "Some value"
  c: "Some other value"
การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

ตัวอย่างไฟล์ configuration

# Data preprocessing paramters
preprocess:
  ...
  target_column: RainTomorrow
  categorical_features:
    - Location
    - WindGustDir
    - ...

# Model training/evaluation paramters train_and_evaluate: rfc_params: n_estimators: 2 ...
การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

ตัวอย่างฟังก์ชันแบบโมดูล

# In model.py
def evaluate_model(model, X_test, y_test):
    """Evaluate a model on a test set and return metrics."""
    y_pred = model.predict(X_test)
    precision = precision_score(y_test, y_pred)
    ...
    return { "accuracy": accuracy, "precision": precision,
        "recall": recall, "f1_score": f1 }
# In entry-point code (train_and_evaluate.py)
from model import evaluate_model
metrics = evaluate_model(model, X_test, y_test)
การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

ตัวอย่างโครงสร้างโค้ดในโปรเจกต์

ภาพแสดงโครงสร้างโค้ดใน Machine Learning repository

การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

มาฝึกกันเถอะ!

การจัดการเวอร์ชันข้อมูลด้วย DVC เบื้องต้น

Preparing Video For Download...