OP 実装を Python で作成する - 3.5 日本語

Vitis AI ライブラリ ユーザー ガイド (UG1354)

Document ID
UG1354
Release Date
2023-06-29
Version
3.5 日本語

このセクションでは、add OP を例として使用します。その他の 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 とします。
    • カスタム OP が複数ある場合は、これらを別々に作成して 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. 次のコード スニペットに示すように、op をインストールします。
    % 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"

エッジの場合、次のコマンドを実行して 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 フォルダーをボードにコピーします。

C++ インターフェイス同様、Python モジュールも xir::Op のタイプと同じ名前のクラスが必要です。この例では、add を使用します。このクラスには、self 以外に 1 つの引数 op を持つコンストラクターが必要です。これは XIR::Op です。詳細は、XIR Python API を参照してください。同様に、クラス add には引数 self 以外にメンバー関数 calculate が必要です。その第 1 引数名は output とし、その後の引数名は XIR::Op に関連する XIR::OpDef に準拠している必要があります。詳細は XIR API を参照してください。

注記: libvart_op_imp_python-cpu-op.so へのシンボリック リンクが libvart_op_imp_add.so という名前で作成されます。libvart_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 では、Python モジュール vart_op_imp.add がインポートされ、Python が通常どおりモジュールを検索します。