Connie-Wild commited on
Commit
bfefc44
·
1 Parent(s): cae0b07

First commit

Browse files
Files changed (2) hide show
  1. README.md +5 -5
  2. app.py +117 -0
README.md CHANGED
@@ -1,10 +1,10 @@
1
  ---
2
- title: Quantized Model Memory Estimator
3
- emoji: 🌖
4
- colorFrom: indigo
5
- colorTo: red
6
  sdk: gradio
7
- sdk_version: 5.21.0
8
  app_file: app.py
9
  pinned: false
10
  license: mit
 
1
  ---
2
+ title: Quantized model memory estimator
3
+ emoji: 🔥
4
+ colorFrom: yellow
5
+ colorTo: yellow
6
  sdk: gradio
7
+ sdk_version: 5.14.0
8
  app_file: app.py
9
  pinned: false
10
  license: mit
app.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+
4
+
5
+ # 定数定義
6
+ API_BASE_URL = "https://huggingface.co/api/models/"
7
+ LLAMA_CPP_SOURCE = "https://raw.githubusercontent.com/ggml-org/llama.cpp/refs/heads/master/convert_hf_to_gguf.py"
8
+ QUANTIZE = {
9
+ "IQ4_XS": 4.25,
10
+ "Q4_K_M": 4.9,
11
+ "Q5_K_M": 5.7,
12
+ "Q6_K": 6.6,
13
+ }
14
+
15
+ def get_model_api_info(model_name: str) -> dict:
16
+ """
17
+ Hugging Face Hub APIから指定モデルの情報を取得する。
18
+
19
+ Args:
20
+ model_name (str): モデル名(例: "meta-llama/Llama-3.3-70B-Instruct")
21
+
22
+ Returns:
23
+ dict: モデル情報の辞書。取得に失敗した場合は空の辞書を返す。
24
+ """
25
+ api_url = f"{API_BASE_URL}{model_name}"
26
+ try:
27
+ response = requests.get(api_url)
28
+ response.raise_for_status()
29
+ return response.json()
30
+ except:
31
+ return {}
32
+
33
+ def is_architecture_supported(architecture: str) -> str:
34
+ """
35
+ llama.cppのソースコード内に指定アーキテクチャが含まれているかチェックする。
36
+
37
+ Args:
38
+ architecture (str): アーキテクチャ名
39
+
40
+ Returns:
41
+ Optional[bool]:
42
+ - True: アーキテクチャがサポートされている場合
43
+ - False: サポートされていない場合
44
+ - None: ソースコードの取得に失敗した場合
45
+ """
46
+ try:
47
+ response = requests.get(LLAMA_CPP_SOURCE)
48
+ response.raise_for_status()
49
+ content = response.text
50
+ return architecture in content
51
+ except:
52
+ return None
53
+
54
+ def estimate_gpu_memory(model_name: str) -> str:
55
+ """
56
+ 指定したモデル名からAPI情報を取得し、safetensors内の各精度パラメータサイズの合算値から
57
+ GPUメモリ必要量を概算する。
58
+
59
+ Args:
60
+ model_name (str): モデル名
61
+
62
+ Returns:
63
+ str: GPUメモリ必要量などの情報を含むメッセージ文字列
64
+ """
65
+ result_lines = []
66
+
67
+ model_info = get_model_api_info(model_name)
68
+ if not model_info:
69
+ result_lines.append(f"エラー: モデル '{model_name}' の情報が取得できませんでした。")
70
+ return "\n".join(result_lines)
71
+
72
+ parameters = model_info.get("safetensors", {}).get("parameters")
73
+ if parameters is None:
74
+ result_lines.append("safetensorsの情報が見つかりませんでした。")
75
+ return "\n".join(result_lines)
76
+
77
+ architectures = model_info.get("config", {}).get("architectures", [])
78
+ if not architectures or architectures[0] is None:
79
+ result_lines.append("モデルアーキテクチャの情報が見つかりませんでした。")
80
+ return "\n".join(result_lines)
81
+
82
+ # アーキテクチャの対応確認
83
+ architecture = architectures[0]
84
+ arch_supported = is_architecture_supported(architecture)
85
+ if arch_supported is None:
86
+ result_lines.append("llama.cppのソースコード参照に失敗しました。")
87
+ return "\n".join(result_lines)
88
+ if not arch_supported:
89
+ result_lines.append(f"{architecture}はllama.cppにて未対応のアーキテクチャです。")
90
+ return "\n".join(result_lines)
91
+
92
+ result_lines.append(f"モデル: {model_name}")
93
+ result_lines.append(f"アーキテクチャ: {architecture}")
94
+ result_lines.append("")
95
+ result_lines.append("各量子化モデルの動作に必要な概算のGPUメモリサイズは")
96
+
97
+ # GPUメモリサイズの計算
98
+ total_params = sum(parameters.values())
99
+ for quant, multiplier in QUANTIZE.items():
100
+ gpu_memory = total_params * multiplier / 8 / (1024 ** 3) * 1.3
101
+ result_lines.append(f"【{quant}】約 {gpu_memory:.2f} GB")
102
+
103
+ result_lines.append("となります。")
104
+ result_lines.append("")
105
+ result_lines.append("参考:Qの数字が量子化ビット数です。")
106
+ return "\n".join(result_lines)
107
+
108
+ # Gradio インターフェースの定義
109
+ iface = gr.Interface(
110
+ fn=estimate_gpu_memory,
111
+ inputs=gr.Textbox(label="モデル名 (例: meta-llama/Llama-3.3-70B-Instruct)"),
112
+ outputs="text",
113
+ title="Quantized model memory estimator",
114
+ description=("Hugging Face Hub APIから取得したsafetensorsの情報をもとに、llama.cppで量子化を行ったモデルの動作に必要なGPUメモリサイズを概算(GB単位)で計算します。")
115
+ )
116
+
117
+ iface.launch()