| import importlib |
| import platform |
| import sys |
| import traceback |
|
|
| import torch |
|
|
| from bitsandbytes import __version__ as bnb_version |
| from bitsandbytes.cextension import BNB_BACKEND |
| from bitsandbytes.consts import PACKAGE_GITHUB_URL |
| from bitsandbytes.cuda_specs import get_cuda_specs |
| from bitsandbytes.diagnostics.cuda import ( |
| print_diagnostics, |
| ) |
| from bitsandbytes.diagnostics.utils import print_dedented, print_header |
|
|
| _RELATED_PACKAGES = [ |
| "accelerate", |
| "diffusers", |
| "numpy", |
| "pip", |
| "peft", |
| "safetensors", |
| "transformers", |
| "triton", |
| "trl", |
| ] |
|
|
|
|
| def sanity_check(): |
| from bitsandbytes.optim import Adam |
|
|
| p = torch.nn.Parameter(torch.rand(10, 10).cuda()) |
| a = torch.rand(10, 10).cuda() |
| p1 = p.data.sum().item() |
| adam = Adam([p]) |
| out = a * p |
| loss = out.sum() |
| loss.backward() |
| adam.step() |
| p2 = p.data.sum().item() |
| assert p1 != p2 |
|
|
|
|
| def get_package_version(name: str) -> str: |
| try: |
| version = importlib.metadata.version(name) |
| except importlib.metadata.PackageNotFoundError: |
| version = "not found" |
| return version |
|
|
|
|
| def show_environment(): |
| """Simple utility to print out environment information.""" |
|
|
| print(f"Platform: {platform.platform()}") |
| if platform.system() == "Linux": |
| print(f" libc: {'-'.join(platform.libc_ver())}") |
|
|
| print(f"Python: {platform.python_version()}") |
|
|
| print(f"PyTorch: {torch.__version__}") |
| print(f" CUDA: {torch.version.cuda or 'N/A'}") |
| print(f" HIP: {torch.version.hip or 'N/A'}") |
| print(f" XPU: {getattr(torch.version, 'xpu', 'N/A') or 'N/A'}") |
|
|
| print("Related packages:") |
| for pkg in _RELATED_PACKAGES: |
| version = get_package_version(pkg) |
| print(f" {pkg}: {version}") |
|
|
|
|
| def main(): |
| print_header(f"bitsandbytes v{bnb_version}") |
| show_environment() |
| print_header("") |
|
|
| cuda_specs = get_cuda_specs() |
|
|
| if cuda_specs: |
| print_diagnostics(cuda_specs) |
|
|
| |
| |
|
|
| if not torch.cuda.is_available(): |
| print(f"PyTorch says {BNB_BACKEND} is not available. Possible reasons:") |
| print(f"1. {BNB_BACKEND} driver not installed") |
| print("2. Using a CPU-only PyTorch build") |
| print("3. No GPU detected") |
|
|
| else: |
| print(f"Checking that the library is importable and {BNB_BACKEND} is callable...") |
|
|
| try: |
| sanity_check() |
| print("SUCCESS!") |
| return |
| except RuntimeError as e: |
| if "not available in CPU-only" in str(e): |
| print( |
| f"WARNING: {__package__} is currently running as CPU-only!\n" |
| "Therefore, 8-bit optimizers and GPU quantization are unavailable.\n\n" |
| f"If you think that this is so erroneously,\nplease report an issue!", |
| ) |
| else: |
| raise e |
| except Exception: |
| traceback.print_exc() |
|
|
| print_dedented( |
| f""" |
| Above we output some debug information. |
| Please provide this info when creating an issue via {PACKAGE_GITHUB_URL}/issues/new/choose |
| WARNING: Please be sure to sanitize sensitive info from the output before posting it. |
| """, |
| ) |
| sys.exit(1) |
|
|