Skip to content

Commit 199a36d

Browse files
authored
add pagination to viz [pr] (tinygrad#8794)
* add pagination to viz [pr] * work * lint
1 parent ba17786 commit 199a36d

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

tinygrad/viz/index.html

+25-1
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,13 @@
193193
border-radius: 8px;
194194
padding: 8px;
195195
}
196+
.progress {
197+
font-size: 20px;
198+
z-index: 2;
199+
align-self: center;
200+
justify-content: center;
201+
width: 100%;
202+
}
196203
</style>
197204
</head>
198205
<body>
@@ -204,6 +211,7 @@
204211
<a class="btn nav-btn" href="/profiler">Profiler</a>
205212
</div>
206213
<div class="container kernel-list-parent"><div class="container kernel-list"></div></div>
214+
<p class="progress"></p>
207215
<div class="graph">
208216
<svg id="graph-svg">
209217
<g id="render"></g>
@@ -347,7 +355,23 @@
347355
ret = cache[cacheKey];
348356
}
349357
else {
350-
ret = await (await fetch(`/kernels?kernel=${currentKernel}&idx=${currentUOp}`)).json();
358+
const p = document.querySelector(".progress");
359+
const limit = 100;
360+
const pageCount = Math.ceil((kernels[currentKernel][1][currentUOp].match_count+1)/limit);
361+
p.style.display = pageCount == 1 ? "none" : "flex";
362+
for (let i=0; i < pageCount; i++) {
363+
p.innerText = `fetching data ${i+1}/${pageCount}`;
364+
const chunk = await (await fetch(`/kernels?kernel=${currentKernel}&idx=${currentUOp}&offset=${i*limit}&limit=${limit}`)).json();
365+
if (i === 0) ret = chunk
366+
else {
367+
// TODO: this shouldn't exist after the viz api refactor
368+
for (const [k,v] of Object.entries(chunk)) {
369+
if (["uops", "graphs"].includes(k)) v.splice(0, 1);
370+
if (Array.isArray(v) && k !== "loc") ret[k].push(...v);
371+
}
372+
}
373+
}
374+
p.style.display = "none";
351375
cache[cacheKey] = ret;
352376
}
353377
renderGraph(ret.graphs[currentRewrite], currentRewrite == 0 ? [] : ret.changed_nodes[currentRewrite-1]);

tinygrad/viz/serve.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ def get_metadata(keys:list[Any], contexts:list[list[TrackedGraphRewrite]]) -> li
6666

6767
@functools.lru_cache(None)
6868
def _prg(k:Kernel): return k.to_program().src
69-
def get_details(k:Any, ctx:TrackedGraphRewrite, metadata:GraphRewriteMetadata) -> GraphRewriteDetails:
69+
def get_details(k:Any, ctx:TrackedGraphRewrite, metadata:GraphRewriteMetadata, offset=0, limit=200) -> GraphRewriteDetails:
7070
ret:GraphRewriteDetails = {"uops":[pcall(str, sink:=ctx.sink)], "graphs":[uop_to_json(sink)], "code_line":lines(ctx.loc[0])[ctx.loc[1]-1].strip(),
7171
"kernel_code":pcall(_prg, k) if isinstance(k, Kernel) else None, "diffs":[], "upats":[], "changed_nodes":[], **metadata}
7272
replaces: dict[UOp, UOp] = {}
73-
for i,(u0,u1,upat) in enumerate(tqdm(ctx.matches)):
73+
for i,(u0,u1,upat) in enumerate(tqdm(ctx.matches[offset:offset+limit])):
7474
replaces[u0] = u1
7575
new_sink = sink.substitute(replaces)
7676
ret["graphs"].append(new_sink_js:=uop_to_json(new_sink))
@@ -127,10 +127,10 @@ def do_GET(self):
127127
if url.path.endswith(".css"): content_type = "text/css"
128128
except FileNotFoundError: status_code = 404
129129
elif url.path == "/kernels":
130-
query = parse_qs(url.query)
131-
if (qkernel:=query.get("kernel")) is not None:
132-
kidx, ridx = int(qkernel[0]), int(query["idx"][0])
133-
jret:Any = get_details(contexts[0][kidx], contexts[1][kidx][ridx], kernels[int(qkernel[0])][1][int(query["idx"][0])])
130+
if "kernel" in (query:=parse_qs(url.query)):
131+
def getarg(k:str,default=0): return int(query[k][0]) if k in query else default
132+
kidx, ridx = getarg("kernel"), getarg("idx")
133+
jret:Any = get_details(contexts[0][kidx], contexts[1][kidx][ridx], kernels[kidx][1][ridx], getarg("offset", 0), getarg("limit", 200))
134134
else: jret = kernels
135135
ret, content_type = json.dumps(jret).encode(), "application/json"
136136
elif url.path == "/get_profile" and perfetto_profile is not None: ret, content_type = perfetto_profile, "application/json"

0 commit comments

Comments
 (0)