|
import gradio as gr |
|
import requests |
|
from typing import Optional |
|
|
|
|
|
|
|
API_BASE_URL = "https://huggingface.co/api/models/" |
|
LLAMA_CPP_SOURCE = "https://raw.githubusercontent.com/ggml-org/llama.cpp/refs/heads/master/convert_hf_to_gguf.py" |
|
QUANTIZE = { |
|
"IQ4_XS": 4.25, |
|
"Q4_K_M": 4.9, |
|
"Q5_K_M": 5.7, |
|
"Q6_K": 6.6, |
|
} |
|
|
|
def get_model_api_info(model_name: str) -> dict: |
|
""" |
|
Hugging Face Hub APIから指定モデルの情報を取得する。 |
|
|
|
Args: |
|
model_name (str): モデル名(例: "meta-llama/Llama-3.3-70B-Instruct") |
|
|
|
Returns: |
|
dict: モデル情報の辞書。取得に失敗した場合は空の辞書を返す。 |
|
""" |
|
api_url = f"{API_BASE_URL}{model_name}" |
|
try: |
|
response = requests.get(api_url) |
|
response.raise_for_status() |
|
return response.json() |
|
except: |
|
return {} |
|
|
|
def is_architecture_supported(architecture: str) -> Optional[bool]: |
|
""" |
|
llama.cppのソースコード内に指定アーキテクチャが含まれているかチェックする。 |
|
|
|
Args: |
|
architecture (str): アーキテクチャ名 |
|
|
|
Returns: |
|
Optional[bool]: |
|
- True: アーキテクチャがサポートされている場合 |
|
- False: サポートされていない場合 |
|
- None: ソースコードの取得に失敗した場合 |
|
""" |
|
try: |
|
response = requests.get(LLAMA_CPP_SOURCE) |
|
response.raise_for_status() |
|
content = response.text |
|
models = [line for line in content.splitlines() if "@Model.register" in line] |
|
return any(architecture in entry for entry in models) |
|
except: |
|
return None |
|
|
|
def estimate_gpu_memory(model_name: str) -> str: |
|
""" |
|
指定したモデル名からAPI情報を取得し、safetensors内の各精度パラメータサイズの合算値から |
|
GPUメモリ必要量を概算する。 |
|
|
|
Args: |
|
model_name (str): モデル名 |
|
|
|
Returns: |
|
str: GPUメモリ必要量などの情報を含むメッセージ文字列 |
|
""" |
|
result_lines = [] |
|
|
|
model_info = get_model_api_info(model_name) |
|
if not model_info: |
|
result_lines.append(f"エラー: モデル '{model_name}' の情報が取得できませんでした。") |
|
return "\n".join(result_lines) |
|
|
|
parameters = model_info.get("safetensors", {}).get("parameters") |
|
if parameters is None: |
|
result_lines.append("safetensorsの情報が見つかりませんでした。") |
|
return "\n".join(result_lines) |
|
|
|
architectures = model_info.get("config", {}).get("architectures", []) |
|
if not architectures or architectures[0] is None: |
|
result_lines.append("モデルアーキテクチャの情報が見つかりませんでした。") |
|
return "\n".join(result_lines) |
|
|
|
|
|
architecture = architectures[0] |
|
arch_supported = is_architecture_supported(architecture) |
|
if arch_supported is None: |
|
result_lines.append("llama.cppのソースコード参照に失敗しました。") |
|
return "\n".join(result_lines) |
|
if not arch_supported: |
|
result_lines.append(f"{architecture}はllama.cppにて未対応のアーキテクチャです。") |
|
return "\n".join(result_lines) |
|
|
|
result_lines.append(f"モデル: {model_name}") |
|
result_lines.append(f"アーキテクチャ: {architecture}") |
|
result_lines.append("") |
|
result_lines.append("各量子化モデルの動作に必要な概算のGPUメモリサイズは") |
|
|
|
|
|
total_params = sum(parameters.values()) |
|
for quant, multiplier in QUANTIZE.items(): |
|
gpu_memory = total_params * multiplier / 8 / (1024 ** 3) * 1.3 |
|
result_lines.append(f"【{quant}】約 {gpu_memory:.2f} GB") |
|
|
|
result_lines.append("となります。") |
|
result_lines.append("") |
|
result_lines.append("参考:Qの数字が量子化ビット数です。") |
|
return "\n".join(result_lines) |
|
|
|
|
|
iface = gr.Interface( |
|
fn=estimate_gpu_memory, |
|
inputs=gr.Textbox(label="モデル名 (例: meta-llama/Llama-3.3-70B-Instruct)"), |
|
outputs="text", |
|
title="Quantized model memory estimator", |
|
description=("Hugging Face Hub APIから取得したsafetensorsの情報をもとに、llama.cppで量子化を行ったモデルの動作に必要なGPUメモリサイズを概算(GB単位)で計算します。") |
|
) |
|
|
|
iface.launch() |
|
|