# LiteRT developer workflow

You can use an existing LiteRT model by downloading it from the open-source
community. Or you can convert a TensorFlow or Keras model to the LiteRT format
using specific tools. After converting the model, you can run inference on a device and develop a custom
application for the LiteRT model.

The following figure shows the tasks involved in using existing models, converting and quantizing models, and creating an application to run inference.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export litert-developer-workflow.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.5556in" height="6.91667in" viewbox="0 0 904 498" xml:space="preserve" color-interpolation-filters="sRGB" class="st8" aria-label="../../_images/litert-developer-workflow.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-1 .st1 { fill: #f7f8fa; stroke: #f7f8fa; stroke-width: 1 }
.svg-1 .st2 { fill: none; stroke: #3253dc; stroke-width: 1 }
.svg-1 .st3 { fill: #000000; font-family: Arial; font-size: 0.75em }
.svg-1 .st4 { font-size: 1em }
.svg-1 .st5 { marker-end: url("#mrkr4-63"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st6 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-1 .st7 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st8 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-63" class="st6" v:arrowtype="4" v:arrowsize="2" v:setback="7.04" refx="-7.04" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Callout" v:index="0"></v:layer>	<v:layer v:name="Connector" v:index="1"></v:layer>	<g id="shape13-1" v:mid="13" v:groupcontext="shape" transform="translate(19,-19)">		<title></title>		<rect x="0" y="37" width="866" height="461" class="st1"></rect>	</g>	<g id="shape3-3" v:mid="3" v:groupcontext="shape" transform="translate(21,-354.628)">		<title></title>		<desc>Convert a TensorFlow model to a LiteRT model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="477.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="456.085" width="142" height="41.9155" class="st2"></rect>		<text x="8.22" y="474.34" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert a TensorFlow model to<v:lf></v:lf><tspan x="40.49" dy="1.2em" class="st4">a LiteRT model</tspan></text>		</g>	<g id="shape15-7" v:mid="15" v:groupcontext="shape" transform="translate(50.5,-289.664)">		<title></title>		<desc>Use an existing LiteRT model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="10.98" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Use an existing LiteRT <tspan x="43.99" dy="1.2em" class="st4">model</tspan></text>		</g>	<g id="shape22-11" v:mid="22" v:groupcontext="shape" transform="translate(50.5,-223.115)">		<title></title>		<desc>Convert a TensorFlow or Keras model to the LiteRT format</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="6.73" y="472.98" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert a TensorFlow or <tspan x="18.48" dy="1.2em" class="st4">Keras model to the </tspan><tspan x="28.99" dy="1.2em" class="st4">LiteRT format  </tspan>  </text>		</g>	<g id="shape26-16" v:mid="26" v:groupcontext="shape" transform="translate(50.5,-155.535)">		<title></title>		<desc>Convert and quantize using Python APIs</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.9911" cy="481.082" width="111.99" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="111.982" height="33.836" class="st2"></rect>		<text x="13.21" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert and quantize <tspan x="19.22" dy="1.2em" class="st4">using Python APIs</tspan></text>		</g>	<g id="shape28-20" v:mid="28" v:groupcontext="shape" transform="translate(49.9821,-87.9547)">		<title></title>		<desc>Convert a TensorFlow SavedModel (recommended)</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="11.98" y="472.98" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert a TensorFlow <tspan x="31.23" dy="1.2em" class="st4">SavedModel </tspan><tspan x="24.49" dy="1.2em" class="st4">(recommended)</tspan></text>		</g>	<g id="shape30-25" v:mid="30" v:groupcontext="shape" transform="translate(49.9821,-20.3744)">		<title></title>		<desc>Convert a Keras model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="10.23" y="483.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert a Keras model</text>		</g>	<g id="shape31-28" v:mid="31" v:groupcontext="shape" transform="translate(379,-437.085)">		<title></title>		<desc>LiteRT developer workflow</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="477.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="456.085" width="142" height="41.9155" class="st2"></rect>		<text x="17.98" y="479.74" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>LiteRT developer workflow</text>		</g>	<g id="shape32-31" v:mid="32" v:groupcontext="shape" transform="translate(200,-354.628)">		<title></title>		<desc>Quantize models (posttraining quantization)</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="477.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="456.085" width="142" height="41.9155" class="st2"></rect>		<text x="37.23" y="474.34" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Quantize models<v:lf></v:lf><tspan x="19.22" dy="1.2em" class="st4">(posttraining quantization)</tspan></text>		</g>	<g id="shape37-35" v:mid="37" v:groupcontext="shape" transform="translate(229.5,-289.664)">		<title></title>		<desc>Posttraining dynamic range quantization</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="14.48" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Posttraining dynamic <tspan x="19.22" dy="1.2em" class="st4">range quantization</tspan></text>		</g>	<g id="shape39-39" v:mid="39" v:groupcontext="shape" transform="translate(229.5,-222.874)">		<title></title>		<desc>Posttraining full-integer quantization</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="10.23" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Posttraining full-integer <tspan x="31.98" dy="1.2em" class="st4">quantization</tspan></text>		</g>	<g id="shape51-43" v:mid="51" v:groupcontext="shape" transform="translate(380,-354.843)">		<title></title>		<desc>Convert using offline converter tool (CLI)</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="477.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="456.085" width="142" height="41.9155" class="st2"></rect>		<text x="9.97" y="474.34" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert using offline converter <tspan x="52.49" dy="1.2em" class="st4">tool (CLI)</tspan></text>		</g>	<g id="shape53-47" v:mid="53" v:groupcontext="shape" transform="translate(409.5,-289.664)">		<title></title>		<desc>Convert a SavedModel</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="10.47" y="483.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert a SavedModel</text>		</g>	<g id="shape55-50" v:mid="55" v:groupcontext="shape" transform="translate(409.5,-223.115)">		<title></title>		<desc>Convert a Keras H5 model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="16.73" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Convert a Keras H5 <tspan x="43.99" dy="1.2em" class="st4">model  </tspan>  </text>		</g>	<g id="shape56-54" v:mid="56" v:groupcontext="shape" transform="translate(561,-355.084)">		<title></title>		<desc>Create an application and run inference</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="477.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="456.085" width="142" height="41.9155" class="st2"></rect>		<text x="11.96" y="474.34" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Create an application and run <tspan x="52.49" dy="1.2em" class="st4">inference</tspan></text>		</g>	<g id="shape57-58" v:mid="57" v:groupcontext="shape" v:layermember="1" transform="translate(622.625,-355.084)">		<title>Dynamic connector.57</title>		<path d="M9 498 L9 522.03" class="st5"></path>	</g>	<g id="shape58-64" v:mid="58" v:groupcontext="shape" transform="translate(575.009,-289.664)">		<title></title>		<desc>Load a LiteRT model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="14.48" y="483.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Load a LiteRT model    </text>		</g>	<g id="shape59-67" v:mid="59" v:groupcontext="shape" v:layermember="1" transform="translate(622.518,-289.664)">		<title>Dynamic connector.59</title>		<path d="M9 498 L9 523.67" class="st5"></path>	</g>	<g id="shape60-72" v:mid="60" v:groupcontext="shape" transform="translate(575.527,-223.115)">		<title></title>		<desc>Create a LiteRT interpreter</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.9911" cy="481.082" width="111.99" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="111.982" height="33.836" class="st2"></rect>		<text x="24.23" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Create a LiteRT <tspan x="35.48" dy="1.2em" class="st4">interpreter</tspan></text>		</g>	<g id="shape61-76" v:mid="61" v:groupcontext="shape" v:layermember="1" transform="translate(622.259,-223.115)">		<title>Dynamic connector.61</title>		<path d="M9 498 L9 524.7" class="st5"></path>	</g>	<g id="shape62-81" v:mid="62" v:groupcontext="shape" transform="translate(574.491,-155.535)">		<title></title>		<desc>Prepare a model with a chosen delegate</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="9.98" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Prepare a model with a <tspan x="23.22" dy="1.2em" class="st4">chosen delegate</tspan></text>		</g>	<g id="shape63-85" v:mid="63" v:groupcontext="shape" v:layermember="1" transform="translate(622,-155.535)">		<title>Dynamic connector.63</title>		<path d="M9 498 L9 524.7" class="st5"></path>	</g>	<g id="shape64-90" v:mid="64" v:groupcontext="shape" transform="translate(575.009,-87.9547)">		<title></title>		<desc>Prepare input/output buffers</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.9911" cy="481.082" width="111.99" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="111.982" height="33.836" class="st2"></rect>		<text x="15.21" y="478.38" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Prepare input/output <tspan x="42.23" dy="1.2em" class="st4">buffers</tspan></text>		</g>	<g id="shape65-94" v:mid="65" v:groupcontext="shape" v:layermember="1" transform="translate(622,-87.9547)">		<title>Dynamic connector.65</title>		<path d="M9 498 L9 524.7" class="st5"></path>	</g>	<g id="shape66-99" v:mid="66" v:groupcontext="shape" transform="translate(574.491,-20.3744)">		<title></title>		<desc>Run a model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="481.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="464.164" width="112.5" height="33.836" class="st2"></rect>		<text x="30.74" y="483.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Run a model</text>		</g>	<g id="shape67-102" v:mid="67" v:groupcontext="shape" transform="translate(742,-355.084)">		<title></title>		<desc>Develop a custom application</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="477.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="456.085" width="142" height="41.9155" class="st2"></rect>		<text x="12.22" y="479.74" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Develop a custom application</text>		</g>	<g id="shape68-105" v:mid="68" v:groupcontext="shape" v:layermember="1" transform="translate(37,-354.628)">		<title>Dynamic connector</title>		<path d="M-9 498 L-9 815.1" class="st7"></path>	</g>	<g id="shape70-108" v:mid="70" v:groupcontext="shape" v:layermember="1" transform="translate(28,-297.124)">		<title>Dynamic connector.70</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape71-113" v:mid="71" v:groupcontext="shape" v:layermember="1" transform="translate(28,-231.874)">		<title>Dynamic connector.71</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape72-118" v:mid="72" v:groupcontext="shape" v:layermember="1" transform="translate(28,-165.499)">		<title>Dynamic connector.72</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape73-123" v:mid="73" v:groupcontext="shape" v:layermember="1" transform="translate(27.4821,-94.6244)">		<title>Dynamic connector.73</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape74-128" v:mid="74" v:groupcontext="shape" v:layermember="1" transform="translate(28,-28.5306)">		<title>Dynamic connector.74</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape75-133" v:mid="75" v:groupcontext="shape" v:layermember="1" transform="translate(197.312,-354.423)">		<title>Dynamic connector.75</title>		<path d="M9 498 L9 611.75" class="st7"></path>	</g>	<g id="shape76-136" v:mid="76" v:groupcontext="shape" v:layermember="1" transform="translate(206.312,-296.919)">		<title>Dynamic connector.76</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape77-141" v:mid="77" v:groupcontext="shape" v:layermember="1" transform="translate(206.312,-231.669)">		<title>Dynamic connector.77</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape78-146" v:mid="78" v:groupcontext="shape" v:layermember="1" transform="translate(376.75,-353.374)">		<title>Dynamic connector.78</title>		<path d="M9 498 L9 611.75" class="st7"></path>	</g>	<g id="shape79-149" v:mid="79" v:groupcontext="shape" v:layermember="1" transform="translate(386.578,-295.871)">		<title>Dynamic connector.79</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape80-154" v:mid="80" v:groupcontext="shape" v:layermember="1" transform="translate(385.75,-230.621)">		<title>Dynamic connector.80</title>		<path d="M0 489 L15.46 489" class="st5"></path>	</g>	<g id="shape81-159" v:mid="81" v:groupcontext="shape" v:layermember="1" transform="translate(440.875,-437.292)">		<title>Dynamic connector.81</title>		<path d="M9 498.21 L9 515.79" class="st7"></path>	</g>	<g id="shape82-162" v:mid="82" v:groupcontext="shape" v:layermember="1" transform="translate(401.5,-419.5)">		<title>Dynamic connector.82</title>		<path d="M0 498 L-309.5 498 L-309.5 520.96" class="st7"></path>	</g>	<g id="shape83-165" v:mid="83" v:groupcontext="shape" v:layermember="1" transform="translate(401.5,-419.5)">		<title>Dynamic connector.83</title>		<path d="M0 498 L-130.5 498 L-130.5 520.96" class="st7"></path>	</g>	<g id="shape85-168" v:mid="85" v:groupcontext="shape" v:layermember="1" transform="translate(401.5,-419.5)">		<title>Dynamic connector.85</title>		<path d="M0 498 L48.38 498 L48.38 520.74" class="st7"></path>	</g>	<g id="shape86-171" v:mid="86" v:groupcontext="shape" v:layermember="1" transform="translate(449.875,-419.5)">		<title>Dynamic connector.86</title>		<path d="M0 498 L182.13 498 L182.13 520.5" class="st7"></path>	</g>	<g id="shape87-174" v:mid="87" v:groupcontext="shape" v:layermember="1" transform="translate(632,-419.5)">		<title>Dynamic connector.87</title>		<path d="M0 498 L181 498 L181 520.5" class="st7"></path>	</g></g>
</svg>

**Figure: LiteRT developer workflow**

Note

If you are using LiteRT models from Qualcomm AI Hub or other sources, you may skip the tasks described in the LiteRT developer workflow.

Running a LiteRT model on Qualcomm-specific hardware involves the following tasks.

## Convert a TensorFlow model to a LiteRT model

You can convert TensorFlow models to LiteRT models and optimize them for on-device inference. For more information about LiteRT model conversion, see [Model conversion overview](https://ai.google.dev/edge/litert/models/convert).

LiteRT model conversion supports converting models to the following formats:

- 32‑bit floating-point precision
- 16‑bit floating-point precision
- UINT8/INT8 precision (quantizing models)

### Use an existing LiteRT model

You can deploy an existing LiteRT model from the open-source community using
LiteRT.

Qualcomm AI Hub publishes LiteRT models optimized for the Qualcomm Linux development kit. For LiteRT models from Qualcomm, see [Qualcomm AI Hub](https://aihub.qualcomm.com/).

To download an optimized model from Qualcomm AI Hub, do the following:

1. Go to [Qualcomm AI Hub IOT models page](https://aihub.qualcomm.com/iot/models).
2. From the left pane, filter the available models by selecting a chipset.
3. Select a model.
4. On the next page, select the TorchScript &gt; TFLite path.
5. Select Download model.

Note

The downloaded model is pre-optimized and ready for deployment.

![../../_images/use-an-existing-tensorflow-lite-model.png](data:image/png;base64,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)

**Figure: Optimized LiteRT model on Qualcomm AI Hub**

### Convert a TensorFlow or Keras model to the LiteRT format

The TensorFlow framework provides both Python APIs and a command-line interface (CLI)
tool to convert a TensorFlow or Keras model to the LiteRT format.

Table: TensorFlow model conversion methods

| Conversion method | Description |
| --- | --- |
| Python APIs | Converts, optimizes, and quantizes models to the LiteRT format |
| CLI tool | Converts models to the LiteRT format, but is suitable for basic model conversion only |

Note

The TensorFlow to LiteRT Python APIs offer more flexibility to convert, optimize, and quantize models to suit your requirements.

### Convert and quantize using Python APIs

TensorFlow provides the following APIs to convert a TensorFlow SavedModel or a Keras
model to a LiteRT model.

Table: TensorFlow Python APIs to convert models

| API | Description |
| --- | --- |
| tf.lite.TFLiteConverter.from\_saved\_model() (recommended) | Converts a TensorFlow SavedModel |
| tf.lite.TFLiteConverter.from\_keras\_model() | Converts a Keras model |

### Recommended: Convert a TensorFlow SavedModel

The following example shows how to convert a TensorFlow model saved in the saved\_model format to a LiteRT model:

import tensorflow as tf
    
    # Convert the model
    saved_model_dir = "/path/to/tf/model/in/saved_model/format"
    converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
    tflite_model = converter.convert()
    
    # Save the model
    with open("model.tflite", "wb") as f:
        f.write(tflite_model)
    Copy to clipboard

Note

The converted LiteRT model isn’t quantized, and its data is in 32‑bit floating-point precision.

### Convert a Keras model

The following example shows how to convert a Keras model to a LiteRT model:

import tensorflow as tf
    
    # Create a model using high-level tf.keras.* APIs
    model = tf.keras.models.Sequential([
        tf.keras.layers.Dense(units=1, input_shape=[1]),
        tf.keras.layers.Dense(units=16, activation='relu'),
        tf.keras.layers.Dense(units=1)
    ])
    
    # compile the model
    model.compile(optimizer='sgd', loss='mean_squared_error')
    
    # train the model
    model.fit(x=[-1, 0, 1], y=[-3, -1, 1], epochs=5)
    
    # Convert the model to LiteRT
    converter = tf.lite.TFLiteConverter.from_keras_model(model)
    tflite_model = converter.convert()
    
    # Save the model
    with open('model.tflite', 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

Note

The converted LiteRT model isn’t quantized, and its data is in 32‑bit floating-point precision.

## Quantize models

After converting a model to the LiteRT format, you can quantize it. Quantization in neural network models involves the following steps:

1. Quantize weights and biases: These are already part of the trained model and you can quantize them without additional information. Therefore, quantizing weights and biases is a static step.
2. Quantize activation layers: The ranges for the activation layer output depend on the input image during forward propagation. Therefore, a set of sample inputs, known as calibration or representative data sets, is necessary to quantize these layers and identify the minimum and maximum ranges.

To quantize a TensorFlow floating-point model to a quantized LiteRT model, LiteRT provides posttraining quantization techniques. For more information, see [Posttraining quantization](https://ai.google.dev/edge/litert/models/post_training_quantization).

### Posttraining quantization

LiteRT supports two types of posttraining quantizations:

- Posttraining dynamic range quantization
- Posttraining full-integer quantization

### Posttraining dynamic range quantization

In posttraining dynamic range quantization, weights and biases are statically quantized from floating-point precision to fixed-point integer 8‑bit precision. The activation layer ranges remain in 32‑bit floating-point precision.

To reduce latencies during inference, dynamic-range operators:

- Quantize activations based on their ranges to fixed-point integer 8‑bit precision
- Perform computations with 8‑bit weights and activations

Note

This step only quantizes weights and doesn’t need extra calibration data.

The following script converts and quantizes a TensorFlow model to a LiteRT model:

import tensorflow as tf
    from tensorflow import keras
    
    converter = tf.lite.TFLiteConverter.from_saved_model(exp_model_path)
    converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS]
    converter.optimizations = [tf.lite.Optimize.DEFAULT]
    
    tflite_model = converter.convert()
    save_name = 'quantized_model.tflite'
    
    print('Saving Dynamic Quantized LiteRT model ..................')
    
    with open(save_name, 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

### Posttraining full-integer quantization

In full-integer quantization, a representative data quantizes the activation layers within the model.

The following script converts and quantizes a TensorFlow model to a LiteRT model. It generates a full-integer quantized model that’s more suitable for fixed-point integer hardware, such as the Hexagon Tensor Processor on the Qualcomm Linux development kit.

import tensorflow as tf
    
    def representative_dataset():
        for data in dataset:
            yield {
                "image": data.image,
                "bias": data.bias,
            }
    saved_model_dir = "/path/to/saved/model"
    
    # prepare converter by loading model in saved_model format.
    converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
    converter.optimizations = [tf.lite.Optimize.DEFAULT]
    
    # Set representative dataset used for quantization.
    converter.representative_dataset = representative_dataset
    
    # For full-integer quantization, set target_spec supported_ops to TFLITE_BUILTINS_INT8.
    converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]
    converter.inference_input_type = tf.int8  # or tf.uint8
    converter.inference_output_type = tf.int8  # or tf.uint8
    
    # Convert model
    tflite_quant_model = converter.convert()
    save_name = 'quantized_model_int8.tflite'
    
    print('Saving Quantized LiteRT model ..................')
    
    with open(save_name, 'wb') as f:
        f.write(tflite_model)
    Copy to clipboard

Note

`supported_ops` in converter sets `target_spec` to `tf.lite.OpsSet.TFLITE_BUILTINS_INT8`.

## Convert using offline converter tool

The TensorFlow pip package includes the tflite\_convert TensorFlow Lite offline converter tool (CLI), which you can use offline for TensorFlow versions 2.x and later.

The tflite\_convert tool accepts the following input in the CLI:

tflite_convert --help
    
    optional arguments:
      -h, --help            show this help message and exit
      --output_file OUTPUT_FILE
                            Full filepath of the output file.
      --saved_model_dir SAVED_MODEL_DIR
                            Full path of the directory containing the SavedModel.
      --keras_model_file KERAS_MODEL_FILE
                            Full filepath of HDF5 file containing tf.Keras model.
      --saved_model_tag_set SAVED_MODEL_TAG_SET
                            Comma-separated set of tags identifying the MetaGraphDef within the SavedModel to analyze. All tags must be present. To pass in an empty
                            tag set, pass in "". (default "serve")
      --saved_model_signature_key SAVED_MODEL_SIGNATURE_KEY
                            Key identifying the SignatureDef containing inputs and outputs. (default DEFAULT_SERVING_SIGNATURE_DEF_KEY)
      --enable_v1_converter
                            Enables the TensorFlow V1 converter in 2.0
    Copy to clipboard

### Convert a SavedModel

To convert a typical TensorFlow model in the saved\_model format using the tflite\_convert tool, run the following command:

tflite_convert \
          --saved_model_dir=/tmp/mobilenet_saved_model \
          --output_file=/tmp/mobilenet.tflite \
          --saved_model_tag_set=serve \
             --saved_model_signature_key="serving_default"
    Copy to clipboard

### Convert a Keras H5 model

To convert a Keras model using the tflite\_convert tool, run the following command:

tflite_convert \
      --keras_model_file=/tmp/mobilenet_keras_model.h5 \
      --output_file=/tmp/mobilenet.tflite
    Copy to clipboard

Note

The tflite\_convert tool is suitable for basic purposes only. For posttraining integer quantization, Qualcomm recommends using Python APIs.

## Create an application and run inference

You can use the LiteRT C++ APIs to create an application, load a LiteRT model, and
run it on hardware using delegates.

The following figure shows the steps involved in creating an application using C++ APIs to run a LiteRT model.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export tensorflow-lite-model-application-flow.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="12.2639in" height="1.19444in" viewbox="0 0 883 86" xml:space="preserve" color-interpolation-filters="sRGB" class="st7" aria-label="../../_images/tensorflow-lite-model-application-flow.svg"><v:documentproperties v:langid="1033" v:viewmarkup="false">	<v:userdefs>		<v:ud v:nameu="msvNoAutoConnect" v:val="VT0(1):26"></v:ud>	</v:userdefs></v:documentproperties>
<style>.svg-2 .st1 { fill: #f7f8fa; stroke: #f7f8fa; stroke-width: 1 }
.svg-2 .st2 { fill: none; stroke: #3253dc; stroke-width: 1 }
.svg-2 .st3 { fill: #000000; font-family: Arial; font-size: 0.833336em }
.svg-2 .st4 { font-size: 1em }
.svg-2 .st5 { marker-end: url("#mrkr4-24"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-2 .st6 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-2 .st7 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="mrkr4-24" class="st6" v:arrowtype="4" v:arrowsize="2" v:setback="7.04" refx="-7.04" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.52,-3.52) "></use>	</marker></defs><g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<v:userdefs>		<v:ud v:nameu="msvThemeOrder" v:val="VT0(0):26"></v:ud>	</v:userdefs>	<title>Page-1</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Callout" v:index="0"></v:layer>	<v:layer v:name="Connector" v:index="1"></v:layer>	<g id="shape13-1" v:mid="13" v:groupcontext="shape" transform="translate(18,-18)">		<title></title>		<rect x="0" y="36" width="847" height="50" class="st1"></rect>	</g>	<g id="shape3-3" v:mid="3" v:groupcontext="shape" transform="translate(19.5,-19.75)">		<title></title>		<desc>Load a LiteRT model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="24.58" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Load a LiteRT model</text>		</g>	<g id="shape5-6" v:mid="5" v:groupcontext="shape" transform="translate(195,-19.75)">		<title></title>		<desc>Create a LiteRT interpreter</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="11.53" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Create a LiteRT interpreter</text>		</g>	<g id="shape6-9" v:mid="6" v:groupcontext="shape" transform="translate(370.5,-19.75)">		<title></title>		<desc>Prepare a model with a chosen delegate</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="19.58" y="59.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Prepare a model with a <tspan x="34.3" dy="1.2em" class="st4">chosen delegate</tspan></text>		</g>	<g id="shape7-13" v:mid="7" v:groupcontext="shape" transform="translate(546,-19.75)">		<title></title>		<desc>Prepare input/output buffers</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="9.01" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Prepare input/output buffers</text>		</g>	<g id="shape8-16" v:mid="8" v:groupcontext="shape" transform="translate(721.5,-19.75)">		<title></title>		<desc>Run a model</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="62.75" width="142" height="46.5"></v:textrect>		<rect x="0" y="39.5" width="142" height="46.5" class="st2"></rect>		<text x="42.65" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>Run a model</text>		</g>	<g id="shape9-19" v:mid="9" v:groupcontext="shape" v:layermember="1" transform="translate(161.5,-34)">		<title>Dynamic connector</title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g>	<g id="shape10-25" v:mid="10" v:groupcontext="shape" v:layermember="1" transform="translate(337,-34)">		<title>Dynamic connector.10</title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g>	<g id="shape11-30" v:mid="11" v:groupcontext="shape" v:layermember="1" transform="translate(512.5,-34)">		<title>Dynamic connector.11</title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g>	<g id="shape12-35" v:mid="12" v:groupcontext="shape" v:layermember="1" transform="translate(688,-34)">		<title>Dynamic connector.12</title>		<path d="M0 77 L26.46 77" class="st5"></path>	</g></g>
</svg>

**Figure: Workflow to create an application and run a LiteRT model**

### Load a LiteRT model

A LiteRT model is a FlatBuffers file that has information on model operators and
any associated weights and biases.

The contents of the FlatBuffers file include the following:

- Tensors (input and outputs of each operation)
- Buffers (weights and biases)
- Operations that create an execution graph

The LiteRT framework provides APIs to do the following:

- Load a LiteRT model file
- Unpack all the content of the FlatBuffers file into memory

You can use the following APIs to load a LiteRT model for inference:

include <cstdio>
    include <iostream>
    include "tensorflow/lite/interpreter.h"
    include "tensorflow/lite/kernels/register.h"
    include "tensorflow/lite/model.h"
    include "tensorflow/lite/optional_debug_tools.h"
    
    std::unique_ptr<tflite::FlatBufferModel> model;
    
    model = tflite::FlatBufferModel::BuildFromFile(model_name.c_str());
    if (!model) {
      std::cerr << "Failed to mmap model " << model_name << std::endl;
      exit(-1);
    }
    Copy to clipboard

### Create a LiteRT interpreter

Using the TensorFlow C/C++ APIs, you can build an interpreter to run the
model.

The interpreter interface helps you to do the following:

- Configure model execution on a chosen delegate.
- Assign the memory needed to for forward propagation.

The following example code demonstrates how you can create an interpreter. You can configure the interpreter instance to use a specific delegate and perform forward propagation.

//Build the interpreter with the InterpreterBuilder.
    //Note: all Interpreters should be built with the InterpreterBuilder,
    // which allocates memory for the Interpreter and does various set up
    // tasks so that the Interpreter can read the provided model.
    
    tflite::ops::builtin::BuiltinOpResolver resolver;
    tflite::InterpreterBuilder builder(*model, resolver);
    std::unique_ptr<tflite::Interpreter> interpreter;
    builder(&interpreter);
    if (!interpreter) {
       std::cerr << "Failed to construct interpreter on provided tflite model" << std::endl;
    }
    if (interpreter->AllocateTensors() != kTfLiteOk) {
       std::cerr <<  "Failed to allocate tensors!" << std::endl;
       exit(-1);
    }
    Copy to clipboard

### Prepare a model with a chosen delegate

After creating an interpreter and allocating the necessary memory to run the model,
prepare the model with a chosen delegate. This step creates an execution graph from the
model loaded earlier and uses the underlying library to perform inference on the delegate
hardware.

The following example code creates the XNNPACK delegate for running a LiteRT model on the Arm CPU. It creates the delegate by calling the `TfLiteXNNPackDelegateCreate(…)` API. You can also customize the delegate using the Delegate Options API.

TfLiteDelegate *delegate = NULL;
    TfLiteXNNPackDelegateOptions xnnpack_options =
    TfLiteXNNPackDelegateOptionsDefault();
    xnnpack_options.num_threads = num_threads;
    
    TfLiteDelegate* xnnpack_delegate =
    TfLiteXNNPackDelegateCreate(&xnnpack_options);
    if (interpreter->ModifyGraphWithDelegate(xnnpack_delegate) != kTfLiteOk) {
      // Report error and fall back to another delegate, or the default backend
    }
    Copy to clipboard

### Prepare input/output buffers

When you build a standalone LiteRT application, it’s essential to prepare input data,
such as camera frames, for the pipeline to run LiteRT models.

Preprocessing operations, in the following cases for example, are important to ensure that inference happens correctly:

- Resizing the input image to a resolution expected by the model
- Normalization
- Mean subtraction

### Run a model

To run inference on a model, you must invoke a delegate using the
`Invoke()` API. Before invoking this API, create the appropriate
input/output buffers and provide them to the interpreter.

After the inference is complete, you can parse the output from the output buffers of the interpreter to generate the inference results.

An example of the `Invoke()` API running a model using a delegate is as follows:

// Run Inference
    interpreter->Invoke()
    Copy to clipboard

After the inference is complete, you can find the output tensors from the LiteRT `Invoke()` API in the output buffers of the interpreter. To perform further postprocessing on these outputs, you can parse them from the interpreter.

For a comprehensive example, see the label\_image example in the [TensorFlow GitHub repository](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/label_image).

For more information, see [LiteRT documentation](https://ai.google.dev/edge/litert).

## Develop a custom application

To enhance the developer experience, the Qualcomm IM SDK provides the qtimltflite
GStreamer-based plug-in, which performs LiteRT model inference.

For more details, see the following:

- [Qualcomm IM SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-50/overview.html) documentation
- [qtimltflite](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-50/qtimltflite.html) plug-in documentation
- [Develop your own application](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-15B/develop-your-own-application.html)

Last Published: Apr 07, 2025

[Previous Topic
LiteRT architecture](https://docs.qualcomm.com/bundle/publicresource/80-70018-54/topics/arch.md) [Next Topic
Run LiteRT sample applications](https://docs.qualcomm.com/bundle/publicresource/80-70018-54/topics/sample-applications.md)