cudaGetDeviceCount failed in paddle::platform::GetCUDADeviceCount: CUDA driver version is insufficient for CUDA runtime version at [/paddle/paddle/fluid/platform/gpu_info.cc:33]
我们可以在paddle的GitHub上寻找问题的相关解决方法https://github.com/PaddlePaddle/Paddle/issues/8700
docker run --privileged
以及在Container内GPU设备是否可以找到?
【很可能不重要的过程】
https://github.com/PaddlePaddle/Paddle/issues/14434
看了这个issue能想到是否CUDA环境没配好:
(除了查CUDA版本,GPU驱动版本,可以通过代码看看CUDA环境是否正常)
官方CUDA与驱动版本对应关系
https://docs.nvidia.com/deploy/cuda-compatibility/index.html#binary-compatibility__table-toolkit-driver
那么可以先试一下如果不用Paddle是否可以获取GPU信息:
# test_cuda.cu
#include
#include
int main(int argc, char* argv[]) {
int dev_cnt = -1;
cudaGetDeviceCount(&dev_cnt);
auto err = cudaGetLastError();
if(err != cudaSuccess) {
printf("cudaGetDeviceCount Error: %s\n", cudaGetErrorString(err));
exit(-1);
}
printf("device count: %d", dev_cnt);
return 0;
}
编译命令:nvcc -arch sm_30 test_cuda.cu -std=c++11
运行命令:./a.out (不了解是否固定是a.out)
可能是更好的获取GPU信息代码(来自https://www.cnblogs.com/devilmaycry812839668/p/8367294.html):
# test_cuda.cu
#include
#include
#include
//初始化CUDA
int count=0;
bool InitCUDA()
{
printf("Start to detecte devices.........\n");//显示检测到的设备数
cudaGetDeviceCount(&count);//检测计算能力大于等于1.0 的设备数
if(count == 0)
{
fprintf(stderr, "There is no device.\n");
return false;
}
printf("%d device/s detected.\n",count);//显示检测到的设备数
int i;
for(i = 0; i < count; i++)
{//依次验证检测到的设备是否支持CUDA
cudaDeviceProp prop;
if(cudaGetDeviceProperties(&prop, i) == cudaSuccess)
{//获得设备属性并验证是否正确
if(prop.major >= 1)//验证主计算能力,即计算能力的第一位数是否大于1
{
printf("Device %d: %s supportsCUDA %d.%d.\n",i+1,prop.name,prop.major,prop.minor);//显示检测到的设备支持的CUDA 版本
break;
}
}
}
if(i == count)
{//没有支持CUDA1.x 的设备
fprintf(stderr, "There is no device supporting CUDA 1.x.\n");
return false;
}
cudaSetDevice(i);//设置设备为主叫线程的当前设备
return true;
}
int main()
{
if(!InitCUDA())
{//初始化失败返回系统int argc, char** argv
return 0;
}
printf("Hello GPU! CUDA has been initialized.\n");
//exit(argc ? EXIT_SUCCESS : EXIT_FAILURE);
return 0;//返回系统
}
编译命令:nvcc test_cuda.cu
运行命令:./a.out (不了解是否固定是a.out)
【很可能是重点的解决方法】
确认CUDA环境正常,device能被获取后,把眼光放回paddle的版本,最终发现这个问题主要是paddle版本问题:
安装paddlepaddle-gpu时应当认真选择:
版本号对应关系:
paddlepaddle-gpu==X.X.X.postXX 其中post后的两个XX分别代表CUDA版本,CUDNN版本。
如:
paddlepaddle-gpu==1.5.1.post87 代表CUDA版本8,CUDNN版本7.X
paddlepaddle-gpu==1.5.1.post97 代表CUDA版本9,CUDNN版本7.X
paddlepaddle-gpu==1.5.1.post107 代表CUDA版本10,CUDNN版本7.X
其中,
paddlepaddle-gpu==1.2.1.post97 代表CUDA版本9,CUDNN版本7.0
paddlepaddle-gpu==1.3.1.post97 代表CUDA版本9,CUDNN版本7.3
paddlepaddle-gpu==1.4.1.post97 代表CUDA版本9,CUDNN版本7.3
paddlepaddle-gpu==1.5.1.post97 代表CUDA版本9,CUDNN版本7.3