CoreML集成后出现ANE编译错误日志但推理功能正常的原因咨询
CoreML集成后ANE编译失败日志但功能正常的原因解析
问题场景
我正在给原本使用Onnxruntime的C++ macOS应用集成Objective-C CoreML API,用CoreML实现推理功能。目前功能运行正常、性能提升显著,但每次启动都会弹出一堆错误日志——虽然不影响功能,但用户可见日志里出现这类错误很困扰,想搞清楚原因。
错误日志
2025-09-11 10:50:24.066695+0200 myApp[52481:3095925] [client] loadWithQoS:options:error:: loadModel:options:qos:error: failed! lErr=Error Domain=com.apple.appleneuralengine.compiler Code=1 "_ANECompiler : ANECCompile() FAILED" UserInfo={NSLocalizedDescription=_ANECompiler : ANECCompile() FAILED, NSUnderlyingError=0x6000017a9830 {Error Domain=com.apple.appleneuralengine.compiler Code=1 "ANECCompile(/var/folders/rx/rx92242x4rg90_9wb132n_y00000gp/T/495B8D31A99112D2DF18E008E7E1F8E75A4217C733F855E8A2291CBEE633DC69_A2C1576A75CE76E73DB16939AEBCF513D4209E3E380FA2F1B06F285C564AF345_E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855/) FAILED: err=( CompilationFailure )" UserInfo={NSLocalizedDescription=ANECCompile(/var/folders/rx/rx92242x4rg90_9wb132n_y00000gp/T/495B8D31A99112D2DF18E008E7E1F8E75A4217C733F855E8A2291CBEE633DC69_A2C1576A75CE76E73DB16939AEBCF513D4209E3E380FA2F1B06F285C564AF345_E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855/) FAILED: err=( CompilationFailure )}}} 2025-09-11 10:50:24.066951+0200 myApp[52481:3095925] [espresso] [Espresso::handle_ex_plan] exception=ANECF error: failed to load ANE in-memory model. Error=_ANECompiler : ANECCompile() FAILED 2025-09-11 10:50:24.067310+0200 myApp[52481:3095925] [coreml] Error plan build: -1.
我的实现流程
- 模型以加密文件打包,运行时解密后通过
MLModelAsset modelAssetWithSpecificationData:error:从内存块加载 - 再通过
MLModel loadModelAsset:configuration:completionHandler:加载实际模型实例 - 最后用
MLModel predictionFromFeatures:options:error:执行推理 - 所有API调用均未报错,输出结果有效,Instruments也能看到CoreML函数被调用
日志产生的背景原因
这是CoreML内部的降级逻辑日志:CoreML会优先尝试将模型部署到Apple Neural Engine(ANE,苹果神经引擎)以获取最优性能,但部署失败后会自动降级到CPU/GPU执行,所以功能不受影响,但内部失败过程的日志没被CoreML屏蔽,就输出到了系统日志中。
具体触发原因可能有以下几种:
- 模型算子不兼容ANE:不是所有CoreML支持的算子都能在ANE上运行,比如自定义算子、部分复杂层类型,或者模型输入输出形状不符合ANE的硬件限制,导致ANE编译器编译适配代码失败。
- 内存加载模型的限制:你是从内存加载解密后的模型规范数据,ANE编译器处理内存模型时需要在系统临时目录生成临时文件(日志里的
/var/folders/...路径就是临时目录),但这个过程可能因权限、临时文件规则等问题失败,CoreML随即切换到CPU/GPU路径。 - CoreML内部重试机制:CoreML默认会优先尝试ANE,失败后自动 fallback 到其他计算设备,这个失败过程的日志没有被内部吞掉,所以会显示出来。
消除日志的方法
- 指定运行设备跳过ANE尝试:在
MLModelConfiguration中设置computeUnits为.cpuAndGPU,直接跳过ANE的适配流程,避免触发失败日志。示例代码:MLModelConfiguration *config = [[MLModelConfiguration alloc] init]; config.computeUnits = MLComputeUnitsCPUAndGPU; - 修复模型ANE兼容性:用CoreML Tools的
coremltools.models.utils.evaluate_spec工具检查模型的ANE兼容性,替换不兼容算子或调整模型结构,让模型能在ANE上运行,从根源消除失败日志。 - 过滤系统日志:如果无法修改模型或代码,可以在应用中设置日志过滤规则,屏蔽
com.apple.appleneuralengine.compiler、espresso、coreml这些域的错误日志,但这种方法属于全局过滤,可能会影响其他有用日志的查看。
内容的提问来源于stack exchange,提问作者PluginPenguin
相关产品推荐
相关产品推荐

