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 &lt;https://developer.android.com/ndk/reference/group/neural-networks#group___neural_networks_1ggaabbe492c60331b13038e39d4207940e0a2bfbb83a537701e2843a3d5004250c2c&gt;"/>

         <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 &lt;https://developer.android.com/ndk/reference/group/neural-networks#group___neural_networks_1ggaabbe492c60331b13038e39d4207940e0a2bfbb83a537701e2843a3d5004250c2c&gt;"></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 元素。