Contrib Operatoren

Inhalt

Die Domäne der Contrib-Operatoren enthält Operatoren, die standardmäßig in die Laufzeitumgebung integriert sind. Nur ausgewählte Operatoren werden als Contrib-Operatoren hinzugefügt, um die Binärgröße des Kernlaufzeitpakets nicht zu erhöhen. Wenn möglich, sollten benutzerdefinierte Operatoren verwendet werden.

Liste der Contrib-Operatoren

Die Schemata der Contrib-Operatoren sind im ONNX Runtime-Repository dokumentiert.

Hinzufügen von Contrib-Operatoren

Das Schema und die Shape-Inferenzfunktion des benutzerdefinierten Operators sollten in contrib_defs.cc mit ONNX_CONTRIB_OPERATOR_SCHEMA hinzugefügt werden. Beispiel: Inverse-Operator

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

Ein neuer Operator sollte vollständige Referenzimplementierungstests und Shape-Inferenztests haben.

Referenzimplementierungs-Python-Tests sollten in onnxruntime/test/python/contrib_ops hinzugefügt werden. Z. B. aten_op_tests.py

Shape-Inferenz-C++-Tests sollten in onnxruntime/test/contrib_ops hinzugefügt werden. Z. B. trilu_shape_inference_test.cc

Der Operator-Kernel sollte mit der Compute -Funktion im Namespace `contrib` in onnxruntime/contrib_ops/cpu/ für CPU und onnxruntime/contrib_ops/cuda/ für CUDA implementiert werden.

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

Der Kernel sollte in cpu_contrib_kernels.cc für CPU und cuda_contrib_kernels.cc für CUDA registriert werden.

Jetzt sollten Sie in der Lage sein, ONNX Runtime zu erstellen und zu installieren, um Ihren benutzerdefinierten Operator zu verwenden.

Tests für Contrib-Operatoren

Tests sollten in onnxruntime/test/contrib_ops/ hinzugefügt werden. Zum Beispiel

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