Skip to content
> ๐Ÿ’ป ๐Ÿง  ืงื•ื“ 1001 > > ืžื”ื• ONNX (Open Neural Network Exchange)?

ืžื”ื• ONNX (Open Neural Network Exchange)?

ื‘ืžื™ืœื™ื ืคืฉื•ื˜ื•ืช, ONNX ื”ื•ื โ€œืžืชืจื’ืโ€ ืื•ื ื™ื‘ืจืกืœื™ ืœืจืฉืชื•ืช ื ื•ื™ืจื•ื ื™ื, ื”ืžืืคืฉืจ ืœืžืคืชื—ื™ื ืœื”ืขื‘ื™ืจ ืžื•ื“ืœื™ื ุจุญุฑูŠุฉ ืžืกื‘ื™ื‘ื” ืื—ืช ืœืื—ืจืช.

ืื ืœื•ื’ื™ื”: ืื ืจืฉืช ื ื•ื™ืจื•ื ื™ื ื”ื™ื ืžืกืžืš ืžื•ืจื›ื‘, ONNX ื”ื•ื ืคื•ืจืžื˜ PDF. ื ื™ืชืŸ ืœื™ืฆื•ืจ ืžืกืžืš ื‘ื›ืœ ืขื•ืจืš (PyTorch, TensorFlow), ืืš ืœืื—ืจ ืฉืžื™ืจื” ื›-PDF, ื”ื•ื ื™ื™ืคืชื— ื‘ืžื”ื™ืจื•ืช ื•ื‘ืื•ืคืŸ ืขืงื‘ื™ ื‘ื›ืœ ืžื›ืฉื™ืจ ื‘ืืžืฆืขื•ืช ืงื•ืจื ืื•ื ื™ื‘ืจืกืœื™ (ONNX Runtime).


ื›ื™ืฆื“ ืขื•ื‘ื“ ONNX

ONNX ืžื™ื™ืฆื’ ื›ืœ ืžื•ื“ืœ ื›-ื’ืจืฃ ื—ื™ืฉื•ื‘ื™. ื’ืจืฃ ื–ื” ืžื•ืจื›ื‘ ืžืฆืžืชื™ื (ืคืขื•ืœื•ืช ืžืชืžื˜ื™ื•ืช ืื• ืื•ืคืจื˜ื•ืจื™ื) ื•ืงืฉืชื•ืช (ื–ืจืžื™ ื ืชื•ื ื™ื ื‘ืฆื•ืจืช ื˜ื ืกื•ืจื™ื). ื”ืชืงืŸ ืžื’ื“ื™ืจ ืกื˜ ืื—ื™ื“ ืฉืœ ืื•ืคืจื˜ื•ืจื™ื ื•ืคื•ืจืžื˜ื™ื ืฉืœ ื ืชื•ื ื™ื ืฉืžื•ื‘ื ื™ื ืขืœ ื™ื“ื™ ื›ืœ ื”ื›ืœื™ื ื”ืชื•ืืžื™ื.

ืชื”ืœื™ืš ื”ืขื‘ื•ื“ื” ื›ื•ืœืœ ื‘ื“ืจืš ื›ืœืœ ืฉื ื™ ืฉืœื‘ื™ื ืžืจื›ื–ื™ื™ื:

  1. ื™ื™ืฆื•ื: ืžื•ื“ืœ ืžืื•ืžืŸ ื‘ืžืกื’ืจืช ืžืกื•ื™ืžืช (ืœืžืฉืœ PyTorch) ืžื•ืžืจ ืœืงื•ื‘ืฅ .onnx.
  2. ืคืจื™ืกื” (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. ื”ืงื”ื™ืœื” ืขื•ื‘ื“ืช ื‘ืื•ืคืŸ ืคืขื™ืœ ืœื”ืจื—ื‘ืช ื”ืชืžื™ื›ื”.


ืงื™ืฉื•ืจื™ื ืฉื™ืžื•ืฉื™ื™ื

Tags:

ื›ืชื™ื‘ืช ืชื’ื•ื‘ื”

ื”ืื™ืžื™ื™ืœ ืœื ื™ื•ืฆื’ ื‘ืืชืจ. ืฉื“ื•ืช ื”ื—ื•ื‘ื” ืžืกื•ืžื ื™ื *