Created by: zhouwei25
cherry-pick #23816
当前问题
目前Nvidia相关API报错信息格式:
1. 需要用户在Nvidia网站里,自行查找,但是该网址国内用户很难访问,而且网站内容多,也很难找到对应之处,一般用户也不会点击。
2. 各种 cudaFunction failed!
函数调用失败的信息,对用户参考的价值低,而且较难理解;
因此报错信息较为不友好,用户出现Nvidia相关API问题无法自行分析。存在问题较大,issue众多(总计会有10几个以上)。
- 用户issue1:https://github.com/PaddlePaddle/Paddle/issues/21913
- 用户issue2:https://github.com/PaddlePaddle/Paddle/issues/22701
- 用户issue3:https://github.com/PaddlePaddle/Paddle/issues/22749
升级方案
1. 重构了PADDLE_ENFORCE_CUDA_SUCCESS
,开发者直接调用PADDLE_ENFORCE_CUDA_SUCCESS(error)
即可,error
可以是cudaError_t(cudaAPI)
、curandStatus_t(curandAPI)
、cudnnStatus_t(cudnnAPI)
、cublasStatus_t(cublasAPI)
、ncclResult_t(ncclAPI)
五种API的任意一种,涉及Paddle中314个Nvidia相关 API,不再由开发者手动输入,因为开发者对于Nvidia相关的API的外部错误,也无法给出有效的信息,一般为:
cudaGetDeviceCount failed in paddle::platform::GetCUDADeviceCountImpl
cudaEventRecord raises unexpected exception
等函数调用失败的信息,而该信息可以在栈信息C++ call Stack中查看,无需放在最关键的Error Summary中暴露给用户,对用户无实质帮助且形成了理解负担;
2. 新的报错信息由系统根据错误码自动填充,是通过爬虫从Nvidia官网爬取,或根据ncclGetErrorString
等API自动获取,另外统一了五种NvidiaAPI报错信息最终格式;
报错预览
修改前
1. CUDA API: -------------------------------------------- Error Message Summary: -------------------------------------------- Error: cudaGetDeviceCount failed in paddle::platform::GetCUDADeviceCountImpl, error code : 35, Please see detail in https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__TYPES.html#group__CUDART__TYPES_1g3f51e3575c2178246db0a94a430e0038 at (D:\1.6.2\paddle\paddle\fluid\platform\gpu_info.cc:67)
修改后
1. CUDA API:
----------------------
Error Message Summary:
----------------------
ExternalError: Cuda error(35), CUDA driver version is insufficient for CUDA runtime version.
[Advise: This indicates that the installed NVIDIA CUDA driver is older than the CUDA runtime library. This is not a supported configuration.Users should install an updated NVIDIA display driver to allow the application to run.] at (/Paddle/paddle/fluid/pybind/pybind.cc:1244)
2. CURAND API: ---------------------- Error Message Summary: ---------------------- ExternalError: Curand error, CURAND_STATUS_OUT_OF_RANGE : unspecified launch failure at (/Paddle/paddle/fluid/pybind/pybind.cc:1247)
3. CUDNN API: ---------------------- Error Message Summary: ---------------------- ExternalError: Cudnn error, CUDNN_STATUS_INTERNAL_ERROR at (/Paddle/paddle/fluid/pybind/pybind.cc:1250)
4. CUBLAS API: ---------------------- Error Message Summary: ---------------------- ExternalError: Cublas error, CUBLAS_STATUS_LICENSE_ERROR at (/Paddle/paddle/fluid/pybind/pybind.cc:1253)
5. NCCL API: ---------------------- Error Message Summary: ---------------------- ExternalError: Nccl error, unhandled system error at (/Paddle/paddle/fluid/pybind/pybind.cc:1256)
注:第1种API加入了爬虫,有100多种错误码,并提供从Nvidia官网爬取到的详细信息;后4种API错误码较少,未引入爬虫,只提供简要的信息,竞品目前只提供最简要信息,后期可视情况看Paddle是否需要将详细信息也进行爬取;
调用方式举例:
报错信息自动产生,进行了全封装,开发者只需传入Nvidia API的返回值,调用简单;
PADDLE_ENFORCE_CUDA_SUCCESS(cudaGetDeviceCount(&count));