-
Notifications
You must be signed in to change notification settings - Fork 668
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added CUDA SETUP instruction generator.
- Loading branch information
1 parent
62e1649
commit a371be3
Showing
4 changed files
with
74 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,88 @@ | ||
import ctypes as ct | ||
import torch | ||
|
||
from pathlib import Path | ||
from warnings import warn | ||
|
||
|
||
|
||
class CUDASetup(object): | ||
_instance = None | ||
|
||
def __init__(self): | ||
raise RuntimeError("Call get_instance() instead") | ||
|
||
def generate_instructions(self): | ||
if self.cuda is None: | ||
self.add_log_entry('CUDA SETUP: Problem: The main issue seems to be that the main CUDA library was not detected.') | ||
self.add_log_entry('CUDA SETUP: Solution 1): Your paths are probably not up-to-date. You can update them via: sudo ldconfig.') | ||
self.add_log_entry('CUDA SETUP: Solution 2): If you do not have sudo rights, you can do the following:') | ||
self.add_log_entry('CUDA SETUP: Solution 2a): Find the cuda library via: find / -name libcuda.so 2>/dev/null') | ||
self.add_log_entry('CUDA SETUP: Solution 2b): Once the library is found add it to the LD_LIBRARY_PATH: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:FOUND_PATH_FROM_2a') | ||
self.add_log_entry('CUDA SETUP: Solution 2c): For a permanent solution add the export from 2b into your .bashrc file, located at ~/.bashrc') | ||
return | ||
|
||
if self.cudart_path is None: | ||
self.add_log_entry('CUDA SETUP: Problem: The main issue seems to be that the main CUDA runtime library was not detected.') | ||
self.add_log_entry('CUDA SETUP: Solution 1: To solve the issue the libcudart.so location needs to be added to the LD_LIBRARY_PATH variable') | ||
self.add_log_entry('CUDA SETUP: Solution 1a): Find the cuda runtime library via: find / -name libcudart.so 2>/dev/null') | ||
self.add_log_entry('CUDA SETUP: Solution 1b): Once the library is found add it to the LD_LIBRARY_PATH: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:FOUND_PATH_FROM_1a') | ||
self.add_log_entry('CUDA SETUP: Solution 1c): For a permanent solution add the export from 1b into your .bashrc file, located at ~/.bashrc') | ||
self.add_log_entry('CUDA SETUP: Solution 2: If no library was found in step 1a) you need to install CUDA.') | ||
self.add_log_entry('CUDA SETUP: Solution 2a): Download CUDA install script: wget https://github.com/TimDettmers/bitsandbytes/blob/main/cuda_install.sh') | ||
self.add_log_entry('CUDA SETUP: Solution 2b): Install desired CUDA version to desired location. The syntax is bash cuda_install.sh CUDA_VERSION PATH_TO_INSTALL_INTO.') | ||
self.add_log_entry('CUDA SETUP: Solution 2b): For example, "bash cuda_install.sh 113 ~/local/" will download CUDA 11.3 and install into the folder ~/local') | ||
return | ||
|
||
make_cmd = f'CUDA_VERSION={self.cuda_version_string}' | ||
if len(self.cuda_version_string) < 3: | ||
make_cmd += ' make cuda92' | ||
elif self.cuda_version_string == '110': | ||
make_cmd += ' make cuda110' | ||
elif self.cuda_version_string[:2] == '11' and int(self.cuda_version_string[2]) > 0: | ||
make_cmd += ' make cuda11x' | ||
|
||
has_cublaslt = self.cc in ["7.5", "8.0", "8.6"] | ||
if not has_cublaslt: | ||
make_cmd += '_nomatmul' | ||
|
||
self.add_log_entry('CUDA SETUP: Something unexpected happened. Please compile from source:') | ||
self.add_log_entry('git clone [email protected]:TimDettmers/bitsandbytes.git') | ||
self.add_log_entry('cd bitsandbytes') | ||
self.add_log_entry(make_cmd) | ||
self.add_log_entry('python setup.py install') | ||
|
||
def initialize(self): | ||
self.cuda_setup_log = [] | ||
self.lib = None | ||
|
||
from .cuda_setup.main import evaluate_cuda_setup | ||
binary_name = evaluate_cuda_setup() | ||
binary_name, cudart_path, cuda, cc, cuda_version_string = evaluate_cuda_setup() | ||
self.cudart_path = cudart_path | ||
self.cuda = cuda | ||
self.cc = cc | ||
self.cuda_version_string = cuda_version_string | ||
|
||
package_dir = Path(__file__).parent | ||
binary_path = package_dir / binary_name | ||
|
||
try: | ||
if not binary_path.exists(): | ||
self.add_log_entry(f"CUDA SETUP: TODO: compile library for specific version: {binary_name}") | ||
self.add_log_entry(f"CUDA SETUP: Required library version not found: {binary_name}. Maybe you need to compile it from source?") | ||
legacy_binary_name = "libbitsandbytes.so" | ||
self.add_log_entry(f"CUDA SETUP: Defaulting to {legacy_binary_name}...") | ||
binary_path = package_dir / legacy_binary_name | ||
if not binary_path.exists(): | ||
self.add_log_entry('CUDA SETUP: CUDA detection failed. Either CUDA driver not installed, CUDA not installed, or you have multiple conflicting CUDA libraries!') | ||
self.add_log_entry('') | ||
self.add_log_entry('='*48 + 'ERROR' + '='*37) | ||
self.add_log_entry('CUDA SETUP: CUDA detection failed! Possible reasons:') | ||
self.add_log_entry('1. CUDA driver not installed') | ||
self.add_log_entry('2. CUDA not installed') | ||
self.add_log_entry('3. You have multiple conflicting CUDA libraries') | ||
self.add_log_entry('4. Required library not pre-compiled for this bitsandbytes release!') | ||
self.add_log_entry('CUDA SETUP: If you compiled from source, try again with `make CUDA_VERSION=DETECTED_CUDA_VERSION` for example, `make CUDA_VERSION=113`.') | ||
self.add_log_entry('='*80) | ||
self.add_log_entry('') | ||
self.generate_instructions() | ||
self.print_log_stack() | ||
raise Exception('CUDA SETUP: Setup Failed!') | ||
self.lib = ct.cdll.LoadLibrary(binary_path) | ||
|
@@ -56,6 +112,13 @@ def get_instance(cls): | |
|
||
lib = CUDASetup.get_instance().lib | ||
try: | ||
if lib is None and torch.cuda.is_available(): | ||
CUDASetup.get_instance().generate_instructions() | ||
CUDASetup.get_instance().print_log_stack() | ||
raise RuntimeError(''' | ||
CUDA Setup failed despite GPU being available. Inspect the CUDA SETUP outputs to fix your environment! | ||
If you cannot find any issues and suspect a bug, please open an issue with detals about your environment: | ||
https://github.com/TimDettmers/bitsandbytes/issues''') | ||
lib.cadam32bit_g32 | ||
lib.get_context.restype = ct.c_void_p | ||
lib.get_cusparse.restype = ct.c_void_p | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters