注意
前往結尾以下載完整的範例程式碼
轉換時的黑名單運算子¶
某些執行階段並未針對 ONNX 中每個可用的運算子實作執行階段。轉換器不知道這一點,但可以將某些運算子列入黑名單。大多數轉換器不會改變其行為,如果它們使用黑名單中的運算子,它們會失敗,其中一些轉換器會產生不同的 ONNX 圖表。
GaussianMixture¶
第一個根據運算子的黑名單變更其行為的轉換器是針對模型 GaussianMixture。
from timeit import timeit
import numpy
from onnxruntime import InferenceSession
from sklearn.mixture import GaussianMixture
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from skl2onnx import to_onnx
data = load_iris()
X_train, X_test = train_test_split(data.data)
model = GaussianMixture()
model.fit(X_train)
預設轉換¶
model_onnx = to_onnx(
model,
X_train[:1].astype(numpy.float32),
options={id(model): {"score_samples": True}},
target_opset=12,
)
sess = InferenceSession(
model_onnx.SerializeToString(), providers=["CPUExecutionProvider"]
)
xt = X_test[:5].astype(numpy.float32)
print(model.score_samples(xt))
print(sess.run(None, {"X": xt})[2])
[-1.87252497 -1.34625882 -3.3789712 -2.51747032 -2.11219732]
[[-1.8725252]
[-1.3462601]
[-3.3789716]
[-2.51747 ]
[-2.112197 ]]
不使用 ReduceLogSumExp 的轉換¶
參數 black_op 用於告知轉換器不要使用此運算子。讓我們看看轉換器在這種情況下會產生什麼。
model_onnx2 = to_onnx(
model,
X_train[:1].astype(numpy.float32),
options={id(model): {"score_samples": True}},
black_op={"ReduceLogSumExp"},
target_opset=12,
)
sess2 = InferenceSession(
model_onnx2.SerializeToString(), providers=["CPUExecutionProvider"]
)
xt = X_test[:5].astype(numpy.float32)
print(model.score_samples(xt))
print(sess2.run(None, {"X": xt})[2])
[-1.87252497 -1.34625882 -3.3789712 -2.51747032 -2.11219732]
[[-1.8725252]
[-1.3462601]
[-3.3789716]
[-2.51747 ]
[-2.112197 ]]
處理時間¶
0.5201874999997926
0.4130731999998716
使用 ReduceLogSumExp 的模型速度快得多。
如果轉換器無法在沒有的情況下轉換…¶
許多轉換器不會考慮運算子的白名單和黑名單。如果轉換器無法在不使用黑名單中的運算子(或僅使用白名單中的運算子)的情況下轉換,則 skl2onnx 會引發錯誤。
try:
to_onnx(
model,
X_train[:1].astype(numpy.float32),
options={id(model): {"score_samples": True}},
black_op={"ReduceLogSumExp", "Add"},
target_opset=12,
)
except RuntimeError as e:
print("Error:", e)
Error: Operator 'Add' is black listed.
腳本的總執行時間:(0 分鐘 1.122 秒)