ONNX (Open Neural Network Exchange) ืืื ืชืงื ืคืชืื ืฉื ืืขื ืืืื ืืืืืืืฃ ืืืืืื ืฉื ืืืืืช ืืืื ื. ืืืฉืง ืืฉื ืช 2017 ืขื ืืื ืืืงืจืืกืืคื, Meta (ืืฉืขืืจ Facebook) ื-AWS, ืืืื ืคืืชืจ ืืขืื ืืจืืืืช ืืขืืื ื-AI: ืืืกืจ ืืชืืืืืช ืืื ืืกืืจืืช ืฉืื ืืช (ืืืื PyTorch ื-TensorFlow), ืืืื ืืคืืืคืืจืืืช ืืืืจื.
ืืืืืื ืคืฉืืืืช, ONNX ืืื โืืชืจืืโ ืืื ืืืจืกืื ืืจืฉืชืืช ื ืืืจืื ืื, ืืืืคืฉืจ ืืืคืชืืื ืืืขืืืจ ืืืืืื ุจุญุฑูุฉ ืืกืืืื ืืืช ืืืืจืช.
ืื ืืืืื: ืื ืจืฉืช ื ืืืจืื ืื ืืื ืืกืื ืืืจืื, ONNX ืืื ืคืืจืื PDF. ื ืืชื ืืืฆืืจ ืืกืื ืืื ืขืืจื (PyTorch, TensorFlow), ืื ืืืืจ ืฉืืืจื ื-PDF, ืืื ืืืคืชื ืืืืืจืืช ืืืืืคื ืขืงืื ืืื ืืืฉืืจ ืืืืฆืขืืช ืงืืจื ืืื ืืืจืกืื (ONNX Runtime).
ืืืฆื ืขืืื ONNX
ONNX ืืืืฆื ืื ืืืื ื-ืืจืฃ ืืืฉืืื. ืืจืฃ ืื ืืืจืื ืืฆืืชืื (ืคืขืืืืช ืืชืืืืืช ืื ืืืคืจืืืจืื) ืืงืฉืชืืช (ืืจืื ื ืชืื ืื ืืฆืืจืช ืื ืกืืจืื). ืืชืงื ืืืืืจ ืกื ืืืื ืฉื ืืืคืจืืืจืื ืืคืืจืืืื ืฉื ื ืชืื ืื ืฉืืืื ืื ืขื ืืื ืื ืืืืื ืืชืืืืื.
ืชืืืื ืืขืืืื ืืืื ืืืจื ืืื ืฉื ื ืฉืืืื ืืจืืืืื:
- ืืืฆืื: ืืืื ืืืืื ืืืกืืจืช ืืกืืืืช (ืืืฉื PyTorch) ืืืืจ ืืงืืืฅ
.onnx. - ืคืจืืกื (Inference): ืืงืืืฅ
.onnxืืืชืงืื ืืืคืขื ืืืืฆืขืืช ืกืืืืช ืจืืฆื ืืืขืืืืช ืืืืืจื โ ONNX Runtime.
ืืชืจืื ืืช ืืจืืืืื ืฉื ONNX
ืชืืืืืช ืืกืืจืืช:
ืืืชืจืื ืืืจืืื ืืื ืืืคืฉ ืืืขืืจื ืฉื ืืืืืื. ืืืืืื, ื ืืชื ืืืื ืืืื ื-PyTorch, ื ืื ืืืืงืจ, ืืื ืืคืจืืก ืืืชื ืืืืฆืขืืช ONNX Runtime, ืืืืชืื ืืืคืขืื ืืืืจื ืืกืืืื ืคืจืืืงืฉื.
ืืืคืืืืืืฆืื ืืืืืจื:
ืืฆืจื ื ืืืืจื (NVIDIA, Intel, ARM) ืืกืคืงืื ืกืคืจืืืช ืืืชืืืืช ืืืืฆืืข ืืืืืื ืืคืืจืื ONNX. ืื ืืืคืฉืจ ืืืืืข ืืืืฆืืขืื ืืงืกืืืืืื ืขื ืืืืจื ืฉืื ื ืืืื ืืืชืืื ืืช ืืืืื ืืื ืคืืืคืืจืื.
ืืืืฉืืช ืืขืืืืืช:
ืืชืงื ืืื ื ืงืืฉืจ ืืช ืืืคืชื ืืืื ืืืืืื ืืืช. ืื ืืืคืืข ืืกืืจืช ืืืฉื ืืืขืืื ืืืชืจ, ื ืืชื ืืืขืืืจ ืืืื ืืช ืืืืืืื ืืงืืืืื ืืงืืืช.
ONNX Runtime: ืื ืืข ืืืคืขืื
ONNX Runtime ืืื ืจืืื ืืจืืื ืืืขืจืืช ืืืงืืืืืืช. ืืืืืจ ืืกืืืื ืืืืื ืืืฆืืขืื ืืืจืฆืช ืืืืืื ืืคืืจืื .onnx. ืคืืชื ืขื ืืื ืืืงืจืืกืืคื, ืงืื ืคืชืื ืืืืืขื ืืืงืกื ืืช ืืืืจืืช ืืืืฉืื ืฉื ืืจืคื ONNX ืืื ืืืฉืืจ โ ืืฉืจืชืื ืจืื ืขืืฆืื ืืขื ืืืืคืื ืื ื ืืืืื. Runtime ืชืืื ืืฉืคืืช ืจืืืช (Python, C++, C#, Java) ืืืคืืืคืืจืืืช (Windows, Linux, Android, iOS).
ืืืืื ืืขืฉืืช: ื-PyTorch ื-ONNX Runtime
ืืืฆืื ืืืื ื-PyTorch:
import torch
# ืืืืื ืืืืืื ืฉืื
model = YourSuperModel()
# ืืืืืช ืงืื ืืืืืจืช ืืื ื ืืืจืฃ
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(model, dummy_input, "model.onnx")
ืืคืขืืช ืืืืื ืขื ONNX Runtime:
import onnxruntime as ort
import numpy as np
# ืืฆืืจืช ืกืฉื ืืื ืคืจื ืก
session = ort.InferenceSession("model.onnx")
# ืืื ืช ื ืชืื ื ืงืื
input_data = np.random.randn(1, 3, 224, 224).astype(np.float32)
input_name = session.get_inputs()[0].name
# ืงืืืช ืชืืืืช
result = session.run(None, {input_name: input_data})
print(result)
ONNX ื-Hugging Face: ืืชืงื ืืืื ื-NLP
ืืืืืืื ืืืจืืืื ืืื ืืจื ืกืคืืจืืจืื ืฉื Hugging Face, ืชืืืื ืืืืฆืื ืืชืืฆืข ืืฆืืจื ืคืฉืืื ืืืืฆืขืืช ืกืคืจืืืช Optimum, ืืืฉืืฉืช ื"ืืฉืจ ืจืฉืื" ืืืืคื ืืืืืืืืช ืืื ืคืจืื ืืืืจื.
ืืชืงื ืช ืืืืืืืช ืื ืืจืฉืืช:
pip install transformers onnx onnxruntime optimum[onnxruntime]
ืืืฆืื ืืืคืขืื ืฉื ืืืื Hugging Face:
from optimum.onnxruntime import ORTModelForSequenceClassification
from transformers import AutoTokenizer, pipeline
model_id = "distilbert-base-uncased-finetuned-sst-2-english"
# ืฉืื 1: ืืืฆืื ืืืืื ื-ONNX (ืคืขื ืืืช)
model = ORTModelForSequenceClassification.from_pretrained(model_id, from_transformers=True)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model.save_pretrained("./onnx-model/")
tokenizer.save_pretrained("./onnx-model/")
# ืฉืื 2: ืืคืขืืช ืืืื ONNX ืืืชืื
classifier = pipeline("text-classification", model="./onnx-model/")
result = classifier("ONNX ื-Hugging Face ืื ืฉืืืื ืขืืฆืืชื!")
print(result) # ืคืื: [{'label': 'POSITIVE', 'score': 0.9998...}]
ืืคืชื ืืืืฆืืขืื: ืืืคืืืืืืฆืื ืืืืืืช
ONNX Runtime ืื ืจืง ืืจืืฅ ืืืืืื โ ืืื ืืืืฅ ืืืชื. ืืืช ืืฉืืืืช ืืขืืงืจืืืช ืืื ืืืืืช.
ืืืืืื ืคืฉืืืืช: ืื ืชืืืื ืฉื โืคืืฉืืโ ืืืืฉืืืื ืืชืื ืืืืื. ืืืงืื ืืืฉืืืื ืืขืื ืืืืง ืืืื (FP32 ืืื 3.14159), ืืืืื ืืฉืชืืฉ ืืืกืคืจืื ืฉืืืื ืงืืื ืืืืืจืื ืืืืื 8 ืืื (INT8, ืืื -128 ื-127).
ืืชืจืื ืืช ืืืืืืช:
- ๐ ืืืืจืืช ืืืืื: ืคืขืืืืช ืขื ืืกืคืจืื ืฉืืืื ืืชืืฆืขืืช ืืจืื ืืืชืจ ืืืจ.
- ๐พ ืืืื ืงืื ืืืชืจ: ืืืืื ืงืื ืื-4 ืคืขืืื.
- ๐ ืืขืืืืช ืื ืจืืืืช: ืืคืืชืช ืฆืจืืืช ืืื ืจืืื, ืงืจืืื ืืืืฉืืจืื ื ืืืืื ื-edge.
ืฉืืืืฉืื ืฉื ONNX
ONNX ืืคื ืืชืงื ืชืขืฉืืืชื ืื ืืฆื ืืฉืืืืฉ ื ืจืื:
- ืฉืืจืืชื ืขื ื: Azure ML, AWS SageMaker, Google Cloud AI.
- ืืืฉืืืื ืฉืืืื ืืื ืื ืืืืื: ONNX Runtime ืคืืขื ืขื Windows, Linux, macOS, Android ื-iOS.
- ืืืฉืืจื edge: ืืจืฆื ืืขืืื ืฉื ืืืืืื ืขื ืืืฉืืจืื ืขื ืืฉืืืื ืืืืืืื (ืืฆืืืืช, ืจืืคื ืื, ืืืืฉื ืื ืชืขืฉืืืชืืื).
ืืืืืืช
ืืืจืืช ืืืชืจืื ืืช, ืงืืืืืช ืืืืืืช. ืืืจื ืฉื ืืจืืืืงืืืจืืช ืืืจืืืืช ืื ืืืฉืืช ืขืืืื ืืืืชืงื ืืืขืืืช ืื ืืืคืจืืืจ ืกืคืฆืืคื ืขืืืื ืืื ืื ืืงืืืื ื-ONNX. ืืงืืืื ืขืืืืช ืืืืคื ืคืขืื ืืืจืืืช ืืชืืืื.
ืงืืฉืืจืื ืฉืืืืฉืืื
- ืืชืจ ืจืฉืื: https://onnx.ai
- ืืืืจ GitHub: https://github.com/onnx/onnx
- ONNX Runtime: https://onnxruntime.ai
- Hugging Face Optimum: https://github.com/huggingface/optimum