Core ML Model Conversion คือกระบวนการแปลงโมเดลการเรียนรู้ของเครื่องที่ได้รับการฝึกอบรมแล้วจากเฟรมเวิร์กยอดนิยมไปยังรูปแบบ Core ML (.mlmodel) ที่ได้รับการเปรื่อมเพื่อการทำงานบนอุปกรณ์ Apple การแปลงเป็นสิ่งจำเป็นเพราะ PyTorch, TensorFlow และเฟรมเวิร์กอื่นๆ ใช้รูปแบบของตนเองที่ไม่เข้ากันกับ Core ML Runtime ตาม เอกสาร coremltools, 2025 ไลบรารีรองรับการแปลงจาก PyTorch, TensorFlow 1.x และ 2.x, Keras, ONNX, scikit-learn และ libsvm coremltools แทนที่การดำเนินการที่ไม่รองรับโดยอัตโนมัติด้วยการดำเนินการที่เทียบเทียม โดยรักษาความแม่นยำทางตัวเลขของโมเดล
ประเด็นสำคัญ
Core ML Model Conversion คือกระบวนการแปลงโมเดลการเรียนรู้ของเครื่องที่ได้รับการฝึกอบรมแล้วจากรูปแบบเฟรมเวิร์กต้นฉบับไปยังรูปแบบ .mlmodel ที่ Core ML Runtime บนอุปกรณ์ Apple เข้าใจ หากไม่มีการแปลง โมเดลที่ได้รับการฝึกอบรมใน PyTorch หรือ TensorFlow ไม่สามารถโหลดและทำงานบน iOS หรือ macOS โดยตรง
กระบวนการแปลงรวมถึง การแปลกราฟการคำนวณ: ตัวดำเนินการแต่ละตัวจาเฟรมเวิร์กต้นฉบับ (Conv2D, BatchNorm, ReLU) จะถูกแมปไปยังตัวดำเนินการ Core ML ที่สอดคล้องกัน หากไม่มีการแทนที่โดยตรง coremltools จะใช้การดำเนินการแบบผสมหรือเลเยอร์ที่กำหนดเอง ตาม Apple ML Research ไลบรารีครอบคุมมากกว่า 200 ตัวดำเนินการจากเฟรมเวิร์กต่าง ๆ
หลังจากการแปลง โมเดลจะถูกบันทึกในรูปแบบแพ็คเกจ .mlmodel ซึ่งรวมถึงคำอธิบายกราฟ protobuf น้ำหนักในรูปแบบไบนารีและเมตาดาต้า ไฟล์นี้จะถูกคอมไพล์เป็น mlmodelc สำหรับการทำงานบนอุปกรณ์เป้าหมาย
coremltools เวอร์ชั่น 7.x รองรับการแปลงจาก หกแหล่งที่มา PyTorch — ผ่าน torch.jit.trace หรือ torch.export, TensorFlow 2.x — ผ่าน SavedModel และ Keras H5, TensorFlow 1.x — ผ่านกราฟแช่เฮ็ด .pb สำหรับ ONNX จะใช้การแสดงข้อมูลขั้นกลาง ซึ่งจะถูกแปลเป็น Core ML ต่อไป
| เฟรมเวิร์ก | รูปแบบข้าเข้า | API coremltools |
|---|---|---|
| PyTorch | TorchScript, torch.export | CTConverter / convert() |
| TensorFlow 2.x | SavedModel, Keras H5 | convert() |
| TensorFlow 1.x | Frozen .pb | convert() |
| ONNX | .onnx | onnx_to_coreml() |
| scikit-learn | .pkl / Pipeline | converters.sklearn.convert() |
| Keras | .h5 / .keras | convert() |
coremltools คือ ไลบรารี Python แบบเปิดเผยอย่างเป็นทางการ จาก Apple ที่สามารถใช้งานได้ผ่าน pip install coremltools ไลบรารีให้ API แบบเดียวสำหรับการแปลงจากทุกเฟรมเวิร์กที่รองรับ รวมถึงเครื่องมือการประมวลผลภายหลัง: การควอนไตซ์ การตรวจสอบความแม่นยำและการแสดงภาพกราฟ
การติดตั้งและการแปลงโมเดลพื้นฐานจาก PyTorch:
import coremltools as ct
import torch
import torchvision
model = torchvision.models.resnet18(pretrained=True)
model.eval()
example_input = torch.rand(1, 3, 224, 224)
traced_model = torch.jit.trace(model, example_input)
mlmodel = ct.convert(
traced_model,
source="pytorch",
inputs=[ct.ImageType(shape=example_input.shape)]
)
mlmodel.save("ResNet18.mlmodel")
สำหรับการแปลงจาก TensorFlow ให้ใช้ SavedModel เป็นแหล่งที่มา coremltools จะกำหนดเทนเซอร์ข้าเข้าและข้าออกโดยอัตโนมัติตาม signature_def:
import coremltools as ct
mlmodel = ct.convert(
"saved_model_dir",
source="tensorflow",
@minimum_deployment_target=ct.target.iOS16
)
mlmodel.save("MyTFModel.mlmodel")
กระบวนการแปลงประกอบด้วย สี่ขั้นตอน ในขั้นตอนแรก coremltools จะโหลดโมเดลต้นฉบับและดำเนินการติดตาม (tracing) หรือการสแกนกราฟ สำหรับ PyTorch จะใช้ torch.jit.trace ซึ่งจะส่งข้อมูลนำเข้าตัวอย่างผ่านโมเดลและบันทึกลำดับของการดำเนินการ
ในขั้นตอนที่สอง จะดำเนินการ แมปตัวดำเนินการ (operator mapping) ตัวดำเนินการแต่ละตัวจากกราฟต้นฉบับจะถูกแมปไปยังตัวดำเนินการ Core ML หากไม่มีการแทนที่โดยตรง coremltools จะแบ่งตัวดำเนินการออกเป็นลำดับของตัวดำเนินการที่รองรับ ตาม เอกสาร coremltools ความครอบคุมตัวดำเนินการ PyTorch เกิน 95% สำหรับสถาปัตยกรรมทั่วไป
ขั้นตอนที่สางคือ การเพิ่มเติมประสิทธิภาพของกราฟ coremltools ดำเนินการผสานการดำเนินการ (เช่น conv + batch norm) การลบการแปลงที่ไม่จำเป็นและการเรียงลำดับตัวดำเนินการใหม่เพื่อประสิทธิภาพ ขั้นตอนที่สี่คือ การทำซีเรียลไซซ์ ในรูปแบบ .mlmodel โดยการรักษาน้ำหนักและเมตาดาต้า
ปัญหาที่พบบ่อยที่สุดในการแปลงคือ การดำเนินการที่ไม่รองรับ หากโมเดลมีตัวดำเนินการที่ขาดใน Core ML coremltools จะรายงานข้อผิดพร้อมชื่อของการดำเนินการ วิธีแก้คือแทนที่ตัวดำเนินการด้วยการผสานที่เหมาะสมของตัวดำเนินการที่รองรับหรือใช้ custom layer API สร้างเลเยอร์ที่กำหนดเอง
ปัญหาที่สองคือ มิติของมิติไม่ตรงกัน PyTorch ใช้รูปแบบ NCHW ในขณะที่ Core ML ใช้ NHWC เป็นค่าเริ่มต้น coremltools จะแทรกการสลับตำแหน่งโดยอัตโนมัติ แต่บางครั้งลำดับแกนอาจถูกกำหนดไม่ถูกต้อง ตรวจสอบมิติข้าเข้าและข้าออกในบันทึกการแปลงและหากจำเป็นให้ระบุ input_features ด้วยชื่อที่ถูกต้อง
ปัญหาที่สามคือ การสูญเสียความแม่นยำหลังจากการควอนไตซ์ เมื่อแปลงด้วยจานสี FP16 หรือ INT8 ความแม่นยำของโมเดลอาจลดลง coremltools มียูทิลิตี้ ct.models.CompiledModel สำหรับเปรียบเทียผลลัพธ์ของโมเดลต้นฉบับและโมเดลที่แปลงแล้วบนข้อมูลนำเข้าเดียวกัน หากความแตกต่างเกิน 1% ให้ใช้การควอนไตซ์ด้วยจานสี FP16 โดยไม่ต้องการเคาลิเบรชั่นหรือข้ามการควอนไตซ์ไปเลย
ตัวอย่างการแปลงโมเดล MobileNetV3 จาก PyTorch ด้วยการระบุชนิดข้อมูลนำเข้าและเวอร์ชั่น iOS ขั้นต่ำ ใช้ ct.ImageType สำหรับการประมวลภาพให้เป็นปกติโดยอัตโนมัติ:
import coremltools as ct
import torchvision
model = torchvision.models.mobilenet_v3_small(
pretrained=True
)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced = torch.jit.trace(model, example)
mlmodel = ct.convert(
traced,
source="pytorch",
inputs=[ct.ImageType(
shape=example.shape,
scale=1.0/255.0,
bias=[0, 0, 0]
)],
@minimum_deployment_target=ct.target.iOS16
)
# บันทึกไปยัง .mlmodel สำหรับการคอมไพล์ที่หลังใน Xcode
mlmodel.save("MobileNetV3.mlmodel")
ตัวอย่างการแปลงจาก TensorFlow Keras ด้วยการควอนไตซ์ FP16 ระบุ minimum_deployment_target เพื่อเปิดใช้งานการรองรับ FP16 บนอุปกรณ์ที่มี Apple A13 ขึ้นไป:
import coremltools as ct
from tensorflow import keras
keras_model = keras.applications.EfficientNetB0(
weights="imagenet"
)
mlmodel = ct.convert(
keras_model,
source="tensorflow",
@minimum_deployment_target=ct.target.iOS17
)
# ควอนไตซ์น้ำหนักเป็น FP16 เพื่อลดขนาด 2 เท่า
mlmodel_fp16 = ct.models.neural_network.quantization_utils.quantize_weights(
mlmodel, 16
)
mlmodel_fp16.save("EfficientNetB0_fp16.mlmodel")
คำถามที่พบบ่อย
ได้ หากโมเดลถูกบันทึกในรูปแบบ TorchScript, SavedModel หรือ ONNX coremltools จะโหลดรูปแบบเหล่านี้ โดยไม่ต้องใช้โค้ดต้นฉบับ และดำเนินการแปลงโดยอาศัยกราฟการคำนวณ
coremltools จะแสดง รายการการดำเนินการที่ไม่รองรับ ในบันทึกระหว่างการแปลง ใช้ ct.utils.get_coreml_operations() เพื่อรับรายการที่สมบูรณ์ของตัวดำเนินการ Core ML ที่มีอยู่
จานสีการควอนไตซ์คือ ชุดของพารามิเตอร์ สำหรับการบีบอัดน้ำหนักของโมเดล: fp16, int8 หรือ palettization coremltools รองรับจานสี 8 บิต, 16 บิต และ LUT ควอนไตซ์ด้วยความลึกของบิตที่แตกต่างกัน
ใช่ ไฟล์ .mlmodel ต้องถูก คอมไพล์เป็น mlmodelc ก่อนการทำงานบนอุปกรณ์ การคอมไพล์จะดำเนินการโดยอัตโนมัติใน Xcode ระหว่างการสร้างหรือบนอุปกรณ์ผ่าน MLModel.compile(at:)
ใช้ ct.models.CompiledModel เพื่อเปรียบเทียผลลัพธ์ของโมเดลต้นฉบับและโมเดลที่แปลงแล้ว ให้ข้อมูลนำเข้าเดียวกันและเปรียบเทียผลลัพธ์โดยใช้เมตริก MSE หรือ cosine similarity
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม