Machine Learning

Exportar un pipeline completo a ONNX y verificar la paridad

Conversión del pipeline de scikit-learn entero (preprocesamiento incluido) a ONNX, y luego una aserción numérica entre las salidas de sklearn y onnxruntime — el paso que uno lamenta haberse saltado.

Requisitos

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})")

Resultado

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
187
ONNXExportParitéProduction

Snippets relacionados

Volver al Data Lab