inferencekit-cli 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- inferencekit/__init__.py +9 -0
- inferencekit/__main__.py +5 -0
- inferencekit/analysis/__init__.py +1 -0
- inferencekit/analysis/ncu_csv.py +284 -0
- inferencekit/analysis/nsys_sqlite.py +518 -0
- inferencekit/canonical.py +104 -0
- inferencekit/checkpoint.py +396 -0
- inferencekit/cli.py +274 -0
- inferencekit/cuda/bw_peak.cu +252 -0
- inferencekit/cuda/torch_bw.py +60 -0
- inferencekit/engines/__init__.py +7 -0
- inferencekit/engines/adapters.py +190 -0
- inferencekit/engines/clip/__init__.py +13 -0
- inferencekit/engines/clip/comfyui.py +749 -0
- inferencekit/engines/clip/diffusers_ltx.py +601 -0
- inferencekit/engines/clip/noise.py +46 -0
- inferencekit/engines/clip/official_ltx.py +316 -0
- inferencekit/engines/clip/server.py +542 -0
- inferencekit/engines/clip/stepdump.py +182 -0
- inferencekit/engines/gates.py +94 -0
- inferencekit/engines/sglang_worker.py +86 -0
- inferencekit/engines/vllm_worker.py +129 -0
- inferencekit/evidence.py +427 -0
- inferencekit/gpuinfo.py +93 -0
- inferencekit/hardware.py +135 -0
- inferencekit/mcp_server.py +178 -0
- inferencekit/ops/__init__.py +30 -0
- inferencekit/ops/bench.py +184 -0
- inferencekit/ops/bench_audio.py +384 -0
- inferencekit/ops/bench_clip.py +819 -0
- inferencekit/ops/bench_image.py +393 -0
- inferencekit/ops/bench_rounds.py +297 -0
- inferencekit/ops/bench_serve.py +866 -0
- inferencekit/ops/ceiling.py +135 -0
- inferencekit/ops/compare.py +378 -0
- inferencekit/ops/correctness.py +153 -0
- inferencekit/ops/doctor.py +486 -0
- inferencekit/ops/gates.py +1772 -0
- inferencekit/ops/gates_clip.py +930 -0
- inferencekit/ops/intake.py +1321 -0
- inferencekit/ops/ledger.py +749 -0
- inferencekit/ops/manifest.py +309 -0
- inferencekit/ops/ncu.py +183 -0
- inferencekit/ops/nsys.py +224 -0
- inferencekit/ops/prompts.py +316 -0
- inferencekit/ops/quality.py +2161 -0
- inferencekit/ops/quality_clip.py +690 -0
- inferencekit/ops/quality_clip_steps.py +341 -0
- inferencekit/ops/report.py +317 -0
- inferencekit/ops/review.py +119 -0
- inferencekit/ops/rocprof.py +89 -0
- inferencekit/ops/roofline.py +392 -0
- inferencekit/ops/store.py +61 -0
- inferencekit/proc.py +172 -0
- inferencekit/prompts/ATTRIBUTION.md +56 -0
- inferencekit/prompts/__init__.py +167 -0
- inferencekit/prompts/build.py +518 -0
- inferencekit/prompts/dev-load.jsonl.gz +0 -0
- inferencekit/prompts/dev-load.manifest.json +212 -0
- inferencekit/prompts/dev.jsonl.gz +0 -0
- inferencekit/prompts/dev.manifest.json +214 -0
- inferencekit/prompts/exclusions.json +54 -0
- inferencekit/quality/__init__.py +23 -0
- inferencekit/quality/client.py +66 -0
- inferencekit/quality/data/gsm8k_LICENSE.txt +21 -0
- inferencekit/quality/fake.py +329 -0
- inferencekit/quality/gsm8k.py +224 -0
- inferencekit/quality/logprobs.py +106 -0
- inferencekit/quality/metrics.py +235 -0
- inferencekit/quality/niah.py +63 -0
- inferencekit/quality/parquet.py +296 -0
- inferencekit/quality/sampling.py +262 -0
- inferencekit/quality/step_replay.py +217 -0
- inferencekit/quality/video_metrics.py +304 -0
- inferencekit/registry.py +206 -0
- inferencekit/review/__init__.py +6 -0
- inferencekit/review/diff.py +163 -0
- inferencekit/review/media.py +181 -0
- inferencekit/review/page.py +920 -0
- inferencekit/review/rundir.py +844 -0
- inferencekit/roofline_headers.py +504 -0
- inferencekit/schemas/evidence.v1.json +130 -0
- inferencekit/schemas/evidence.v2.json +499 -0
- inferencekit/schemas/intake.v1.json +276 -0
- inferencekit/schemas/run-manifest.v1.json +118 -0
- inferencekit/serve/__init__.py +8 -0
- inferencekit/serve/audio_client.py +330 -0
- inferencekit/serve/client.py +446 -0
- inferencekit/serve/clip_client.py +351 -0
- inferencekit/serve/clip_rounds.py +429 -0
- inferencekit/serve/image_client.py +373 -0
- inferencekit/serve/loadgen.py +136 -0
- inferencekit/serve/metrics.py +203 -0
- inferencekit/serve/profiles.py +105 -0
- inferencekit/serve/prompts_io.py +125 -0
- inferencekit/serve/rounds.py +1111 -0
- inferencekit/serve/servers.py +897 -0
- inferencekit/stats.py +249 -0
- inferencekit_cli-0.1.0.dist-info/METADATA +233 -0
- inferencekit_cli-0.1.0.dist-info/RECORD +104 -0
- inferencekit_cli-0.1.0.dist-info/WHEEL +4 -0
- inferencekit_cli-0.1.0.dist-info/entry_points.txt +2 -0
- inferencekit_cli-0.1.0.dist-info/licenses/LICENSE +202 -0
- inferencekit_cli-0.1.0.dist-info/licenses/NOTICE +9 -0
inferencekit/stats.py
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"""Small, dependency-free statistics for benchmark rounds.
|
|
2
|
+
|
|
3
|
+
Benchmarks here produce few numbers (one per round, typically 5-30), so plain Python
|
|
4
|
+
is fast enough and keeps the logic easy to read. Randomness comes from
|
|
5
|
+
``random.Random(seed)`` and only through ``rng.random()``, whose sequence Python
|
|
6
|
+
guarantees to be reproducible for a given seed; so a CI computed today and next
|
|
7
|
+
year from the same data is identical.
|
|
8
|
+
|
|
9
|
+
Contents
|
|
10
|
+
quantile / nearest_rank two percentile conventions (interpolated / an actual sample)
|
|
11
|
+
percentile_ci 95% percentile interval from bootstrap replicates
|
|
12
|
+
bootstrap_ci CI of a percentile, resampling whole *units* (clusters)
|
|
13
|
+
paired_ratio_ci CI of median(candidate) / median(baseline), resampling pairs
|
|
14
|
+
unpaired_ratio_ci same without pairing, for runs that cannot be paired
|
|
15
|
+
rounds_for_power how many rounds would make the CI narrow enough for decide()
|
|
16
|
+
decide verdict for a comparison (improved / regressed / ...)
|
|
17
|
+
combine_claims PASS / FAIL / UNPROVEN / NOT RUN across several checks
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import math
|
|
23
|
+
import random
|
|
24
|
+
import statistics
|
|
25
|
+
from typing import Hashable, Iterable, Sequence
|
|
26
|
+
|
|
27
|
+
Z95 = 1.959964
|
|
28
|
+
DEFAULT_RESAMPLES = 10_000
|
|
29
|
+
# A CI counts as "powered" (narrow enough to support a "no change" call) when its
|
|
30
|
+
# half-width is at most this fraction of the practical threshold.
|
|
31
|
+
POWER_RATIO = 0.75
|
|
32
|
+
# rounds_for_power multiplies its 1/sqrt(n) estimate by this, so that most reruns (not
|
|
33
|
+
# half of them) come out powered. Calibrated by simulation through paired_ratio_ci +
|
|
34
|
+
# decide: 85-100% of reruns powered at most noise/drift mixes (tests/test_stats.py).
|
|
35
|
+
POWER_MARGIN = 2.0
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# --------------------------------------------------------------------------- percentiles
|
|
39
|
+
|
|
40
|
+
def quantile(xs: Sequence[float], p: float) -> float | None:
|
|
41
|
+
"""Linear-interpolated percentile (p in 0..100), the numpy default. For summaries."""
|
|
42
|
+
if not xs:
|
|
43
|
+
return None
|
|
44
|
+
v = sorted(xs)
|
|
45
|
+
k = (len(v) - 1) * p / 100.0
|
|
46
|
+
lo = int(math.floor(k))
|
|
47
|
+
hi = min(lo + 1, len(v) - 1)
|
|
48
|
+
return v[lo] + (v[hi] - v[lo]) * (k - lo)
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def nearest_rank(sorted_xs: Sequence[float], p: float) -> float | None:
|
|
52
|
+
"""Nearest-rank percentile: the smallest sample with at least p% of samples <= it.
|
|
53
|
+
|
|
54
|
+
Unlike interpolation, the answer is always a value that was actually observed,
|
|
55
|
+
which is what you want inside a bootstrap (no invented in-between values).
|
|
56
|
+
"""
|
|
57
|
+
n = len(sorted_xs)
|
|
58
|
+
if n == 0:
|
|
59
|
+
return None
|
|
60
|
+
rank = max(1, math.ceil(p / 100.0 * n))
|
|
61
|
+
return sorted_xs[min(rank, n) - 1]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def summarize(xs: Iterable[float]) -> dict:
|
|
65
|
+
"""n / median / p95 / min / max / mean of a list (None-free)."""
|
|
66
|
+
v = [float(x) for x in xs if x is not None]
|
|
67
|
+
if not v:
|
|
68
|
+
return {"n": 0}
|
|
69
|
+
return {"n": len(v), "median": statistics.median(v), "p95": quantile(v, 95), "min": min(v), "max": max(v),
|
|
70
|
+
"mean": sum(v) / len(v)}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def percentile_ci(replicates: Sequence[float]) -> tuple[float | None, float | None]:
|
|
74
|
+
"""95% percentile interval of bootstrap replicates.
|
|
75
|
+
|
|
76
|
+
With B sorted replicates the bounds are element floor(0.025 (B-1)) and
|
|
77
|
+
ceil(0.975 (B-1)): slightly conservative (never narrower than the exact quantiles).
|
|
78
|
+
NaN in any replicate means some resample had no defined value: the CI is undefined.
|
|
79
|
+
"""
|
|
80
|
+
reps = [float(r) for r in replicates]
|
|
81
|
+
if not reps or any(math.isnan(r) for r in reps):
|
|
82
|
+
return None, None
|
|
83
|
+
reps.sort()
|
|
84
|
+
b = len(reps)
|
|
85
|
+
return reps[int(0.025 * (b - 1))], reps[int(math.ceil(0.975 * (b - 1)))]
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _draw(rng: random.Random, k: int) -> int:
|
|
89
|
+
# rng.random() is the only stream Python guarantees reproducible across versions.
|
|
90
|
+
return min(int(rng.random() * k), k - 1)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# --------------------------------------------------------------------------- bootstrap CIs
|
|
94
|
+
|
|
95
|
+
def bootstrap_ci(values: Sequence[float], units: Sequence[Hashable] | None = None, ps: Sequence[float] = (50,),
|
|
96
|
+
resamples: int = DEFAULT_RESAMPLES, seed: int = 0) -> dict[float, tuple[float | None, float | None]]:
|
|
97
|
+
"""95% CI of nearest-rank percentiles ``ps`` of ``values``, by cluster bootstrap.
|
|
98
|
+
|
|
99
|
+
``units[i]`` names the resampling unit of ``values[i]``. Values that share a unit
|
|
100
|
+
(e.g. all per-token latencies of one round) are correlated, so resampling them
|
|
101
|
+
one by one would understate the uncertainty. Instead each resample draws whole
|
|
102
|
+
units with replacement (as many draws as there are units) and keeps every value
|
|
103
|
+
of every drawn unit. With ``units=None`` each value is its own unit (ordinary
|
|
104
|
+
bootstrap). Returns ``{p: (lo, hi)}``; ``(None, None)`` with < 2 values or units.
|
|
105
|
+
"""
|
|
106
|
+
if units is None:
|
|
107
|
+
units = list(range(len(values)))
|
|
108
|
+
by_unit: dict[Hashable, list[float]] = {}
|
|
109
|
+
for v, u in zip(values, units):
|
|
110
|
+
by_unit.setdefault(u, []).append(float(v))
|
|
111
|
+
groups = list(by_unit.values())
|
|
112
|
+
k = len(groups)
|
|
113
|
+
if len(values) < 2 or k < 2 or resamples <= 0:
|
|
114
|
+
return {p: (None, None) for p in ps}
|
|
115
|
+
rng = random.Random(seed)
|
|
116
|
+
reps: dict[float, list[float]] = {p: [] for p in ps}
|
|
117
|
+
for _ in range(resamples):
|
|
118
|
+
sample: list[float] = []
|
|
119
|
+
for _ in range(k):
|
|
120
|
+
sample.extend(groups[_draw(rng, k)])
|
|
121
|
+
sample.sort()
|
|
122
|
+
for p in ps:
|
|
123
|
+
reps[p].append(nearest_rank(sample, p))
|
|
124
|
+
return {p: percentile_ci(reps[p]) for p in ps}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def paired_ratio_ci(baseline: Sequence[float], candidate: Sequence[float], resamples: int = DEFAULT_RESAMPLES,
|
|
128
|
+
seed: int = 0) -> dict:
|
|
129
|
+
"""Ratio of medians, candidate / baseline, with a paired bootstrap 95% CI.
|
|
130
|
+
|
|
131
|
+
``baseline[i]`` and ``candidate[i]`` must come from the same round i (run back to
|
|
132
|
+
back). Resampling *pairs* keeps that link: anything that slowed round i for both
|
|
133
|
+
arms (a thermal dip, a noisy neighbour) moves numerator and denominator together
|
|
134
|
+
and largely cancels, which gives a narrower and more honest CI than resampling
|
|
135
|
+
the two arms independently.
|
|
136
|
+
"""
|
|
137
|
+
n = min(len(baseline), len(candidate))
|
|
138
|
+
base, cand = [float(x) for x in baseline[:n]], [float(x) for x in candidate[:n]]
|
|
139
|
+
out = {"n_pairs": n, "ratio": None, "ci95": (None, None), "log_ratio_sd": None}
|
|
140
|
+
if n == 0 or statistics.median(base) == 0:
|
|
141
|
+
return out
|
|
142
|
+
out["ratio"] = statistics.median(cand) / statistics.median(base)
|
|
143
|
+
logs = [math.log(c / b) for b, c in zip(base, cand) if b > 0 and c > 0]
|
|
144
|
+
out["log_ratio_sd"] = statistics.stdev(logs) if len(logs) > 1 else (0.0 if logs else None)
|
|
145
|
+
if n < 2:
|
|
146
|
+
return out
|
|
147
|
+
rng = random.Random(seed)
|
|
148
|
+
reps = []
|
|
149
|
+
for _ in range(resamples):
|
|
150
|
+
idx = [_draw(rng, n) for _ in range(n)]
|
|
151
|
+
mb = statistics.median([base[i] for i in idx])
|
|
152
|
+
mc = statistics.median([cand[i] for i in idx])
|
|
153
|
+
reps.append(mc / mb if mb > 0 else float("nan"))
|
|
154
|
+
out["ci95"] = percentile_ci(reps)
|
|
155
|
+
return out
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def unpaired_ratio_ci(baseline: Sequence[float], candidate: Sequence[float], resamples: int = DEFAULT_RESAMPLES,
|
|
159
|
+
seed: int = 0) -> dict:
|
|
160
|
+
"""Ratio of medians with each arm resampled independently (no pairing available)."""
|
|
161
|
+
base, cand = [float(x) for x in baseline], [float(x) for x in candidate]
|
|
162
|
+
out = {"n_baseline": len(base), "n_candidate": len(cand), "ratio": None, "ci95": (None, None)}
|
|
163
|
+
if not base or not cand or statistics.median(base) == 0:
|
|
164
|
+
return out
|
|
165
|
+
out["ratio"] = statistics.median(cand) / statistics.median(base)
|
|
166
|
+
if len(base) < 2 or len(cand) < 2:
|
|
167
|
+
return out
|
|
168
|
+
rng = random.Random(seed)
|
|
169
|
+
reps = []
|
|
170
|
+
for _ in range(resamples):
|
|
171
|
+
mb = statistics.median([base[_draw(rng, len(base))] for _ in base])
|
|
172
|
+
mc = statistics.median([cand[_draw(rng, len(cand))] for _ in cand])
|
|
173
|
+
reps.append(mc / mb if mb > 0 else float("nan"))
|
|
174
|
+
out["ci95"] = percentile_ci(reps)
|
|
175
|
+
return out
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
# --------------------------------------------------------------------------- power and verdicts
|
|
179
|
+
|
|
180
|
+
def rounds_for_power(n: int, half_width: float | None, threshold: float, power_ratio: float = POWER_RATIO,
|
|
181
|
+
margin: float = POWER_MARGIN) -> int | None:
|
|
182
|
+
"""Rounds per arm that would make decide() call the CI powered, from a pilot comparison.
|
|
183
|
+
|
|
184
|
+
``n`` rounds gave a CI with this ``half_width`` (decide()'s, on the ratio scale); the
|
|
185
|
+
target is ``power_ratio * threshold``. A CI's half-width shrinks like 1/sqrt(n), so
|
|
186
|
+
n * (half_width / target)^2 rounds would hit the target on average -- which means only
|
|
187
|
+
about half of the reruns would. ``margin`` (2x) buys a large majority.
|
|
188
|
+
|
|
189
|
+
Why not the textbook 1.96 * SD / sqrt(n) of per-pair log ratios: decide() tests a
|
|
190
|
+
bootstrap CI of a *ratio of medians*. A median is noisier than a mean (about 1.25x the
|
|
191
|
+
standard error for normal data), and slow drift cancels only partly when each arm's
|
|
192
|
+
median is taken on its own. Scaling the half-width of the very CI that decide() uses
|
|
193
|
+
includes both effects. (Simulated with 2-3% per-round noise: n from the textbook
|
|
194
|
+
formula came out powered in only 3-15% of reruns.) With fewer than about 5 pilot rounds
|
|
195
|
+
the estimate is rough.
|
|
196
|
+
"""
|
|
197
|
+
if half_width is None or n < 1 or not threshold:
|
|
198
|
+
return None
|
|
199
|
+
target = power_ratio * abs(threshold)
|
|
200
|
+
return max(2, int(math.ceil(margin * n * (half_width / target) ** 2 - 1e-9)))
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def decide(ratio: float | None, lo: float | None, hi: float | None, threshold: float, higher_is_better: bool,
|
|
204
|
+
power_ratio: float = POWER_RATIO) -> dict:
|
|
205
|
+
"""Turn a ratio CI into ``improved | regressed | within_noise | inconclusive``.
|
|
206
|
+
|
|
207
|
+
Work with g = the ratio oriented so that g > 1 is better. The checks run in this
|
|
208
|
+
order and the first that applies wins:
|
|
209
|
+
1. no ratio or no CI -> inconclusive (no data)
|
|
210
|
+
2. CI entirely below 1 and g <= 1 - threshold -> regressed
|
|
211
|
+
3. CI entirely above 1 and g >= 1 + threshold -> improved
|
|
212
|
+
4. CI inside [1 - threshold, 1 + threshold] and powered -> within_noise
|
|
213
|
+
5. anything else -> inconclusive
|
|
214
|
+
"Powered" means the CI half-width is at most power_ratio x threshold: a CI that
|
|
215
|
+
happens to sit inside the band but is nearly as wide as it is not evidence of
|
|
216
|
+
"no change"; more rounds are needed.
|
|
217
|
+
"""
|
|
218
|
+
if ratio is None or lo is None or hi is None or ratio <= 0 or lo <= 0:
|
|
219
|
+
return {"verdict": "inconclusive", "reason": "no ratio or no confidence interval (need >= 2 rounds per arm)"}
|
|
220
|
+
if higher_is_better:
|
|
221
|
+
g, g_lo, g_hi = ratio, lo, hi
|
|
222
|
+
else: # invert so that "faster" (smaller latency) is still g > 1
|
|
223
|
+
g, g_lo, g_hi = 1 / ratio, 1 / hi, 1 / lo
|
|
224
|
+
half_width = max(g - g_lo, g_hi - g)
|
|
225
|
+
powered = half_width <= power_ratio * threshold * (1 + 1e-9)
|
|
226
|
+
base = {"oriented_ratio": g, "oriented_ci95": [g_lo, g_hi], "half_width": half_width, "powered": powered}
|
|
227
|
+
if g_hi < 1 and g <= 1 - threshold:
|
|
228
|
+
return {**base, "verdict": "regressed", "reason": f"CI below 1 and change beyond -{threshold:.1%}"}
|
|
229
|
+
if g_lo > 1 and g >= 1 + threshold:
|
|
230
|
+
return {**base, "verdict": "improved", "reason": f"CI above 1 and change beyond +{threshold:.1%}"}
|
|
231
|
+
if g_lo >= 1 - threshold and g_hi <= 1 + threshold and powered:
|
|
232
|
+
return {**base, "verdict": "within_noise", "reason": f"CI inside +/-{threshold:.1%} and narrow enough"}
|
|
233
|
+
why = "CI too wide to decide" if not powered else "CI crosses the practical threshold"
|
|
234
|
+
return {**base, "verdict": "inconclusive", "reason": why}
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def combine_claims(verdicts: Iterable[str]) -> str:
|
|
238
|
+
"""Combine claim verdicts: any FAIL -> FAIL; else any UNPROVEN -> UNPROVEN; else PASS.
|
|
239
|
+
|
|
240
|
+
"NOT RUN" entries are ignored unless nothing else ran. Missing data is never a pass.
|
|
241
|
+
"""
|
|
242
|
+
vs = [v for v in verdicts if v != "NOT RUN"]
|
|
243
|
+
if not vs:
|
|
244
|
+
return "NOT RUN"
|
|
245
|
+
if "FAIL" in vs:
|
|
246
|
+
return "FAIL"
|
|
247
|
+
if "UNPROVEN" in vs:
|
|
248
|
+
return "UNPROVEN"
|
|
249
|
+
return "PASS"
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: inferencekit-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Make your model serve faster on your GPU, and prove it. Skills for Claude Code, Codex and OpenCode, plus a CLI and MCP server: your agent picks and tunes inference engines, can write GPU kernels, and backs every number with client-timed benchmarks, anti-cheat gates and quality checks.
|
|
5
|
+
Project-URL: Homepage, https://github.com/kittenml/inferencekit
|
|
6
|
+
Project-URL: Repository, https://github.com/kittenml/inferencekit
|
|
7
|
+
Project-URL: Issues, https://github.com/kittenml/inferencekit/issues
|
|
8
|
+
Author: Stellon Labs
|
|
9
|
+
License-Expression: Apache-2.0
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
License-File: NOTICE
|
|
12
|
+
Keywords: benchmarking,capacity,correctness,cuda,gpu,inference,llama.cpp,llm,mcp,nsight-compute,nsight-systems,nvidia,profiling,quantization,roofline,serving,sglang,tensorrt-llm,vllm
|
|
13
|
+
Classifier: Development Status :: 3 - Alpha
|
|
14
|
+
Classifier: Environment :: GPU :: NVIDIA CUDA
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
24
|
+
Classifier: Topic :: System :: Benchmark
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Requires-Dist: jsonschema>=4.20
|
|
27
|
+
Requires-Dist: pyyaml>=6.0
|
|
28
|
+
Provides-Extra: mcp
|
|
29
|
+
Requires-Dist: mcp<3,>=2.3; extra == 'mcp'
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
<div align="center">
|
|
33
|
+
|
|
34
|
+
# inferencekit
|
|
35
|
+
|
|
36
|
+
**Turn your coding agent into an inference engineer.**
|
|
37
|
+
|
|
38
|
+
inferencekit made Gemma 4 run 1.33× faster than tuned vLLM. Your model is next.
|
|
39
|
+
|
|
40
|
+
[](LICENSE)
|
|
41
|
+
[](https://pypi.org/project/inferencekit-cli/)
|
|
42
|
+
[](#install)
|
|
43
|
+
[](#install)
|
|
44
|
+
[](#install)
|
|
45
|
+
|
|
46
|
+
[Install](#install) · [How it works](#how-it-works) · [Results](#results) · [Features](#features) · [Engines](https://github.com/kittenml/inferencekit-engines) · [Roadmap](#roadmap) · [Contributing](CONTRIBUTING.md)
|
|
47
|
+
|
|
48
|
+

|
|
49
|
+
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
inferencekit is a plugin for Claude Code, Codex and OpenCode, plus a command-line tool (CLI). Give your agent a model, hardware and a goal. It finds, benchmarks and tunes supported inference engines for your workload. You can stop with the best tested configuration or go further with custom optimizations, including GPU kernels.
|
|
53
|
+
|
|
54
|
+
## How it works
|
|
55
|
+
|
|
56
|
+
inferencekit gives your agent the playbook and the tools of a senior inference engineer. On every run it works the problem the same way.
|
|
57
|
+
|
|
58
|
+
1. **Understand the task.** The agent first asks about your goal, deadline, budget and how much the results may change, reusing answers you already gave. It identifies the model, hardware and real inputs, then estimates memory, compute and launch costs per request. Text, image, audio and video use their own metrics and quality checks.
|
|
59
|
+
2. **Find and tune an engine.** It researches current implementations, then tunes and benchmarks supported engines (vLLM, SGLang, llama.cpp, TensorRT-LLM and others) for your workload on your hardware. The fastest tested configuration that meets your quality requirements can be the result, or the tuned baseline for further work.
|
|
60
|
+
3. **Find the bottleneck.** It selects the profiler for your hardware: Nsight on NVIDIA, ROCm tools on AMD, or Instruments and Metal on Apple. It measures the critical path and investigates memory, compute and launch costs, checking current vendor docs when support is uncertain.
|
|
61
|
+
4. **Investigate and implement, if requested.** Search current code, papers, compiler docs and engineering talks; inspect dispatch, IR and assembly when useful. Choose graph execution, fusion, matrix kernels, packing, state reuse or other techniques from measured bottlenecks. Independent implementations can run in parallel; integration and shared-device measurements stay isolated.
|
|
62
|
+
5. **Prove every step.** Every change gets a fast correctness check and a timed screen; milestones get the full proof: interleaved rounds against the tuned baseline, the anti-cheat gates and quality against a reference model. Changes that miss the agreed performance or quality requirements are reverted.
|
|
63
|
+
6. **Ship it.** You get the fastest proven configuration, its launch command, and a report with the commands that reproduce every number.
|
|
64
|
+
|
|
65
|
+
## When it asks you
|
|
66
|
+
|
|
67
|
+
The agent works on its own and stops only when it needs you:
|
|
68
|
+
|
|
69
|
+
- **Missing details.** If you didn't say which model, GPU or workload, it asks before it starts.
|
|
70
|
+
- **Your preferences.** Choose exactly the same results, small differences with the same quality, or speed with an agreed quality tradeoff. Set your goal, spending, deadline and check-ins; it reuses answers you already gave.
|
|
71
|
+
- **Model changes.** Permission to simplify the model is separate from permission to use stronger compression. Plans are optional: ask to see one if you want it.
|
|
72
|
+
- **The budget cap.** When the run reaches the cap you set, it stops and asks.
|
|
73
|
+
- **Things only you can give.** For example, permission to read the GPU's profiler counters, or a Hugging Face token for a gated model.
|
|
74
|
+
|
|
75
|
+
Everything else runs without asking. For a hands-off run, approve a budget with a cap up front (`non_interactive: true` and `budget.approved: true` in the intake file); the agent then writes its questions and the choices it made to `QUESTIONS.md` instead of waiting for you.
|
|
76
|
+
|
|
77
|
+
## Results
|
|
78
|
+
|
|
79
|
+
**Pushing speed on AMD:** with quality secondary, MOSS-Image-SFT reached **2.46×** faster image generation than the tested tuned vLLM-Omni baseline on a 16 GB RX 9070 XT.‡
|
|
80
|
+
|
|
81
|
+
Single-user decode for the language models; one clip at a time for video; single-user speech generation for Drama3.
|
|
82
|
+
|
|
83
|
+
| Engine | GPU | Speedup | Agent | Agent time | Tokens | Cost |
|
|
84
|
+
|---|---|---|---|---|---|---|
|
|
85
|
+
| [Gemma 4 26B-A4B (NVFP4)](https://github.com/kittenml/inferencekit-engines/tree/main/gemma-4-26b-a4b-nvfp4_rtx-5090) | RTX 5090 | **1.33×** vs tuned vLLM | Claude Opus 5.5 (high) | 19 h | 630M | $199 |
|
|
86
|
+
| [LTX-2.5 text-to-video](https://github.com/kittenml/inferencekit-engines/tree/main/ltx-2.5_rtx-pro-6000) | RTX PRO 6000 | **1.25×** vs ComfyUI | Claude Opus 5.5 (high) | 3.6 h | 47M | $18 |
|
|
87
|
+
| [Qwen3-8B (FP8)](https://github.com/kittenml/inferencekit-engines/tree/main/qwen3-8b-fp8_rtx-5090)* | RTX 5090 | **1.25×** vs vLLM | Claude Opus 5.5 (xhigh) | about 10 h | about 240M | about $125 |
|
|
88
|
+
| [Drama3 speech](https://github.com/haaziq-sl/inferencekit-engines/tree/main/drama-3_apple-m4-16gb/profiles/main5-tower5)† | Apple M4 (16 GB) | **1.112×** vs tuned MLX-Audio | GPT-6.1 Sol (high) | ~70 h elapsed | ~2.07B | ~$475 standard-rate equivalent |
|
|
89
|
+
| [MOSS-Image-SFT (FP8)](https://github.com/haaziq-sl/inferencekit-engines/tree/main/moss-image-sft_rx-9070-xt-fp8)‡ | RX 9070 XT (16 GB) | **2.46×** vs tuned vLLM-Omni | GPT-6.1 Terra (high) | ~19.6 h elapsed | ~1.80B | ~$206 standard-rate equivalent |
|
|
90
|
+
|
|
91
|
+
<sub>* Against vLLM with its default settings; neither side uses speculative decoding. † Drama3 used identical quantized weights and matched PCM audio, codes, chunks and completion in 144 fresh output pairs. Four paired timing rounds gave a 95% CI of 1.059×–1.156×. [Comparison details](https://github.com/haaziq-sl/inferencekit-engines/tree/main/drama-3_apple-m4-16gb/profiles/main5-tower5).</sub>
|
|
92
|
+
|
|
93
|
+
<sub>‡ Lossy speed-first experiment: FP8/24 steps vs BF16/50 steps; paired 95% CI **2.453–2.465×**, conservative lower bound **2.453×**. [Outputs, timing and accounting](https://github.com/haaziq-sl/inferencekit-engines/tree/main/moss-image-sft_rx-9070-xt-fp8/).</sub>
|
|
94
|
+
|
|
95
|
+
Time and tokens include setup, benchmarking, optimization, validation and reporting. Costs are API list-price estimates; most tokens are cached conversation reads. Drama3’s estimates cover direct agent work ([accounting](https://github.com/haaziq-sl/inferencekit-engines/blob/main/drama-3_apple-m4-16gb/ACCOUNTING_V65.json)). How each engine was built and measured: [inferencekit-engines](https://github.com/kittenml/inferencekit-engines).
|
|
96
|
+
|
|
97
|
+
## Speed you can trust
|
|
98
|
+
|
|
99
|
+
Fast is easy. Fast and still correct is the hard part, and it's the part agents skip.
|
|
100
|
+
|
|
101
|
+
Agents are good at finding speed. They're also good at finding fake speed: a cached answer, a shorter reply, a different video. inferencekit keeps only the speed that's real.
|
|
102
|
+
|
|
103
|
+
Without these checks, one agent thought its video engine was 2% faster, but it was rendering a completely different video. Another was sure it had a 1.12× speedup; measured again on a clean machine, its engine was 5% slower than where it started.
|
|
104
|
+
|
|
105
|
+
A speedup counts only when both engines pass every check that applies.
|
|
106
|
+
|
|
107
|
+
| A way to game a benchmark | What catches it |
|
|
108
|
+
|---|---|
|
|
109
|
+
| Answer repeated prompts from a cache | `caching`: a replayed prompt may not be over 10% faster; a prompt changed by one character may not get the old answer |
|
|
110
|
+
| Report more tokens than were made | `token_count`: the reported count must match the streamed tokens and the re-tokenized text |
|
|
111
|
+
| Stop early or cut answers short | `output_length`: with end-of-text ignored, every answer must be exactly the requested length |
|
|
112
|
+
| Drop rare tokens from the vocabulary | `rare_tokens`: random CJK text, emoji, long numbers and code names must come back exactly |
|
|
113
|
+
| Ignore sampling settings or fake probabilities | `hidden_probes`: temperature must change answers; probabilities must be valid |
|
|
114
|
+
| Use another chat template so prompts get shorter | Render check: every prompt must become the same number of tokens as on the baseline |
|
|
115
|
+
| Speculative decoding that changes answers | `spec_exact`: greedy answers must match the same engine with speculation off |
|
|
116
|
+
| Lower quality for speed | Quality vs a reference, GSM8K, per-step video check |
|
|
117
|
+
| Numbers that only hold on the agent's machine | Every run writes `manifest.json` with each engine's install and launch commands, so anyone can re-run it on a clean machine, on prompts sealed with `inferencekit prompts seal` that the agent never saw |
|
|
118
|
+
|
|
119
|
+
Each check ends PASS, FAIL, UNPROVEN (not enough evidence) or NOT RUN. A missing check is never a pass.
|
|
120
|
+
|
|
121
|
+
## Features
|
|
122
|
+
|
|
123
|
+
- **9 skills, 4 commands, 5 read-only subagents and an MCP server**, the same in every supported agent.
|
|
124
|
+
- **Speed-of-light ceilings:** measured memory bandwidth (`ceiling bw`) and exact bytes per token read from the checkpoint's safetensors headers (`roofline`), including NVFP4, FP8 and mixture-of-experts models.
|
|
125
|
+
- **Engine triage and tuning:** vLLM, SGLang, llama.cpp, TensorRT-LLM, ComfyUI, Diffusers and others. Only settings that the engine's own logs show in effect are counted.
|
|
126
|
+
- **Kernel work:** profiling routed by hardware, CUDA/HIP, Triton and Metal kernels, and torch.compile. The included engine skeleton targets NVIDIA CUDA.
|
|
127
|
+
- **One timer for every engine:** interleaved rounds in a balanced order, medians with 95% confidence intervals.
|
|
128
|
+
- **Anti-cheat gates:** caching, token counts, output length, rare tokens, sampling probes, prompt rendering, speculative-decoding exactness.
|
|
129
|
+
- **Quality checks:** reference quality and GSM8K for language models; latent and final-clip checks for video. Images and speech use client timing and structural checks plus an external semantic quality protocol; see [media benchmarks](docs/media-benchmarks.md).
|
|
130
|
+
- **Budget control:** spending authorized up front, with caps in hardware hours, dollars and elapsed time. No repeated plan approval inside the agreed scope.
|
|
131
|
+
- **Reproducible output:** a ranked table labelled PASS, FAIL, UNPROVEN or NOT RUN, a launch command, a review page and the commands that reproduce every number.
|
|
132
|
+
|
|
133
|
+
### Tools behind each step
|
|
134
|
+
|
|
135
|
+
| Step | Tools |
|
|
136
|
+
|---|---|
|
|
137
|
+
| Size the problem | `intake`, `doctor`, `ceiling bw`, `roofline` |
|
|
138
|
+
| Start from the best engine | `bench rounds`, `gates run`, `quality` |
|
|
139
|
+
| Find the bottleneck | `doctor` routes profiling; Nsight commands on NVIDIA, vendor tools on AMD/Apple |
|
|
140
|
+
| Pull the right levers, prove every step | `correctness`, `bench rounds`, `gates run`, `quality` |
|
|
141
|
+
| Ship it | `ledger`, `review`, `report` |
|
|
142
|
+
|
|
143
|
+
## Install
|
|
144
|
+
|
|
145
|
+
Requirements: [uv](https://docs.astral.sh/uv/) and Python 3.10 or newer. Install the engine runtime for your hardware. NVIDIA capture commands require CUDA and Nsight; AMD and Apple profiling uses vendor tools with separate evidence files. See [supported hardware](#supported-hardware-and-agents).
|
|
146
|
+
|
|
147
|
+
### Claude Code
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
claude plugin marketplace add kittenml/inferencekit
|
|
151
|
+
claude plugin install inferencekit@inferencekit
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Codex
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
codex plugin marketplace add kittenml/inferencekit
|
|
158
|
+
codex plugin add inferencekit@inferencekit
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### OpenCode
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
git clone --depth 1 https://github.com/kittenml/inferencekit ~/.local/share/inferencekit
|
|
165
|
+
python3 ~/.local/share/inferencekit/plugin/opencode/install.py
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
| Agent | Commands | Check the install |
|
|
169
|
+
|---|---|---|
|
|
170
|
+
| Claude Code | `/inferencekit:optimize-inference`, `/inferencekit:bench`, `/inferencekit:profile`, `/inferencekit:perf-report` | `claude plugin list`; `/mcp` lists the inferencekit server |
|
|
171
|
+
| Codex | same stages; subagent files are followed one at a time where Codex has no subagents | `codex plugin list`; `codex mcp list` |
|
|
172
|
+
| OpenCode | `/optimize-inference`, `/bench`, `/profile`, `/perf-report`, and each skill as `/<skill-name>` | `opencode mcp list` |
|
|
173
|
+
|
|
174
|
+
Updating, removing, per-project installs and OpenCode's options: [docs/install.md](docs/install.md).
|
|
175
|
+
|
|
176
|
+
## Try it
|
|
177
|
+
|
|
178
|
+
```text
|
|
179
|
+
/inferencekit:optimize-inference Qwen/Qwen3-8B-FP8 on 1x RTX 5090, fastest single-user decode, by 6h
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
To tune existing engines without custom kernels:
|
|
183
|
+
|
|
184
|
+
```text
|
|
185
|
+
/inferencekit:optimize-inference Tune vLLM and SGLang for my model and GPU using their built-in settings only; do not write custom kernels.
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
In OpenCode the command is `/optimize-inference`. It asks only for missing preferences and spending authorization; a plan is optional. For a repeatable setup, start from an intake file: `inferencekit intake template --out intake.yaml`, then `/inferencekit:optimize-inference intake.yaml`. For unattended runs, set `non_interactive: true` and `budget.approved: true` with a cap.
|
|
189
|
+
|
|
190
|
+
More things to ask for: [docs/examples.md](docs/examples.md).
|
|
191
|
+
|
|
192
|
+
## CLI and MCP server
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
uv tool install "inferencekit-cli==0.1.0"
|
|
196
|
+
inferencekit doctor # GPU, driver, CUDA, profiler access
|
|
197
|
+
inferencekit gates run --base-url http://127.0.0.1:8000 # anti-cheat gates on any OpenAI-compatible server
|
|
198
|
+
uvx --from 'inferencekit-cli[mcp]==0.1.0' inferencekit mcp serve # MCP server (stdio) for any MCP client
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Every CLI command is also an MCP tool with the same arguments. Text benchmarks, gates and quality checks talk HTTP to OpenAI-compatible servers. Image and streamed speech measurements use the [media adapter contracts](docs/media-benchmarks.md).
|
|
202
|
+
|
|
203
|
+
## Supported hardware and agents
|
|
204
|
+
|
|
205
|
+
| | Status | Run end to end |
|
|
206
|
+
|---|---|---|
|
|
207
|
+
| NVIDIA GPUs (CUDA) | Full tool set | Yes: RTX 5090, RTX PRO 6000 |
|
|
208
|
+
| AMD ROCm GPUs, Apple silicon | Hardware discovery and vendor profiling guidance; HTTP benchmarks; vendor bandwidth/captures collected externally | RX 9070 XT and Apple M4 case studies above |
|
|
209
|
+
| x86 CPUs | Skills and HTTP benchmarks; platform profiling collected externally | No |
|
|
210
|
+
| ARM CPUs | Not covered | No |
|
|
211
|
+
| Language models | Benchmarks, gates, GSM8K, quality vs a reference | Yes |
|
|
212
|
+
| Text-to-video | Per-clip timing, per-step check, final-clip PSNR | Yes |
|
|
213
|
+
| Text-to-image | Client-timed decoded images and structural checks; external quality proof required | No |
|
|
214
|
+
| Speech models | Client-timed streamed PCM, first-signal latency, RTF and underruns; external quality proof required | No |
|
|
215
|
+
| Claude Code | Supported | Yes |
|
|
216
|
+
| Codex, OpenCode | Install paths and CI install checks | No |
|
|
217
|
+
|
|
218
|
+
Profiles and logs can contain environment variables, host names and paths: scan them before you share them.
|
|
219
|
+
|
|
220
|
+
## Roadmap
|
|
221
|
+
|
|
222
|
+
- **More hardware:** H100, H200, B200, RTX 4090, Intel GPUs and Jetson, with the hardware tools (`doctor`, `ceiling bw`, profiling) for each.
|
|
223
|
+
- **More models and modalities:** speech (TTS and STT), image, more video models.
|
|
224
|
+
- **Multi-user serving:** published results for many users at once (load sweeps), not just one user at a time.
|
|
225
|
+
- **OpenCode end to end.**
|
|
226
|
+
|
|
227
|
+
## Contributing
|
|
228
|
+
|
|
229
|
+
We welcome bug reports, engine settings and new skills. See [CONTRIBUTING.md](CONTRIBUTING.md). Develop with `uv sync --all-extras`, then `uv run --all-extras pytest -q` (no GPU needed). Report security problems privately: [SECURITY.md](SECURITY.md).
|
|
230
|
+
|
|
231
|
+
## License
|
|
232
|
+
|
|
233
|
+
Apache-2.0: [LICENSE](LICENSE) and [NOTICE](NOTICE). Copyright 2026 Stellon Labs. inferencekit is an independent project, not affiliated with NVIDIA, any engine project or any model publisher. Product and model names belong to their owners. Every result holds for the GPU, driver, engine version, model and workload it was measured on; change any of them and the numbers can change. The software comes with no warranty, as the Apache-2.0 licence states, and you are responsible for the cost of any GPU time you use with it.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
inferencekit/__init__.py,sha256=PJmV9jtnKhDfQa9G90COALhzphb0ki25xKjSblnG-qU,378
|
|
2
|
+
inferencekit/__main__.py,sha256=7i0SjFFDvEJVQuG69KjaoiDdQ7GthDgLM5JBaKrPJvQ,149
|
|
3
|
+
inferencekit/canonical.py,sha256=UOKPEblWi--MqN9KYSctu5Y_loWyV9rN8EKcYH-z26g,4187
|
|
4
|
+
inferencekit/checkpoint.py,sha256=mIKBWz_kg4zcQxNt8rLjhkk2kslrbtmfZg6kZt8M4dk,16602
|
|
5
|
+
inferencekit/cli.py,sha256=jt_t1-3udOXWt3-Qz3oFJiPeLxaxmmRuR5bNrcr1X-Q,13336
|
|
6
|
+
inferencekit/evidence.py,sha256=gRhxNJtNinQ0bXr4zteBEqoqikr5Wfs2OrW5tV4gQ8Y,18864
|
|
7
|
+
inferencekit/gpuinfo.py,sha256=RJuv5UpeYW4o0VBnzv9TgfNErF4zOdVLzyGiR2xsXuk,3600
|
|
8
|
+
inferencekit/hardware.py,sha256=fHTq-VmSp3UxTZl4PUlJFhN7ZeDT1SO6vZQ57c9g3pI,6592
|
|
9
|
+
inferencekit/mcp_server.py,sha256=RIp7L4l_AU7qnjTV1ftHpfxGA7X8YitHRFvF5vWmFAg,8944
|
|
10
|
+
inferencekit/proc.py,sha256=llS8tKL7Cgv8zHASmRc879DHUno0kroi-aaNmYd1z5c,8144
|
|
11
|
+
inferencekit/registry.py,sha256=xf3NzzXM0lqnYQQNQLSZTibZt6xUd8hwWzshOAZ8ieI,7587
|
|
12
|
+
inferencekit/roofline_headers.py,sha256=4U7Dv3SBO_mLbTTwSDJAGePEFLDO_ZsagzQZMrvmvEY,25598
|
|
13
|
+
inferencekit/stats.py,sha256=4Ow1aGdSQYdyohaIKtMRySO_A-gRN30VgUkMgMxFuAI,12045
|
|
14
|
+
inferencekit/analysis/__init__.py,sha256=PpsmjGnAkH22GjmMe2bY4BFU56YIW-mWjtJuPUSKPeE,98
|
|
15
|
+
inferencekit/analysis/ncu_csv.py,sha256=MiIduu3QPN4c4dYxqFOJmK-DMFML6ibbCimHuKWm-jg,14417
|
|
16
|
+
inferencekit/analysis/nsys_sqlite.py,sha256=hVGNPfuJOuPSdp-rO6M9QnTyWy1Y2hpXYyywM6Dav-4,25901
|
|
17
|
+
inferencekit/cuda/bw_peak.cu,sha256=LkiVtN5Kawqad4KgiNp_Q_qSuJl8s5FzsOtTsKe2uko,11205
|
|
18
|
+
inferencekit/cuda/torch_bw.py,sha256=8VxbGCZ8jdoY_fBrYn7Kqc6_uXFHdkoDe3-mwiHdYkk,2524
|
|
19
|
+
inferencekit/engines/__init__.py,sha256=mRrlkPZ7CKwD2qsx8XIZxU0QEmWQj3Otq1BjFlXfPCw,353
|
|
20
|
+
inferencekit/engines/adapters.py,sha256=NGSrAKqeBbrfC8EuI8OMs7eOcmE4dygr93xD5bi8aCQ,9844
|
|
21
|
+
inferencekit/engines/gates.py,sha256=t9FDgheJyZiXHqy4i2W5gf4rUo7CRM1-d4T5Sge60t0,4929
|
|
22
|
+
inferencekit/engines/sglang_worker.py,sha256=JsF8qvDIjyBfcQBVl2b6HBbotcM4NuIEmJiVh1wRWrM,3602
|
|
23
|
+
inferencekit/engines/vllm_worker.py,sha256=zg34kpR7klRYjrmY-z__MCBSC0meuKkVhREyb9ilugE,5638
|
|
24
|
+
inferencekit/engines/clip/__init__.py,sha256=Eu9KiTRUoHLYT1Puqyd_i9L7F2WY2Aqu-vls1jVUe2s,879
|
|
25
|
+
inferencekit/engines/clip/comfyui.py,sha256=ts55pn1xF8RmcKsTGpITAh2_BfhNx4k6HCqdGKEhRdw,40169
|
|
26
|
+
inferencekit/engines/clip/diffusers_ltx.py,sha256=ap_bvVu3Ai08SeqyLIHqIdH23uzWI_dXRIxykMSQbfs,34596
|
|
27
|
+
inferencekit/engines/clip/noise.py,sha256=_jIqqfnJDtChjqbopOw7fS8GPGp0DlxGcDho6DfeBI0,2154
|
|
28
|
+
inferencekit/engines/clip/official_ltx.py,sha256=fOfz8_69xgYHsuscm-7uEyv3VZhIyY9OVcimFuCRvas,17747
|
|
29
|
+
inferencekit/engines/clip/server.py,sha256=nc5JCXJTMMALY-9yLzOwTN80LhwCtAEMoSCcQ0kVKzA,24501
|
|
30
|
+
inferencekit/engines/clip/stepdump.py,sha256=L_TQVvv3nolvwUY7W8fx67Dw_9fPoXkI8rMnMFERs_M,8698
|
|
31
|
+
inferencekit/ops/__init__.py,sha256=DAmvBcl1SoTQI-RyTnjgV7XTfmNMayPCLcBOSCFczxA,1140
|
|
32
|
+
inferencekit/ops/bench.py,sha256=89GmgkmtMtkZoUIjntcnDVz3gAOzs4WUNCjtu_ZNKF8,10630
|
|
33
|
+
inferencekit/ops/bench_audio.py,sha256=2nr4DCSQGa8Xdd3ClJKs0Iyuaf_w9xe6e2GLXK9sPls,25787
|
|
34
|
+
inferencekit/ops/bench_clip.py,sha256=Kcfe396Tz0CbQ0U9TCtKZPz3Y2VeajSVwEpPO3QwPbc,49376
|
|
35
|
+
inferencekit/ops/bench_image.py,sha256=x18X8HNpkSRxZi_K-mFGzmBSVLOwMctGsimg1osIRfo,24948
|
|
36
|
+
inferencekit/ops/bench_rounds.py,sha256=JozJWlsWAvt4hB5GFKLqcrrcXhOD3z9f70CwSYXnds4,21028
|
|
37
|
+
inferencekit/ops/bench_serve.py,sha256=6e9gOXYhWQ7JdwEYou3g_LXsfXdKp_-Ak7D_mhUeTss,53226
|
|
38
|
+
inferencekit/ops/ceiling.py,sha256=NHmTxoNWkr0uAy8rbx1xafiY6xByCnSV7WSqHtaBwdQ,7470
|
|
39
|
+
inferencekit/ops/compare.py,sha256=hgA2B4pRhkH6vAnj8aPzOtfK3cOVUrk9P5GLtkC23iY,24787
|
|
40
|
+
inferencekit/ops/correctness.py,sha256=PmTUkDUr1PsZS9IIDM9tZuutEaa8_rSeLFryyAM_eho,7861
|
|
41
|
+
inferencekit/ops/doctor.py,sha256=q-qLNzRMjtOTqoPKB2cgPK3GGIpEYNVZAm_wbauKH1c,25866
|
|
42
|
+
inferencekit/ops/gates.py,sha256=TrL5GL-Z5Wicve3oBlwF6PZBLK0jcufknN9ViOmI_ng,99334
|
|
43
|
+
inferencekit/ops/gates_clip.py,sha256=l-3lgBtn8RSdZgoJiyuSqMDQoASGQNkVcjAFEhbhPjU,55608
|
|
44
|
+
inferencekit/ops/intake.py,sha256=OoFRi_7YTeM9adj7Cz-GNNdTkpvVj8RcHfX625a8y3c,75411
|
|
45
|
+
inferencekit/ops/ledger.py,sha256=1YvpD5nRediCBBa9tSsqb36_u_dPIfIXKkYLz_pQxTg,39492
|
|
46
|
+
inferencekit/ops/manifest.py,sha256=QnKzucYxoXi3iZ2ZOcsu6oIS9kK3A--wI6noELvhMtQ,17621
|
|
47
|
+
inferencekit/ops/ncu.py,sha256=KUQ7ExsEW8pmA5-M8USeG9MgD5Zu5L_C2hhipb6qVvc,10866
|
|
48
|
+
inferencekit/ops/nsys.py,sha256=ocUgmOfT4VgyhpJhWbqu1nHJkY6a64hhx-Ip3-etYa4,13623
|
|
49
|
+
inferencekit/ops/prompts.py,sha256=KZm7ufbLndli-QTtIGO6HLyNqUZ93CTQY8BMoO4Tvxs,16321
|
|
50
|
+
inferencekit/ops/quality.py,sha256=Ib9DQK_ybDFBoLSlKPN81-tJuPEyDw-5SLuCqqFwrnw,129400
|
|
51
|
+
inferencekit/ops/quality_clip.py,sha256=Uj6NTx-HkmqpX992Lx1iEUud6zKxZZtG0utRcI91Y14,42255
|
|
52
|
+
inferencekit/ops/quality_clip_steps.py,sha256=E7CnwAUC3TWmThby_VcALoI5-RkP1T9k7r38hNlQNYg,21885
|
|
53
|
+
inferencekit/ops/report.py,sha256=SXXpxZ_8zhngoBrcXQFhAhEMiwVvdI0-OLGKeEFFOM0,17306
|
|
54
|
+
inferencekit/ops/review.py,sha256=2lYrLVtxcf7pTDuSQbNQ9BGAQMIZIG8lHVrqi3J_d8M,6241
|
|
55
|
+
inferencekit/ops/rocprof.py,sha256=09-UK6_3p9JMJ7ztBD_q0Yzifu8X2zUqNRNalBUgHyA,5356
|
|
56
|
+
inferencekit/ops/roofline.py,sha256=ZU34aygsNkUcBxBKfvzuri52TRfCp_UTq-iEl7aGlCk,22317
|
|
57
|
+
inferencekit/ops/store.py,sha256=BBwvO5qML3Z442DH5SgYEpYRXbjnKzlGlyN4jOpm7fc,3049
|
|
58
|
+
inferencekit/prompts/ATTRIBUTION.md,sha256=zppCL-BM8dXbBvDHLqm2R2NWfavwEidY3yWRnPJhGkc,3900
|
|
59
|
+
inferencekit/prompts/__init__.py,sha256=w66vzdYU-geXKO-22svk6vUmNmPg9ph1VYBYeuiAClk,6347
|
|
60
|
+
inferencekit/prompts/build.py,sha256=VEcpCuxkRRjQOi2FXxlJoqjvSCgaox4-FHKA9WMMNLk,26840
|
|
61
|
+
inferencekit/prompts/dev-load.jsonl.gz,sha256=uHFhk6_e7ijropWthUkciP--itSBjXVC6v7q-9jtsQ8,239038
|
|
62
|
+
inferencekit/prompts/dev-load.manifest.json,sha256=WTGYf-z4o3_Oqx3Dlxi0Z9eHs27R66N4O8XeOZ4r-5Y,8001
|
|
63
|
+
inferencekit/prompts/dev.jsonl.gz,sha256=Cavr1imNrBrNwtvAOHl6ySYJF7aJGSl4lnN7i0WKV9A,87529
|
|
64
|
+
inferencekit/prompts/dev.manifest.json,sha256=C55Un2fKfH1ytaEQFnpqy-z0PJoN1KPPWImk3D-yd64,8031
|
|
65
|
+
inferencekit/prompts/exclusions.json,sha256=HgWDMSd7O5xnuFeamUoHljPOMPK-wc_L6HBSU2kNTYY,2203
|
|
66
|
+
inferencekit/quality/__init__.py,sha256=ELORbnqiu8pkHuFVAauZA80Nc5t-Wptu9qsoZv4vvzw,1463
|
|
67
|
+
inferencekit/quality/client.py,sha256=1sf2dThe3vcwq6pypQlsfrYULvbAy8mdK_5Fbq3xbvg,2597
|
|
68
|
+
inferencekit/quality/fake.py,sha256=CdHlJf3J-LWqiWrehQEq315FfGV3ua0gsQ6BKVIw6So,16319
|
|
69
|
+
inferencekit/quality/gsm8k.py,sha256=HEWkqT6Zq9bvxSnLhj53HLbytysw8zP_c9OGxq0rWiM,9959
|
|
70
|
+
inferencekit/quality/logprobs.py,sha256=0UQfWUkRHV_o0gOrpNYdDrCpNa1SiSAr0vDOhTPJ9ac,4625
|
|
71
|
+
inferencekit/quality/metrics.py,sha256=PFOgzPrxJkEFv82Cc4G3KYZkX4jiEbKnwYk2CrTJpNg,10407
|
|
72
|
+
inferencekit/quality/niah.py,sha256=FAYe76LmDoqYfxzS2qDypZiWs3x7tI_bha9LxL0AR8c,3515
|
|
73
|
+
inferencekit/quality/parquet.py,sha256=HGI88TssEGqEAs6UJ1wpAXCWIntMBa5F4nVwg8QGtaM,11267
|
|
74
|
+
inferencekit/quality/sampling.py,sha256=he-pLZXCIz2bK7YuGj197EXxXo2j4n2XZiBPMg92DgU,14739
|
|
75
|
+
inferencekit/quality/step_replay.py,sha256=T-cPg8s7RKXLrqa0U_ogfipW8m3U-5umKUL_a7EKwFY,9856
|
|
76
|
+
inferencekit/quality/video_metrics.py,sha256=c9EXoOr28Cm8WTe8V0enr8ENMGYhjDFX-JRMP8ESSjs,14356
|
|
77
|
+
inferencekit/quality/data/gsm8k_LICENSE.txt,sha256=hru3PoVYIdfEAZEv1L-C40MT5uO2_W-QnytsyeIJpTs,1062
|
|
78
|
+
inferencekit/review/__init__.py,sha256=OvarRG6lMYdrU4tl9pKEx67nywwKkk9xKhAnHKh5ujc,320
|
|
79
|
+
inferencekit/review/diff.py,sha256=cnR3_ydwL5lom0DN0wqrp1uNkmBO64bzbSBHnQvdwLI,6805
|
|
80
|
+
inferencekit/review/media.py,sha256=Evrbg4ueHOATsovO7Gw4xZf8KiO3ip8MOkVX3VOnfBo,9192
|
|
81
|
+
inferencekit/review/page.py,sha256=Ty_vH5ZjcbaZ4hCDn903KsUMPkqsQyeZYkQVG5zQfNQ,51471
|
|
82
|
+
inferencekit/review/rundir.py,sha256=2T3Dbd_Ee1LTHFGsvhNy6E4-ckpAAvE20sjVtHgejxg,43505
|
|
83
|
+
inferencekit/serve/__init__.py,sha256=El5XiZMZJn89O0k_oHyEmDxFYHt0wiXNi0pYuAySmZg,518
|
|
84
|
+
inferencekit/serve/audio_client.py,sha256=Qqut5YjmtkC38do8NQYwHGK8BEKGKbaLUKo6xCiSX_c,15041
|
|
85
|
+
inferencekit/serve/client.py,sha256=cQbOcLOwBNCuqjjakOJn3k9sZ6Ho16cI9ZET8whgsJ0,18755
|
|
86
|
+
inferencekit/serve/clip_client.py,sha256=cRPWx-Am21wePDAXATEG0rnaYqBKm3ghj3WnmBLen5M,17202
|
|
87
|
+
inferencekit/serve/clip_rounds.py,sha256=uWml18v7aJo89qfNJBqfEv0M_lAMikMs6lXiVetcCVQ,28059
|
|
88
|
+
inferencekit/serve/image_client.py,sha256=2q9zXz0QJdYYcYOYw8ZOPX78vYBnF-9Sx6AO9ddv54s,17635
|
|
89
|
+
inferencekit/serve/loadgen.py,sha256=7Dd5POFeozmPUqJ4gLcqG7NNSom7mDGEVQMALiYlPF8,5787
|
|
90
|
+
inferencekit/serve/metrics.py,sha256=DXnwhWMxbAjmEA0BjsCuBfPfUf9_kzpj_bwmC4XnArE,10755
|
|
91
|
+
inferencekit/serve/profiles.py,sha256=2wWgxDSUVxWzcYD8WNriyimJCg1rWLbWlTaQm9VrmNM,5758
|
|
92
|
+
inferencekit/serve/prompts_io.py,sha256=q5P2YvGQDA5NnGy0uK7_WDer1adL44M5MzK2z3pNZaw,5384
|
|
93
|
+
inferencekit/serve/rounds.py,sha256=Eu2eCxl_qHTcpA6-OUMnHC3q9UM75dWM3Y-dupqOnQY,61352
|
|
94
|
+
inferencekit/serve/servers.py,sha256=D0KspAuZaK-QZAxsgjmdMYrqNSRzFk9t_1YZeQYqgLc,40472
|
|
95
|
+
inferencekit/schemas/evidence.v1.json,sha256=hGSdeJzPFsewHTSvegV2bFuGI6CvUkWHlTObdGXMFTU,4976
|
|
96
|
+
inferencekit/schemas/evidence.v2.json,sha256=QPIf7vnSGEKt5Wpc5niWexmVq9s_GRlmeeGQN_JZKY4,15450
|
|
97
|
+
inferencekit/schemas/intake.v1.json,sha256=msxET5X-4lwJ6NGYYPgIRizBaPIgr1L2d7BAT53Xw0U,23089
|
|
98
|
+
inferencekit/schemas/run-manifest.v1.json,sha256=CujWEgDwYu3MxWYUr37qc354Tu3THyuN4IQxUPMP4BM,8654
|
|
99
|
+
inferencekit_cli-0.1.0.dist-info/METADATA,sha256=n0sJ7WBO993TWIezoX4cMKk_ls7XZKfk8-iOF1nvRVI,17953
|
|
100
|
+
inferencekit_cli-0.1.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
|
|
101
|
+
inferencekit_cli-0.1.0.dist-info/entry_points.txt,sha256=pl01EvSJ2tIjZ6XJuyABIKTeiS_WCbi02wILbMT6vnw,55
|
|
102
|
+
inferencekit_cli-0.1.0.dist-info/licenses/LICENSE,sha256=_IkNG2bSqucQOHCATYVgvIPqkI8nPQZqx2bXzIjtI80,11343
|
|
103
|
+
inferencekit_cli-0.1.0.dist-info/licenses/NOTICE,sha256=o4B_ehJCo7di6Qoo3ztq-OHrhDlugPZuXmFkrhkJ6Fc,364
|
|
104
|
+
inferencekit_cli-0.1.0.dist-info/RECORD,,
|