Qualcomm® AI Engine Direct 使用手册(10)

150 篇文章 9 订阅
50 篇文章 0 订阅


4.1.6.6 禁用优化

QNN GPU 后端提供了三个功能来禁用相应的优化。这些功能是通过自定义图形配置启用的(请参阅QnnGpuGraph_CustomConfig_t)。

QNN GPU 后端将根据网络拓扑分析共享 NATIVE 张量内存。当 disableMemoryOptimizations非零时,模型中的每个张量将被分配唯一的内存并且共享被禁用。

QNN GPU 后端会将兼容操作融合为一个操作,以提高 QnnGraph_execute性能。当 disableNodeOptimizations非零时,操作将不会被融合并且将保持分离。qnn-net-run的 –debug 选项也会禁用操作融合。

QNN GPU 后端将使用队列记录来提高 QnnGraph_execute性能。当 disableQueueRecording非零时,队列记录被禁用。

4.1.6.7 后端扩展

QNN 后端扩展功能有助于使用后端特定 API,即自定义配置。有关后端扩展的更多文档可以在qnn-net-run下找到。请注意,QNN 后端扩展的范围仅限于 qnn-net-run。

在 GPU 后端中,如果指定了图形自定义配置选项(如下面架构中的依赖项所示),则需要图形名称列表。图表自定义配置选项将应用于每个图表。GPU后端扩展的架构是:

{
   "type": "object",
   "properties": {
     // Corresponds to the graph name provided to QnnGraph_create
     "graph_names" : {"type": "array", "items": {"type": "string"}},

     // Precision Mode [optional]
     // Corresponds to QnnGpuGraph_CustomConfig_t::precisionMode.
     "precision_mode": {"type": "string", "enum": ["fp16", "fp32", "hybrid"]},

     // Disable Memory Optimizations (e.g. sharing tensor memory) [optional]
     // Corresponds to QnnGpuGraph_CustomConfig_t::disableMemoryOptimizations.
     "disable_memory_optimizations": {"type": "boolean"},

     // Disable Node Optimizations (e.g. node fusion) [optional]
     // Corresponds to QnnGpuGraph_CustomConfig_t::disableNodeOptimizations.
     "disable_node_optimizations": {"type": "boolean"},

     // Kernel Disk Repository Path [optional]
     // Corresponds to QnnGpuContext_CustomConfig_t::kernelRepoDir.
     // Valid values are any valid path having read/write permissions.
     "kernel_repo_path": {"type": "string"},

     // Disable Recordable Command Queue [optional]
     // Corresponds to QnnGpuGraph_CustomConfig_t::disableQueueRecording.
     "disable_queue_recording" : {"type" : "boolean"},

     // Context custom config performance hint [optional]
     // Corresponds to QnnGpuContext_CustomConfig_t::perfHint.
     "perf_hint": {"type": "string", "enum": ["high", "normal", "low"]}
   },
   "dependencies": {
     "precision_mode": ["graph_names"],
     "disable_memory_optimizations": ["graph_names"],
     "disable_node_optimizations": ["graph_names"],
     "disable_queue_recording": ["graph_names"]
   }
 }
4.1.6.8 自定义配置文件读取器

qnn-profile-viewer应用程序可以接受不同的读者和作者。QNN GPU 后端提供 libQnnGpuProfilingReader.so 库,以 JSON 格式输出分析数据。

4.1.6.9 Op 包写作指南

有关 op 包编写的详细信息将在未来版本中提供。同时,请参考op包示例,可以在 中找到${QNN_SDK_ROOT}/examples/QNN/OpPackage/GPU/。

4.1.6.10 其他注意事项
  • 目前不支持可变输入维度(例如批次)

  • 目前不支持可变输出尺寸

  • 支持有符号零值

4.1.7 储户

本节提供特定于 QNN Saver 后端的信息。

概述

QNN Saver 是 QNN SDK 提供的后端,主要用于调试目的。它是一个后端,因为它是一个实现所有 QNN API 的共享库,但与所有其他后端不同,Saver 不执行任何图形。相反,它将所有 QNN API 调用及其参数记录到可以在任何 QNN 后端重播的文件中。

以下是 Saver 生成的文件的一些详细信息 -saver_output.c和params.bin:

  • saver_output.c是一个包含所有 QNN API 调用的 C 文件。

  • params.bin是一个非结构化二进制文件,包含张量创建、操作配置验证和图形执行期间提供的所有输入/输出/参数张量数据。

