常见问题

导入问题

导入Lyngor库失败

问题描述

在执行 import lyngor 命令导入Lyngor库文件时报错。错误信息如下:

tvm._ffi.base.LynCError:
lyngor.exception.LynException:ErrCode-6000:C_FUNCTION_ERR

其中, ErrCode-6000:C_FUNCTION_ERR 显示为C++函数运行错误。

解决办法

  1. 确认LynSDK是否正确安装。

  2. 确认Lyngor包是否已正确安装。验证方法参见 验证

  3. 确认Lyngor包和LynSDK版本是否匹配。版本依赖说明参见 前提条件

  4. 确认包的所在路径(如site-packages)存在一个名为Lyngor的文件夹。如未包含,则重新安装Lyngor,并确认安装成功。具体操作参见 安装软件

  5. 确认环境变量中的$PYTHONPATH是否包含Lyngor文件夹所在路径。如未包含,则手动添加。

  6. 如无法解决,则联系售后 技术支持

Python中导入Lyngor时提示.so文件不存在

问题描述

安装Lyngor后,在Python中执行 import lyngor 命令时报错。错误信息示例如下:

错误信息

原因分析

Lyngor需要与LynSDK配套使用,如果没有安装LynSDK会报错xx文件不存在。

解决办法

执行 dpkg -l | grep lynsdk 命令,查询LynSDK信息,确认已安装LynSDK, 且LynSDK版本满足当前Lyngor版本的前提条件。具体说明参见 前提条件

错误信息

如果没有安装LynSDK,或者LynSDK版本不满足当前Lyngor版本的前提条件,需要安装适当版本的LynSDK。 具体操作说明参见《灵汐产品快速入门》。

模型编译问题

模型编译时单独编译卷积层报错:Verify ‘coreVectorPair.size() >0’ failed

问题描述

使用Lyngor进行模型编译时,单独编译卷积层报错。错误信息如下:

错误信息

原因分析

Lyngor进行模型编译时,经过卷积后的输出超出限制。

解决办法

为避免输入输出超限,可以将 lyngor.DLModel.loadin_typeout_type 参数设置为 float16 ,以减少其大小。

模型编译时将nn.BatchNorm2d作为网络的最后输出时报错

问题描述

使用Lyngor进行模型编译时,将 nn.BatchNorm2d 作为网络的最后输出,编译时报错。错误信息为: TypeError:'Call' object does not support indexing

错误信息

解决办法

方法1:在BN层后放一个激活层。

方法2:将输入结果reshape一下。

Pytorch模型推理问题

torch.jit.trace相关限制

在解析Pytorch模型时,Lyngor使用了Pytorch的 torch.jit.trace 接口。该接口自身的限制在使用 Lyngor时同样存在。大致包括以下几个方面。

模型输入输出

模型的输入和输出需要是仅含 torch.Tensor 的列表或者元组。

None可以作为模型中算子参数 nn.Parameter 的默认值,但不可以作为模型的输入、输出和输入接口的默认值。

控制流

对控制流(例如if-else)支持较差。 torch.jit.trace 接口只会在被调用时,根据trace接口的输入来记录 一次模型的运行流程,此时模型内由输入决定的控制流只会被记录一条分支。因此,如果你的模型中包含分支, 那么模型运行时任何由输入决定的控制流只会被trace保留一个分支(保留哪一个分支由trace的输入决定)。

模型结构

torch.jit.trace 接口记录模型时,仅支持符合Pytorch自定义模型规范的模型,并且会从模型的forward 方法开始记录。

因此,使用Lyngor前,需先确保你的模型符合规范(继承 torch.nn.Module 并以forward方法作为模型入口), 具体参考Pytorch官方自定义模型流程:Modules — PyTorch 1.10.0 documentation

其他操作说明

推理模式

用Lyngor推理时,会将模型设置为推理模式以冻结像BatchNorm,Dropout之类算子的参数。所以当模型中包含相关 算子时,相同输入数据的运行结果会和不冻结参数模式有出差别。

使用的冻结方法: your_module.eval() 或者 your_module.train(False) ;这里your_module是 torch.nn.Module 类型。参考:torch.nn.Module.eval

apply方法

Pytorch框架的模型不支持模型中算子使用算子对应的静态类的apply方法,可修改为对应的 forward() 函数, 并移除所有的@staticmethod装饰器。

引入模型相关的源码

编译时找不到模型对应的类或模块,则需要引入模型相关的源码。

具体引入操作:需要在使用 model_compile 前,把模型源码文件所在路径提前加到 PYTHONPATH 中。

示例如下:

# 一行命令:
export PYTHONPATH=/toolchain/pytorch_models/efficientnet_lite/:$PYTHONPATH

&&

model_compile -m ./middle.pth -f Pytorch -t apu --input_nodes 'data' --input_shapes "1,3,224,224" --output_nodes "fc"

模型 middle.pth 对应源码类在文件 /toolchain/pytorch_models/efficientnet_lite/efficientnet.py 中, 所以将路径 /toolchain/pytorch_models/efficientnet_lite/ 添加到 PYTHONPATH 中。