Spaces:
Running
Running
Connie-Wild
commited on
Commit
·
cc0bc9b
1
Parent(s):
c333905
refactoring
Browse files
app.py
CHANGED
@@ -1,47 +1,70 @@
|
|
1 |
import gradio as gr
|
2 |
import requests
|
3 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
def get_model_api_info(model_name: str) -> dict:
|
5 |
"""
|
6 |
-
Hugging Face Hub API
|
|
|
|
|
|
|
7 |
"""
|
8 |
-
api_url = f"
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
11 |
return None
|
12 |
-
return response.json()
|
13 |
|
14 |
def sum_precision_sizes(parameters: dict) -> int:
|
15 |
"""
|
16 |
-
|
|
|
|
|
|
|
17 |
"""
|
18 |
# 各データ型とその乗数の対応表
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
"I16": 2,
|
25 |
-
"U16": 2,
|
26 |
-
"F16": 2,
|
27 |
-
"BF16": 2,
|
28 |
-
"I32": 4,
|
29 |
-
"U32": 4,
|
30 |
-
"F32": 4,
|
31 |
-
"F64": 8,
|
32 |
-
"I64": 8,
|
33 |
-
"U64": 8,
|
34 |
-
}
|
35 |
-
return sum(parameters.get(key, 0) * multiplier for key, multiplier in multipliers.items())
|
36 |
|
37 |
def estimate_gpu_memory(model_name: str) -> str:
|
38 |
"""
|
39 |
-
指定したモデル名からAPI
|
40 |
-
|
|
|
|
|
|
|
41 |
"""
|
|
|
|
|
42 |
model_info = get_model_api_info(model_name)
|
43 |
if model_info is None:
|
44 |
-
|
|
|
45 |
|
46 |
# リポジトリ全体のファイルサイズ(参考)
|
47 |
usedStorage = model_info.get("usedStorage")
|
@@ -51,35 +74,40 @@ def estimate_gpu_memory(model_name: str) -> str:
|
|
51 |
|
52 |
# safetensorsの情報が見つからない場合
|
53 |
if not safetensors or "parameters" not in safetensors:
|
54 |
-
|
55 |
if usedStorage_gb is not None:
|
56 |
-
|
57 |
-
f"
|
58 |
-
f"
|
59 |
-
f"
|
60 |
-
f"
|
61 |
-
|
|
|
62 |
|
63 |
# safetensorsの情報がある場合
|
64 |
parameters = safetensors["parameters"]
|
65 |
estimated_bytes = sum_precision_sizes(parameters)
|
66 |
estimated_gb = estimated_bytes / (1024 ** 3)
|
67 |
|
68 |
-
|
69 |
|
70 |
-
|
71 |
-
|
72 |
-
|
|
|
73 |
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
|
|
79 |
|
80 |
if usedStorage_gb is not None:
|
81 |
-
|
82 |
-
|
|
|
|
|
83 |
|
84 |
# Gradio インターフェースの定義
|
85 |
iface = gr.Interface(
|
|
|
1 |
import gradio as gr
|
2 |
import requests
|
3 |
|
4 |
+
|
5 |
+
# 定数定義
|
6 |
+
API_BASE_URL = "https://huggingface.co/api/models/"
|
7 |
+
MULTIPLIERS = {
|
8 |
+
"U8": 1,
|
9 |
+
"I8": 1,
|
10 |
+
"F8_E5M2": 1,
|
11 |
+
"F8_E4M3": 1,
|
12 |
+
"I16": 2,
|
13 |
+
"U16": 2,
|
14 |
+
"F16": 2,
|
15 |
+
"BF16": 2,
|
16 |
+
"I32": 4,
|
17 |
+
"U32": 4,
|
18 |
+
"F32": 4,
|
19 |
+
"F64": 8,
|
20 |
+
"I64": 8,
|
21 |
+
"U64": 8,
|
22 |
+
}
|
23 |
+
PRECISION_KEYS = list(MULTIPLIERS.keys())
|
24 |
+
|
25 |
def get_model_api_info(model_name: str) -> dict:
|
26 |
"""
|
27 |
+
Hugging Face Hub APIから指定モデルの情報を取得する。
|
28 |
+
|
29 |
+
:param model_name: モデル名(例: "meta-llama/Llama-3.3-70B-Instruct")
|
30 |
+
:return: モデル情報の辞書。取得に失敗した場合はNoneを返す。
|
31 |
"""
|
32 |
+
api_url = f"{API_BASE_URL}{model_name}"
|
33 |
+
try:
|
34 |
+
response = requests.get(api_url)
|
35 |
+
response.raise_for_status()
|
36 |
+
return response.json()
|
37 |
+
except requests.RequestException:
|
38 |
return None
|
|
|
39 |
|
40 |
def sum_precision_sizes(parameters: dict) -> int:
|
41 |
"""
|
42 |
+
safetensors内の各精度のパラメータ数に対して、定数の乗数をかけた合計バイト数を算出する。
|
43 |
+
|
44 |
+
:param parameters: 各精度のパラメータ数を含む辞書
|
45 |
+
:return: 合計バイト数
|
46 |
"""
|
47 |
# 各データ型とその乗数の対応表
|
48 |
+
total_bytes = 0
|
49 |
+
for precision, multiplier in MULTIPLIERS.items():
|
50 |
+
count = parameters.get(precision, 0)
|
51 |
+
total_bytes += count * multiplier
|
52 |
+
return total_bytes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
53 |
|
54 |
def estimate_gpu_memory(model_name: str) -> str:
|
55 |
"""
|
56 |
+
指定したモデル名からAPI情報を取得し、safetensors内の各精度パラメータサイズの合算値から
|
57 |
+
GPUメモリ必要量を概算する。
|
58 |
+
|
59 |
+
:param model_name: モデル名
|
60 |
+
:return: GPUメモリ必要量などの情報を含むメッセージ文字列
|
61 |
"""
|
62 |
+
result_lines = []
|
63 |
+
|
64 |
model_info = get_model_api_info(model_name)
|
65 |
if model_info is None:
|
66 |
+
result_lines.append(f"エラー: モデル '{model_name}' の情報が取得できませんでした。")
|
67 |
+
return "\n".join(result_lines)
|
68 |
|
69 |
# リポジトリ全体のファイルサイズ(参考)
|
70 |
usedStorage = model_info.get("usedStorage")
|
|
|
74 |
|
75 |
# safetensorsの情報が見つからない場合
|
76 |
if not safetensors or "parameters" not in safetensors:
|
77 |
+
result_lines.append("safetensorsの情報が見つかりません。")
|
78 |
if usedStorage_gb is not None:
|
79 |
+
result_lines.append("")
|
80 |
+
result_lines.append(f"参考までに、該当リポジトリのファイルサイズは合計 {usedStorage_gb:.2f} GBです。")
|
81 |
+
result_lines.append(f"仮にこれを全てモデルサイズとして推論時(1.5倍)、トレーニング時(4倍)の補正を適用すると概算GPUメモリ必要量は")
|
82 |
+
result_lines.append(f"【推論】約 {usedStorage_gb * 1.5:.2f} GB")
|
83 |
+
result_lines.append(f"【トレーニング】約 {usedStorage_gb * 4:.2f} GB")
|
84 |
+
result_lines.append("となります。")
|
85 |
+
return "\n".join(result_lines)
|
86 |
|
87 |
# safetensorsの情報がある場合
|
88 |
parameters = safetensors["parameters"]
|
89 |
estimated_bytes = sum_precision_sizes(parameters)
|
90 |
estimated_gb = estimated_bytes / (1024 ** 3)
|
91 |
|
92 |
+
result_lines.append(f"モデル '{model_name}' のsafetensors情報より、各パラメータ数は")
|
93 |
|
94 |
+
# 各精度ごとのパラメータ数の出力
|
95 |
+
for precision in PRECISION_KEYS:
|
96 |
+
if precision in parameters:
|
97 |
+
result_lines.append(f"【{precision}】 {parameters[precision]:,}")
|
98 |
|
99 |
+
result_lines.append(f"これらを合算するとモデルのパラメータサイズは約 {estimated_gb:.2f} GB です。")
|
100 |
+
result_lines.append("")
|
101 |
+
result_lines.append(f"推論時(1.5倍)、トレーニング時(4倍)の補正を適用すると概算GPUメモリ必要量は")
|
102 |
+
result_lines.append(f"【推論】約 {estimated_gb * 1.5:.2f} GB")
|
103 |
+
result_lines.append(f"【トレーニング】約 {estimated_gb * 4:.2f} GB")
|
104 |
+
result_lines.append("となります。")
|
105 |
|
106 |
if usedStorage_gb is not None:
|
107 |
+
result_lines.append("")
|
108 |
+
result_lines.append(f"参考: 該当リポジトリのファイルサイズは合計 {usedStorage_gb:.2f} GB")
|
109 |
+
|
110 |
+
return "\n".join(result_lines)
|
111 |
|
112 |
# Gradio インターフェースの定義
|
113 |
iface = gr.Interface(
|