saver_output.c可用于直观地检查所有 QNN API 调用,以确保它们以正确的顺序调用、参数格式正确等。它还可以针对要重播的 QNN 后端库进行编译和链接。

在运行时,将读取张量数据params.bin,并按照在 Saver 后端调用的顺序调用记录的 QNN API。重播期间从 QNN API 返回的任何错误代码都将打印到 stdout。

有关如何生成和重放的说明saver_output.c,请参阅 使用 Saver 保存执行序列并在后端重放。

API 专业化

本节包含与 Saver 后端 API 专业化相关的信息。所有 QNN Saver 后端专业化都可以在<QNN_SDK_ROOT>/include/QNN/Saver/目录下找到。

QNN 保护程序 API

除了所有其他 QNN API 之外,Saver 后端还实现 QnnSaver_initialize()。此功能可用于为 Saver 提供自定义配置。此功能是可选的,仅在需要自定义配置时才需要。如果使用此函数,则必须在QnnBackend_initialize()之前 调用。

该函数及其相应的数据类型位于文件 QnnSaver.h中。

用法

与支持自定义配置的其他 QNN API(例如QnnBackend_initialize() )类似 , QnnSaver_initialize()也将指向配置对象的以 NULL 结尾的指针数组作为输入。此 API 的适当配置对象是Struct QnnSaver_Config_t。

下面显示了每个配置选项的描述以及代码示例。

输出目录

Saver 输出(saver_output.c 和 params.bin)的默认输出目录是 ./saver_output/。这可以配置到任何目录。如果给出相对路径,则输出目录将相对于当前工作目录。如果指定的目录不存在,则会创建该目录。

输出目录配置

QnnSaver_Config_t outputDirCfg;
outputDirCfg.option = QNN_SAVER_CONFIG_OPTION_OUTPUT_DIRECTORY;
outputDirCfg.outputDirectory = "./saver_output_config_example/"; //can be absolute e.g. "/data/local/tmp/saver/"

const QnnSaver_Config_t *saverCfg[] = {&outputDirCfg, NULL};
QnnSaver_initialize(saverCfg);

输出文件时间戳

默认情况下,Saver 输出在连续运行之间被覆盖。为了防止覆盖,可以通过附加时间戳来使文件名唯一。如果在自动化环境中使用 Saver,此选项可能很有用,因为所有输出都将被保存以供以后调试。任何非零值都将启用此选项。

笔记
请记住,由于 params.bin 包含所有输入张量数据,因此启用此设置将导致该数据重复,并且随着时间的推移可能会占用大量存储空间。

时间戳配置

QnnSaver_Config_t appendTimestampCfg;
appendTimestampCfg.option = QNN_SAVER_CONFIG_OPTION_APPEND_TIMESTAMP;
appendTimestampCfg.appendTimestamp = 1;

const QnnSaver_Config_t *saverCfg[] = {&appendTimestampCfg, NULL};
QnnSaver_initialize(saverCfg);

后端ID

默认情况下,Saver 在将特定于后端的自定义配置传递给支持的 API(例如QnnBackend_initialize() )时不会记录它们 。为了能够记录这些特定于后端的配置,必须向 Saver 提供这些配置所应用的后端的所需后端 ID。

QNN 公开的后端 ID 在 中定义 <QNN_SDK_ROOT>/include/QNN//QnnCommon.h。

后台ID配置

QnnSaver_Config_t backendIdCfg;
backendIdCfg.option = QNN_SAVER_CONFIG_OPTION_BACKEND_ID;
backendIdCfg.backendId = QNN_BACKEND_ID_GPU;

const QnnSaver_Config_t *saverCfg[] = {&backendIdCfg, NULL};
QnnSaver_initialize(saverCfg)

// Can now pass GPU custom configs and have them recorded by Saver in saver_output.c
QnnGpuBackend_CustomConfig_t gpuConfig;
gpuConfig.kernelRepoDir = "/data/local/tmp/example/";
gpuConfig.invalidateKernelRepo = 1;

QnnBackend_Config_t backendConfigGpu;
backendConfigGpu.option = QNN_BACKEND_CONFIG_OPTION_CUSTOM;
backendConfigGpu.customConfig = &gpuConfig;

const QnnBackend_Config_t *backendConfig[] = {&backendConfigGpu, NULL};
QnnBackend_initialize(backendConfig);
  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值