Safetensors เป็นรูปแบบโมเดลที่โดดเด่น ออกแบบมาเพื่อจัดเก็บ Tensor อย่างปลอดภัย ด้วยความเร็วและประสิทธิภาพที่น่าประทับใจ เมื่อเทียบกับทางเลือกอื่นๆ ในวงการ Safetensors ไม่เพียงแต่รวดเร็วอย่างเหลือเชื่อเท่านั้น แต่ยังได้รับการออกแบบโดยคำนึงถึงความเรียบง่ายและความปลอดภัยเป็นหลัก ทำให้แตกต่างจากรูปแบบดั้งเดิมมากมายที่ใช้ใน Machine Learning
ทำไมต้องเลือก Safetensors
ด้วยรูปแบบที่มีให้เลือกมากมายสำหรับ Machine Learning และการจัดเก็บข้อมูล คุณอาจสงสัยว่าอะไรที่ทำให้ Safetensors แตกต่างออกไป ลองมาเปรียบเทียบรูปแบบเหล่านี้ เพื่อทำความเข้าใจว่า Safetensors ให้ผลลัพธ์ตามเกณฑ์สำคัญได้อย่างไร:
- ปลอดภัย (Safe): ไฟล์ที่ดาวน์โหลดมาแบบสุ่ม จะไม่รันโค้ดโดยพลการใช่ไหม
- Zero-copy: การอ่านไฟล์ต้องใช้หน่วยความจำมากกว่าไฟล์ต้นฉบับหรือไม่
- Lazy loading: สามารถตรวจสอบไฟล์ได้โดยไม่ต้องโหลดทุกอย่างหรือไม่ และสามารถโหลดเฉพาะบาง Tensor ในไฟล์ได้หรือไม่ โดยไม่ต้องสแกนทั้งไฟล์ (สำคัญในการตั้งค่าแบบกระจาย)
- Layout control: สามารถควบคุมตำแหน่งของ Tensor ภายในไฟล์ได้ เพื่อให้เข้าถึง Tensor แต่ละตัวได้อย่างรวดเร็วหรือไม่
- No file size limit: มีการจำกัดขนาดไฟล์หรือไม่
- ความยืดหยุ่น (Flexibility): สามารถบันทึกโค้ดที่กำหนดเองในรูปแบบ และใช้งานในภายหลังได้โดยไม่ต้องมีโค้ดเพิ่มเติมหรือไม่
- Bfloat16: รูปแบบรองรับ Bfloat16 ดั้งเดิม โดยไม่จำเป็นต้องมีวิธีแก้ไขปัญหาแปลกๆ หรือไม่
แต่ละสัญลักษณ์ ✔ แทนการมีอยู่, ❌ แทนการไม่มีอยู่, ~ แทนการมีอยู่บางส่วน, และ ? แทนการมีอยู่ที่ไม่ทราบ
รูปแบบ | ปลอดภัย | Zero-copy | Lazy loading | ไม่จำกัดขนาดไฟล์ | ควบคุม Layout | ความยืดหยุ่น | Bfloat16 |
---|---|---|---|---|---|---|---|
SafeTensors | ✔ | ✔ | ✔ | ✔ | ✔ | ❌ | ✔ |
pickle (PyTorch) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
H5 (Tensorflow) | ✔ | ❌ | ✔ | ✔ | ~ | ~ | ❌ |
SavedModel (Tensorflow) | ✔ | ❌ | ❌ | ✔ | ✔ | ❌ | ✔ |
MsgPack (flax) | ✔ | ✔ | ❌ | ✔ | ❌ | ❌ | ✔ |
Protobuf (ONNX) | ✔ | ❌ | ❌ | ❌ | ❌ | ❌ | ✔ |
Cap’n’Proto | ✔ | ✔ | ~ | ✔ | ✔ | ~ | ❌ |
Numpy (npy,npz) | ✔ | ? | ? | ❌ | ✔ | ❌ | ❌ |
pdparams (Paddle) | ❌ | ❌ | ❌ | ✔ | ❌ | ✔ | ✔ |
จากการเปรียบเทียบนี้ คุณจะเห็นว่า Safetensors ตอบสนองหรือเหนือกว่าคุณสมบัติที่รูปแบบโมเดลอื่นๆ มีให้ โดยเฉพาะอย่างยิ่งสำหรับความสามารถในการจัดการข้อมูลแบบ ‘zero-copy’ และ Lazy loading ซึ่งสามารถเพิ่มประสิทธิภาพในการจัดการข้อมูลในงาน Machine Learning ได้อย่างมาก
การเปรียบเทียบที่น่าสนใจ
แม้ว่าทุกรูปแบบจะมีจุดแข็งที่เป็นเอกลักษณ์ของตัวเอง ลองมาพิจารณาว่า Safetensors ทำงานได้ดีเพียงใด เมื่อเทียบกับรูปแบบที่ใช้กันทั่วไป:
- Pickle (PyTorch): เป็นรูปแบบที่ใช้กันอย่างแพร่หลาย แต่ Pickle มีข้อเสียที่สำคัญคือ ไม่ปลอดภัย เนื่องจากอนุญาตให้รันโค้ดโดยพลการได้
- H5 (Tensorflow): แม้ว่าจะปลอดภัย แต่ไม่รองรับ Zero-copy ซึ่งเป็นคุณสมบัติสำคัญสำหรับการจัดการข้อมูลอย่างมีประสิทธิภาพ
- SavedModel (Tensorflow): รูปแบบนี้เฉพาะสำหรับ Tensorflow และขาดความยืดหยุ่นสำหรับการใช้งานอื่นๆ
- Numpy (npz): แม้ว่าจะเป็นที่นิยม แต่รูปแบบนี้ไม่รองรับ Bfloat16 ซึ่งเป็นคุณสมบัติที่สำคัญมากขึ้นในโลก ML
เบื้องหลัง Safetensors
เมื่อเจาะลึกลงไปใน Safetensors เราพบว่าไม่ใช่แค่รูปแบบข้อมูล แต่เป็นการผสมผสานระหว่างตัวเลือกการออกแบบที่พิถีพิถัน ซึ่งช่วยเพิ่มความปลอดภัย ประสิทธิภาพ และประโยชน์ใช้สอย:
- Zero-copy: การออกแบบ Safetensors ช่วยให้สามารถ Zero-copy ที่แท้จริงบน CPU ได้ หากไฟล์อยู่ในแคชแล้ว บน GPU แม้ว่าจะจำเป็นต้องมีการคัดลอกเสมอ เนื่องจากไม่มีดิสก์แคช แต่การออกแบบจะหลีกเลี่ยงความจำเป็นในการจัดสรร Tensor ทั้งหมดบน CPU ณ จุดใดจุดหนึ่ง
- Endianness: Safetensors ใช้ Little-endian ordering ซึ่งเป็นตัวเลือกยอดนิยมในการจัดเก็บข้อมูล
- Order: ใช้ ‘C’ หรือ Row-major ordering ตัวเลือกนี้สอดคล้องกับมาตรฐานที่แพร่หลายในการจัดเก็บข้อมูล
- Stride: ไม่รองรับ Striding ต้องแพ็ก Tensor ทั้งหมดก่อนที่จะ Serialized การตัดสินใจออกแบบนี้มีพื้นฐานมาจากรูปแบบการใช้งานปัจจุบันในรูปแบบ Serialized
เหนือกว่า
นอกเหนือจากการเป็นรูปแบบการจัดเก็บข้อมูลที่มีประสิทธิภาพและปลอดภัยแล้ว Safetensors ยังนำข้อดีเพิ่มเติมมาสู่โต๊ะ:
- การป้องกันการโจมตี DOS: การออกแบบของ Safetensors ช่วยลดความเป็นไปได้ที่ไฟล์ที่เป็นอันตรายจะก่อให้เกิดการโจมตี DOS มีการจำกัดขนาดของ Header เพื่อป้องกันการ Parse JSON ขนาดใหญ่มาก และมีการรับประกันว่าที่อยู่ในไฟล์จะไม่ทับซ้อนกัน ซึ่งหมายความว่าการโหลดไฟล์ไม่ควรใช้หน่วยความจำเกินขนาดไฟล์
- โหลดเร็วขึ้น: Safetensors ข้ามการคัดลอก CPU เพิ่มเติมใน PyTorch ทำให้โหลด CPU ได้เร็วมาก เมื่อเทียบกับ Pickle เวลาในการโหลด GPU เร็วเท่ากันหรือเร็วกว่า PyTorch
- Lazy Loading: ในการตั้งค่าแบบกระจาย (Multi-node หรือ Multi-gpu) Safetensors ช่วยให้โหลดเฉพาะบางส่วนของ Tensor ได้ ซึ่งช่วยเร่งเวลาในการโหลดโมเดลอย่างมาก และปรับปรุงรอบการตอบสนองของการพัฒนา
ในโลกจริง
Safetensors ได้รับการยอมรับอย่างกว้างขวางในองค์กร AI ชั้นนำ เช่น Hugging Face, EleutherAI และ StabilityAI โครงการที่โดดเด่นหลายโครงการที่ใช้ Safetensors ได้แก่:
- huggingface/transformers
- AUTOMATIC1111/stable-diffusion-webui
- Llama-cpp
- microsoft/TaskMatrix
- hpcaitech/ColossalAI
- huggingface/pytorch-image-models
- CivitAI
- huggingface/diffusers
- coreylowman/dfdx
- invoke-ai/InvokeAI
- oobabooga/text-generation-webui
- Sanster/lama-cleaner
- PaddlePaddle/PaddleNLP
- AIGC-Audio/AudioGPT
- brycedrennan/imaginAIry
- comfyanonymous/ComfyUI
- LianjiaTech/BELLE
โดยสรุปแล้ว Safetensors ที่มีคุณสมบัติและประโยชน์ที่เป็นเอกลักษณ์ กำลังจะกลายเป็น Game-changer ในโลกของ Machine Learning และการจัดเก็บข้อมูล ลองใช้งานดูสิ อนาคตของรูปแบบโมเดลกำลังรอคุณอยู่!