This change is a second attempt at #38964, which was rolled back because it was fragile. First, cuda_configure.bzl templates a file with data it already pulled from get_cuda_config. gen_build_info loads that file to provide package build information within TensorFlow: from tensorflow.python.platform import build_info print(build_info.build_info) {'cuda_version': '10.2', 'cudnn_version': '7', ... } Also is exposed through tf.sysconfig.get_build_info(), a public API change. setup.py pulls build_info into package metadata. The wheel's long description ends with: TensorFlow 2.2.0 for NVIDIA GPUs was built with these platform and library versions: - NVIDIA CUDA 10.2 - NVIDIA cuDNN 7 - NVIDIA CUDA Compute Capabilities compute_30, compute_70 (etc.) I set one of the new CUDA Classifiers, and add metadata to the "platform" tag: >>> import pkginfo >>> a = pkginfo.Wheel('./tf_nightly_gpu-2.1.0-cp36-cp36m-linux_x86_64.whl') >>> a.platforms ['cuda_version:10.2', 'cudnn_version:7', ...] I'm not 100% confident this is the best way to accomplish this. It still seems odd to import like this setup.py, even though it works, even in an environment with TensorFlow installed. This method is much better than the old method as it uses data that was already gathered. It could be extended to gather tensorrt, nccl, etc. from other .bzl files, but I wanted to get feedback (and ensure this lands in 2.3) before designing something like that. Currently tested only on Linux GPU (Remote Build) for Python 3.6. I'd like to see more tests before merging. The API is the same as the earlier change. Resolves https://github.com/tensorflow/tensorflow/issues/38351. PiperOrigin-RevId: 315018663 Change-Id: Idf68a8fe4d1585164d22b5870894c879537c280d
65 lines
2.6 KiB
Python
65 lines
2.6 KiB
Python
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
# ==============================================================================
|
|
|
|
"""Platform-specific code for checking the integrity of the TensorFlow build."""
|
|
from __future__ import absolute_import
|
|
from __future__ import division
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
|
|
MSVCP_DLL_NAMES = "msvcp_dll_names"
|
|
|
|
try:
|
|
from tensorflow.python.platform import build_info
|
|
except ImportError:
|
|
raise ImportError("Could not import tensorflow. Do not import tensorflow "
|
|
"from its source directory; change directory to outside "
|
|
"the TensorFlow source tree, and relaunch your Python "
|
|
"interpreter from there.")
|
|
|
|
|
|
def preload_check():
|
|
"""Raises an exception if the environment is not correctly configured.
|
|
|
|
Raises:
|
|
ImportError: If the check detects that the environment is not correctly
|
|
configured, and attempting to load the TensorFlow runtime will fail.
|
|
"""
|
|
if os.name == "nt":
|
|
# Attempt to load any DLLs that the Python extension depends on before
|
|
# we load the Python extension, so that we can raise an actionable error
|
|
# message if they are not found.
|
|
import ctypes # pylint: disable=g-import-not-at-top
|
|
if MSVCP_DLL_NAMES in build_info.build_info:
|
|
missing = []
|
|
for dll_name in build_info.build_info[MSVCP_DLL_NAMES].split(","):
|
|
try:
|
|
ctypes.WinDLL(dll_name)
|
|
except OSError:
|
|
missing.append(dll_name)
|
|
if missing:
|
|
raise ImportError(
|
|
"Could not find the DLL(s) %r. TensorFlow requires that these DLLs "
|
|
"be installed in a directory that is named in your %%PATH%% "
|
|
"environment variable. You may install these DLLs by downloading "
|
|
'"Microsoft C++ Redistributable for Visual Studio 2015, 2017 and '
|
|
'2019" for your platform from this URL: '
|
|
"https://support.microsoft.com/help/2977003/the-latest-supported-visual-c-downloads"
|
|
% " or ".join(missing))
|
|
else:
|
|
# TODO(mrry): Consider adding checks for the Linux and Mac OS X builds.
|
|
pass
|