Skip to content

Commit 7d4479d

Browse files
authored
Test against onnxruntime 1.16.0 + scikit-learn 1.3.1 (#1027)
* Upgrade CI to test against onnxruntime 1.16.0 Signed-off-by: Xavier Dupre <[email protected]> * fix adaboost converter for scikit-learn==1.3.1 Signed-off-by: Xavier Dupre <[email protected]> * fix example Signed-off-by: Xavier Dupre <[email protected]> * fix unit tests Signed-off-by: Xavier Dupre <[email protected]> --------- Signed-off-by: Xavier Dupre <[email protected]>
1 parent 262abfc commit 7d4479d

10 files changed

+88
-35
lines changed

.azure-pipelines/linux-conda-CI.yml

+24-11
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,40 @@ jobs:
1414
strategy:
1515
matrix:
1616

17-
Py311-Onnx140-Rt151-Skl130:
17+
Py311-Onnx141-Rt160-Skl131:
1818
do.bench: '0'
1919
python.version: '3.11' # onnxruntime cannot support python 3.11 yet
2020
numpy.version: '>=1.21.1'
2121
scipy.version: '>=1.7.0'
2222
onnx.version: 'onnx==1.14.1' # '-i https://test.pypi.org/simple/ onnx==1.14.0rc3'
2323
onnx.target_opset: ''
24-
onnxrt.version: 'onnxruntime==1.15.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
25-
sklearn.version: '>=1.3.0'
24+
onnxrt.version: 'onnxruntime==1.16.0'
25+
sklearn.version: '>=1.3.1'
2626
lgbm.version: ''
2727
onnxcc.version: '>=1.8.1' # git
2828
run.example: '1'
2929

30+
Py311-Onnx140-Rt151-Skl130:
31+
do.bench: '0'
32+
python.version: '3.11' # onnxruntime cannot support python 3.11 yet
33+
numpy.version: '>=1.21.1'
34+
scipy.version: '>=1.7.0'
35+
onnx.version: 'onnx==1.14.0' # '-i https://test.pypi.org/simple/ onnx==1.14.0rc3'
36+
onnx.target_opset: ''
37+
onnxrt.version: 'onnxruntime==1.15.1'
38+
sklearn.version: '==1.3.0'
39+
lgbm.version: ''
40+
onnxcc.version: '>=1.8.1' # git
41+
run.example: '0'
42+
3043
Py310-Onnx140-Rt140-Skl122:
3144
do.bench: '0'
3245
python.version: '3.10' # onnxruntime cannot support python 3.11 yet
3346
numpy.version: '>=1.21.1'
3447
scipy.version: '>=1.7.0'
3548
onnx.version: 'onnx==1.14.1' # '-i https://test.pypi.org/simple/ onnx==1.14.0rc3'
3649
onnx.target_opset: ''
37-
onnxrt.version: 'onnxruntime==1.14.0' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
50+
onnxrt.version: 'onnxruntime==1.14.0'
3851
sklearn.version: '==1.2.2'
3952
lgbm.version: ''
4053
onnxcc.version: '>=1.8.1' # git
@@ -47,7 +60,7 @@ jobs:
4760
scipy.version: '>=1.7.0'
4861
onnx.version: 'onnx==1.13.0' #'-i https://test.pypi.org/simple/ onnx==1.13.0rc1'
4962
onnx.target_opset: ''
50-
onnxrt.version: 'onnxruntime==1.14.0' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
63+
onnxrt.version: 'onnxruntime==1.14.0'
5164
sklearn.version: '==1.2.1'
5265
lgbm.version: ''
5366
onnxcc.version: '>=1.8.1' # git
@@ -60,7 +73,7 @@ jobs:
6073
scipy.version: '>=1.7.0'
6174
onnx.version: 'onnx==1.13.0' #'-i https://test.pypi.org/simple/ onnx==1.13.0rc1'
6275
onnx.target_opset: ''
63-
onnxrt.version: 'onnxruntime==1.13.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
76+
onnxrt.version: 'onnxruntime==1.13.1'
6477
sklearn.version: '==1.2.0'
6578
lgbm.version: ''
6679
onnxcc.version: '>=1.8.1' # git
@@ -73,7 +86,7 @@ jobs:
7386
scipy.version: '>=1.7.0'
7487
onnx.version: 'onnx==1.12.0' #'-i https://test.pypi.org/simple/ onnx==1.12.0rc4'
7588
onnx.target_opset: ''
76-
onnxrt.version: 'onnxruntime==1.13.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
89+
onnxrt.version: 'onnxruntime==1.13.1'
7790
sklearn.version: '==1.2.0'
7891
lgbm.version: ''
7992
onnxcc.version: '>=1.8.1' # git
@@ -85,7 +98,7 @@ jobs:
8598
scipy.version: '>=1.7.0'
8699
onnx.version: 'onnx==1.12.0' #'-i https://test.pypi.org/simple/ onnx==1.12.0rc4'
87100
onnx.target_opset: ''
88-
onnxrt.version: 'onnxruntime==1.12.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
101+
onnxrt.version: 'onnxruntime==1.12.1'
89102
sklearn.version: '==1.1.3'
90103
lgbm.version: ''
91104
onnxcc.version: '>=1.8.1' # git
@@ -97,7 +110,7 @@ jobs:
97110
scipy.version: '>=1.7.0'
98111
onnx.version: 'onnx==1.12.0' #'-i https://test.pypi.org/simple/ onnx==1.12.0rc4'
99112
onnx.target_opset: ''
100-
onnxrt.version: 'onnxruntime==1.11.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
113+
onnxrt.version: 'onnxruntime==1.11.1'
101114
sklearn.version: '==1.1.3'
102115
lgbm.version: ''
103116
onnxcc.version: '>=1.8.1' # git
@@ -109,7 +122,7 @@ jobs:
109122
scipy.version: '>=1.7.0'
110123
onnx.version: 'onnx==1.11.0' # '-i https://test.pypi.org/simple/ onnx==1.11.0rc2'
111124
onnx.target_opset: ''
112-
onnxrt.version: 'onnxruntime==1.11.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
125+
onnxrt.version: 'onnxruntime==1.11.1'
113126
sklearn.version: '==1.1.3'
114127
lgbm.version: ''
115128
onnxcc.version: '>=1.8.1' # git
@@ -121,7 +134,7 @@ jobs:
121134
scipy.version: '>=1.7.0'
122135
onnx.version: 'onnx==1.11.0' # '-i https://test.pypi.org/simple/ onnx==1.11.0rc2'
123136
onnx.target_opset: ''
124-
onnxrt.version: 'onnxruntime==1.11.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
137+
onnxrt.version: 'onnxruntime==1.11.1'
125138
sklearn.version: '==1.0.2'
126139
lgbm.version: ''
127140
onnxcc.version: '>=1.8.1' # git

.azure-pipelines/win32-conda-CI.yml

+20-11
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,31 @@ jobs:
1313
vmImage: 'windows-latest'
1414
strategy:
1515
matrix:
16-
Py310-Onnx140-Rt151-Skl130:
16+
Py310-Onnx141-Rt160-Skl131:
1717
python.version: '3.11' # onnxruntime cannot support python 3.11 yet
1818
onnx.version: 'onnx==1.14.1' # '-i https://test.pypi.org/simple/ onnx==1.14.0rc3'
1919
onnx.target_opset: ''
2020
numpy.version: 'numpy>=1.22.3'
2121
scipy.version: 'scipy'
22-
onnxrt.version: 'onnxruntime==1.15.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
22+
onnxrt.version: 'onnxruntime==1.16.0'
23+
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
24+
sklearn.version: '>=1.3.1'
25+
Py310-Onnx140-Rt151-Skl130:
26+
python.version: '3.11' # onnxruntime cannot support python 3.11 yet
27+
onnx.version: 'onnx==1.14.0' # '-i https://test.pypi.org/simple/ onnx==1.14.0rc3'
28+
onnx.target_opset: ''
29+
numpy.version: 'numpy>=1.22.3'
30+
scipy.version: 'scipy'
31+
onnxrt.version: 'onnxruntime==1.15.1'
2332
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
24-
sklearn.version: '>=1.3.0'
33+
sklearn.version: '==1.3.0'
2534
Py310-Onnx140-Rt140-Skl122:
2635
python.version: '3.10' # onnxruntime cannot support python 3.11 yet
2736
onnx.version: 'onnx==1.14.1' # '-i https://test.pypi.org/simple/ onnx==1.14.0rc3'
2837
onnx.target_opset: ''
2938
numpy.version: 'numpy>=1.22.3'
3039
scipy.version: 'scipy'
31-
onnxrt.version: 'onnxruntime==1.14.0' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
40+
onnxrt.version: 'onnxruntime==1.14.0'
3241
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
3342
sklearn.version: '==1.2.2'
3443
Py310-Onnx130-Rt140-Skl121:
@@ -37,7 +46,7 @@ jobs:
3746
onnx.target_opset: ''
3847
numpy.version: 'numpy>=1.22.3'
3948
scipy.version: 'scipy'
40-
onnxrt.version: 'onnxruntime==1.14.0' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
49+
onnxrt.version: 'onnxruntime==1.14.0'
4150
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
4251
sklearn.version: '==1.2.2'
4352
Py310-Onnx130-Rt131-Skl120:
@@ -46,7 +55,7 @@ jobs:
4655
onnx.target_opset: ''
4756
numpy.version: 'numpy>=1.22.3'
4857
scipy.version: 'scipy'
49-
onnxrt.version: 'onnxruntime==1.13.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
58+
onnxrt.version: 'onnxruntime==1.13.1'
5059
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
5160
sklearn.version: '==1.2.0'
5261
Py310-Onnx120-Rt131-Skl120:
@@ -55,7 +64,7 @@ jobs:
5564
onnx.target_opset: ''
5665
numpy.version: 'numpy>=1.22.3'
5766
scipy.version: 'scipy'
58-
onnxrt.version: 'onnxruntime==1.13.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
67+
onnxrt.version: 'onnxruntime==1.13.1'
5968
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
6069
sklearn.version: '==1.2.0'
6170
Py310-Onnx120-Rt120-Skl11:
@@ -64,7 +73,7 @@ jobs:
6473
onnx.target_opset: ''
6574
numpy.version: 'numpy>=1.22.3'
6675
scipy.version: 'scipy'
67-
onnxrt.version: 'onnxruntime==1.12.0' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
76+
onnxrt.version: 'onnxruntime==1.12.0'
6877
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
6978
sklearn.version: '==1.1.3'
7079
Py39-Onnx120-Rt1111-Skl11:
@@ -73,7 +82,7 @@ jobs:
7382
onnx.target_opset: ''
7483
numpy.version: 'numpy>=1.22.3'
7584
scipy.version: 'scipy'
76-
onnxrt.version: 'onnxruntime==1.11.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
85+
onnxrt.version: 'onnxruntime==1.11.1'
7786
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
7887
sklearn.version: '==1.1.3'
7988
Py39-Onnx1110-Rt1111-Skl11:
@@ -82,7 +91,7 @@ jobs:
8291
onnx.target_opset: ''
8392
numpy.version: 'numpy>=1.22.3'
8493
scipy.version: 'scipy'
85-
onnxrt.version: 'onnxruntime==1.11.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
94+
onnxrt.version: 'onnxruntime==1.11.1'
8695
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
8796
sklearn.version: '==1.1.3'
8897
Py39-Onnx1110-Rt1111-Skl10:
@@ -91,7 +100,7 @@ jobs:
91100
onnx.target_opset: ''
92101
numpy.version: 'numpy==1.23.5'
93102
scipy.version: 'scipy'
94-
onnxrt.version: 'onnxruntime==1.11.1' # -i https://test.pypi.org/simple/ ort-nightly==1.11.0.dev20220311003
103+
onnxrt.version: 'onnxruntime==1.11.1'
95104
onnxcc.version: 'onnxconverter-common>=1.8.1' # git+https://github.com/microsoft/onnxconverter-common.git
96105
sklearn.version: '==1.0.2'
97106
Py39-Onnx1110-Rt1100-Skl10:

docs/tutorial/plot_wext_pyod_forest.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ def pyod_iforest_converter(scope, operator, container):
206206
expected_labels = model1.predict(data)
207207
expected_proba = model1.predict_proba(data)
208208

209-
sess = InferenceSession(onx.SerializeToString())
209+
sess = InferenceSession(onx.SerializeToString(), providers=["CPUExecutionProvider"])
210210
res = sess.run(None, {"float_input": data})
211211

212212
onx_labels = res[0]

skl2onnx/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
"""
44
Main entry point to the converter from the *scikit-learn* to *onnx*.
55
"""
6-
__version__ = "1.16.0"
6+
__version__ = "1.16.1"
77
__author__ = "Microsoft"
88
__producer__ = "skl2onnx"
99
__producer_version__ = __version__
1010
__domain__ = "ai.onnx"
1111
__model_version__ = 0
12-
__max_supported_opset__ = 18 # Converters are tested up to this version.
12+
__max_supported_opset__ = 19 # Converters are tested up to this version.
1313

1414

1515
from .convert import convert_sklearn, to_onnx, wrap_as_onnx_mixin # noqa

skl2onnx/common/_topology.py

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ def _default_OPSET_TO_IR_VERSION():
6262
17: 8,
6363
18: 8,
6464
19: 9,
65+
20: 9,
6566
}
6667

6768

skl2onnx/operator_converters/ada_boost.py

+31-7
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,30 @@
3131
from .._supported_operators import sklearn_operator_name_map
3232

3333

34-
def _scikit_learn_before_022():
34+
def _scikit_learn_before_any(any_version: str) -> bool:
3535
if ".dev" in __version__:
36-
return pv.Version(__version__.split(".dev")[0]) < pv.Version("0.22")
36+
return pv.Version(__version__.split(".dev")[0]) < pv.Version(any_version)
3737
if ".post" in __version__:
38-
return pv.Version(__version__.split(".post")[0]) < pv.Version("0.22")
39-
return pv.Version(__version__) < pv.Version("0.22")
38+
return pv.Version(__version__.split(".post")[0]) < pv.Version(any_version)
39+
return pv.Version(__version__) < pv.Version(any_version)
40+
41+
42+
def _scikit_learn_before_022() -> bool:
43+
return _scikit_learn_before_any("0.22")
44+
45+
46+
def _scikit_learn_before_131():
47+
return _scikit_learn_before_any("1.3.1")
4048

4149

4250
def _samme_proba(
43-
scope, container, proba_name, weight, zero_name, classes_ind_name, one_name
51+
scope,
52+
container,
53+
proba_name,
54+
weight,
55+
zero_name_or_symmetric,
56+
classes_ind_name,
57+
one_name,
4458
):
4559
weight_name = scope.get_unique_variable_name("weight")
4660
container.add_initializer(weight_name, onnx_proto.TensorProto.FLOAT, [], [weight])
@@ -64,7 +78,7 @@ def _samme_proba(
6478
max_proba_name = scope.get_unique_variable_name("probsmax")
6579
container.add_node(
6680
"Where",
67-
[equal_name, one_name, zero_name],
81+
[equal_name, one_name, zero_name_or_symmetric],
6882
max_proba_name,
6983
name=scope.get_unique_operator_name("Where"),
7084
)
@@ -394,6 +408,7 @@ def convert_sklearn_ada_boost_classifier(
394408
zero_name = None
395409
one_name = None
396410
classes_ind_name = None
411+
symmetric_weight = None
397412

398413
proto_dtype = guess_proto_type(operator.inputs[0].type)
399414
proba_type = operator.inputs[0].type.__class__
@@ -487,12 +502,21 @@ def convert_sklearn_ada_boost_classifier(
487502
),
488503
)
489504

505+
if not _scikit_learn_before_131() and symmetric_weight is None:
506+
symmetric_weight = scope.get_unique_variable_name(
507+
"symmetrix_weight"
508+
)
509+
container.add_initializer(
510+
symmetric_weight, proto_dtype, [1], [-1 / (len(classes) - 1)]
511+
)
512+
490513
cur_proba_name = _samme_proba(
491514
scope,
492515
container,
493516
proba_name.onnx_name,
494517
op.estimator_weights_[i_est],
495-
zero_name,
518+
# See https://github.com/scikit-learn/scikit-learn/pull/26521
519+
zero_name if _scikit_learn_before_131() else symmetric_weight,
496520
classes_ind_name,
497521
one_name,
498522
)

tests/test_sklearn_adaboost_converter.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -368,5 +368,5 @@ def test_ada_boost_regressor_bool(self):
368368

369369

370370
if __name__ == "__main__":
371-
# TestSklearnAdaBoostModels().test_ada_boost_classifier_lr()
371+
TestSklearnAdaBoostModels().test_ada_boost_classifier_samme()
372372
unittest.main(verbosity=2)

tests/test_sklearn_one_hot_encoder_converter.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,11 @@ def test_shape_inference(self):
424424
("cat_2", Int64TensorType([None, 1])),
425425
]
426426

427-
model_onnx = convert_sklearn(model, initial_types=initial_type)
427+
model_onnx = convert_sklearn(
428+
model, initial_types=initial_type, target_opset=TARGET_OPSET
429+
)
430+
if TARGET_OPSET < 19:
431+
model_onnx.ir_version = 8
428432

429433
feeds = dict(
430434
[

tests/test_sklearn_pipeline.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1387,7 +1387,7 @@ def test_feature_vectorizer_double(self):
13871387
X_train, X_test, y_train, y_test = train_test_split(X, y)
13881388
regr = Pipeline([("std", StandardScaler()), ("reg", LinearRegression())])
13891389
regr = regr.fit(X_train, y_train)
1390-
onnx_model = to_onnx(regr, X=X_train)
1390+
onnx_model = to_onnx(regr, X=X_train, target_opset=TARGET_OPSET)
13911391

13921392
sess = InferenceSession(
13931393
onnx_model.SerializeToString(), providers=["CPUExecutionProvider"]

tests/test_utils/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ def max_onnxruntime_opset():
8484
<https://github.com/microsoft/onnxruntime/blob/main/docs/Versioning.md>`_.
8585
"""
8686
vi = pv.Version(ort_version.split("+")[0])
87+
if vi >= pv.Version("1.16.0"):
88+
return 19
8789
if vi >= pv.Version("1.14.0"):
8890
return 18
8991
if vi >= pv.Version("1.12.0"):

0 commit comments

Comments
 (0)