แผนการเรียนรู้
/

การใช้ Docker เพื่อความสามารถในการทำซ้ำ
(Reproducibility)

Dockerfile • Container • Image • MCP Metadata

ผลลัพธ์การเรียนรู้

1
เข้าใจหลักการของ Docker และ containerization
2
สร้าง Dockerfile สำหรับโครงการข้อมูลได้
3
ทดสอบและปรับปรุง environment เพื่อความ reproducible
4
ฝัง metadata ของ MCP ใน Docker image ได้
สัปดาห์ที่ 9

สัปดาห์ที่ 9: Docker และการทำซ้ำงาน (Reproducibility)

  • แนวคิดเรื่องการทำซ้ำงานในวิทยาการข้อมูล [1]
  • การสร้าง Docker Image สำหรับโปรเจกต์วิเคราะห์ข้อมูล
  • การฝัง Metadata ของ Model Context Protocol (MCP) ใน Docker Build
  • การจัดการสภาพแวดล้อมให้คงที่ (Environment Consistency)
  • Personalized AI Learning: ใช้ AI ช่วยเขียนและตรวจสอบ Dockerfile [7]

ทำไมการทำซ้ำงานจึงสำคัญ?

ปัญหา: "มันรันได้ในเครื่องของผมนะ"

  • เวอร์ชันของโมดูล (เช่น Scikit-Learn) ไม่ตรงกันทำให้ผลลัพธ์โมเดลเพี้ยน [8]
  • OS ต่างกันมีการจัดการหน่วยความจำหรือ Library พื้นฐานต่างกัน
  • การตั้งค่าสภาพแวดล้อม (Environment) ตกหล่น

Docker ช่วย "แช่แข็ง" สภาพแวดล้อมทั้งหมดเพื่อให้ทุกคนรันได้ผลลัพธ์เดียวกัน

องค์ประกอบพื้นฐานของ Docker

Dockerfile

"สูตรอาหาร" หรือชุดคำสั่งในการสร้าง Image

Image

ไฟล์ที่พร้อมรัน (Read-only) ที่รวมโค้ดและ Library ไว้แล้ว

Container

Image ที่กำลังรันอยู่ (Runtime instance)

$ docker build -t my-data-project .
$ docker run my-data-project

โครงสร้าง Dockerfile สำหรับงานข้อมูล

FROM: เลือก Python เวอร์ชันที่ต้องการ

WORKDIR: กำหนดโฟลเดอร์ทำงานใน Container

COPY: คัดลอกโค้ดและไฟล์ข้อมูลเข้าไป

RUN: ติดตั้ง Library ผ่าน pip

CMD: คำสั่งเริ่มต้น (เช่นรัน Jupyter หรือ script)

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "train_model.py"]

การจัดการโมดูลวิทยาการข้อมูล

Personal Learning Tip: ให้ AI ช่วยระบุเวอร์ชันของ Library ที่เสถียรที่สุดสำหรับโปรเจกต์

ตัวอย่าง requirements.txt

pandas==2.1.0
scikit-learn==1.3.0
pycaret==3.1.0
matplotlib==3.8.0
            

*ระบุเวอร์ชันเสมอ (Pinning) เพื่อป้องกันโมเดลพังในอนาคตเมื่อ Library อัปเดต*

ฝัง Metadata ด้วย Model Context Protocol (MCP)

เพื่อให้ AI Agent สามารถอ่านและเข้าใจ Image ได้ทันที เราจะใช้ **MCP Metadata** ในรูปของ Docker Label [1]:

  • Dataset Origin: ชุดข้อมูลมาจากที่ไหน? (เช่น UCI ML Repo [9])
  • Model Type: อัลกอริทึมที่ใช้คืออะไร?
  • Performance: ค่า Accuracy หรือ F1-score ที่ได้ล่าสุด
  • Context Layer: ข้อจำกัดของโมเดลนี้คืออะไร? [1]

โค้ดตัวอย่างการฝัง Metadata

