Contrib 算子

目录

contrib 算子域 包含默认构建到运行时的算子。仅选择部分运算符作为 contrib 算子添加,以避免增加核心运行时包的二进制文件大小。如果可能,应使用自定义运算符

Contrib 算子列表

contrib 运算符模式记录在 ONNX Runtime 存储库中。

添加 Contrib 算子

自定义算子的模式和形状推断函数应使用 ONNX_CONTRIB_OPERATOR_SCHEMAcontrib_defs.cc 中添加。示例:Inverse op

ONNX_CONTRIB_OPERATOR_SCHEMA(Inverse)
    .SetDomain(kMSDomain) // kMSDomain = "com.microsoft"
    .SinceVersion(1) // Same version used at op (symbolic) registration
    ...

新的运算符应具有完整的参考实现测试和形状推断测试。

参考实现 python 测试应在 onnxruntime/test/python/contrib_ops 中添加。例如,aten_op_tests.py

形状推断 C++ 测试应在 onnxruntime/test/contrib_ops 中添加。例如,trilu_shape_inference_test.cc

运算符内核应使用 Compute 函数在 onnxruntime/contrib_ops/cpu/ 下的 contrib 命名空间中为 CPU 实现,并在 onnxruntime/contrib_ops/cuda/ 下为 CUDA 实现。

namespace onnxruntime {
namespace contrib {

class Inverse final : public OpKernel {
 public:
  explicit Inverse(const OpKernelInfo& info) : OpKernel(info) {}
  Status Compute(OpKernelContext* ctx) const override;

 private:
 ...
};

ONNX_OPERATOR_KERNEL_EX(
    Inverse,
    kMSDomain,
    1,
    kCpuExecutionProvider,
    KernelDefBuilder()
        .TypeConstraint("T", BuildKernelDefConstraints<float, double, MLFloat16>()),
    Inverse);

Status Inverse::Compute(OpKernelContext* ctx) const {
... // kernel implementation
}

}  // namespace contrib
}  // namespace onnxruntime

内核应在 cpu_contrib_kernels.cc 中为 CPU 注册,并在 cuda_contrib_kernels.cc 中为 CUDA 注册。

现在,您应该能够构建和安装 ONNX Runtime 以开始使用您的自定义算子。

Contrib 算子测试

测试应在 onnxruntime/test/contrib_ops/ 中添加。例如

namespace onnxruntime {
namespace test {

// Add a comprehensive set of unit tests for custom op kernel implementation

TEST(InverseContribOpTest, two_by_two_float) {
  OpTester test("Inverse", 1, kMSDomain); // custom opset version and domain
  test.AddInput<float>("X", {2, 2}, {4, 7, 2, 6});
  test.AddOutput<float>("Y", {2, 2}, {0.6f, -0.7f, -0.2f, 0.4f});
  test.Run();
}

...

}  // namespace test
}  // namespace onnxruntime