onnx2paddle转换onnx文件时的cuda版本问题

在尝试使用x2paddle将ONNX模型转换为PaddlePaddle格式时,遇到CUDA版本不兼容的问题。错误是由于CUDA11.3与paddlepaddle-gpu0.0.0.post111和x2paddle1.4.0不匹配。解决方法是安装CUDA11.1,并通过软连接在不同CUDA版本间切换。删除原有软连接,创建指向所需CUDA版本的新软连接后,成功解决了问题。
摘要由CSDN通过智能技术生成

onnx2paddle将onnx转成paddle文件时遇到了cuda版本不兼容问题

运行指令: x2paddle --framework=onnx --model=model.onnx --save_dir=pd_model
错误描述:
error code is /usr/local/cuda/lib64/libcudnn.so: cannot open shared object file: No such file or directory

RuntimeError: (PreconditionNotMet) Cannot load cudnn shared library. Cannot invoke method cudnnGetVersion.
[Hint: cudnn_dso_handle should not be null.] (at /paddle/paddle/phi/backends/dynload/cudnn.cc:64)

原因: 我现在的cuda版本时11.3,与paddlepaddle-gpu 0.0.0.post111、x2paddle1.4.0版本不匹配,通过查询,paddlepaddle的每个版本都会要求相应的cuda版本,对于我来说可以换成cuda11.1
解决办法:

  1. 安装多个版本cuda,进行版本切换。(注:尽量不要直接删掉自己的cuda,可以在同一台电脑上安装多个不同版本的cuda)
  2. 多版本cuda安装,安装教程很多,我看的这两个:教程1教程2
  3. 重中之重是利用软连接进行版本的切换
# 建立软连接
# 1.先将原来的软连接删掉
sudo rm -rf /usr/local/cuda
sudo ln -s /usr/local/cuda-11.* /usr/local/cuda #将想要切换的版本11.*链接到/usr/local/cuda

#检测版本
nvcc -V

#查看cudnn版本是否变换成功
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

至此,问题解决。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Paddle模型导出为ONNX格式并在ONNXRuntime C中使用,可以按照以下步骤进行: 首先,需要使用Paddle框架训练或加载一个现有的模型。在训练或加载模型后,可以使用以下代码将Paddle模型导出为ONNX格式: ```python import paddle import paddle.nn as nn import paddle.onnx as onnx # 定义并训练Paddle模型 class MyModel(nn.Layer): def __init__(self): super(MyModel, self).__init__() self.fc = nn.Linear(10, 10) def forward(self, x): x = self.fc(x) return x model = MyModel() # 进行模型训练 # 将Paddle模型导出为ONNX格式 onnx_model_path = "model.onnx" paddle.onnx.export(model, onnx_model_path) ``` 然后,安装ONNXRuntime C库,并使用以下代码在C中加载和运行导出的ONNX模型: ```c #include <onnxruntime_c_api.h> // 加载ONNX模型 const wchar_t* model_path = L"model.onnx"; OrtEnv* env; OrtCreateEnv(ORT_LOGGING_LEVEL_WARNING, "ONNXModel", &env); OrtSessionOptions* session_options; OrtCreateSessionOptions(&session_options); OrtSession* session; OrtCreateSession(env, model_path, session_options, &session); // 设置输入张量 OrtAllocator* allocator; OrtCreateAllocatorWithDefaultOptions(&allocator); int input_tensor_shape[] = {1, 10}; float input_tensor_data[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0}; const char* input_tensor_name[] = {"input"}; size_t input_tensor_size = sizeof(input_tensor_data); OrtValue* input_tensor; OrtStatus* status; OrtCreateTensorWithDataAsOrtValue(allocator, input_tensor_data, input_tensor_size, input_tensor_shape, 2, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT, &input_tensor); OrtStatus* input_status; OrtSessionGetInputCount(session, &input_count); OrtInput* input_def; OrtSessionGetInput(session, 0, &input_def); OrtSessionFillInputTensor(session, input_tensor, input_def, input_tensor_data, input_tensor_size); // 运行模型 OrtStatus* run_status; const char* output_names[] = {"output"}; OrtValue* output_tensor; OrtStatus* output_status; int output_tensor_count = 1; OrtStatus* session_status; OrtRun(session, NULL, input_tensor_name, (const OrtValue* const*)&input_tensor, 1, output_names, output_tensor_count, &output_tensor); // 获取输出结果 float* output_tensor_data; OrtGetTensorMutableData(output_tensor, (void**)&output_tensor_data); for (int i = 0; i < 10; i++) { printf("%f ", output_tensor_data[i]); } // 释放资源 OrtAllocatorFree(allocator, input_tensor); OrtReleaseSession(session); OrtReleaseSessionOptions(session_options); OrtReleaseEnvironment(env); ``` 这样,就可以使用ONNXRuntime C加载和运行导出的ONNX模型。注意,在使用ONNXRuntime C之前,需要根据平台和编译器的要求进行相应的设置和安装。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值