# การใส่ Metadata ตามมาตรฐาน MCP [1]

LABEL org.mcp.context.model="RandomForest"

LABEL org.mcp.context.dataset="Pima Indians Diabetes"

LABEL org.mcp.context.metrics='{"accuracy": 0.89, "f1": 0.85}'

LABEL org.mcp.context.author="StudentID-12345"


# ตรวจสอบ Metadata หลัง Build:

$ docker inspect --format='{ {json .Config.Labels} }' my-image

การ Serve โมเดลอย่างปลอดภัยด้วย RamaLama

Concept

RamaLama ใช้ OCI containers เพื่อจัดการและ Serve โมเดล AI ในเครื่อง [6]

ทำไมถึงเหมาะสม?

  • Isolation: แยกโมเดลออกจากไฟล์ระบบของ Host [3]
  • No Network Access: ป้องกันข้อมูลรั่วไหลระหว่างการรันโมเดล [4]
  • Auto-Cleanup: ลบข้อมูลชั่วคราวทิ้งเมื่อจบการทำงาน [4]

ความปลอดภัยในการทำซ้ำงาน

ความเสี่ยง

โมเดลหรือโค้ดจากภายนอกอาจแฝง Malware หรือช่องโหว่ในการเข้าถึงไฟล์ในเครื่อง

ทางแก้ (Docker/RamaLama)

รันแบบ rootless และใช้ read-only volume mount เพื่อไม่ให้โค้ดแก้ไขไฟล์ Host ได้ [4]

"Reproducibility ต้องมาคู่กับ Security"

เตรียมตัวสำหรับ Workshop

ในคาบ Lab 2 ชั่วโมง เราจะลงมือปฏิบัติจริงดังนี้:

  1. สร้าง Dockerfile สำหรับโปรเจกต์ Scikit-Learn
  2. ฝึกฝัง **MCP Metadata** ลงในขั้นตอนการ Build [1]
  3. ทดลองส่ง Image ให้เพื่อนรัน เพื่อพิสูจน์ความแม่นยำของผลลัพธ์
  4. ใช้ AI Agent ช่วยตรวจสอบความถูกต้องของ Docker Configuration

*พร้อมแล้วไปที่ Laboratory Slide แผ่นแรกกันเลย!*

การจัดการข้อมูลถาวร (Volumes)

ในงานวิทยาการข้อมูล เราไม่ควรเก็บชุดข้อมูลขนาดใหญ่ไว้ใน Image โดยตรง [1]:

  • Docker Volumes: ใช้สำหรับเก็บข้อมูลที่ต้องการให้คงอยู่แม้ Container จะถูกลบ [2].
  • Bind Mounts: เชื่อมต่อโฟลเดอร์จากเครื่อง Host (เช่น datasets/) เข้ากับ Container โดยตรง เพื่อความสะดวกในการแก้ไขไฟล์ [2].
# ตัวอย่างการรันพร้อมเชื่อมต่อข้อมูลภายนอกแบบ Read-only เพื่อความปลอดภัย [3]
$ docker run -v /home/user/data:/app/data:ro my-ml-image

Docker Compose: จัดการระบบที่ซับซ้อน

ใช้ YAML file เพื่อนิยามและรันบริการหลายอย่างพร้อมกัน [4]:

  • รัน Jupyter Notebook คู่กับฐานข้อมูล (เช่น PostgreSQL).
  • กำหนด Network และ Environment Variables ได้ในที่เดียว.
  • ช่วยให้เพื่อนร่วมทีมรัน Stack ทั้งหมดได้ด้วยคำสั่งเดียว.
services:
  db: image: postgres
  ml_app:
    build: .
    ports: ["8888:8888"]
    depends_on: [db]

แนวปฏิบัติที่ดีที่สุดในการสร้าง Data Image

1. ใช้ .dockerignore

ข้ามไฟล์ที่ไม่จำเป็น เช่น .git, __pycache__, หรือไฟล์ข้อมูลดิบขนาดใหญ่ เพื่อลดขนาด Image [1].

