DVC กับ Git: เมื่อ Data ก็มีเวอร์ชั่น!
สวัสดีครับ! วันนี้ผมอยากมาเล่าเรื่อง DVC หรือ Data Version Control ให้ฟัง. สำหรับคนทำสาย ML หรือ Data Science น่าจะเคยเจอปัญหาเดียวกันคือ โค้ดเรานี่ Git จัดการได้สบายๆ เลยใช่ป่ะ? แต่พอเป็นไฟล์ Data โห... มันใหญ่มาก ใส่ Git ไม่ได้ หรือถ้าได้ก็ช้าโคตรๆ แล้วพอมีหลายเวอร์ชั่นนี่ก็งงไปหมดว่าโมเดลที่เราเทรนเนี่ยมันใช้ Data ตัวไหนกันแน่.
ปัญหามันคือ: * Data ขนาดใหญ่: Git ไม่ได้ถูกออกแบบมาให้จัดการไฟล์ใหญ่ๆ อะครับ * ติดตามการเปลี่ยนแปลงยาก: Data มันก็เปลี่ยนเรื่อยๆ บางทีเราก็อยากย้อนกลับไปดูว่า Data เวอร์ชั่นเก่าๆ หน้าตาเป็นยังไง * Reproducibility: โมเดลที่เราทำเนี่ย ถ้าอยากให้คนอื่นรันแล้วได้ผลเหมือนเดิม หรือเรากลับมารันเองในอนาคตแล้วได้ผลเดิม มันต้องใช้ Data ตัวเดิมเป๊ะๆ ซึ่ง Git ทำได้ไม่ค่อยดี
DVC นี่แหละพระเอก. มันไม่ได้มาแทนที่ Git นะ แต่มาทำงานร่วมกับ Git. Concept มันง่ายมากคือ DVC มันจะสร้างไฟล์เล็กๆ (.dvc) ที่เก็บ metadata ของ Data เรา เช่น checksum, ขนาดไฟล์, และบอกว่าไฟล์ Data ตัวจริงมันอยู่ตรงไหน (เช่นบน S3, GCS, หรือแม้แต่ในเครื่องเราเอง). แล้วไฟล์ .dvc เนี่ยแหละที่เราจะเอาเข้า Git. ส่วน Data จริงๆ DVC จะจัดการให้ไปเก็บที่ remote storage ที่เราเซ็ตไว้.
ลองมาดูวิธีใช้แบบง่ายๆ กัน:
- ติดตั้ง DVC:
pip install dvc
# หรือ dvc[s3] ถ้าจะใช้ S3
# pip install dvc[gdrive]
สำหรับผมนะ ใช้ Pip นี่แหละง่ายสุดละ
- เริ่มโปรเจกต์ DVC: เข้าโฟลเดอร์โปรเจกต์เรา แล้วรัน
git init
dvc init
สองคำสั่งนี้สำคัญมาก เหมือนเป็นการบอก Git ว่า "เฮ้ย นี่โปรเจกต์นะ" แล้วก็บอก DVC ว่า "แกเตรียมตัวมาช่วยจัดการ Data ตรงนี้นะ"
- ตั้งค่า Remote Storage: อันนี้แล้วแต่เลยว่าจะใช้ S3, GCS, Azure Blob, หรือแม้แต่ folder ในเครื่องอื่นก็ได้. สมมติผมจะใช้ S3 ละกัน (เพราะชอบใช้ AWS อะนะ).
dvc remote add -d s3_remote s3://your-dvc-bucket/dvc-store
# -d คือตั้งเป็น default
ตรง `your-dvc-bucket/dvc-store` ก็เปลี่ยนเป็นชื่อ bucket ของคุณเองนะ ถ้าไม่มีก็ไปสร้างใน S3 ก่อน
- เพิ่มไฟล์ Data เข้า DVC: สมมติเรามีไฟล์
data.csvอยู่
dvc add data.csv
git add data.csv.dvc .gitignore
git commit -m "Add initial data.csv with DVC"
dvc push
สังเกตว่าเรา `git add data.csv.dvc` นะ ไม่ใช่ `data.csv` ตัวจริง! DVC มันจะไปเพิ่ม `data.csv` ใน `.gitignore` ให้เองตอน `dvc add` นี่แหละ.
เวลา `dvc push` มันก็จะอัปโหลดไฟล์ `data.csv` ตัวจริงไปที่ S3 bucket ที่เราเซ็ตไว้.
- Pull Data: ถ้าเพื่อนร่วมทีมเราอยากได้ Data ตัวนี้มาใช้ ก็แค่
git pull(ได้ไฟล์ .dvc มา) แล้วตามด้วยdvc pullก็จะได้data.csvตัวจริงมา.
git pull
dvc pull
- จัดการ Data Pipeline ด้วย
dvc run: นี่คือฟีเจอร์โคตรเจ๋งอีกอันของ DVC มันทำให้เราจัดการ Data Pipeline แบบ reproducible ได้ง่ายๆ. สมมติเรามี scriptprocess_data.pyที่อ่านdata.csvแล้วเขียนออกเป็นprocessed_data.csv
# process_data.py
import pandas as pd
df = pd.read_csv('data.csv')
df['new_col'] = df['value'] * 2
df.to_csv('processed_data.csv', index=False)
print("Data processed!")
เราก็สามารถรัน script นี้ด้วย DVC ได้แบบนี้:
dvc run -n process_data_step \
-d data.csv \
-d process_data.py \
-o processed_data.csv \
python process_data.py
คำสั่งนี้มันบอกว่า:
* `-n process_data_step`: ตั้งชื่อ step นี้ (ช่วยให้ดูง่าย)
* `-d data.csv`: `data.csv` เป็น dependency (ถ้าไฟล์นี้เปลี่ยน DVC จะรู้ว่าต้องรันใหม่)
* `-d process_data.py`: `process_data.py` ก็เป็น dependency
* `-o processed_data.csv`: `processed_data.csv` เป็น output (ถ้าไฟล์นี้ไม่มี หรือ dependencies เปลี่ยน DVC จะรันคำสั่งใหม่)
* `python process_data.py`: คำสั่งที่จะรัน
DVC จะสร้างไฟล์ `process_data_step.dvc` ขึ้นมา ซึ่งเก็บข้อมูลทั้งหมดเกี่ยวกับ step นี้. ถ้าเราแก้ไข `data.csv` หรือ `process_data.py` แล้วรัน `dvc repro` (เหมือน `make` เลย) DVC ก็จะรู้ว่าต้องรัน `process_data.py` ใหม่. แต่ถ้าไม่มีอะไรเปลี่ยน มันก็ไม่รัน ประหยัดเวลาไปเยอะ!
ประสบการณ์ตรงกับ DVC:
ส่วนตัวผมว่า DVC มันเจ๋งนะเวลาที่โปรเจกต์เราเริ่มมี data เยอะๆ หรือมีทีมที่ทำงานร่วมกันหลายคน มันช่วยให้เราไม่หลงทางว่า Data เวอร์ชั่นไหนใช้กับโมเดลไหน. แต่ก็มีจุดที่ต้องระวังเหมือนกันนะ.
ปัญหาที่เคยเจอ: บางทีมือใหม่ๆ จะลืม dvc remote add หรือตั้งค่า remote ผิด. ตอน dvc push หรือ dvc pull เนี่ย ถ้าเจอ Error แบบ Permission denied หรือ No such bucket ประมาณเนี้ย ให้กลับไปเช็คการตั้งค่า Credentials ของ S3 (หรือ Cloud อื่นๆ) หรือชื่อ Bucket กับ Path ให้ดีๆ เลย. ผมเคยเจอแบบว่าลืมตั้งค่า AWS CLI profile ให้มัน access S3 ได้ ก็ Error แบบน่าหงุดหงิดเลย.
ERROR: failed to push data to the remote: Not authorized to access the bucket. Check your credentials.
เนี่ย! เจอบ่อยมาก! ต้องไปเช็คพวก ~/.aws/credentials หรือ Environment Variables ดีๆ นะ.
อีกเรื่องคือ DVC มันฉลาดมากนะ ถ้าคุณแก้ไขไฟล์ที่ DVC track อยู่แล้วคุณลืม dvc add ใหม่เนี่ย แล้วไป git commit เลย ก็อาจจะทำให้ไฟล์ .dvc มันไม่ตรงกับ Data จริงๆ ที่อยู่บน remote storage ได้นะ. อันนี้ต้องระวังนิดนึง.
สรุปคือ DVC เป็นเครื่องมือที่โคตรมีประโยชน์เลย สำหรับใครที่ทำงานกับ Data เยอะๆ หรือทำ MLOps. ลองเอาไปใช้ดูนะครับ ชีวิตการทำงานจะง่ายขึ้นเยอะเลย!