Connie-Wild commited on
Commit
c333905
·
1 Parent(s): 5b6c127

First Commit

Browse files
Files changed (1) hide show
  1. app.py +93 -0
app.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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"https://huggingface.co/api/models/{model_name}"
9
+ response = requests.get(api_url)
10
+ if response.status_code != 200:
11
+ return None
12
+ return response.json()
13
+
14
+ def sum_precision_sizes(parameters: dict) -> int:
15
+ """
16
+ parameters 辞書から、キーがあれば対応表に合わせて合算する
17
+ """
18
+ # 各データ型とその乗数の対応表
19
+ multipliers = {
20
+ "U8": 1,
21
+ "I8": 1,
22
+ "F8_E5M2": 1,
23
+ "F8_E4M3": 1,
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を呼び出し、safetensors内の各精度のサイズを合算して、
40
+ 補正後に必要なGPUメモリ量を GB 単位で概算して返す。
41
+ """
42
+ model_info = get_model_api_info(model_name)
43
+ if model_info is None:
44
+ return f"エラー: モデル '{model_name}' の情報が取得できませんでした。"
45
+
46
+ # リポジトリ全体のファイルサイズ(参考)
47
+ usedStorage = model_info.get("usedStorage")
48
+ usedStorage_gb = usedStorage / (1024 ** 3) if usedStorage else None
49
+
50
+ safetensors = model_info.get("safetensors")
51
+
52
+ # safetensorsの情報が見つからない場合
53
+ if not safetensors or "parameters" not in safetensors:
54
+ result = "safetensors の情報が見つかりません。\n"
55
+ if usedStorage_gb is not None:
56
+ result += (f"\n参考: 該当リポジトリのファイルサイズは合計 {usedStorage_gb:.2f} GB \n"
57
+ f"仮にこれを全てモデルサイズとして推論時(1.5倍)、トレーニング時(4倍)の補正を適用すると概算GPUメモリ必要量は\n"
58
+ f"【推論】約 {usedStorage_gb * 1.5:.2f} GB \n"
59
+ f"【トレーニング】約 {usedStorage_gb* 4:.2f} GB \n"
60
+ f"となります。")
61
+ return result
62
+
63
+ # safetensorsの情報がある場合
64
+ parameters = safetensors["parameters"]
65
+ estimated_bytes = sum_precision_sizes(parameters)
66
+ estimated_gb = estimated_bytes / (1024 ** 3)
67
+
68
+ result = f"モデル '{model_name}' のsafetensors情報より、各パラメータ数は\n"
69
+
70
+ keys = ["U8", "I8", "F8_E5M2", "F8_E4M3", "I16", "U16", "F16", "BF16", "I32", "U32", "F32", "F64", "I64", "U64"]
71
+ lines = [f"【{key}】{parameters[key]:,}" for key in keys if key in parameters]
72
+ result += "\n".join(lines) + "\n"
73
+
74
+ result += (f"これらを合算するとモデルのパラメータサイズは約 {estimated_gb:.2f} GB です。\n\n"
75
+ f"推論時(1.5倍)、トレーニング時(4倍)の補正を適用すると概算GPUメモリ必要量は\n"
76
+ f"【推論】約 {estimated_gb * 1.5:.2f} GB \n"
77
+ f"【トレーニング】約 {estimated_gb * 4:.2f} GB \n"
78
+ f"となります。\n")
79
+
80
+ if usedStorage_gb is not None:
81
+ result += f"参考: 該当リポジトリのファイルサイズは合計 {usedStorage_gb:.2f} GB"
82
+ return result
83
+
84
+ # Gradio インターフェースの定義
85
+ iface = gr.Interface(
86
+ fn=estimate_gpu_memory,
87
+ inputs=gr.Textbox(label="モデル名 (例: meta-llama/Llama-3.3-70B-Instruct)"),
88
+ outputs="text",
89
+ title="Model memory estimator",
90
+ description=("Hugging Face Hub APIの返り値に含まれるsafetensors情報から各パラメータサイズを合算し、概算GPUメモリ必要量をGB単位で返します。")
91
+ )
92
+
93
+ iface.launch()