Source code for mlprodict.cli.asv_bench

"""
Command line about validation of prediction runtime.


:githublink:`%|py|5`
"""
import json
from logging import getLogger
from ..asv_benchmark import create_asv_benchmark


[docs]def asv_bench(location='asvsklonnx', opset_min=-1, opset_max=None, runtime='scikit-learn,python_compiled', models=None, skip_models=None, extended_list=True, dims='1,10,100,1000,10000', n_features='4,20', dtype=None, verbose=1, fLOG=print, clean=True, flat=False, conf_params=None, build=None, add_pyspy=False, env=None, matrix=None): """ Creates an :epkg:`asv` benchmark in a folder but does not run it. :param location: location of the benchmark :param n_features: number of features to try :param dims: number of observations to try :param verbose: integer from 0 (None) to 2 (full verbose) :param opset_min: tries every conversion from this minimum opset, `-1` to get the current opset defined by module onnx :param opset_max: tries every conversion up to maximum opset, `-1` to get the current opset defined by module onnx :param runtime: runtime to check, *scikit-learn*, *python*, *python_compiled* compiles the graph structure and is more efficient when the number of observations is small, *onnxruntime1* to check :epkg:`onnxruntime`, *onnxruntime2* to check every ONNX node independently with onnxruntime, many runtime can be checked at the same time if the value is a comma separated list :param models: list of models to test or empty string to test them all :param skip_models: models to skip :param extended_list: extends the list of :epkg:`scikit-learn` converters with converters implemented in this module :param dtype: '32' or '64' or None for both, limits the test to one specific number types :param fLOG: logging function :param clean: clean the folder first, otherwise overwrites the content :param conf_params: to overwrite some of the configuration parameters, format ``name,value;name2,value2`` :param flat: one folder for all files or subfolders :param build: location of the outputs (env, html, results) :param add_pyspy: add an extra folder with code to profile each configuration :param env: default environment or ``same`` to use the current one :param matrix: specifies versions for a module as a json string, example: ``{'onnxruntime': ['1.1.1', '1.1.2']}``, if a package name starts with `'~'`, the package is removed :return: created files .. cmdref:: :title: Automatically creates an asv benchmark :cmd: -m mlprodict asv_bench --help :lid: l-cmd-asv-bench The command creates a benchmark based on asv module. It does not run it. Example:: python -m mlprodict asv_bench --models LogisticRegression,LinearRegression :githublink:`%|py|69` """ if not isinstance(models, list): models = (None if models in (None, "") else models.strip().split(',')) if not isinstance(skip_models, list): skip_models = ({} if skip_models in (None, "") else skip_models.strip().split(',')) if opset_max == "": opset_max = None # pragma: no cover if isinstance(opset_min, str): opset_min = int(opset_min) # pragma: no cover if isinstance(opset_max, str): opset_max = int(opset_max) # pragma: no cover if isinstance(verbose, str): verbose = int(verbose) # pragma: no cover if isinstance(extended_list, str): extended_list = extended_list in ( '1', 'True', 'true') # pragma: no cover if isinstance(add_pyspy, str): add_pyspy = add_pyspy in ('1', 'True', 'true') # pragma: no cover if not isinstance(runtime, list): runtime = runtime.split(',') if not isinstance(dims, list): dims = [int(_) for _ in dims.split(',')] if matrix is not None: if matrix in ('None', ''): matrix = None # pragma: no cover elif not isinstance(matrix, dict): matrix = json.loads(matrix) if not isinstance(n_features, list): if n_features in (None, ""): n_features = None # pragma: no cover else: n_features = list(map(int, n_features.split(','))) flat = flat in (True, 'True', 1, '1') def fct_filter_exp(m, s): return str(m) not in skip_models if dtype in ('', None): fct_filter = fct_filter_exp elif dtype == '32': # pragma: no cover def fct_filter_exp2(m, p): return fct_filter_exp(m, p) and '64' not in p fct_filter = fct_filter_exp2 elif dtype == '64': def fct_filter_exp3(m, p): return fct_filter_exp(m, p) and '64' in p fct_filter = fct_filter_exp3 else: raise ValueError( # pragma: no cover "dtype must be empty, 32, 64 not '{}'.".format(dtype)) if conf_params is not None: res = {} kvs = conf_params.split(';') for kv in kvs: spl = kv.split(',') if len(spl) != 2: raise ValueError( # pragma: no cover "Unable to interpret '{}'.".format(kv)) k, v = spl res[k] = v conf_params = res if verbose <= 1: logger = getLogger('skl2onnx') logger.disabled = True return create_asv_benchmark( location=location, opset_min=opset_min, opset_max=opset_max, runtime=runtime, models=models, skip_models=skip_models, extended_list=extended_list, dims=dims, n_features=n_features, dtype=dtype, verbose=verbose, fLOG=fLOG, clean=clean, conf_params=conf_params, filter_exp=fct_filter, filter_scenario=None, flat=flat, build=build, add_pyspy=add_pyspy, env=env, matrix=matrix)