خروجی گرفتن از کل pipeline به ONNX و چک کردن برابری
کل pipeline در scikit-learn (با پیشپردازش) رو به ONNX تبدیل کن، بعد بین خروجیهای sklearn و onnxruntime یه assert عددی بذار — همون مرحلهای که اگه ردش کنی پشیمون میشی.
کاربرد
استقرار سبک (بدون sklearn) توی یه سرویس C#/C++/Rust یا یه محیط محدود.
پیشنیازها
skl2onnx, onnxruntime, numpy
Python
import numpy as np
import onnxruntime as rt
from skl2onnx import to_onnx
X_sample = X_train.to_numpy().astype(np.float32)[:1]
onnx_model = to_onnx(
pipe, X_sample,
options={id(pipe.steps[-1][1]): {"zipmap": False}}, # sortie ndarray
)
with open("pipeline.onnx", "wb") as f:
f.write(onnx_model.SerializeToString())
sess = rt.InferenceSession("pipeline.onnx",
providers=["CPUExecutionProvider"])
entree = sess.get_inputs()[0].name
X_np = X_test.to_numpy().astype(np.float32)
proba_onnx = sess.run(None, {entree: X_np})[1]
proba_skl = pipe.predict_proba(X_test)
ecart = float(np.abs(proba_skl - proba_onnx).max())
assert ecart < 1e-4, f"Divergence sklearn/ONNX : {ecart}"
print(f"Parité OK (écart max {ecart:.2e})")نتیجه
Parité OK (écart max 3.42e-07)
>>> sess.get_inputs()[0].shape, sess.get_inputs()[0].type
([None, 24], 'tensor(float)')
>>> import os; os.path.getsize("pipeline.onnx") // 1024 # Ko sur disque
187ONNXExportParitéProduction