以 Python 来编写运算符实现 - 3.5 简体中文

Vitis AI Library 用户指南 (UG1354)

Document ID
UG1354
Release Date
2023-06-29
Version
3.5 简体中文

在本节中,使用 add 运算符作为示例。如需获取更多 Python 示例,请参阅 TensorFlow2 示例和 PyTorch 示例。

  1. 创建 Python 程序包和模块文件。
    % mkdir -p /tmp/demo_add_op/
    % cd /tmp/demo_add_op/
    % mkdir vart_op_imp/
    % touch vart_op_imp/__init__.py
    % touch vart_op_imp/add.py
    注释:
    • 文件夹名称应为 vart_op_imp
    • 如果有多个自定义运算符,请单独创建每个自定义运算符,并将其置于 vart_op_imp 文件夹内。
  2. 更新 add.py,如以下代码片段所示。
    import numpy as np
    
    
    class add:
        def __init__(self, op):
            pass
    
        def calculate(self, output, input):
            np_output = np.array(output, copy=False)
            L = len(input)
            if L == 0:
                return
            np_input_0 = np.array(input[0], copy=False)
            np.copyto(np_output, np_input_0)
            for i in range(1, L):
                np_output = np.add(np_output,
                                   np.array(input[i], copy=False),
                                   out=np_output)

    您也可以使用以下简化版本。

    import numpy as np
    
    
    class add:
        def __init__(self, op):
            pass
    
        def calculate(self, output, input):
            np_output = np.array(output, copy=False)
            L = len(input)
            assert L == 2
            np_input_0 = np.array(input[0], copy=False)
            np_input_1 = np.array(input[1], copy=False)
            np_output = np.add(np_input_0, np_input_1, out=np_output)
  3. 安装运算符,如以下代码片段所示。
    % mkdir -p lib
    % ln -sf ~/.local/Ubuntu.18.04.x86_64.Debug/lib/libvart_op_imp_python-cpu-op.so lib/libvart_op_imp_add.so
    % ls -l lib
    % mkdir -p dump
    % env LD_LIBRARY_PATH=$HOME/.local/Ubuntu.18.04.x86_64.Debug/lib:$PWD/lib $HOME/.local/Ubuntu.18.04.x86_64.Debug/share/vitis_ai_library/test/cpu_task/test_op_imp --graph /tmp/add.xmodel --op "add_op"

对于边缘器件,您可执行以下命令来安装和测试运算符。

# ls -sf /usr/lib/libvart_op_imp_python-cpu-op.so /usr/lib/libvart_op_imp_add.so
# cp -r vart_op_imp /usr/lib.python3.9/site-packages
# xdputil run_op add.xmodel add_op -r ref -d dump
注释: 执行以上命令前,请将 add.xmodel、含输入文件样本的 ref 文件夹以及 vart_op_imp 文件夹复制到开发板。

Python 模块与 C++ 接口类似,必须具有类,并且类名必须与 xir::Op 的类型相同。在此示例中,使用的是 add。该类必须包含构造函数,其中具有单个实参 opself。这样即可构成一个 XIR::Op。请参阅 XIR Python API 以获取更多信息。同样,类 add 必须具有名为 calculate 的成员函数以及 self 实参。首个实参必须名为 output,以下实参名称必须遵循与 XIR::Op 关联的 XIR::OpDef 的命名方式,请参阅 XIR API 了解详细信息。

注释: 此外还会创建一个指向 libvart_op_imp_python-cpu-op.so 的符号链接,名为 libvart_op_imp_add.solibvart_op_imp_python-cpu-op.so 在 Python 与 C++ 之间起到了桥接作用。它会在 C++ 侧搜索 libvart_op_imp_add.so 并查找 libvart_op_imp_python-cpu-op.so。在 libvart_op_imp_python_cpu_op.so 中,会导入名为 vart_op_imp.add 的 Python 模块,Python 会照常搜索此模块。