hiaripc commited on
Commit
d5bbae7
·
1 Parent(s): aac01d9
Files changed (1) hide show
  1. app.js +216 -0
app.js ADDED
@@ -0,0 +1,216 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // =====================================================
2
+ // SweetSpot analytical model
3
+ // =====================================================
4
+
5
+
6
+ const THETA0 = -2.100e-3;
7
+ const THETA1 = 3.419e-11;
8
+ const THETA2 = 1.010e-9;
9
+ const THETA3 = 5.550e-10;
10
+ const THETA4 = 2.045e-7;
11
+
12
+
13
+ function computeEnergy(d,L,nq,nkv,nin,nout)
14
+ {
15
+
16
+ const ratio = nkv/nq;
17
+
18
+ let total=[];
19
+
20
+ for (let n of nout)
21
+ {
22
+ let value =
23
+ THETA0
24
+ +
25
+ d*L*(
26
+ THETA1*d*(nin/n)
27
+ +
28
+ ratio*(THETA2*nin + THETA3*n)
29
+ +
30
+ THETA4
31
+ );
32
+
33
+ total.push(value);
34
+ }
35
+
36
+ return total;
37
+ }
38
+
39
+
40
+
41
+ function logspace2(start,end,points)
42
+ {
43
+ let arr=[];
44
+
45
+ let a=Math.log2(start);
46
+ let b=Math.log2(end);
47
+
48
+ for(let i=0;i<points;i++)
49
+ {
50
+ let x=a+(b-a)*i/(points-1);
51
+ arr.push(2**x);
52
+ }
53
+
54
+ return arr;
55
+ }
56
+
57
+
58
+
59
+ function draw()
60
+ {
61
+
62
+ let d =
63
+ Number(document.getElementById("d").value);
64
+
65
+ let L =
66
+ Number(document.getElementById("L").value);
67
+
68
+ let nq =
69
+ Number(document.getElementById("nq").value);
70
+
71
+ let nkv =
72
+ Number(document.getElementById("nkv").value);
73
+
74
+ let nin =
75
+ Number(document.getElementById("nin").value);
76
+
77
+
78
+ let nout =
79
+ logspace2(1,4096,300);
80
+
81
+
82
+ let energy =
83
+ computeEnergy(
84
+ d,L,nq,nkv,nin,nout
85
+ );
86
+
87
+
88
+ let trace = {
89
+ x:nout,
90
+ y:energy,
91
+ mode:"lines",
92
+ name:"Total E_tok"
93
+ };
94
+
95
+
96
+ let layout={
97
+
98
+ title:
99
+ `d=${d}, L=${L}, nq=${nq}, nkv=${nkv}, nin=${nin}`,
100
+
101
+ xaxis:{
102
+ title:"Output tokens",
103
+ type:"log"
104
+ },
105
+
106
+ yaxis:{
107
+ title:"Energy per token (J)"
108
+ }
109
+
110
+ };
111
+
112
+
113
+ Plotly.newPlot(
114
+ "plot",
115
+ [trace],
116
+ layout
117
+ );
118
+
119
+ }
120
+
121
+
122
+
123
+ async function loadModel()
124
+ {
125
+
126
+ let repo =
127
+ document.getElementById("repo").value.trim();
128
+
129
+
130
+ if(!repo.includes("/"))
131
+ {
132
+ alert("Use org/model format");
133
+ return;
134
+ }
135
+
136
+
137
+ let url =
138
+ `https://huggingface.co/${repo}/resolve/main/config.json`;
139
+
140
+
141
+ try
142
+ {
143
+
144
+ let response =
145
+ await fetch(url);
146
+
147
+
148
+ if(!response.ok)
149
+ throw Error("Cannot load config");
150
+
151
+
152
+ let cfg =
153
+ await response.json();
154
+
155
+
156
+ let d =
157
+ cfg.hidden_size ||
158
+ cfg.d_model ||
159
+ cfg.n_embd;
160
+
161
+
162
+ let L =
163
+ cfg.num_hidden_layers ||
164
+ cfg.num_layers ||
165
+ cfg.n_layer;
166
+
167
+
168
+ let nq =
169
+ cfg.num_attention_heads ||
170
+ cfg.n_head;
171
+
172
+
173
+ let nkv =
174
+ cfg.num_key_value_heads ||
175
+ nq;
176
+
177
+
178
+ document.getElementById("d").value=d;
179
+ document.getElementById("L").value=L;
180
+ document.getElementById("nq").value=nq;
181
+ document.getElementById("nkv").value=nkv;
182
+
183
+
184
+ document.getElementById("status").innerHTML =
185
+ `
186
+ Loaded ${repo}<br>
187
+ d=${d},
188
+ L=${L},
189
+ nq=${nq},
190
+ nkv=${nkv}
191
+ `;
192
+
193
+
194
+ draw();
195
+
196
+ }
197
+ catch(e)
198
+ {
199
+ document.getElementById("status").innerHTML =
200
+ "Error: "+e.message;
201
+ }
202
+
203
+ }
204
+
205
+
206
+
207
+ // redraw when sliders change
208
+
209
+ document
210
+ .querySelectorAll("input[type=number]")
211
+ .forEach(
212
+ x=>x.addEventListener("change",draw)
213
+ );
214
+
215
+
216
+ draw();