# LiteRT 开发者工作流程

您可以通过从开源社区下载现有的 LiteRT 模型来使用它。或者，您可以使用特定工具将 TensorFlow 或 Keras 模型转换为 LiteRT 格式。模型转换完成后，您可以在设备上运行推理并为 LiteRT 模型开发定制应用。

下图展示了使用现有模型、对模型进行转换和量化，以及创建用于运行推理的应用程序所涉及的各项任务。

<?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 litert-developer-workflow -->
<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.93056in" viewbox="0 0 904 499" xml:space="preserve" color-interpolation-filters="sRGB" class="st11" 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: Microsoft YaHei UI; font-size: 0.75em }
.svg-1 .st4 { font-family: Arial; font-size: 1em }
.svg-1 .st5 { font-size: 1em }
.svg-1 .st6 { fill: #000000; font-family: Arial; font-size: 0.75em }
.svg-1 .st7 { font-family: Microsoft YaHei UI; font-size: 1em }
.svg-1 .st8 { marker-end: url("#mrkr4-77"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st9 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409090909091 }
.svg-1 .st10 { stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st11 { 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-77" class="st9" 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>litert-developer-workflow</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>Sheet.13</title>		<rect x="0" y="38" width="866" height="461" class="st1"></rect>	</g>	<g id="shape3-3" v:mid="3" v:groupcontext="shape" transform="translate(21,-354.628)">		<title>Sheet.3</title>		<desc>将 TensorFlow 模型转换为 LiteRT 模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="478.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="457.085" width="142" height="41.9155" class="st2"></rect>		<text x="17.99" y="475.31" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>将<tspan class="st4"> </tspan><tspan class="st4">TensorFlow </tspan>模型转换为<tspan class="st4"> </tspan><tspan x="47.5" dy="1.216em" class="st4">LiteRT </tspan>模型</text>		</g>	<g id="shape15-10" v:mid="15" v:groupcontext="shape" transform="translate(50.5,-289.664)">		<title>Sheet.15</title>		<desc>使用现有的 LiteRT 模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="9" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>使用现有的<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>模型</text>		</g>	<g id="shape22-15" v:mid="22" v:groupcontext="shape" transform="translate(50.5,-223.115)">		<title>Sheet.22</title>		<desc>将 TensorFlow 或 Keras 模型转换为 LiteRT 格式</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="8.24" y="479.35" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>将<tspan class="st4"> </tspan><tspan class="st4">TensorFlow </tspan>或<tspan class="st4"> </tspan><tspan class="st4">Keras </tspan><tspan x="9" dy="1.216em" class="st5">模型转换为</tspan><tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>格式  </text>		</g>	<g id="shape26-25" v:mid="26" v:groupcontext="shape" transform="translate(50.5,-155.535)">		<title>Sheet.26</title>		<desc>使用Python API 进行转换和量化</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.9911" cy="482.082" width="111.99" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="111.982" height="33.836" class="st2"></rect>		<text x="24.48" y="479.35" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>使用<tspan class="st4">Python API </tspan><tspan x="24.49" dy="1.216em" class="st5">进行转换和量化</tspan></text>		</g>	<g id="shape28-30" v:mid="28" v:groupcontext="shape" transform="translate(49.9821,-87.9547)">		<title>Sheet.28</title>		<desc>转换 TensorFlow SavedModel推荐</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="22.49" y="479.35" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>转换<tspan class="st4"> </tspan><tspan class="st4">TensorFlow </tspan><tspan x="13.23" dy="1.216em" class="st4">SavedModel</tspan>（推荐）</text>		</g>	<g id="shape30-36" v:mid="30" v:groupcontext="shape" transform="translate(49.9821,-20.3744)">		<title>Sheet.30</title>		<desc>转换 Keras 模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="23.99" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>转换<tspan class="st4"> </tspan><tspan class="st4">Keras </tspan>模型</text>		</g>	<g id="shape31-41" v:mid="31" v:groupcontext="shape" transform="translate(379,-437.085)">		<title>Sheet.31</title>		<desc>LiteRT 开发者工作流程</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="478.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="457.085" width="142" height="41.9155" class="st2"></rect>		<text x="25" y="480.78" class="st6" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>LiteRT <tspan class="st7">开发者工作流程</tspan></text>		</g>	<g id="shape32-45" v:mid="32" v:groupcontext="shape" transform="translate(200,-354.628)">		<title>Sheet.32</title>		<desc>量化模型训练后量化</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="478.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="457.085" width="142" height="41.9155" class="st2"></rect>		<text x="21.5" y="480.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>量化模型（训练后量化）</text>		</g>	<g id="shape37-48" v:mid="37" v:groupcontext="shape" transform="translate(229.5,-289.664)">		<title>Sheet.37</title>		<desc>训练后动态范围量化</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="15.75" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>训练后动态范围量化</text>		</g>	<g id="shape39-51" v:mid="39" v:groupcontext="shape" transform="translate(229.5,-222.874)">		<title>Sheet.39</title>		<desc>训练后全整数量化</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="20.25" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>训练后全整数量化</text>		</g>	<g id="shape51-54" v:mid="51" v:groupcontext="shape" transform="translate(380,-354.843)">		<title>Sheet.51</title>		<desc>使用离线转换工具 (CLI) 进行转换</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="478.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="457.085" width="142" height="41.9155" class="st2"></rect>		<text x="4.5" y="480.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>使用离线转换工具<tspan class="st4"> </tspan><tspan class="st4">(CLI) </tspan>进行转换</text>		</g>	<g id="shape53-59" v:mid="53" v:groupcontext="shape" transform="translate(409.5,-289.664)">		<title>Sheet.53</title>		<desc>转换 SavedModel</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="20.98" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>转换<tspan class="st4"> </tspan><tspan class="st4">SavedModel</tspan></text>		</g>	<g id="shape55-64" v:mid="55" v:groupcontext="shape" transform="translate(409.5,-223.115)">		<title>Sheet.55</title>		<desc>转换 Keras H5 模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="16.99" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>转换<tspan class="st4"> </tspan><tspan class="st4">Keras H5 </tspan>模型  </text>		</g>	<g id="shape56-69" v:mid="56" v:groupcontext="shape" transform="translate(561,-355.084)">		<title>Sheet.56</title>		<desc>创建应用程序并运行推理</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="478.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="457.085" width="142" height="41.9155" class="st2"></rect>		<text x="21.5" y="480.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>创建应用程序并运行推理</text>		</g>	<g id="shape57-72" v:mid="57" v:groupcontext="shape" v:layermember="1" transform="translate(622.625,-355.084)">		<title>Dynamic connector.57</title>		<path d="M9 499 L9 523.03" class="st8"></path>	</g>	<g id="shape58-78" v:mid="58" v:groupcontext="shape" transform="translate(575.009,-289.664)">		<title>Sheet.58</title>		<desc>加载 LiteRT 模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="22.5" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>加载<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>模型  </text>		</g>	<g id="shape59-83" v:mid="59" v:groupcontext="shape" v:layermember="1" transform="translate(622.518,-289.664)">		<title>Dynamic connector.59</title>		<path d="M9 499 L9 524.67" class="st8"></path>	</g>	<g id="shape60-88" v:mid="60" v:groupcontext="shape" transform="translate(575.527,-223.115)">		<title>Sheet.60</title>		<desc>创建 LiteRT 解释</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.9911" cy="482.082" width="111.99" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="111.982" height="33.836" class="st2"></rect>		<text x="22.24" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>创建<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>解释</text>		</g>	<g id="shape61-93" v:mid="61" v:groupcontext="shape" v:layermember="1" transform="translate(622.259,-223.115)">		<title>Dynamic connector.61</title>		<path d="M9 499 L9 525.7" class="st8"></path>	</g>	<g id="shape62-98" v:mid="62" v:groupcontext="shape" transform="translate(574.491,-155.535)">		<title>Sheet.62</title>		<desc>使用选定的 delegate来准备一个模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="33.75" y="479.35" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>使用选定的<tspan class="st4"> </tspan><tspan x="7.48" dy="1.216em" class="st4">delegate</tspan>来准备一个模型</text>		</g>	<g id="shape63-103" v:mid="63" v:groupcontext="shape" v:layermember="1" transform="translate(622,-155.535)">		<title>Dynamic connector.63</title>		<path d="M9 499 L9 525.7" class="st8"></path>	</g>	<g id="shape64-108" v:mid="64" v:groupcontext="shape" transform="translate(575.009,-87.9547)">		<title>Sheet.64</title>		<desc>准备输入/输出缓存</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="55.9911" cy="482.082" width="111.99" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="111.982" height="33.836" class="st2"></rect>		<text x="18.74" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>准备输入<tspan class="st4">/</tspan>输出缓存</text>		</g>	<g id="shape65-112" v:mid="65" v:groupcontext="shape" v:layermember="1" transform="translate(622,-87.9547)">		<title>Dynamic connector.65</title>		<path d="M9 499 L9 525.7" class="st8"></path>	</g>	<g id="shape66-117" v:mid="66" v:groupcontext="shape" transform="translate(574.491,-20.3744)">		<title>Sheet.66</title>		<desc>运行模型</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="56.25" cy="482.082" width="112.5" height="33.836"></v:textrect>		<rect x="0" y="465.164" width="112.5" height="33.836" class="st2"></rect>		<text x="38.25" y="484.82" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>运行模型</text>		</g>	<g id="shape67-120" v:mid="67" v:groupcontext="shape" transform="translate(742,-355.084)">		<title>Sheet.67</title>		<desc>开发定制的应用程序</desc>		<v:textblock v:margins="rect(4,4,4,4)"></v:textblock>		<v:textrect cx="71" cy="478.042" width="142" height="41.9155"></v:textrect>		<rect x="0" y="457.085" width="142" height="41.9155" class="st2"></rect>		<text x="30.5" y="480.78" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>开发定制的应用程序</text>		</g>	<g id="shape68-123" v:mid="68" v:groupcontext="shape" v:layermember="1" transform="translate(37,-354.628)">		<title>Dynamic connector</title>		<path d="M-9 499 L-9 816.1" class="st10"></path>	</g>	<g id="shape70-126" v:mid="70" v:groupcontext="shape" v:layermember="1" transform="translate(28,-297.124)">		<title>Dynamic connector.70</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape71-131" v:mid="71" v:groupcontext="shape" v:layermember="1" transform="translate(28,-231.874)">		<title>Dynamic connector.71</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape72-136" v:mid="72" v:groupcontext="shape" v:layermember="1" transform="translate(28,-165.499)">		<title>Dynamic connector.72</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape73-141" v:mid="73" v:groupcontext="shape" v:layermember="1" transform="translate(27.4821,-94.6244)">		<title>Dynamic connector.73</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape74-146" v:mid="74" v:groupcontext="shape" v:layermember="1" transform="translate(28,-28.5306)">		<title>Dynamic connector.74</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape75-151" v:mid="75" v:groupcontext="shape" v:layermember="1" transform="translate(197.312,-354.423)">		<title>Dynamic connector.75</title>		<path d="M9 499 L9 612.75" class="st10"></path>	</g>	<g id="shape76-154" v:mid="76" v:groupcontext="shape" v:layermember="1" transform="translate(206.312,-296.919)">		<title>Dynamic connector.76</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape77-159" v:mid="77" v:groupcontext="shape" v:layermember="1" transform="translate(206.312,-231.669)">		<title>Dynamic connector.77</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape78-164" v:mid="78" v:groupcontext="shape" v:layermember="1" transform="translate(376.75,-353.374)">		<title>Dynamic connector.78</title>		<path d="M9 499 L9 612.75" class="st10"></path>	</g>	<g id="shape79-167" v:mid="79" v:groupcontext="shape" v:layermember="1" transform="translate(386.578,-295.871)">		<title>Dynamic connector.79</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape80-172" v:mid="80" v:groupcontext="shape" v:layermember="1" transform="translate(385.75,-230.621)">		<title>Dynamic connector.80</title>		<path d="M0 490 L15.46 490" class="st8"></path>	</g>	<g id="shape81-177" v:mid="81" v:groupcontext="shape" v:layermember="1" transform="translate(440.875,-437.292)">		<title>Dynamic connector.81</title>		<path d="M9 499.21 L9 516.79" class="st10"></path>	</g>	<g id="shape82-180" v:mid="82" v:groupcontext="shape" v:layermember="1" transform="translate(401.5,-419.5)">		<title>Dynamic connector.82</title>		<path d="M0 499 L-309.5 499 L-309.5 521.96" class="st10"></path>	</g>	<g id="shape83-183" v:mid="83" v:groupcontext="shape" v:layermember="1" transform="translate(401.5,-419.5)">		<title>Dynamic connector.83</title>		<path d="M0 499 L-130.5 499 L-130.5 521.96" class="st10"></path>	</g>	<g id="shape85-186" v:mid="85" v:groupcontext="shape" v:layermember="1" transform="translate(401.5,-419.5)">		<title>Dynamic connector.85</title>		<path d="M0 499 L48.38 499 L48.38 521.74" class="st10"></path>	</g>	<g id="shape86-189" v:mid="86" v:groupcontext="shape" v:layermember="1" transform="translate(449.875,-419.5)">		<title>Dynamic connector.86</title>		<path d="M0 499 L182.13 499 L182.13 521.5" class="st10"></path>	</g>	<g id="shape87-192" v:mid="87" v:groupcontext="shape" v:layermember="1" transform="translate(632,-419.5)">		<title>Dynamic connector.87</title>		<path d="M0 499 L181 499 L181 521.5" class="st10"></path>	</g></g>
</svg>

**图：LiteRT 开发者工作流程**

Note

如果您使用来自 Qualcomm AI Hub 或其他来源的 LiteRT 模型，则可以跳过 LiteRT 开发者工作流中描述的任务。

在 Qualcomm 专用硬件上运行 LiteRT 模型涉及以下任务。

## 将 TensorFlow 模型转换为 LiteRT 模型

您可以将 TensorFlow 模型转换为 LiteRT 模型，并对设备上推理对其进行优化。有关 LiteRT 模型转换的更多信息，请参见[模型转换概述](https://ai.google.dev/edge/litert/models/convert)。

LiteRT 模型转换支持将模型转换为以下格式：

- 32 位浮点精度
- 16 位浮点精度
- UINT8/INT8 精度（量化模型）

### 使用现有的 LiteRT 模型

可以使用 LiteRT 部署来自开源社区的现有LiteRT模型。

Qualcomm AI Hub 发布针对 Qualcomm Linux 开发包优化的 LiteRT 模型。关于 Qualcomm 的 LiteRT 模型，请参阅 [Qualcomm AI Hub](https://aihub.qualcomm.com/)。

如需从 Qualcomm AI Hub 下载优化后的模型，可执行以下操作：

1. 转到 [Qualcomm AI Hub IOT 模型页面](https://aihub.qualcomm.com/iot/models)。
2. 在左侧窗格中，通过选择芯片组筛选可用模型。
3. 选择一个模型。
4. 在下一页，选择 TorchScript &gt; TFLite 路径。
5. 选择 Download model

Note

下载的模型已经过预优化，可直接部署。

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

**图：在 Qualcomm AI Hub 上优化的 LiteRT 模型**

### 将 TensorFlow 或 Keras 模型转换为 LiteRT 格式

TensorFlow 框架提供 Python API 和命令行界面 (CLI) 工具，用于将 TensorFlow 或 Keras 模型转换为 LiteRT 格式。

表：TensorFlow 模型转换方法

| 转换方法 | 说明 |
| --- | --- |
| Python API | 将模型转换、优化和量化为 LiteRT 格式 |
| CLI 工具 | 将模型转换为 LiteRT 格式，但仅适用于基本模型转换 |

Note

TensorFlow 到 LiteRT Python API 提供了更大的灵活性，可进行模型转换、优化和量化以满足您的要求。

### 使用Python API 进行转换和量化

TensorFlow 提供以下 API 将 TensorFlow SavedModel 或 Keras 模型转换为 LiteRT 模型。

表：用于转换模型的 TensorFlow Python API

| API | 说明 |
| --- | --- |
| tf.lite.TFLiteConverter.from\_saved\_model()（推荐） | 转换 TensorFlow SavedModel |
| tf.lite.TFLiteConverter.from\_keras\_model() | 转换 Keras 模型 |

### 推荐：转换 TensorFlow SavedModel

以下示例展示了如何将以 saved\_model 格式保存的 TensorFlow 模型转换为 LiteRT 模型：

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

转换后的 LiteRT 模型未进行量化，其数据为 32 位浮点精度。

### 转换 Keras 模型

以下示例展示了如何将 Keras 模型转换为 LiteRT 模型：

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

转换后的 LiteRT 模型未进行量化，其数据为 32 位浮点精度。

## 量化模型

将模型转换为 LiteRT 格式后，您可以对其进行量化。神经网络模型中的量化涉及以下步骤：

1. 量化权值和阈值：这些已包含在训练好的模型中，无需额外信息即可量化。因此，权值和阈值的量化是一个静态步骤。
2. 量化激活层：激活层输出的范围取决于前向传播期间的输入图像。因此，需要一组称为校准数据集或代表性数据集的样本输入，以量化这些层并确定最小值和最大值范围。

为了将TensorFlow浮点模型处理为量化的 LiteRT 模型，LiteRT 提供了训练后量化技术。有关详细信息，参见[训练后量化](https://ai.google.dev/edge/litert/models/post_training_quantization)。

### 训练后量化

LiteRT 支持两种类型的训练后量化：

- 训练后动态范围量化
- 训练后全整数量化

### 训练后动态范围量化

在训练后动态范围量化中，权重和偏差从浮点精度静态量化为定点整数 8 位精度。激活层范围保持 32 位浮点精度。

为了减少推理过程中的延迟，动态范围运算符：

- 根据激活的范围将其量化为定点整数 8 位精度
- 使用 8 位权重和激活执行计算

Note

此步骤仅量化权重，无需额外校准数据。

以下脚本将 TensorFlow 模型转换并量化为 LiteRT 模型：

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

### 训练后全整数量化

在全整数量化中，代表性数据会量化模型内的激活层。

以下脚本将 TensorFlow 模型转换并量化为 LiteRT 模型。该脚本生成了一个全整数量化模型，更适合定点整数硬件，例如 Qualcomm Linux 开发包上的 Hexagon Tensor Processor。

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` 将 `target_spec` 设置为 `tf.lite.OpsSet.TFLITE_BUILTINS_INT8`。

## 使用离线转换工具进行转换

TensorFlow pip 包包含 tflite\_convert TensorFlow Lite 离线转换器工具 (CLI)，可以在2.x 及更高版本的 TensorFlow 中离线使用。

Tflite\_convert 工具在 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

### 转换 SavedModel

要使用 tflite\_convert工具转换以 saved\_model 格式的典型 TensorFlow 模型，运行以下命令：

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

### 转换 Keras H5 模型

要使用 tflite\_convert 工具转换 Keras 模型，运行以下命令：

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

Note

tflite\_convert 工具仅适用于基本用途。对于训练后整数量化，Qualcomm 建议使用 Python API。

## 创建应用程序并运行推理

可以使用 LiteRT C++ API 创建应用程序、加载 LiteRT 模型并使用 delegate 在硬件上运行该模型。

下图展示了使用 C++ API 创建一个用于运行 LiteRT 模型的应用程序所涉及的步骤。

<?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 tensorflow-lite-model-application-flow -->
<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.1944in" viewbox="0 0 883.001 85.9968" xml:space="preserve" color-interpolation-filters="sRGB" class="st8" aria-label="../../_images/tensorflow-lite-model-application-flow.svg"><v:documentproperties v:langid="1033">	<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-linecap: butt; stroke-width: 0.999996 }
.svg-2 .st2 { fill: none; stroke: #3253dc; stroke-linecap: butt; stroke-width: 0.999996 }
.svg-2 .st3 { fill: #000000; font-family: Microsoft YaHei; font-size: 0.833336em }
.svg-2 .st4 { font-family: Arial; font-size: 1em }
.svg-2 .st5 { font-size: 1em }
.svg-2 .st6 { marker-end: url("#mrkr4-30"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.999996 }
.svg-2 .st7 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.28409015231517 }
.svg-2 .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-30" class="st7" v:arrowtype="4" v:arrowsize="2" v:setback="0" refx="-0" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-3.5200093767791,-3.5200093767791) "></use>	</marker></defs><g v:mid="4" v:index="2" v:groupcontext="foregroundPage">	<title>tensorflow-lite-model-application-flow</title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="8.99997" v:shadowoffsety="-8.99997"></v:pageproperties>	<v:layer v:name="Connector" v:index="0"></v:layer>	<g id="shape1-1" v:mid="1" v:groupcontext="shape" transform="translate(18,-18)">		<title>shape13-1</title>		<rect x="0" y="35.997" width="846.997" height="49.9998" class="st1"></rect>	</g>	<g id="shape2-3" v:mid="2" v:groupcontext="shape" transform="translate(19.5,-19.75)">		<title>shape3-3</title>		<desc>Load a LiteRT model</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="33.49" y="65.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>加载<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>模型</text>		</g>	<g id="shape3-8" v:mid="3" v:groupcontext="shape" transform="translate(194.999,-19.75)">		<title>shape5-6</title>		<desc>Create a LiteRT interpreter</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="33.49" y="65.79" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>创建<tspan class="st4"> </tspan><tspan class="st4">LiteRT </tspan>解释</text>		</g>	<g id="shape4-13" v:mid="4" v:groupcontext="shape" transform="translate(370.499,-19.75)">		<title>shape6-9</title>		<desc>Prepare a model with a chosen delegate</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="25.42" y="59.71" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>使用选定的<tspan class="st4"> </tspan><tspan class="st4">delegate<v:lf></v:lf></tspan><tspan x="36" dy="1.216em" class="st5">来准备一个模型</tspan></text>		</g>	<g id="shape5-19" v:mid="5" v:groupcontext="shape" transform="translate(545.998,-19.75)">		<title>shape7-13</title>		<desc>Prepare input/output buffers</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="28.86" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>准备输入/输出缓存</text>		</g>	<g id="shape6-22" v:mid="6" v:groupcontext="shape" transform="translate(721.497,-19.75)">		<title>shape8-16</title>		<desc>Run a model</desc>		<v:userdefs></v:userdefs>		<v:textblock v:margins="rect(3.99999,3.99999,3.99999,3.99999)"></v:textblock>		<v:textrect cx="70.9977" cy="62.7469" width="142" height="46.4998"></v:textrect>		<rect x="0" y="39.497" width="141.999" height="46.4998" class="st2"></rect>		<text x="51" y="65.75" class="st3" v:langid="1033"><v:paragraph v:horizalign="1"></v:paragraph><v:tablist></v:tablist>运行模型</text>		</g>	<g id="shape7-25" v:mid="7" v:groupcontext="shape" v:layermember="0" transform="translate(161.499,-42.9999)">		<title>Dynamic connector</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g>	<g id="shape8-31" v:mid="8" v:groupcontext="shape" v:layermember="0" transform="translate(336.999,-42.9999)">		<title>Dynamic connector.10</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g>	<g id="shape9-36" v:mid="9" v:groupcontext="shape" v:layermember="0" transform="translate(512.498,-42.9999)">		<title>Dynamic connector.11</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g>	<g id="shape10-41" v:mid="10" v:groupcontext="shape" v:layermember="0" transform="translate(687.998,-42.9999)">		<title>Dynamic connector.12</title>		<path d="M0 86 L26.46 86 L33.5 86" class="st6"></path>	</g></g>
</svg>

**图：创建应用并运行 LiteRT 模型的工作流程**

### 加载 LiteRT 模型

LiteRT 模型是一个 FlatBuffers 文件，其中包含关于模型运算符以及任何相关权重和偏差的信息。

FlatBuffers 文件包括以下内容：

- 张量（每个操作的输入和输出）
- 缓存（权重和偏差）
- 创建执行图的操作

LiteRT 框架提供了执行以下内容的 API：

- 加载 LiteRT 模型文件
- 将 FlatBuffers 文件的所有内容解压至内存中

可以使用以下 API 加载 LiteRT 模型进行推理：

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

### 创建 LiteRT 解释

使用 TensorFlow C/C++ API，可编译一个解析器来运行模型。

解析器界面可帮助您执行以下操作：

- 在选定的 delegate 上配置模型执行方法。
- 分配前向传播所需的内存。

以下示例代码演示了如何创建解析器。可配置解析器实例以使用特定的 delegate 并执行前向传播。

//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

### 使用选定的 delegate来准备一个模型

创建解析器并分配运行模型所需的内存后，使用选定的 delegate 准备模型。此步骤从之前加载的模型创建执行图，并使用底层库在 delegate 硬件上执行推理。

以下示例代码创建 XNNPACK Delegate，用于在 Arm CPU 上运行 LiteRT 模型。它通过调用 `TfLiteXNNPackDelegateCreate(…)` API 来创建 delegate。您还可以使用 delegate 选项 API 自定义 delegate。

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

### 准备输入/输出缓存

编译独立的 LiteRT 应用时，必须准备输入数据（例如相机帧），以便 pipeline 运行 LiteRT 模型。

例如在以下情况下，预处理操作对于确保推理正确进行非常重要：

- 将输入图像调整为模型期望的分辨率
- 归一化
- 均值减法

### 运行模型

您必须使用 `Invoke()` API 调用 delegate，以便对模型运行推理。在调用此 API 之前，创建适当的输入/输出缓冲区并将其提供给解析器。

推理完成后，您可以解析由解释器缓存的输出，生成推理结果。

使用 delegate 运行模型的 `Invoke()` API 示例如下：

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

推理完成后，您可以在解释器的输出缓存中找到 LiteRT `Invoke()` API 的输出张量。要对这些输出执行进一步的后处理，可以从解析器中进行解析。

有关综合示例，请参见 [TensorFlow GitHub 存储库](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/examples/label_image)中的 label\_image 示例。

关于更多信息，请参阅 [LiteRT 文档](https://ai.google.dev/edge/litert)。

## 开发定制的应用程序

Qualcomm IM SDK 提供了基于 qtimltflite GStreamer、用于执行 LiteRT 模型推理的插件，以便提升开发者体验。

有关更多信息，请参见以下内容：

- [Qualcomm IM SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-50/overview.html) 文档
- [qtimltflite](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-50/qtimltflite.html) 插件文档
- [开发您自己的应用程序](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-15B/develop-your-own-application.html)

Last Published: Apr 29, 2025

[Previous Topic
LiteRT 架构](https://docs.qualcomm.com/bundle/publicresource/80-70018-54SC/topics/arch.md) [Next Topic
运行 LiteRT 示例应用](https://docs.qualcomm.com/bundle/publicresource/80-70018-54SC/topics/sample-applications.md)