打包JAR后PyTorch Runtime缺失致ONNX模型运行异常求助
问题分析与解决方案
问题根源
IDE运行环境同时存在PyTorch和ONNXRuntime引擎,DJL会自动选择PyTorch的NDArray实现(支持getName()及stack操作);但打包成JAR后仅包含ONNXRuntime,其NDArrayAdapter未实现相关操作,触发UnsupportedOperationException。
具体解决步骤
1. 统一DJL依赖版本
当前Gradle依赖中onnxruntime-engine版本为0.19.0,与其他DJL组件(0.21.0-SNAPSHOT)版本不一致,可能导致兼容性问题。修改为同版本:
api("ai.djl.onnxruntime:onnxruntime-engine:0.21.0-SNAPSHOT")
2. 确保打包时包含完整依赖
如果使用Gradle的shadowJar插件打包可执行JAR,需配置插件确保所有依赖被正确合并:
plugins { id("com.github.johnrengelman.shadow") version "7.1.2" } shadowJar { mergeServiceFiles() manifest { attributes("Main-Class" to "your.package.TestModel") } }
若使用application插件,需确保运行任务包含全量runtime依赖:
plugins { application } application { mainClass.set("your.package.TestModel") }
3. 替换不兼容的Batchifier
ONNXRuntime的NDArray实现不支持StackBatchifier的部分操作,可改用PaddingStackBatchifier替代,示例:
在自定义Translator中重写getBatchifier()方法:
override fun getBatchifier(): Batchifier { return PaddingStackBatchifier.builder().build() }
4. 明确指定运行引擎
在代码中强制指定使用ONNXRuntime,避免环境差异导致的引擎选择不一致:
val criteria = Criteria.builder<YourInputType, YourOutputType>() .setEngine("OnnxRuntime") .setModelPath(Paths.get("path/to/your/model.onnx")) .setTranslator(YourTranslator()) .build()
内容的提问来源于stack exchange,提问作者HishamGarout
相关产品推荐
相关产品推荐

