Connie-Wild
commited on
Commit
·
bfefc44
1
Parent(s):
cae0b07
First commit
Browse files
README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
---
|
2 |
-
title: Quantized
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 5.
|
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()
|