Qualcomm® AI Engine Direct 使用手册(13)
Qualcomm® AI Engine Direct 使用手册(13)
5.1.3 XML OpDef 配置示例
本页概述了与qnn-op-package-generator. 所有示例都是对位于以下位置的示例的更改:
${QNN_SDK_ROOT}/examples/QNN/OpPackageGenerator/ExampleOpPackageHtp.xml
笔记
示例配置使用一个后端,而 qnn-op-package-generator 目前仅支持 HTP、DSP 和 CPU 后端。
示例配置 #1
以下示例为 HTP 定义了一个操作包,其中包含一个名为 Softmax 的操作。此示例配置代表了后端操作相同且不需要任何补充信息的情况。
<?xml version="1.0" encoding="UTF-8"?>
<OpDefCollection
PackageName="ExamplePackage"
Domain="aisw"
Version="1.0"
>
<OpDefList>
<OpDef>
<Name>Softmax</Name>
<Description>
<Content>
Computes data normalization exponentially on an input tensor given an optional positive
scaling factor, beta. The computation is done element-wise per batch along the last dimension.
See Softmax backend definition for supported datatypes and constraints per backend
</Content>
</Description>
<Reference Source="Android NDK NeuralNetworks"
Url="ANEURALNETWORKS_SOFTMAX <https://developer.android.com/ndk/reference/group/neural-networks#group___neural_networks_1ggaabbe492c60331b13038e39d4207940e0a2bfbb83a537701e2843a3d5004250c2c>"/>
<Input>
<Name>in[0]</Name>
<Description>
<Content>input activation</Content>
</Description>
<Mandatory>true</Mandatory>
<Datatype>QNN_DATATYPE_UFIXED_POINT_8</Datatype>
<Datatype>QNN_DATATYPE_UFIXED_POINT_16</Datatype>
<Shape>
<Rank>1</Rank>
<Text>a tensor of N dimension</Text>
</Shape>
</Input>
<Output>
<Name>out[0]</Name>
<Description>
<Content>output activation</Content>
</Description>
<Mandatory>true</Mandatory>
<Datatype>QNN_DATATYPE_UFIXED_POINT_8</Datatype>
<Datatype>QNN_DATATYPE_UFIXED_POINT_16</Datatype>
<Shape>
<Rank>1</Rank>
<Text>a tensor of N dimension</Text>
</Shape>
</Output>
<Parameter>
<Name>beta</Name>
<Mandatory>false</Mandatory>
<Datatype>QNN_DATATYPE_FLOAT_32</Datatype>
<Shape>
<Rank>0</Rank>
</Shape>
<Default>1.0</Default>
</Parameter>
<!--This Op is implemented on these Backends-->
<SupportedBackend>HTP</SupportedBackend>
</OpDef>
</OpDefList>
这里,定义的 Softmax 运算有一个输入和一个输出。每个输入和输出都是一个向量,如排名为 1 所示,并且是强制性的,这意味着必须为每个输入和输出提供非空值。此外,每个输入和输出都支持 QNN_DATATYPE_UFIXED_POINT_8 和 QNN_DATATYPE_UFIXED_POINT_16 作为 HTP 包的数据类型。请注意,可以为同一张量列出多个数据类型。
除了输入和输出之外,Softmax 运算还有一个名为 beta 的参数。Beta 是一个标量值,与激活张量不同,它不是强制性的。如果未指定,则用于 beta 的默认值为 1.0。Beta 支持 QNN_DATATYPE_FLOAT_32 数据类型。
示例配置#2
下面的例子再次为HTP定义了一个op包,其中包含一个名为Softmax的操作。但是,此示例配置代表了一种情况,其中操作具有一些在后端之间有所不同的信息,并且需要补充信息。
<OpDefCollection
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:noNamespaceSchemaLocation="../OpDef.xsd"
PackageName="ExamplePackage"
Domain="example"
Version="1.0"
>
<OpDefList>
<!--Example Op Def Collection, mirroring an OpPackage with supplemental info-->
<OpDef>
<Name>Softmax</Name>
<Description>
<Content>
Computes data normalization exponentially on an input tensor given an optional positive
scaling factor, beta. The computation is done element-wise per batch along the last dimension.
See Softmax backend definition for supported datatypes and constraints per backend
</Content>
</Description>
<Reference Source="Android NDK NeuralNetworks"
Url="ANEURALNETWORKS_SOFTMAX <https://developer.android.com/ndk/reference/group/neural-networks#group___neural_networks_1ggaabbe492c60331b13038e39d4207940e0a2bfbb83a537701e2843a3d5004250c2c>"></Reference>
<Input>
<Name>in[0]</Name>
<Description><Content>input activation</Content></Description>
<Mandatory>true</Mandatory>
<Datatype>BACKEND_SPECIFIC</Datatype>
<Shape>
<Rank>1</Rank>
<Text>a tensor of N dimension</Text>
</Shape>
</Input>
<Output>
<Name>out[0]</Name>
<Description><Content>output activation</Content></Description>
<Mandatory>true</Mandatory>
<Datatype>BACKEND_SPECIFIC</Datatype>
<Shape>
<Rank>1</Rank>
<Text>a tensor of N dimension</Text>
</Shape>
</Output>
<Parameter>
<Name>beta</Name>
<Mandatory>false</Mandatory>
<Datatype>QNN_DATATYPE_FLOAT_32</Datatype>
<Shape>
<Rank>0</Rank>
</Shape>
<Default>1.0</Default>
</Parameter>
<SupportedBackend>HTP</SupportedBackend>
</OpDef>
</OpDefList>
<SupplementalOpDefList Backend="HTP">
<SupportedOps>
<OpName>Softmax</OpName>
</SupportedOps>
<SupplementalOpDef>
<Name>Softmax</Name>
<Input>
<Name>in[0]</Name>
<Datatype>QNN_DATATYPE_UFIXED_POINT_8</Datatype>
<Datatype>QNN_DATATYPE_UFIXED_POINT_16</Datatype>
</Input>
<Output>
<Name>out[0]</Name>
<Datatype>QNN_DATATYPE_UFIXED_POINT_8</Datatype>
<Datatype>QNN_DATATYPE_UFIXED_POINT_16</Datatype>
</Output>
<!--Nothing to do for beta, it remains the same-->
</SupplementalOpDef>
</SupplementalOpDefList>
</OpDefCollection>
在这个例子中,操作的抽象定义与前面的例子相同。Softmax 运算包含 1 个输入、1 个输出和 1 个参数。这与第一个示例不同,因为激活张量的数据类型在后端不同,如 BACKEND_SPECIFIC 字段所示。该信息由 SupplementalOpDef 指定。
笔记
必须补充后端特定信息才能使用qnn-op-package-generator.
这里有一个用于 HTP 的 SupplementalOpDefList,如 SupplementalOpDefList 的 Backend 属性所指示。
HTP 包支持激活张量的 QNN_DATATYPE_UFIXED_POINT_8 和 QNN_DATATYPE_UFIXED_POINT_16 数据类型。请注意,HTP 补充信息并未专门说明参数 beta。这表明 HTP 的 beta 规范与相应 OpDef 中定义的规范相同。
请注意,此示例中的后端支持是用 SupplementalOpDefList 中的 SupportedOp 列表指示的,而不是 OpDef 本身的 BackendSupport 元素。