import asyncio import os import json import shutil import inspect import requests import subprocess import platform import importlib.util import sys config = None def check_nvidia_gpu(): try: # Utilizza torch per verificare la presenza di una GPU NVIDIA return torch.cuda.is_available() and 'NVIDIA' in torch.cuda.get_device_name(0) except Exception as e: print(f"Error while checking for NVIDIA GPU: {e}") return False def get_cuda_version(): try: if torch.cuda.is_available(): cuda_version = torch.version.cuda.replace(".","").strip() return "cu"+cuda_version else: return "No NVIDIA GPU available" except Exception as e: print(f"Error while checking CUDA version: {e}") return "Unable to determine CUDA version" def check_avx2_support(): import cpuinfo try: info = cpuinfo.get_cpu_info() return 'avx2' in info['flags'] except Exception as e: print(f"Error while checking AVX2 support: {e}") return False def get_python_version(): if "3.9" in platform.python_version(): return "39" elif "3.10" in platform.python_version(): return "310" elif "3.11" in platform.python_version(): return "311" else: return None def get_os(): return platform.system() def get_os_bit(): return platform.architecture()[0].replace("bit","") import requests def get_platform_tag(_os): #return the first tag in the list of tags try: import packaging.tags response = requests.get("https://api.github.com/repos/abetlen/llama-cpp-python/releases/latest") jresponse= response.json() return extract_platform_tag(jresponse,list(packaging.tags.sys_tags())[0],_os) except: return None def install_package(package): subprocess.check_call([sys.executable, "-m", "pip", "install", "--no-cache-dir", package]) def install_llama(): try: gpu = check_nvidia_gpu() avx2 = check_avx2_support() lcpVersion = get_last_llcpppy_version() python_version = get_python_version() _os = get_os() os_bit = get_os_bit() platform_tag = get_platform_tag(_os) print(f"Python version: {python_version}") print(f"OS: {_os}") print(f"OS bit: {os_bit}") print(f"Platform tag: {platform_tag}") if python_version == None: print("Unsupported Python version. Please use Python 3.9, 3.10 or 3.11.") return #python -m pip install llama-cpp-python --force-reinstall --no-deps --index-url=https://jllllll.github.io/llama-cpp-python-cuBLAS-wheels/AVX2/cu117 if avx2: avx="AVX2" else: avx="AVX" if gpu: cuda = get_cuda_version() print(f"--index-url=https://jllllll.github.io/llama-cpp-python-cuBLAS-wheels/{avx}/{cuda}") else: print(f"https://github.com/abetlen/llama-cpp-python/releases/download/v{lcpVersion}/llama_cpp_python-{lcpVersion}-{platform_tag}.whl") except Exception as e: print(f"Error while installing LLAMA: {e}") # llama wheels https://github.com/jllllll/llama-cpp-python-cuBLAS-wheels def check_module(package): import importlib try: print("Detected: ", package) importlib.import_module(package) return True except ImportError: return False import zipfile import re def extract_platform_tag(jresponse,tag,_os): if _os.lower()== "linux" or _os.lower()=="macosx": print(jresponse) for res in jresponse["assets"]: url = res["browser_download_url"] print(url) pattern = r'.*-((cp\d+-cp\d+)-(manylinux|macosx)_(\d+_\d+)_(x86_64|i686)\.whl)$' match = re.match(pattern, url) pattern_tag = r'((cp\d+-cp\d+)-(manylinux|macosx)_\d+_\d+_(x86_64|i686))$' match_tag = re.match(pattern_tag, tag) if match_tag: rl_platform_tag = f"{match_tag.group(2)}-{match_tag.group(3)}_**_{match_tag.group(4)}" #print(rl_platform_tag) if match: # Estrai il platform tag dal match url_platform_tag = f"{match.group(2)}-{match.group(3)}_**_{match.group(5)}" final_platform_tag =f"{match.group(2)}-{match.group(3)}_{match.group(4)}_{match.group(5)}" if rl_platform_tag == url_platform_tag: return final_platform_tag return None else: return tag def get_last_llcpppy_version(): try: import requests response = requests.get("https://api.github.com/repos/abetlen/llama-cpp-python/releases/latest") return response.json()["tag_name"].replace("v","") except: return "0.2.20" install_llama()