RK3588平台OnnxRuntime ACL EP节点已分配但GPU零负载问题咨询
Orange Pi 5(RK3588)上强制ACLExecutionProvider使用OpenCL后端的解决方案
是的,Arm Compute Library(ACL)集成到OnnxRuntime的ACLExecutionProvider时,默认会优先采用CPU(NEON)后端,而非OpenCL后端——这通常是因为编译阶段未明确启用OpenCL支持,或是运行时未指定后端参数导致的。以下是强制启用OpenCL后端的具体步骤:
编译阶段确保启用OpenCL支持
编译OnnxRuntime时,必须通过cmake参数明确开启ACL的OpenCL后端支持,同时确保环境中已安装Mali OpenCL开发库:# 配置ORT编译参数 cmake ../onnxruntime \ -DONNXruntime_BUILD_ACL=ON \ -DONNXruntime_ACL_ENABLE_OPENCL=ON \ -DONNXruntime_ACL_USE_OPENCL=ON \ # 其他必要编译参数...若ORT自动拉取ACL源码编译,需确保上述参数会传递给ACL的编译流程,也可单独编译ACL时指定:
# 单独编译ACL的参数 cmake ../ComputeLibrary \ -DARM_COMPUTE_OPENCL=ON \ -DARM_COMPUTE_CL=ON \ # 其他参数...运行时显式指定OpenCL后端
在初始化ORT推理会话时,给ACLExecutionProvider传入参数强制使用OpenCL:- C++示例:
Ort::SessionOptions session_options; std::unordered_map<std::string, std::string> acl_opts; acl_opts["backend"] = "opencl"; acl_opts["device_id"] = "0"; // 对应Mali-G610的设备ID,通常为0 Ort::ThrowOnError(Ort::GetApi().SessionOptionsAppendExecutionProvider_ACL(session_options, acl_opts)); Ort::Session session(env, "your_model.onnx", session_options); - Python示例:
import onnxruntime as ort sess_opts = ort.SessionOptions() acl_provider_config = {"backend": "opencl", "device_id": "0"} sess = ort.InferenceSession( "your_model.onnx", sess_opts, providers=[("ACLExecutionProvider", acl_provider_config)] )
- C++示例:
环境变量快速验证
运行推理程序前,设置全局环境变量强制ACL使用OpenCL后端,适合快速测试:export ARM_COMPUTE_BACKEND=OpenCL # 然后启动你的推理程序 ./your_inference_app
内容的提问来源于stack exchange,提问作者이호연
相关产品推荐
相关产品推荐