2. เลเยอร์การติดตั้ง (Layer Caching)

Copy เฉพาะ requirements.txt และรัน pip install ก่อน Copy โค้ดทั้งหมด เพื่อให้ Build ครั้งต่อไปเร็วขึ้น [5].

3. ใช้ระบบ Rootless

รัน Container โดยไม่ใช้สิทธิ์ Root เพื่อความปลอดภัยสูงสุด (Security-first) [2, 6].

ภารกิจปฏิบัติการ: บรรจุโมเดลลง Container

สร้างสภาพแวดล้อมที่ทำซ้ำได้ (Reproducible) และฝัง Context ผ่าน MCP

Input:

Scikit-Learn Pipeline จากสัปดาห์ที่ 8 [7]

Output:

Docker Image ที่มี MCP Metadata ฝังอยู่ [8]

Step 1: จัดเตรียม Dependencies

สร้างไฟล์ requirements.txt เพื่อระบุเวอร์ชันที่แน่นอนของโมดูล [5]:

scikit-learn==1.3.0
pandas==2.1.0
numpy==1.24.3
joblib==1.3.1

*Tip: ใช้คำสั่ง `pip freeze > requirements.txt` ใน venv เพื่อดึงรายการปัจจุบันออกมา [9]*

Step 2: เขียนชุดคำสั่ง Dockerfile

# ใช้ base image ที่เหมาะสม

FROM python:3.9-slim


# ตั้งค่าโฟลเดอร์ทำงาน

WORKDIR /ml_app


# ติดตั้ง dependencies (Layer caching)

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt


# คัดลอกโค้ดและโมเดล (.pkl)

COPY . .

Step 3: การฝัง Metadata ตามมาตรฐาน MCP

เพิ่มคำสั่ง LABEL เพื่อให้ AI Agent เข้าใจบริบทของ Image นี้ [7, 8]:

LABEL org.mcp.model.version="1.0.0"
LABEL org.mcp.dataset.source="UCI Machine Learning Repository" [9]
LABEL org.mcp.metrics='{"accuracy": 0.88, "precision": 0.85}' [8]
LABEL org.mcp.reproducibility="true"

*การฝัง Metadata ช่วยให้ระบบอัตโนมัติสามารถตรวจสอบประสิทธิภาพได้โดยไม่ต้องรันโค้ด*

Step 4: การ Build และตรวจสอบความถูกต้อง

# สร้าง Image พร้อมระบุ Tag

$ docker build -t my-ml-project:v1 .

# ตรวจสอบว่า Metadata ถูกฝังลงไปจริงหรือไม่

$ docker inspect my-ml-project:v1

ให้นักศึกษาแคปเจอร์หน้าจอผลลัพธ์จาก docker inspect เพื่อใส่ในรายงาน [10].

Step 5: การพิสูจน์การทำซ้ำ (Validation)

กิจกรรมจับคู่ (Pair Testing):

  1. Export Image เป็นไฟล์: docker save my-image > project.tar
  2. ส่งไฟล์ให้เพื่อนในกลุ่มทดสอบรันในเครื่องของตนเอง.
  3. เปรียบเทียบผลลัพธ์ (Metrics) ว่าตรงกับที่ระบุไว้ใน MCP Label หรือไม่ [7].

*หากรันได้ผลไม่ตรงกัน ให้ใช้ AI ช่วยวิเคราะห์หาสาเหตุ (เช่น เวอร์ชันไฟล์ข้อมูลดิบต่างกัน)*

บทสรุปและสิ่งที่ต้องส่ง

  • Concepts: เข้าใจความสำคัญของ Image Isolation และ Reproducibility [11].
  • Skills: เขียน Dockerfile และจัดการ MCP Metadata ได้อย่างถูกต้อง [4].
  • Submission: อัปโหลด Dockerfile และ Requirements ไปที่ GitHub Repo ของตนเอง [12].

สัปดาห์หน้า: เริ่มต้นใช้งาน Agent Development Kit (ADK) [7]