From 0cb8a070d93a8f79f9eb5a798108129c39e832d7 Mon Sep 17 00:00:00 2001 From: "A. Unique TensorFlower" Date: Tue, 16 Apr 2019 08:16:39 -0700 Subject: [PATCH] Suggest default CUDA/cuDNN/TensorRT versions after initial auto-detection. Reduce spew on error message when some file was not found. PiperOrigin-RevId: 243810113 --- configure.py | 30 +++++++----- third_party/gpus/find_cuda_config.py | 72 +++++++++++++++------------- 2 files changed, 57 insertions(+), 45 deletions(-) diff --git a/configure.py b/configure.py index fe0e6d7b315..1a69b06a1ac 100644 --- a/configure.py +++ b/configure.py @@ -33,6 +33,9 @@ except ImportError: from distutils.spawn import find_executable as which # pylint: enable=g-import-not-at-top +_DEFAULT_CUDA_VERSION = '10' +_DEFAULT_CUDNN_VERSION = '7' +_DEFAULT_TENSORRT_VERSION = '5' _DEFAULT_CUDA_COMPUTE_CAPABILITIES = '3.5,7.0' _TF_OPENCL_VERSION = '1.2' @@ -865,21 +868,25 @@ def set_tf_cuda_paths(environ_cp): def set_tf_cuda_version(environ_cp): """Set TF_CUDA_VERSION.""" - ask_cuda_version = ('Please specify the CUDA SDK version you want to use. ' - '[Leave empty to accept any version]: ') + ask_cuda_version = ( + 'Please specify the CUDA SDK version you want to use. ' + '[Leave empty to default to CUDA %s]: ') % _DEFAULT_CUDA_VERSION tf_cuda_version = get_from_env_or_user_or_default(environ_cp, 'TF_CUDA_VERSION', - ask_cuda_version, '') + ask_cuda_version, + _DEFAULT_CUDA_VERSION) environ_cp['TF_CUDA_VERSION'] = tf_cuda_version def set_tf_cudnn_version(environ_cp): """Set TF_CUDNN_VERSION.""" - ask_cudnn_version = ('Please specify the cuDNN version you want to use. ' - '[Leave empty to accept any version]: ') + ask_cudnn_version = ( + 'Please specify the cuDNN version you want to use. ' + '[Leave empty to default to cuDNN %s]: ') % _DEFAULT_CUDNN_VERSION tf_cudnn_version = get_from_env_or_user_or_default(environ_cp, 'TF_CUDNN_VERSION', - ask_cudnn_version, '') + ask_cudnn_version, + _DEFAULT_CUDNN_VERSION) environ_cp['TF_CUDNN_VERSION'] = tf_cudnn_version @@ -922,11 +929,10 @@ def set_tf_tensorrt_version(environ_cp): ask_tensorrt_version = ( 'Please specify the TensorRT version you want to use. ' - '[Leave empty to accept any version]: ') - tf_tensorrt_version = get_from_env_or_user_or_default(environ_cp, - 'TF_TENSORRT_VERSION', - ask_tensorrt_version, - '') + '[Leave empty to default to TensorRT %s]: ') % _DEFAULT_TENSORRT_VERSION + tf_tensorrt_version = get_from_env_or_user_or_default( + environ_cp, 'TF_TENSORRT_VERSION', ask_tensorrt_version, + _DEFAULT_TENSORRT_VERSION) environ_cp['TF_TENSORRT_VERSION'] = tf_tensorrt_version @@ -1331,7 +1337,7 @@ def validate_cuda_config(environ_cp): if proc.wait(): # Errors from find_cuda_config.py were sent to stderr. - print('\n\nAsking for detailed CUDA configuration...\n') + print('Asking for detailed CUDA configuration...\n') return False config = dict( diff --git a/third_party/gpus/find_cuda_config.py b/third_party/gpus/find_cuda_config.py index c8977a08c75..faabd827def 100644 --- a/third_party/gpus/find_cuda_config.py +++ b/third_party/gpus/find_cuda_config.py @@ -139,7 +139,7 @@ def _get_ld_config_paths(): match = pattern.match(line.decode("ascii")) if match: result.add(os.path.dirname(match.group(1))) - return list(result) + return sorted(list(result)) def _get_default_cuda_paths(cuda_version): @@ -155,42 +155,47 @@ def _get_default_cuda_paths(cuda_version): "C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v%s\\" % cuda_version) ] - return ["/usr/local/cuda-%s" % cuda_version, "/usr"] + _get_ld_config_paths() + return ["/usr/local/cuda-%s" % cuda_version, "/usr/local/cuda", "/usr" + ] + _get_ld_config_paths() -def _header_paths(base_paths): - return _cartesian_product(base_paths, [ +def _header_paths(): + """Returns hard-coded set of relative paths to look for header files.""" + return [ "", "include", "include/cuda", "include/*-linux-gnu", "extras/CUPTI/include", "include/cuda/CUPTI", - ]) + ] -def _library_paths(base_paths): - return _cartesian_product(base_paths, [ +def _library_paths(): + """Returns hard-coded set of relative paths to look for library files.""" + return [ "", "lib64", "lib", "lib/*-linux-gnu", "lib/x64", "extras/CUPTI/*", - ]) + ] -def _not_found_error(paths, filepattern): +def _not_found_error(base_paths, relative_paths, filepattern): + base_paths = "".join(["\n '%s'" % path for path in sorted(base_paths)]) + relative_paths = "".join(["\n '%s'" % path for path in relative_paths]) return ConfigError( - "Could not find any %s in:%s\n" % - (filepattern, "".join(["\n %s" % path for path in sorted(paths)]))) + "Could not find any %s in any subdirectory:%s\nof:%s\n" % + (filepattern, relative_paths, base_paths)) -def _find_file(paths, filepattern): - for path in paths: +def _find_file(base_paths, relative_paths, filepattern): + for path in _cartesian_product(base_paths, relative_paths): for file in glob.glob(os.path.join(path, filepattern)): return file - raise _not_found_error(paths, filepattern) + raise _not_found_error(base_paths, relative_paths, filepattern) def _find_library(base_paths, library_name, required_version): @@ -203,24 +208,26 @@ def _find_library(base_paths, library_name, required_version): else: filepattern = ".".join(["lib" + library_name, "so"] + required_version.split(".")[:1]) + "*" - return _find_file(_library_paths(base_paths), filepattern) + return _find_file(base_paths, _library_paths(), filepattern) -def _find_versioned_file(paths, filepattern, required_version, get_version): +def _find_versioned_file(base_paths, relative_paths, filepattern, + required_version, get_version): """Returns first valid path to a file that matches the requested version.""" - for path in paths: + for path in _cartesian_product(base_paths, relative_paths): for file in glob.glob(os.path.join(path, filepattern)): actual_version = get_version(file) if _matches_version(actual_version, required_version): return file, actual_version raise _not_found_error( - paths, filepattern + " matching version '%s'" % required_version) + base_paths, relative_paths, + filepattern + " matching version '%s'" % required_version) def _find_header(base_paths, header_name, required_version, get_version): """Returns first valid path to a header that matches the requested version.""" - return _find_versioned_file( - _header_paths(base_paths), header_name, required_version, get_version) + return _find_versioned_file(base_paths, _header_paths(), header_name, + required_version, get_version) def _find_cuda_config(base_paths, required_version): @@ -247,20 +254,18 @@ def _find_cuda_config(base_paths, required_version): return None nvcc_name = "nvcc.exe" if _is_windows() else "nvcc" - nvcc_path, nvcc_version = _find_versioned_file( - _cartesian_product(base_paths, [ - "", - "bin", - ]), nvcc_name, cuda_version, get_nvcc_version) + nvcc_path, nvcc_version = _find_versioned_file(base_paths, [ + "", + "bin", + ], nvcc_name, cuda_version, get_nvcc_version) - nvvm_path = _find_file( - _cartesian_product(base_paths, [ - "nvvm/libdevice", - "share/cuda", - "lib/nvidia-cuda-toolkit/libdevice", - ]), "libdevice*.10.bc") + nvvm_path = _find_file(base_paths, [ + "nvvm/libdevice", + "share/cuda", + "lib/nvidia-cuda-toolkit/libdevice", + ], "libdevice*.10.bc") - cupti_header_path = _find_file(_header_paths(base_paths), "cupti.h") + cupti_header_path = _find_file(base_paths, _header_paths(), "cupti.h") cupti_library_path = _find_library(base_paths, "cupti", required_version) cuda_binary_dir = os.path.dirname(nvcc_path) @@ -311,7 +316,7 @@ def _find_cublas_config(base_paths, required_version, cuda_version): else: # There is no version info available before CUDA 10.1, just find the file. - header_path = _find_file(_header_paths(base_paths), "cublas_api.h") + header_path = _find_file(base_paths, _header_paths(), "cublas_api.h") # cuBLAS version is the same as CUDA version (x.y). cublas_version = required_version @@ -411,6 +416,7 @@ def find_cuda_config(): cuda_version = os.environ.get("TF_CUDA_VERSION", "") base_paths = _list_from_env("TF_CUDA_PATHS", _get_default_cuda_paths(cuda_version)) + base_paths = [path for path in base_paths if os.path.exists(path)] result = {} if "cuda" in libraries: