常见问题 ================================================================ .. _import_error: 导入问题 ---------------------------------------------------------------- 导入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包是否已正确安装。验证方法参见 :ref:`verify` 。 3. 确认Lyngor包和LynSDK版本是否匹配。版本依赖说明参见 :ref:`prerequisites` 。 4. 确认包的所在路径(如site-packages)存在一个名为Lyngor的文件夹。如未包含,则重新安装Lyngor,并确认安装成功。具体操作参见 :doc:`安装软件` 。 5. 确认环境变量中的$PYTHONPATH是否包含Lyngor文件夹所在路径。如未包含,则手动添加。 6. 如无法解决,则联系售后 :doc:`_common/9_fae_support` 。 Python中导入Lyngor时提示.so文件不存在 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **问题描述** 安装Lyngor后,在Python中执行 ``import lyngor`` 命令时报错。错误信息示例如下: .. figure:: _images/image15.png :alt: 错误信息 **原因分析** Lyngor需要与LynSDK配套使用,如果没有安装LynSDK会报错xx文件不存在。 **解决办法** 执行 ``dpkg -l | grep lynsdk`` 命令,查询LynSDK信息,确认已安装LynSDK, 且LynSDK版本满足当前Lyngor版本的前提条件。具体说明参见 :ref:`prerequisites` 。 .. figure:: _images/image16.png :alt: 错误信息 如果没有安装LynSDK,或者LynSDK版本不满足当前Lyngor版本的前提条件,需要安装适当版本的LynSDK。 具体操作说明参见《灵汐产品快速入门》。 模型编译问题 ------------------------------------------------------------------------------------ 模型编译时单独编译卷积层报错:Verify 'coreVectorPair.size() >0' failed ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **问题描述** 使用Lyngor进行模型编译时,单独编译卷积层报错。错误信息如下: .. figure:: _images/image17.png :alt: 错误信息 **原因分析** Lyngor进行模型编译时,经过卷积后的输出超出限制。 **解决办法** 为避免输入输出超限,可以将 ``lyngor.DLModel.load`` 的 ``in_type`` 和 ``out_type`` 参数设置为 ``float16`` ,以减少其大小。 模型编译时将nn.BatchNorm2d作为网络的最后输出时报错 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **问题描述** 使用Lyngor进行模型编译时,将 ``nn.BatchNorm2d`` 作为网络的最后输出,编译时报错。错误信息为: ``TypeError:'Call' object does not support indexing`` .. figure:: _images/image18.png :alt: 错误信息 **解决办法** 方法1:在BN层后放一个激活层。 方法2:将输入结果reshape一下。 .. _pytorch_error: 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`` 中。