如何在DJL(deepjava库)中调用自定义mxnet操作符?

如何在DJL(deepjava库)中调用自定义mxnet操作符?,java,mxnet,djl,Java,Mxnet,Djl,如何从DJL调用自定义mxnet操作符?例如,中的my_gemm操作符可以通过手动调用JnaUtils,方法与内置mxnet引擎相同,只需使用自定义库即可。对于my_gemm示例,如下所示: import ai.djl.Device; import ai.djl.mxnet.jna.FunctionInfo; import ai.djl.mxnet.jna.JnaUtils; import ai.djl.ndarray.NDArray; import ai.djl.ndarray.NDManag

如何从DJL调用自定义mxnet操作符?例如,

中的
my_gemm
操作符可以通过手动调用JnaUtils,方法与内置mxnet引擎相同,只需使用自定义库即可。对于
my_gemm
示例,如下所示:

import ai.djl.Device;
import ai.djl.mxnet.jna.FunctionInfo;
import ai.djl.mxnet.jna.JnaUtils;
import ai.djl.ndarray.NDArray;
import ai.djl.ndarray.NDManager;
import ai.djl.util.PairList;

import java.util.Map;

// Load the external mxnet operator library
JnaUtils.loadLib("path/to/incubator-mxnet/example/extensions/lib_custom_op/libgemm_lib.so", 1);
// get a handle to the loaded operator
Map<String, FunctionInfo> allFunctionsAfterLoading = JnaUtils.getNdArrayFunctions();
FunctionInfo myGemmFunction = allFunctionsAfterLoading.get("my_gemm");
// create a manager to execute the example with
try (NDManager ndManager = NDManager.newBaseManager().newSubManager(Device.cpu())) {
    // create input for the gemm call
    NDArray a = ndManager.create(new float[][]{new float[]{1, 2, 3}, new float[]{4, 5, 6}});
    NDArray b = ndManager.create(new float[][]{new float[]{7}, new float[]{8}, new float[]{9}});
    // call the function manually (NDManager.invoke will not work, as it caches the mxnet
    // engine operators and ignores external ones)
    PairList<String, Object> params = new PairList<>();
    NDArray result = myGemmFunction.invoke(ndManager, new NDArray[]{a, b}, params)[0];
    // prints
    // ND: (2, 1) cpu() float32
    //[[ 50.],
    // [122.],
    //]
    // (same as the python example)
    System.out.println(result);
}
导入ai.djl.Device;
导入ai.djl.mxnet.jna.FunctionInfo;
导入ai.djl.mxnet.jna.JnaUtils;
导入ai.djl.ndarray.ndarray;
导入ai.djl.ndarray.NDManager;
导入ai.djl.util.PairList;
导入java.util.Map;
//加载外部mxnet运算符库
loadLib(“path/to/incubator mxnet/example/extensions/lib_custom_op/libgemm_lib.so”,1);
//获取已加载运算符的句柄
Map allFunctionsAfterLoading=JnaUtils.GetNdarayFunctions();
FunctionInfo myGemmFunction=allFunctionsAfterLoading.get(“my_gemm”);
//创建一个管理器来执行示例
try(NDManager NDManager=NDManager.newBaseManager().newSubManager(Device.cpu())){
//为gemm调用创建输入
NDArray a=ndManager.create(新浮点[][{new float[]{1,2,3},新浮点[]{4,5,6});
NDArray b=ndManager.create(新浮点[][{new float[]{7},新浮点[]{8},新浮点[]{9});
//手动调用该函数(NDManager.invoke将不起作用,因为它会缓存mxnet
//发动机操作员(忽略外部操作员)
PairList参数=新的PairList();
NDArray result=myGemmFunction.invoke(ndManager,新的NDArray[]{a,b},params)[0];
//印刷品
//ND:(2,1)cpu()浮点数32
//[[ 50.],
// [122.],
//]
//(与python示例相同)
系统输出打印项次(结果);
}