181 lines
8.0 KiB
Python
181 lines
8.0 KiB
Python
try:
|
|
import platform
|
|
import subprocess
|
|
import logging
|
|
from importlib_metadata import distributions
|
|
import torch
|
|
import os # Import the os module
|
|
import re
|
|
import glob
|
|
import textwrap
|
|
import packaging.version
|
|
import packaging.specifiers
|
|
except ImportError as e:
|
|
print(f"\033[91mError importing module: {e}\033[0m\n")
|
|
print("\033[94mPlease ensure you started the Text-generation-webUI Python environment with either\033[0m")
|
|
print("\033[92mcmd_linux.sh\033[0m, \033[92mcmd_windows.bat\033[0m, \033[92mcmd_macos.sh\033[0m, or \033[92mcmd_wsl.bat\033[0m")
|
|
print("\033[94mand then try running the diagnostics again.\033[0m")
|
|
exit(1)
|
|
|
|
try:
|
|
import psutil
|
|
except ImportError:
|
|
print("psutil not found. Installing...")
|
|
subprocess.run(['pip', 'install', 'psutil'])
|
|
import psutil
|
|
|
|
def get_requirements_file():
|
|
requirements_files = glob.glob("requirements*.txt")
|
|
if not requirements_files:
|
|
print("\033[91mNo requirements files found.\033[0m")
|
|
return None
|
|
|
|
print("\033[94m\nSelect a requirements file to check against (or press Enter for default 'requirements.txt'):\033[0m\n")
|
|
for i, file in enumerate(requirements_files, start=1):
|
|
print(f"{i}. {file}")
|
|
|
|
choice = input("\nEnter the number of your choice: ")
|
|
try:
|
|
choice = int(choice) - 1
|
|
return requirements_files[choice]
|
|
except (ValueError, IndexError):
|
|
return "requirements.txt"
|
|
|
|
# Set up logging with filemode='w'
|
|
logging.basicConfig(filename='diagnostics.log', filemode='w', level=logging.INFO)
|
|
|
|
# Function to get GPU information using subprocess
|
|
def get_gpu_info():
|
|
try:
|
|
result = subprocess.run(['nvidia-smi'], stdout=subprocess.PIPE, text=True)
|
|
return result.stdout
|
|
except FileNotFoundError:
|
|
return "NVIDIA GPU information not available"
|
|
|
|
# Function to check if a port is in use
|
|
def is_port_in_use(port):
|
|
for conn in psutil.net_connections():
|
|
if conn.laddr.port == port:
|
|
return True
|
|
return False
|
|
|
|
# Function to log and print system information
|
|
def log_system_info():
|
|
# System information
|
|
os_version = platform.system() + " " + platform.version()
|
|
|
|
# Get CUDA_HOME environment variable
|
|
cuda_home = os.environ.get('CUDA_HOME', 'N/A')
|
|
|
|
gpu_info = get_gpu_info()
|
|
|
|
# Python environment information
|
|
python_version = platform.python_version()
|
|
|
|
# Torch version
|
|
torch_version = torch.__version__
|
|
|
|
# System RAM using psutil
|
|
try:
|
|
virtual_memory = psutil.virtual_memory()
|
|
total_ram = f"{virtual_memory.total / (1024 ** 3):.2f} GB"
|
|
available_ram = f"{virtual_memory.available / (1024 ** 3):.2f} GB"
|
|
system_ram = f"{available_ram} available out of {total_ram} total"
|
|
except NameError:
|
|
print("psutil is not installed. Unable to check system RAM.")
|
|
system_ram = "N/A"
|
|
|
|
# Port check (if psutil is available)
|
|
port_status = "N/A"
|
|
if 'psutil' in globals():
|
|
port_to_check = 7851
|
|
if is_port_in_use(port_to_check):
|
|
port_status = f"Port {port_to_check} is in use."
|
|
else:
|
|
port_status = f"Port {port_to_check} is available."
|
|
|
|
# Package versions using importlib_metadata
|
|
package_versions = {d.metadata['Name']: d.version for d in distributions()}
|
|
|
|
# Compare with requirements file
|
|
requirements_file = get_requirements_file()
|
|
if requirements_file:
|
|
required_packages = {}
|
|
installed_packages = {}
|
|
|
|
try:
|
|
with open(requirements_file, 'r') as req_file:
|
|
requirements = [line.strip() for line in req_file]
|
|
for req in requirements:
|
|
# Use regular expression to parse package name and version
|
|
match = re.match(r'([^\s>=]+)\s*([>=<]+)\s*([^,]+)', req)
|
|
if match:
|
|
package_name, operator, version_spec = match.groups()
|
|
installed_version = package_versions.get(package_name, 'Not installed')
|
|
if installed_version != 'Not installed':
|
|
required_packages[package_name] = (operator, version_spec)
|
|
installed_packages[package_name] = installed_version
|
|
except FileNotFoundError:
|
|
print(f"\n{requirements_file} not found. Skipping version checks.")
|
|
logging.info(f"NOTE {requirements_file} not found. Skipping version checks.")
|
|
|
|
# Log and print information
|
|
logging.info(f"OS Version: {os_version}")
|
|
logging.info(f"Note: Windows 11 build is 10.x.22xxx")
|
|
logging.info(f"Python Version: {python_version}")
|
|
logging.info(f"Torch Version: {torch_version}")
|
|
logging.info(f"System RAM: {system_ram}")
|
|
logging.info(f"CUDA_HOME: {cuda_home}")
|
|
logging.info(f"Port Status: {port_status}")
|
|
if required_packages: # Check if the dictionary is not empty
|
|
logging.info("Package Versions:")
|
|
max_package_length = max(len(package) for package in required_packages.keys())
|
|
for package_name, (operator, required_version) in required_packages.items():
|
|
installed_version = installed_packages.get(package_name, 'Not installed')
|
|
logging.info(f"{package_name.ljust(max_package_length)} Required: {operator} {required_version.ljust(12)} Installed: {installed_version}")
|
|
logging.info(f"GPU Information:\n{gpu_info}")
|
|
logging.info("Package Versions:")
|
|
for package, version in package_versions.items():
|
|
logging.info(f"{package}>= {version}")
|
|
|
|
# Print to screen
|
|
print(f"\n\033[94mOS Version:\033[0m \033[92m{os_version}\033[0m")
|
|
print(f"\033[94mOS Ver note:\033[0m \033[92mWindows 11 build is 10.x.22xxx\033[0m")
|
|
print(f"\033[94mCUDA_HOME:\033[0m \033[92m{cuda_home}\033[0m")
|
|
print(f"\033[94mSystem RAM:\033[0m \033[92m{system_ram}\033[0m")
|
|
print(f"\033[94mPort Status:\033[0m \033[92m{port_status}\033[0m")
|
|
print(f"\033[94mTorch Version:\033[0m \033[92m{torch_version}\033[0m")
|
|
print(f"\033[94mPython Version:\033[0m \033[92m{python_version}\033[0m")
|
|
if required_packages: # Check if the dictionary is not empty
|
|
print("\033[94m\nRequirements file package comparison:\033[0m")
|
|
max_package_length = max(len(package) for package in required_packages.keys())
|
|
|
|
for package_name, (operator, required_version) in required_packages.items():
|
|
installed_version = installed_packages.get(package_name, 'Not installed')
|
|
|
|
# Compare versions using packaging.version
|
|
required = packaging.version.parse(required_version)
|
|
installed = packaging.version.parse(installed_version)
|
|
|
|
# Set color based on version comparison
|
|
condition_met = eval(f"installed {operator} required")
|
|
color_required = "\033[92m" if condition_met else "\033[91m"
|
|
color_installed = "\033[92m" if condition_met else "\033[91m"
|
|
|
|
# Print colored output
|
|
print(f"{package_name.ljust(max_package_length)} Required: {color_required}{operator} {required_version.ljust(12)}\033[0m Installed: {color_installed}{installed_version}\033[0m")
|
|
print("\033[94m\nRequirements file specifier meanings:\033[0m")
|
|
explanation = textwrap.dedent("""
|
|
== Exact version != Any version except < Less than
|
|
<= Less than or equal to > Greater than >= Greater than or equal to
|
|
~ Compatible release ; Environment marker AND Logical AND
|
|
OR Logical OR
|
|
""")
|
|
print(explanation.strip())
|
|
print("")
|
|
print(f"GPU Information:{gpu_info}")
|
|
print(f"\033[94mDiagnostic log created:\033[0m \033[92mdiagnostics.log\033[0m")
|
|
print(f"\033[94mPlease upload the log file with any support ticket.\033[0m")
|
|
|
|
if __name__ == "__main__":
|
|
log_system_info() |