mirror of
https://github.com/saymrwulf/onnxruntime.git
synced 2026-07-14 18:12:05 +00:00
395 lines
No EOL
39 KiB
HTML
395 lines
No EOL
39 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
||
|
||
<title>Train, convert and predict with ONNX Runtime</title>
|
||
|
||
<link rel="stylesheet" href="../_static/pyramid.css" type="text/css"/>
|
||
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
|
||
<link rel="stylesheet" href="../_static/gallery.css" type="text/css" />
|
||
</head>
|
||
<body>
|
||
<div class="container">
|
||
<div class="row" style="margin-top: 1rem;">
|
||
<div id="sidebar" class="col-xs-12 col-sm-3">
|
||
<a href="../index.html">
|
||
<img style="margin-bottom: 0.5rem;" class="img-fluid" src="../_static/ONNX_Runtime_icon.png"/>
|
||
</a>
|
||
<div id="searchbox" style="display: none" role="search">
|
||
<form class="form-inline" action="../search.html" method="get">
|
||
<div class="form-group">
|
||
<label class="sr-only" for="searchInput">Search</label>
|
||
<input type="text" class="form-control" name="q" id="searchInput" placeholder="Search">
|
||
</div>
|
||
<button type="submit" class="btn btn-secondary" style="display:none">Go</button>
|
||
<input type="hidden" name="check_keywords" value="yes"/>
|
||
<input type="hidden" name="area" value="default"/>
|
||
</form>
|
||
</div>
|
||
|
||
<hr>
|
||
|
||
<div id="toc">
|
||
<ul class="current">
|
||
<li class="toctree-l1"><a class="reference internal" href="../tutorial.html">Tutorial</a><ul>
|
||
<li class="toctree-l2"><a class="reference internal" href="../tutorial.html#step-1-train-a-model-using-your-favorite-framework">Step 1: Train a model using your favorite framework</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../tutorial.html#step-2-convert-or-export-the-model-into-onnx-format">Step 2: Convert or export the model into ONNX format</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../tutorial.html#step-3-load-and-run-the-model-using-onnx-runtime">Step 3: Load and run the model using ONNX Runtime</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l1"><a class="reference internal" href="../api_summary.html">API Summary</a><ul>
|
||
<li class="toctree-l2"><a class="reference internal" href="../api_summary.html#device">Device</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../api_summary.html#examples-and-datasets">Examples and datasets</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../api_summary.html#load-and-run-a-model">Load and run a model</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="../api_summary.html#backend">Backend</a></li>
|
||
</ul>
|
||
</li>
|
||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Gallery of examples</a><ul class="current">
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_pipeline.html">Draw a pipeline</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_load_and_predict.html">Load and predict with ONNX Runtime and a very simple model</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_profiling.html">Profile the execution of a simple model</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_backend.html">ONNX Runtime Backend for ONNX</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_metadata.html">Metadata</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_dl_keras.html">ONNX Runtime for Keras</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_convert_pipeline_vectorizer.html">Train, convert and predict with ONNX Runtime</a></li>
|
||
<li class="toctree-l2"><a class="reference internal" href="plot_common_errors.html">Common errors with onnxruntime</a></li>
|
||
<li class="toctree-l2 current"><a class="current reference internal" href="#">Train, convert and predict with ONNX Runtime</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
|
||
</div>
|
||
</div>
|
||
<div class="col-xs-12 col-sm-9">
|
||
<div class="sphx-glr-download-link-note admonition note">
|
||
<p class="first admonition-title">Note</p>
|
||
<p class="last">Click <a class="reference internal" href="#sphx-glr-download-auto-examples-plot-train-convert-predict-py"><span class="std std-ref">here</span></a> to download the full example code</p>
|
||
</div>
|
||
<div class="sphx-glr-example-title section" id="train-convert-and-predict-with-onnx-runtime">
|
||
<span id="l-logreg-example"></span><span id="sphx-glr-auto-examples-plot-train-convert-predict-py"></span><h1>Train, convert and predict with ONNX Runtime<a class="headerlink" href="#train-convert-and-predict-with-onnx-runtime" title="Permalink to this headline">¶</a></h1>
|
||
<p>This example demonstrates an end to end scenario
|
||
starting with the training of a machine learned model
|
||
to its use in its converted from.</p>
|
||
<div class="contents local topic" id="contents">
|
||
<ul class="simple">
|
||
<li><a class="reference internal" href="#train-a-logistic-regression" id="id1">Train a logistic regression</a></li>
|
||
<li><a class="reference internal" href="#conversion-to-onnx-format" id="id2">Conversion to ONNX format</a></li>
|
||
<li><a class="reference internal" href="#probabilities" id="id3">Probabilities</a></li>
|
||
<li><a class="reference internal" href="#benchmark-with-randomforest" id="id4">Benchmark with RandomForest</a></li>
|
||
</ul>
|
||
</div>
|
||
<div class="section" id="train-a-logistic-regression">
|
||
<h2><a class="toc-backref" href="#id1">Train a logistic regression</a><a class="headerlink" href="#train-a-logistic-regression" title="Permalink to this headline">¶</a></h2>
|
||
<p>The first step consists in retrieving the iris datset.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.datasets</span> <span class="kn">import</span> <span class="n">load_iris</span>
|
||
<span class="n">iris</span> <span class="o">=</span> <span class="n">load_iris</span><span class="p">()</span>
|
||
<span class="n">X</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">iris</span><span class="o">.</span><span class="n">data</span><span class="p">,</span> <span class="n">iris</span><span class="o">.</span><span class="n">target</span>
|
||
|
||
<span class="kn">from</span> <span class="nn">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">train_test_split</span>
|
||
<span class="n">X_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">y_train</span><span class="p">,</span> <span class="n">y_test</span> <span class="o">=</span> <span class="n">train_test_split</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>Then we fit a model.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegression</span>
|
||
<span class="n">clr</span> <span class="o">=</span> <span class="n">LogisticRegression</span><span class="p">()</span>
|
||
<span class="n">clr</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>We compute the prediction on the test set
|
||
and we show the confusion matrix.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.metrics</span> <span class="kn">import</span> <span class="n">confusion_matrix</span>
|
||
|
||
<span class="n">pred</span> <span class="o">=</span> <span class="n">clr</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">confusion_matrix</span><span class="p">(</span><span class="n">y_test</span><span class="p">,</span> <span class="n">pred</span><span class="p">))</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[11 0 0]
|
||
[ 0 12 4]
|
||
[ 0 0 11]]
|
||
</pre></div>
|
||
</div>
|
||
</div>
|
||
<div class="section" id="conversion-to-onnx-format">
|
||
<h2><a class="toc-backref" href="#id2">Conversion to ONNX format</a><a class="headerlink" href="#conversion-to-onnx-format" title="Permalink to this headline">¶</a></h2>
|
||
<p>We use module
|
||
<a class="reference external" href="https://github.com/onnx/sklearn-onnx">sklearn-onnx</a>
|
||
to convert the model into ONNX format.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">skl2onnx</span> <span class="kn">import</span> <span class="n">convert_sklearn</span>
|
||
<span class="kn">from</span> <span class="nn">skl2onnx.common.data_types</span> <span class="kn">import</span> <span class="n">FloatTensorType</span>
|
||
|
||
<span class="n">initial_type</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">'float_input'</span><span class="p">,</span> <span class="n">FloatTensorType</span><span class="p">([</span><span class="bp">None</span><span class="p">,</span> <span class="mi">4</span><span class="p">]))]</span>
|
||
<span class="n">onx</span> <span class="o">=</span> <span class="n">convert_sklearn</span><span class="p">(</span><span class="n">clr</span><span class="p">,</span> <span class="n">initial_types</span><span class="o">=</span><span class="n">initial_type</span><span class="p">)</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"logreg_iris.onnx"</span><span class="p">,</span> <span class="s2">"wb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">onx</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>We load the model with ONNX Runtime and look at
|
||
its input and output.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">onnxruntime</span> <span class="kn">as</span> <span class="nn">rt</span>
|
||
<span class="n">sess</span> <span class="o">=</span> <span class="n">rt</span><span class="o">.</span><span class="n">InferenceSession</span><span class="p">(</span><span class="s2">"logreg_iris.onnx"</span><span class="p">)</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"input name='{}' and shape={}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
||
<span class="n">sess</span><span class="o">.</span><span class="n">get_inputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">sess</span><span class="o">.</span><span class="n">get_inputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="p">))</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"output name='{}' and shape={}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
||
<span class="n">sess</span><span class="o">.</span><span class="n">get_outputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">sess</span><span class="o">.</span><span class="n">get_outputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">shape</span><span class="p">))</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>input name='float_input' and shape=[None, 4]
|
||
output name='output_label' and shape=[1]
|
||
</pre></div>
|
||
</div>
|
||
<p>We compute the predictions.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">input_name</span> <span class="o">=</span> <span class="n">sess</span><span class="o">.</span><span class="n">get_inputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="n">label_name</span> <span class="o">=</span> <span class="n">sess</span><span class="o">.</span><span class="n">get_outputs</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||
|
||
<span class="kn">import</span> <span class="nn">numpy</span>
|
||
<span class="n">pred_onx</span> <span class="o">=</span> <span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">label_name</span><span class="p">],</span> <span class="p">{</span><span class="n">input_name</span><span class="p">:</span> <span class="n">X_test</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">)})[</span><span class="mi">0</span><span class="p">]</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">confusion_matrix</span><span class="p">(</span><span class="n">pred</span><span class="p">,</span> <span class="n">pred_onx</span><span class="p">))</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[11 0 0]
|
||
[ 0 12 0]
|
||
[ 0 0 15]]
|
||
</pre></div>
|
||
</div>
|
||
<p>The prediction are perfectly identical.</p>
|
||
</div>
|
||
<div class="section" id="probabilities">
|
||
<h2><a class="toc-backref" href="#id3">Probabilities</a><a class="headerlink" href="#probabilities" title="Permalink to this headline">¶</a></h2>
|
||
<p>Probabilities are needed to compute other
|
||
relevant metrics such as the ROC Curve.
|
||
Let’s see how to get them first with
|
||
scikit-learn.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">prob_sklearn</span> <span class="o">=</span> <span class="n">clr</span><span class="o">.</span><span class="n">predict_proba</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">prob_sklearn</span><span class="p">[:</span><span class="mi">3</span><span class="p">])</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[[1.04597336e-03 3.26972202e-01 6.71981824e-01]
|
||
[8.07529571e-01 1.92267362e-01 2.03067523e-04]
|
||
[3.75046145e-02 6.77776609e-01 2.84718777e-01]]
|
||
</pre></div>
|
||
</div>
|
||
<p>And then with ONNX Runtime.
|
||
The probabilies appear to be</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">prob_name</span> <span class="o">=</span> <span class="n">sess</span><span class="o">.</span><span class="n">get_outputs</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">name</span>
|
||
<span class="n">prob_rt</span> <span class="o">=</span> <span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">prob_name</span><span class="p">],</span> <span class="p">{</span><span class="n">input_name</span><span class="p">:</span> <span class="n">X_test</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">)})[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="kn">import</span> <span class="nn">pprint</span>
|
||
<span class="n">pprint</span><span class="o">.</span><span class="n">pprint</span><span class="p">(</span><span class="n">prob_rt</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">3</span><span class="p">])</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>[{0: 0.0010459469631314278, 1: 0.32697227597236633, 2: 0.6719817519187927},
|
||
{0: 0.807529628276825, 1: 0.19226738810539246, 2: 0.00020308367675170302},
|
||
{0: 0.037504520267248154, 1: 0.6777766942977905, 2: 0.2847188115119934}]
|
||
</pre></div>
|
||
</div>
|
||
<p>Let’s benchmark.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">timeit</span> <span class="kn">import</span> <span class="n">Timer</span>
|
||
|
||
<span class="k">def</span> <span class="nf">speed</span><span class="p">(</span><span class="n">inst</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="mi">20</span><span class="p">):</span>
|
||
<span class="n">timer</span> <span class="o">=</span> <span class="n">Timer</span><span class="p">(</span><span class="n">inst</span><span class="p">,</span> <span class="nb">globals</span><span class="o">=</span><span class="nb">globals</span><span class="p">())</span>
|
||
<span class="n">raw</span> <span class="o">=</span> <span class="n">numpy</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">timer</span><span class="o">.</span><span class="n">repeat</span><span class="p">(</span><span class="n">repeat</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="n">number</span><span class="p">))</span>
|
||
<span class="n">ave</span> <span class="o">=</span> <span class="n">raw</span><span class="o">.</span><span class="n">sum</span><span class="p">()</span> <span class="o">/</span> <span class="nb">len</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span> <span class="o">/</span> <span class="n">number</span>
|
||
<span class="n">mi</span><span class="p">,</span> <span class="n">ma</span> <span class="o">=</span> <span class="n">raw</span><span class="o">.</span><span class="n">min</span><span class="p">()</span> <span class="o">/</span> <span class="n">number</span><span class="p">,</span> <span class="n">raw</span><span class="o">.</span><span class="n">max</span><span class="p">()</span> <span class="o">/</span> <span class="n">number</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Average </span><span class="si">%1.3g</span><span class="s2"> min=</span><span class="si">%1.3g</span><span class="s2"> max=</span><span class="si">%1.3g</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">ave</span><span class="p">,</span> <span class="n">mi</span><span class="p">,</span> <span class="n">ma</span><span class="p">))</span>
|
||
<span class="k">return</span> <span class="n">ave</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for clr.predict"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"clr.predict(X_test)"</span><span class="p">)</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for ONNX Runtime"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"sess.run([label_name], {input_name: X_test.astype(numpy.float32)})[0]"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>Execution time for clr.predict
|
||
Average 2.35e-05 min=1.95e-05 max=4.43e-05
|
||
Execution time for ONNX Runtime
|
||
Average 2.9e-05 min=2.69e-05 max=4.27e-05
|
||
</pre></div>
|
||
</div>
|
||
<p>Let’s benchmark a scenario similar to what a webservice
|
||
experiences: the model has to do one prediction at a time
|
||
as opposed to a batch of prediction.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">loop</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">fct</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
|
||
<span class="n">nrow</span> <span class="o">=</span> <span class="n">X_test</span><span class="o">.</span><span class="n">shape</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
||
<span class="k">if</span> <span class="n">n</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
|
||
<span class="n">n</span> <span class="o">=</span> <span class="n">nrow</span>
|
||
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
|
||
<span class="n">im</span> <span class="o">=</span> <span class="n">i</span> <span class="o">%</span> <span class="n">nrow</span>
|
||
<span class="n">fct</span><span class="p">(</span><span class="n">X_test</span><span class="p">[</span><span class="n">im</span><span class="p">:</span> <span class="n">im</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for clr.predict"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, clr.predict, 100)"</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">sess_predict</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">label_name</span><span class="p">],</span> <span class="p">{</span><span class="n">input_name</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">)})[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for sess_predict"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, sess_predict, 100)"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>Execution time for clr.predict
|
||
Average 0.00202 min=0.00181 max=0.00239
|
||
Execution time for sess_predict
|
||
Average 0.00155 min=0.00128 max=0.00247
|
||
</pre></div>
|
||
</div>
|
||
<p>Let’s do the same for the probabilities.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for predict_proba"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, clr.predict_proba, 100)"</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">sess_predict_proba</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">prob_name</span><span class="p">],</span> <span class="p">{</span><span class="n">input_name</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">)})[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for sess_predict_proba"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, sess_predict_proba, 100)"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>Execution time for predict_proba
|
||
Average 0.00396 min=0.0034 max=0.00516
|
||
Execution time for sess_predict_proba
|
||
Average 0.00171 min=0.0014 max=0.00269
|
||
</pre></div>
|
||
</div>
|
||
<p>This second comparison is better as
|
||
ONNX Runtime, in this experience,
|
||
computes the label and the probabilities
|
||
in every case.</p>
|
||
</div>
|
||
<div class="section" id="benchmark-with-randomforest">
|
||
<h2><a class="toc-backref" href="#id4">Benchmark with RandomForest</a><a class="headerlink" href="#benchmark-with-randomforest" title="Permalink to this headline">¶</a></h2>
|
||
<p>We first train and save a model in ONNX format.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestClassifier</span>
|
||
<span class="n">rf</span> <span class="o">=</span> <span class="n">RandomForestClassifier</span><span class="p">()</span>
|
||
<span class="n">rf</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
|
||
|
||
<span class="n">initial_type</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">'float_input'</span><span class="p">,</span> <span class="n">FloatTensorType</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">]))]</span>
|
||
<span class="n">onx</span> <span class="o">=</span> <span class="n">convert_sklearn</span><span class="p">(</span><span class="n">rf</span><span class="p">,</span> <span class="n">initial_types</span><span class="o">=</span><span class="n">initial_type</span><span class="p">)</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"rf_iris.onnx"</span><span class="p">,</span> <span class="s2">"wb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">onx</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>We compare.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">sess</span> <span class="o">=</span> <span class="n">rt</span><span class="o">.</span><span class="n">InferenceSession</span><span class="p">(</span><span class="s2">"rf_iris.onnx"</span><span class="p">)</span>
|
||
|
||
<span class="k">def</span> <span class="nf">sess_predict_proba_rf</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">prob_name</span><span class="p">],</span> <span class="p">{</span><span class="n">input_name</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">)})[</span><span class="mi">0</span><span class="p">]</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for predict_proba"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, rf.predict_proba, 100)"</span><span class="p">)</span>
|
||
|
||
<span class="k">print</span><span class="p">(</span><span class="s2">"Execution time for sess_predict_proba"</span><span class="p">)</span>
|
||
<span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, sess_predict_proba_rf, 100)"</span><span class="p">)</span>
|
||
</pre></div>
|
||
</div>
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>Execution time for predict_proba
|
||
Average 0.0578 min=0.0551 max=0.0601
|
||
Execution time for sess_predict_proba
|
||
Average 0.00177 min=0.00145 max=0.0029
|
||
</pre></div>
|
||
</div>
|
||
<p>Let’s see with different number of trees.</p>
|
||
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">measures</span> <span class="o">=</span> <span class="p">[]</span>
|
||
|
||
<span class="k">for</span> <span class="n">n_trees</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">5</span><span class="p">):</span>
|
||
<span class="k">print</span><span class="p">(</span><span class="n">n_trees</span><span class="p">)</span>
|
||
<span class="n">rf</span> <span class="o">=</span> <span class="n">RandomForestClassifier</span><span class="p">(</span><span class="n">n_estimators</span><span class="o">=</span><span class="n">n_trees</span><span class="p">)</span>
|
||
<span class="n">rf</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
|
||
<span class="n">initial_type</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">'float_input'</span><span class="p">,</span> <span class="n">FloatTensorType</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">4</span><span class="p">]))]</span>
|
||
<span class="n">onx</span> <span class="o">=</span> <span class="n">convert_sklearn</span><span class="p">(</span><span class="n">rf</span><span class="p">,</span> <span class="n">initial_types</span><span class="o">=</span><span class="n">initial_type</span><span class="p">)</span>
|
||
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">"rf_iris_</span><span class="si">%d</span><span class="s2">.onnx"</span> <span class="o">%</span> <span class="n">n_trees</span><span class="p">,</span> <span class="s2">"wb"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
|
||
<span class="n">f</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">onx</span><span class="o">.</span><span class="n">SerializeToString</span><span class="p">())</span>
|
||
<span class="n">sess</span> <span class="o">=</span> <span class="n">rt</span><span class="o">.</span><span class="n">InferenceSession</span><span class="p">(</span><span class="s2">"rf_iris_</span><span class="si">%d</span><span class="s2">.onnx"</span> <span class="o">%</span> <span class="n">n_trees</span><span class="p">)</span>
|
||
<span class="k">def</span> <span class="nf">sess_predict_proba_loop</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="n">sess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="n">prob_name</span><span class="p">],</span> <span class="p">{</span><span class="n">input_name</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">astype</span><span class="p">(</span><span class="n">numpy</span><span class="o">.</span><span class="n">float32</span><span class="p">)})[</span><span class="mi">0</span><span class="p">]</span>
|
||
<span class="n">tsk</span> <span class="o">=</span> <span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, rf.predict_proba, 100)"</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="n">trt</span> <span class="o">=</span> <span class="n">speed</span><span class="p">(</span><span class="s2">"loop(X_test, sess_predict_proba_loop, 100)"</span><span class="p">,</span> <span class="n">number</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">repeat</span><span class="o">=</span><span class="mi">5</span><span class="p">)</span>
|
||
<span class="n">measures</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s1">'n_trees'</span><span class="p">:</span> <span class="n">n_trees</span><span class="p">,</span> <span class="s1">'sklearn'</span><span class="p">:</span> <span class="n">tsk</span><span class="p">,</span> <span class="s1">'rt'</span><span class="p">:</span> <span class="n">trt</span><span class="p">})</span>
|
||
|
||
<span class="kn">from</span> <span class="nn">pandas</span> <span class="kn">import</span> <span class="n">DataFrame</span>
|
||
<span class="n">df</span> <span class="o">=</span> <span class="n">DataFrame</span><span class="p">(</span><span class="n">measures</span><span class="p">)</span>
|
||
<span class="n">ax</span> <span class="o">=</span> <span class="n">df</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="s2">"n_trees"</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s2">"sklearn"</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">"scikit-learn"</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s2">"blue"</span><span class="p">,</span> <span class="n">logy</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
||
<span class="n">df</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="s2">"n_trees"</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s2">"rt"</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s2">"onnxruntime"</span><span class="p">,</span>
|
||
<span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="s2">"green"</span><span class="p">,</span> <span class="n">logy</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
|
||
<span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s2">"Number of trees"</span><span class="p">)</span>
|
||
<span class="n">ax</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s2">"Prediction time (s)"</span><span class="p">)</span>
|
||
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="s2">"Speed comparison between scikit-learn and ONNX Runtime</span><span class="se">\n</span><span class="s2">For a random forest on Iris dataset"</span><span class="p">)</span>
|
||
<span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">()</span>
|
||
</pre></div>
|
||
</div>
|
||
<img alt="../_images/sphx_glr_plot_train_convert_predict_001.png" class="sphx-glr-single-img" src="../_images/sphx_glr_plot_train_convert_predict_001.png" />
|
||
<p class="sphx-glr-script-out">Out:</p>
|
||
<div class="sphx-glr-script-out highlight-none notranslate"><div class="highlight"><pre><span></span>5
|
||
Average 0.0353 min=0.0324 max=0.0386
|
||
Average 0.00156 min=0.00135 max=0.00173
|
||
10
|
||
Average 0.0541 min=0.0519 max=0.0567
|
||
Average 0.00157 min=0.00145 max=0.00167
|
||
15
|
||
Average 0.079 min=0.0768 max=0.0806
|
||
Average 0.00187 min=0.00155 max=0.00216
|
||
20
|
||
Average 0.103 min=0.0994 max=0.109
|
||
Average 0.0017 min=0.00168 max=0.00176
|
||
25
|
||
Average 0.121 min=0.117 max=0.125
|
||
Average 0.00195 min=0.00159 max=0.00231
|
||
30
|
||
Average 0.149 min=0.145 max=0.153
|
||
Average 0.00239 min=0.0016 max=0.00324
|
||
35
|
||
Average 0.17 min=0.163 max=0.178
|
||
Average 0.00199 min=0.00162 max=0.00269
|
||
40
|
||
Average 0.191 min=0.189 max=0.192
|
||
Average 0.00183 min=0.00171 max=0.00197
|
||
45
|
||
Average 0.214 min=0.212 max=0.216
|
||
Average 0.00252 min=0.00187 max=0.00345
|
||
50
|
||
Average 0.236 min=0.226 max=0.243
|
||
Average 0.00237 min=0.00182 max=0.00326
|
||
</pre></div>
|
||
</div>
|
||
<p><strong>Total running time of the script:</strong> ( 0 minutes 49.102 seconds)</p>
|
||
<div class="sphx-glr-footer class sphx-glr-footer-example docutils container" id="sphx-glr-download-auto-examples-plot-train-convert-predict-py">
|
||
<div class="sphx-glr-download docutils container">
|
||
<a class="reference download internal" href="../_downloads/plot_train_convert_predict.py" download=""><code class="xref download docutils literal notranslate"><span class="pre">Download</span> <span class="pre">Python</span> <span class="pre">source</span> <span class="pre">code:</span> <span class="pre">plot_train_convert_predict.py</span></code></a></div>
|
||
<div class="sphx-glr-download docutils container">
|
||
<a class="reference download internal" href="../_downloads/plot_train_convert_predict.ipynb" download=""><code class="xref download docutils literal notranslate"><span class="pre">Download</span> <span class="pre">Jupyter</span> <span class="pre">notebook:</span> <span class="pre">plot_train_convert_predict.ipynb</span></code></a></div>
|
||
</div>
|
||
<p class="sphx-glr-signature"><a class="reference external" href="https://sphinx-gallery.readthedocs.io">Gallery generated by Sphinx-Gallery</a></p>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js"
|
||
integrity="sha384-THPy051/pYDQGanwU6poAc/hOdQxjnOEXzbT+OuUAFqNqFjL+4IGLBgCJC3ZOShY"
|
||
crossorigin="anonymous"></script>
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.2.0/js/tether.min.js"
|
||
integrity="sha384-Plbmg8JY28KFelvJVai01l8WyZzrYWG825m+cZ0eDDS1f7d/js6ikvy1+X+guPIB"
|
||
crossorigin="anonymous"></script>
|
||
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.3/js/bootstrap.min.js"
|
||
integrity="sha384-ux8v3A6CPtOTqOzMKiuo3d/DomGaaClxFYdCu2HPMBEkf6x2xiDyJ7gkXU0MWwaD"
|
||
crossorigin="anonymous"></script>
|
||
<script src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML'></script>
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lunr.js/0.6.0/lunr.min.js"></script>
|
||
<script src="../_static/searchtools.js"></script>
|
||
<script>$('#searchbox').show(0)</script>
|
||
</body>
|
||
</html> |