mlmodel คือรูปแบบไฟล์โมเดลการเรียนรู้ของเครื่องสำหรับเฟรมเวิร์ก Core ML ของ Apple ที่ใช้จัดเก็บโมเดลที่ฝึกสอนแล้วก่อนที่รูปแบบ .mlpackage จะเกิดขึ้น ไฟล์ .mlmodel เป็นแพ็คเกจไบนารีในรูปแบบ protobuf ที่ประกอบด้วยคำอธิบายโมเดล น้ำหนักของโครงข่ายประสาทเทียม เมตาดาต้า และข้อมูลเกี่ยวกับอินพุตและเอาต์พุต ตามบันทึกประจำรุ่น Apple Core ML (2025) ตั้งแต่ Xcode 13 และ Core ML 4 เป็นต้นไป รูปแบบ .mlmodel แบบเก่าถูกยกเลิกเพื่อสนับสนุน .mlpackage ซึ่งให้การจัดการเวอร์ชันที่ดีกว่าและความสามารถในการอ่านเมตาดาต้า
ประเด็นสำคัญ
mlmodel คือรูปแบบไฟล์ไบนารีที่ Apple เปิดตัวในปี 2017 พร้อมกับเฟรมเวิร์ก Core ML ในงาน WWDC 2017 รูปแบบนี้ใช้เทคโนโลยีการทำให้เป็นอนุกรม protobuf (Protocol Buffers) ของ Google ซึ่งรับประกันขนาดที่กะทัดรัด (น้ำหนักโมเดลในรูปแบบ Float32) และการโหลดหน่วยความจำที่มีประสิทธิภาพ ไฟล์ .mlmodel มีนามสกุล .mlmodel และประเภท MIME คือ application/x-Apple-mlmodel
รูปแบบ .mlmodel เป็นรูปแบบ Core ML เพียงรูปแบบเดียวตั้งแต่ปี 2017 ถึง 2021 ในช่วงเวลานี้ โมเดลหลายล้านรายการจาก TensorFlow, Keras, PyTorch, Caffe, scikit-learn และไลบรารีอื่น ๆ ถูกแปลงผ่าน coremltools ข้อจำกัดของรูปแบบเริ่มชัดเจนขึ้นเมื่อความซับซ้อนของโมเดลเพิ่มขึ้น: protobuf ไม่รองรับการจัดการเวอร์ชันที่สะดวก เมตาดาต้าถูกจัดเก็บในรูปแบบไบนารี (อ่านไม่ได้ใน git diff) และการเพิ่มฟิลด์ใหม่จำเป็นต้องเปลี่ยนแปลงสคีมา protobuf
ไฟล์ mlmodel จัดเก็บโมเดลในรูปแบบการแสดงผลแบบไบนารีที่กะทัดรัด ขนาดมีตั้งแต่หลักสิบกิโลไบต์ (การถดถอยเชิงเส้น) ไปจนถึงกิกะไบต์ (โครงข่ายประสาทเทียมที่มีพารามิเตอร์นับล้าน) รูปแบบรองรับโมเดล Core ML ทุกประเภท: โครงข่ายประสาทเทียม (NeuralNetwork, NeuralNetworkClassifier, NeuralNetworkRegressor), โมเดลแบบensemble (TreeEnsemble, GradientBoosting), การถดถอย (LinearRegression, SVM) และไปป์ไลน์การประมวลผลก่อน/หลัง (OneHotEncoder, FeatureVectorizer)
| คุณลักษณะ | mlmodel |
|---|---|
| รูปแบบ | ไบนารี (protobuf) |
| ความสามารถในการอ่าน | อ่านไม่ได้ (ผ่าน coremltools เท่านั้น) |
| การจัดการเวอร์ชัน | ไม่มี (ไฟล์ไบนารีเดียว) |
| เมตาดาต้า | ในสคีมา protobuf |
| เป็นมิตรกับ git | ไม่ (diff ไบนารีไม่มีประสิทธิภาพ) |
โครงสร้างภายในของไฟล์ .mlmodel ถูกกำหนดโดยสคีมา protobuf ที่อธิบายไว้ในเฟรมเวิร์ก CoreML.framework ส่วนหลักได้แก่: modelDescription — คำอธิบายอินพุต เอาต์พุต และเมตาดาต้าของโมเดล; modelParameters — พารามิเตอร์เฉพาะของประเภทโมเดล (น้ำหนักโครงข่ายประสาทเทียม, tree ensembles, สัมประสิทธิ์การถดถอย); preprocessing — การกำหนดค่าการประมวลผลก่อน (การปรับขนาด, การทำให้ภาพเป็นมาตรฐาน); postprocessing — การประมวลผลหลัง (softmax, argmax, ค่าเกณฑ์)
ส่วน modelDescription (MLModelDescription) ประกอบด้วยชื่อโมเดล ผู้เขียน เวอร์ชัน คำอธิบาย ใบอนุญาต รวมถึงคำอธิบายโดยละเอียดของพารามิเตอร์อินพุตและเอาต์พุตทั้งหมด: ชื่อ, ชนิดข้อมูล (Float32, Int32, String, Image), มิติ, รูปแบบภาพ (BGR, RGB), ข้อจำกัดเพิ่มเติม (ช่วงค่า) ส่วนนี้ถูกใช้โดย Xcode เพื่อสร้างคลาสโมเดล Swift ที่มีอินพุตและเอาต์พุตแบบกำหนดชนิด
ส่วน modelParameters ประกอบด้วยน้ำหนักและพารามิเตอร์ที่แท้จริงของโมเดลที่ฝึกสอนแล้ว สำหรับโครงข่ายประสาทเทียม นี่คืออาร์เรย์ของเลเยอร์ (NeuralNetworkLayer) แต่ละเลเยอร์ประกอบด้วยชนิด (convolution, pooling, activation, innerProduct), น้ำหนัก, อคติ (bias) และพารามิเตอร์ (kernelSize, stride, padding) สำหรับโมเดลแบบensemble — ต้นไม้ตัดสินใจและโหนดของมัน สำหรับการถดถอย — สัมประสิทธิ์และจุดตัด น้ำหนักถูกจัดเก็บในรูปแบบ Float32 (4 ไบต์ต่อค่า)
ส่วน preprocessing อธิบายขั้นตอนการประมวลผลก่อนข้อมูลอินพุตก่อนส่งเข้าโมเดล Core ML รองรับ: การปรับขนาด (Scaler) — การทำให้เป็นมาตรฐานผ่านค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐาน; การแปลงภาพ (ImagePreprocessing) — การปรับขนาด, การครอบตัด, การปรับช่องสีให้เป็นมาตรฐาน, การแปลง BGR→RGB; OneHotEncoder — การเข้ารหัสคุณลักษณะเชิงหมวดหมู่; FeatureVectorizer — การรวมหลายคุณลักษณะเป็นเวกเตอร์เดียว
mlpackage คือรูปแบบเจเนอเรชันถัดไปสำหรับโมเดล Core ML ที่เปิดตัวในงาน WWDC 2021 แตกต่างจากไฟล์ .mlmodel ไบนารีเดี่ยว .mlpackage เป็นไดเรกทอรี (แพ็คเกจ) ที่มีโครงสร้างไฟล์: เนื้อหาโมเดลถูกจัดเก็บเป็นไฟล์ JSON ที่อ่านได้ (เมตาดาต้า, การกำหนดค่าเลเยอร์) และไฟล์ไบนารีแยกต่างหากสำหรับน้ำหนัก สิ่งนี้เปลี่ยนแปลงแนวทางการจัดเก็บ การจัดการเวอร์ชัน และการทำงานร่วมกันบนโมเดล ML อย่างสิ้นเชิง
| พารามิเตอร์ | mlmodel | mlpackage |
|---|---|---|
| ชนิด | ไฟล์ไบนารีเดียว | ไดเรกทอรี (แพ็คเกจ) |
| เมตาดาต้า | protobuf ไบนารี | JSON (อ่านได้) |
| Git diff | ไร้ประโยชน์ | ทำงานได้ (ยกเว้นน้ำหนัก) |
| การจัดการเวอร์ชัน | ด้วยตนเอง | อัตโนมัติใน JSON |
| เลเยอร์กำหนดเอง | ไม่ | รองรับ |
| สถานะ | เลิกใช้แล้ว | ปัจจุบัน |
แพ็คเกจ .mlpackage ประกอบด้วย: ModelCI/ — ไดเรกทอรีที่มีการกำหนดค่าโมเดลแบบมีเวอร์ชัน; Data/ — ไฟล์น้ำหนักไบนารี (SharedWeights.bin); Metadata.json — ชื่อ, ผู้เขียน, คำอธิบาย, เวอร์ชันโมเดล, วันที่สร้าง; Model.json — คำอธิบายสถาปัตยกรรม, อินพุต/เอาต์พุต, ชนิดเลเยอร์; Manifests/ — ใบแสดงเวอร์ชันสำหรับ CI/CD โครงสร้างนี้ช่วยให้ทำงานกับโมเดลใน git ได้อย่างมีประสิทธิภาพ: เมตาดาต้าและการกำหนดค่าถูกติดตาม ในขณะที่น้ำหนักไบนารีสามารถใช้ Git LFS
การแปลงจาก .mlmodel เป็น .mlpackage ทำได้สองวิธี: โดยอัตโนมัติระหว่างการสร้างใน Xcode (Xcode จะแปลง .mlmodel เป็น .mlpackage ระหว่างการคอมไพล์) หรือด้วยตนเองผ่าน coremltools ใน Python การแปลงด้วยตนเองให้การควบคุมมากขึ้นและอนุญาตให้อัปเดตเมตาดาต้าของโมเดล เพิ่มคำอธิบาย และตั้งค่าผู้เขียน หลังการแปลง โมเดลจะถูกบันทึกเป็น .mlpackage และสามารถใช้แทน .mlmodel ดั้งเดิมได้
import coremltools as ct
model = ct.models.MLModel(
"OldModel.mlmodel"
)
model.author = "IT Sectr"
model.short_description = "Converted from mlmodel"
model.version = "2.0"
model.save("NewModel.mlpackage")
เมื่อเพิ่มไฟล์ .mlmodel ในโปรเจกต์ Xcode ระบบจะตรวจจับรูปแบบโดยอัตโนมัติและระหว่างการสร้างจะเรียกใช้ Model Compiler — เครื่องมือที่แปล .mlmodel เป็น .mlpackage .mlpackage ที่คอมไพล์แล้วจะถูกวางในไดเรกทอรีการสร้าง (DerivedData) นักพัฒนาไม่สังเกตเห็นกระบวนการนี้ — API Core ML ทั้งหมดทำงานกับโมเดลอย่างสม่ำเสมอโดยไม่ขึ้นกับรูปแบบดั้งเดิม อย่างไรก็ตาม Xcode จะแสดงคำเตือนเมื่อเพิ่ม .mlmodel พร้อมคำแนะนำให้ใช้ .mlpackage
หลังการแปลง จำเป็นต้องตรวจสอบให้แน่ใจว่าโมเดล คงความแม่นยำไว้ coremltools มียูทิลิตี้ ct.utils.compare_models() สำหรับเปรียบเทียบการทำนายของโมเดลดั้งเดิมและโมเดลที่แปลงแล้วบนข้อมูลอินพุตเดียวกัน ความคลาดเคลื่อนที่ยอมรับได้คือไม่เกิน 1e-5 สำหรับ Float32 หากความคลาดเคลื่อนเกินเกณฑ์นี้ โมเดลอาจมีเลเยอร์กำหนดเองหรือการดำเนินการที่ไม่รองรับในรูปแบบใหม่
ความเข้ากันได้ย้อนหลังของ .mlmodel ได้รับการรับประกันบน iOS และ macOS ทุกเวอร์ชันปัจจุบัน แอปพลิเคชันที่คอมไพล์ด้วย Xcode 12 หรือใหม่กว่าจะได้รับเวอร์ชัน .mlpackage ของโมเดลโดยอัตโนมัติ แม้ว่าไฟล์ต้นฉบับจะเป็น .mlmodel อย่างไรก็ตาม ตั้งแต่ Xcode 15 (2023) เป็นต้นไป Apple ประกาศว่าโมเดลชนิดใหม่ (โครงข่ายประสาทเทียมแบบไดนามิก, การเรียนรู้แบบควบคุม) จะพร้อมใช้งานในรูปแบบ .mlpackage เท่านั้น และ .mlmodel จะไม่ได้รับความสามารถใหม่
ตั้งแต่ iOS 18 และ macOS 15 (Sequoia) เป็นต้นไป Core ML ไม่รองรับการโหลด .mlmodel โดยตรงอีกต่อไป โมเดล .mlmodel ทั้งหมดต้องถูกแปลงเป็น .mlpackage ล่วงหน้า หรือจะใช้ Xcode Model Compiler สำหรับการแปลงระหว่างการสร้าง API ระบบ MLModel(contentsOf:) สามารถเปิดไฟล์ .mlmodel ได้ก็ต่อเมื่อถูกแปลงเป็น .mlpackage ในขั้นตอนการสร้างโปรเจกต์
Apple ยังไม่ได้ประกาศวันสิ้นสุดการสนับสนุน .mlmodel อย่างเป็นทางการ แต่บริบททางประวัติศาสตร์ชี้ให้เห็นถึงช่วงเปลี่ยนผ่าน 3-4 ปี รูปแบบ .mlmodel เปิดตัวในปี 2017, .mlpackage ในปี 2021 คำเตือนการเลิกใช้ปรากฏใน Xcode 13 (2021) โดยเปรียบเทียบกับแอปพลิเคชัน 32 บิต (iOS 11 ยุติการสนับสนุน) การสนับสนุน .mlmodel อย่างสมบูรณ์อาจสิ้นสุดใน iOS 20-21 (2026-2027)
แม้รูปแบบจะเลิกใช้แล้ว .mlmodel ยังคงพบในโปรเจกต์ที่มีอยู่และบางสถานการณ์ นักพัฒนาที่ทำงานกับ Core ML ต้องเข้าใจว่าเมื่อใดที่ .mlmodel ยังคงเป็นส่วนหนึ่งของเวิร์กโฟลว์และวิธีการโต้ตอบกับมันอย่างถูกต้องโดยไม่สูญเสียประสิทธิภาพ
โปรเจกต์ที่มีอยู่ซึ่งเริ่มก่อนปี 2021 อาจมีโมเดล .mlmodel หลายสิบรายการที่โหลดผ่าน Swift Package Manager หรือโดยตรงใน Xcode การโยกย้ายโมเดลทั้งหมดไปยัง .mlpackage อาจใช้แรงงานมาก โดยเฉพาะอย่างยิ่งหากโมเดลถูกสร้างโดย coremltools เวอร์ชันเก่า (ก่อน 5.0) Apple แนะนำให้โยกย้ายทีละน้อย ทีละโมเดล ในการอัปเดตฟังก์ชันการทำงานครั้งถัดไป
บาง ไปป์ไลน์ CI/CD ที่มีอยู่ใช้ coremltools เวอร์ชัน 4.x สำหรับการแปลงโมเดลอัตโนมัติ ซึ่งโดยค่าเริ่มต้นจะส่งออกเป็น .mlmodel การอัปเดต coremltools เป็นเวอร์ชัน 5+ จะเปลี่ยนรูปแบบการส่งออกเป็น .mlpackage ซึ่งอาจต้องอัปเดตสคริปต์และการทดสอบ ในกรณีเช่นนี้ ทีมบางครั้งยังคงส่งออกเป็น .mlmodel ชั่วคราว โดยวางแผนการโยกย้ายในภายหลัง
ไลบรารีและ CocoaPods ของบุคคลที่สามที่เผยแพร่ก่อนปี 2021 อาจมีโมเดลในรูปแบบ .mlmodel ตัวอย่างเช่น ไลบรารีสำหรับการจดจำใบหน้า การกรองภาพ หรือฟิลเตอร์ AR นักพัฒนาที่ใช้ไลบรารีดังกล่าวสามารถทำงานกับ .mlmodel ต่อไปได้เนื่องจาก Xcode แปลงโดยอัตโนมัติระหว่างการสร้าง อย่างไรก็ตาม ขอแนะนำให้ตรวจสอบว่าผู้เขียนเผยแพร่อัปเดตด้วย .mlpackage หรือไม่
เมื่อทำงานกับรูปแบบ .mlmodel ที่เลิกใช้แล้ว นักพัฒนาพบ ปัญหาทั่วไปหลายประการ การรู้ปัญหาเหล่านี้และวิธีแก้ไขช่วยป้องกันการเสียเวลาเมื่อรวมโมเดล Core ML เข้ากับโปรเจกต์สมัยใหม่ มาดูปัญหาหลักกัน
เมื่อเพิ่ม .mlmodel ใน Xcode 13+ จะมี คำเตือน ปรากฏขึ้น: “‘mlmodel’ format is deprecated. Use ‘mlpackage’ instead.” คำเตือนไม่ได้ขัดขวางการสร้างแต่บ่งบอกถึงความจำเป็นในการโยกย้าย เพื่อแก้ไขคำเตือน ให้แปลงโมเดลผ่าน coremltools หรืออัปเดตเครื่องมือสร้างโมเดล
ไฟล์ .mlmodel ที่สร้างด้วย coremltools เวอร์ชันเก่า (ก่อน 3.0) อาจไม่เปิดบนอุปกรณ์ใหม่ที่ใช้ iOS 16+ เนื่องจากการเปลี่ยนแปลงใน ตัวแปลงสัญญาณ protobuf วิธีแก้ไขคือโหลดโมเดลผ่าน Python: model = ct.models.MLModel(“old.mlmodel”) จากนั้นบันทึกอีกครั้ง: model.save(“fixed.mlmodel”) หรือดีกว่านั้นคือแปลงเป็น .mlpackage โดยตรง
โมเดล .mlmodel ที่มี เลเยอร์กำหนดเอง (เลเยอร์โครงข่ายประสาทเทียมที่ผู้ใช้กำหนด) ไม่สามารถแปลงเป็น .mlpackage โดยตรงได้หากไม่มีขั้นตอนเพิ่มเติม ขั้นแรกต้องโหลดโมเดลใน coremltools ตรวจสอบว่าเลเยอร์ใดไม่รองรับในรูปแบบใหม่และปรับใช้สำหรับ .mlpackage หากเลเยอร์กำหนดเองไม่สำคัญ คุณสามารถลองลบออกจากโมเดล
คำถามที่พบบ่อย
mlmodel คือรูปแบบไฟล์ไบนารีที่เลิกใช้แล้วสำหรับจัดเก็บโมเดล Core ML ที่ใช้ตั้งแต่ปี 2017 ถึง 2021 มันขึ้นอยู่กับการทำให้เป็นอนุกรม protobuf ประกอบด้วยน้ำหนักโมเดล เมตาดาต้า และคำอธิบายข้อมูลอินพุต/เอาต์พุตในไฟล์ไบนารีเดียวที่มีนามสกุล .mlmodel
mlmodel คือไฟล์ไบนารีเดียว อ่านไม่ได้ใน git และไม่รองรับการจัดการเวอร์ชัน mlpackage คือไดเรกทอรี (แพ็คเกจ) ที่มีเมตาดาต้า JSON อ่านได้ใน git และรองรับการจัดการเวอร์ชัน mlpackage ยังรองรับเลเยอร์กำหนดเองและสร้างใบแสดงเวอร์ชันโดยอัตโนมัติ Apple แนะนำ mlpackage สำหรับโปรเจกต์ใหม่ทั้งหมด
คุณสามารถเปิดไฟล์ .mlmodel ได้สามวิธี: ผ่าน Xcode (เพิ่มในโปรเจกต์ — โมเดลแสดงในโปรแกรมแก้ไขพร้อมเมตาดาต้า), ผ่าน coremltools ใน Python (model = ct.models.MLModel(“model.mlmodel”)) หรือใช้ Netron — ตัวแสดงโมเดลฟรีที่รองรับ Core ML, ONNX, TensorFlow และรูปแบบอื่น ๆ
แนะนำแต่ไม่จำเป็นทันที Xcode จะแปลง .mlmodel เป็น .mlpackage โดยอัตโนมัติระหว่างการสร้างโปรเจกต์ อย่างไรก็ตาม คำเตือนการเลิกใช้ของ Xcode จะปรากฏขึ้นและคุณสมบัติ Core ML ใหม่ (เครือข่ายไดนามิก, iOS 18+) จะไม่พร้อมใช้งานสำหรับ .mlmodel แปลงโมเดลในการอัปเดตฟังก์ชันการทำงานครั้งถัดไป
iOS 18+ รองรับ .mlmodel ในโหมด ความเข้ากันได้ย้อนหลัง เท่านั้น: หากโมเดลถูกเพิ่มเป็น .mlmodel ในโปรเจกต์ Xcode, Xcode จะแปลงเป็น .mlpackage โดยอัตโนมัติระหว่างการสร้าง การโหลด .mlmodel โดยตรงผ่าน MLModel(contentsOf:) บนอุปกรณ์ iOS 18+ ไม่ได้รับการรับประกัน — Apple แนะนำให้จัดเก็บโมเดลใน .mlpackage
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม