hypernix 0.45.2__tar.gz → 0.45.3__tar.gz
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.
- {hypernix-0.45.2 → hypernix-0.45.3}/PKG-INFO +5 -9
- {hypernix-0.45.2 → hypernix-0.45.3}/README.md +4 -8
- {hypernix-0.45.2 → hypernix-0.45.3}/pyproject.toml +1 -1
- {hypernix-0.45.2 → hypernix-0.45.3}/setup.cfg +1 -1
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/__init__.py +1 -1
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/smoke_alarm.py +82 -5
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix.egg-info/SOURCES.txt +1 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_alarms_and_presets.py +64 -0
- hypernix-0.45.3/wiki/Changelog.md +248 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Home.md +9 -2
- {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/build.yml +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/ci.yml +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/public-release.yml +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/.github/workflows/release.yml +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/LICENSE +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/MANIFEST.in +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/examples/custom_arch.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/examples/quickstart.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/examples/run_hypernix.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/examples/train_hypernix_0_1_5_evaluator.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/examples/train_hypernix_1_5_gtx1080.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/examples/upload_to_hub.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/pytest.ini +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/ruff.toml +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/scripts/install_deps.sh +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/scripts/quantize_i7_7660u.sh +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/setup.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/__main__.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/arch.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/blender.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/cli.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/coffee_maker.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/convert.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/deps.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/doctor.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/download.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/espresso_maker.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/fetcher.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/food_processor.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/freezer.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/generate.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/industrial_range.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/instant_pot.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/mediocre_fridge.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/microwave.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/nano_nano.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/new_fridge.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/new_range.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/old_fridge.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/old_oven.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/old_range.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/pans.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/pressure_cooker.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/py.typed +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/quantize.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/sink.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/smoker.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/table.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/toaster.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/train.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/src/hypernix/upload.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_arch_mapping.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_cli_integration.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_deps_and_windows.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_fetcher.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_freezer.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_fridges.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_kitchen_v044.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_kitchen_v045.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_new_archs_v035.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_old_oven.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_ranges.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_snapshot_roundtrip.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/tests/test_v031_chat_and_archs.py +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Alarms.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Architectures.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/CLI.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Freezer.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Fridges.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Kitchen.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Ovens.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Pascal.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Quantization.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Ranges.md +0 -0
- {hypernix-0.45.2 → hypernix-0.45.3}/wiki/Training.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: hypernix
|
|
3
|
-
Version: 0.45.
|
|
3
|
+
Version: 0.45.3
|
|
4
4
|
Summary: Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M).
|
|
5
5
|
Home-page: https://github.com/minerofthesoal/hypernix-pip
|
|
6
6
|
Author: HyperNix contributors
|
|
@@ -53,11 +53,6 @@ Dynamic: license-file
|
|
|
53
53
|
**End-to-end toolkit for the `ray0rf1re/hyper-nix.1` family of PyTorch
|
|
54
54
|
language models.**
|
|
55
55
|
|
|
56
|
-
`hypernix` started as a one-shot GGUF converter and has since grown into
|
|
57
|
-
a small but opinionated framework covering the whole lifecycle — from a
|
|
58
|
-
blank directory to a trained, quantized, uploaded HuggingFace snapshot.
|
|
59
|
-
Every subsystem is a plain Python module you can pick up and use in
|
|
60
|
-
isolation.
|
|
61
56
|
|
|
62
57
|
| Subsystem | What it does |
|
|
63
58
|
|---|---|
|
|
@@ -325,6 +320,7 @@ Topic-focused reference guides live in the `wiki/` directory:
|
|
|
325
320
|
- [`wiki/Training.md`](wiki/Training.md) — scratch training, expansion, and fine-tuning flows
|
|
326
321
|
- [`wiki/CLI.md`](wiki/CLI.md) — full CLI cheat sheet
|
|
327
322
|
- [`wiki/Quantization.md`](wiki/Quantization.md) — GGUF conversion + k-quant pipeline
|
|
323
|
+
- [`wiki/Changelog.md`](wiki/Changelog.md) — full per-release version history
|
|
328
324
|
|
|
329
325
|
## How the GGUF pipeline works
|
|
330
326
|
|
|
@@ -340,9 +336,9 @@ k-quant in the plan.
|
|
|
340
336
|
|
|
341
337
|
## Platform notes
|
|
342
338
|
|
|
343
|
-
- **Linux**: full support, every distro tested (Ubuntu, Debian, Arch
|
|
344
|
-
- **macOS**: Metal for inference, Homebrew for `llama-quantize`.
|
|
345
|
-
- **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps.
|
|
339
|
+
- **Linux**: full support, every distro tested on: (Ubuntu, Debian, Arch.)
|
|
340
|
+
- **macOS**: Metal for inference, Homebrew for `llama-quantize`. (untested)
|
|
341
|
+
- **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps. (untested)
|
|
346
342
|
- **Pascal (GTX 1080 / 1080 Ti / Titan Xp)**: install torch from the CUDA 11.8 index first (see above). Use `OldFreezer` or `auto_freezer()`; `pascal_safe_dtype()` picks fp16. `hypernix.freezer.pascal_mode_hints()` returns the full Pascal cheat sheet.
|
|
347
343
|
|
|
348
344
|
## Build / release
|
|
@@ -7,11 +7,6 @@
|
|
|
7
7
|
**End-to-end toolkit for the `ray0rf1re/hyper-nix.1` family of PyTorch
|
|
8
8
|
language models.**
|
|
9
9
|
|
|
10
|
-
`hypernix` started as a one-shot GGUF converter and has since grown into
|
|
11
|
-
a small but opinionated framework covering the whole lifecycle — from a
|
|
12
|
-
blank directory to a trained, quantized, uploaded HuggingFace snapshot.
|
|
13
|
-
Every subsystem is a plain Python module you can pick up and use in
|
|
14
|
-
isolation.
|
|
15
10
|
|
|
16
11
|
| Subsystem | What it does |
|
|
17
12
|
|---|---|
|
|
@@ -279,6 +274,7 @@ Topic-focused reference guides live in the `wiki/` directory:
|
|
|
279
274
|
- [`wiki/Training.md`](wiki/Training.md) — scratch training, expansion, and fine-tuning flows
|
|
280
275
|
- [`wiki/CLI.md`](wiki/CLI.md) — full CLI cheat sheet
|
|
281
276
|
- [`wiki/Quantization.md`](wiki/Quantization.md) — GGUF conversion + k-quant pipeline
|
|
277
|
+
- [`wiki/Changelog.md`](wiki/Changelog.md) — full per-release version history
|
|
282
278
|
|
|
283
279
|
## How the GGUF pipeline works
|
|
284
280
|
|
|
@@ -294,9 +290,9 @@ k-quant in the plan.
|
|
|
294
290
|
|
|
295
291
|
## Platform notes
|
|
296
292
|
|
|
297
|
-
- **Linux**: full support, every distro tested (Ubuntu, Debian, Arch
|
|
298
|
-
- **macOS**: Metal for inference, Homebrew for `llama-quantize`.
|
|
299
|
-
- **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps.
|
|
293
|
+
- **Linux**: full support, every distro tested on: (Ubuntu, Debian, Arch.)
|
|
294
|
+
- **macOS**: Metal for inference, Homebrew for `llama-quantize`. (untested)
|
|
295
|
+
- **Windows**: native support; doctor accepts Windows; `llama-quantize` auto-downloads Windows binaries; use scoop / chocolatey for system deps. (untested)
|
|
300
296
|
- **Pascal (GTX 1080 / 1080 Ti / Titan Xp)**: install torch from the CUDA 11.8 index first (see above). Use `OldFreezer` or `auto_freezer()`; `pascal_safe_dtype()` picks fp16. `hypernix.freezer.pascal_mode_hints()` returns the full Pascal cheat sheet.
|
|
301
297
|
|
|
302
298
|
## Build / release
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "hypernix"
|
|
7
|
-
version = "0.45.
|
|
7
|
+
version = "0.45.3"
|
|
8
8
|
description = "Download and quantize the HyperNix PyTorch model to GGUF (fp32/fp16/Q8_0/Q6_K/Q4_K_M)."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
license = "Apache-2.0"
|
|
@@ -32,7 +32,7 @@ from __future__ import annotations
|
|
|
32
32
|
|
|
33
33
|
import time
|
|
34
34
|
from collections.abc import Callable
|
|
35
|
-
from dataclasses import dataclass
|
|
35
|
+
from dataclasses import dataclass, field
|
|
36
36
|
from typing import Any
|
|
37
37
|
|
|
38
38
|
import torch
|
|
@@ -198,6 +198,39 @@ class RadsAlarm(Alarm):
|
|
|
198
198
|
object.__setattr__(self, "name", "RadsAlarm")
|
|
199
199
|
|
|
200
200
|
|
|
201
|
+
# ---------------------------------------------------------------------------
|
|
202
|
+
# Preset name resolution — shared by GasAlarm, AutoAlarm, and the
|
|
203
|
+
# public factory helpers. The ``preset=`` kwarg is the intuitive
|
|
204
|
+
# single-string entry point ("give me the alarm for an i7-7700HQ" or
|
|
205
|
+
# "give me the alarm for an H100"); it's resolved against GPU_PRESETS
|
|
206
|
+
# first (GPU bandwidth is the dominant signal for training throughput)
|
|
207
|
+
# and CPU_PRESETS as a fallback.
|
|
208
|
+
# ---------------------------------------------------------------------------
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _resolve_preset(
|
|
212
|
+
preset: str | None,
|
|
213
|
+
) -> tuple[CPUPreset | None, GPUPreset | None]:
|
|
214
|
+
"""Resolve a single ``preset=`` string to ``(cpu, gpu)``.
|
|
215
|
+
|
|
216
|
+
GPU matches win over CPU matches. Raises :class:`ValueError` with
|
|
217
|
+
a useful list of valid names when the string doesn't match any
|
|
218
|
+
preset.
|
|
219
|
+
"""
|
|
220
|
+
if preset is None:
|
|
221
|
+
return None, None
|
|
222
|
+
g = gpu_preset(preset)
|
|
223
|
+
if g is not None:
|
|
224
|
+
return None, g
|
|
225
|
+
c = cpu_preset(preset)
|
|
226
|
+
if c is not None:
|
|
227
|
+
return c, None
|
|
228
|
+
raise ValueError(
|
|
229
|
+
f"unknown preset {preset!r}; valid GPU presets: "
|
|
230
|
+
f"{sorted(GPU_PRESETS)}; valid CPU presets: {sorted(CPU_PRESETS)}"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
|
|
201
234
|
# ---------------------------------------------------------------------------
|
|
202
235
|
# GasAlarm — mid tier
|
|
203
236
|
# ---------------------------------------------------------------------------
|
|
@@ -205,13 +238,29 @@ class RadsAlarm(Alarm):
|
|
|
205
238
|
@dataclass
|
|
206
239
|
class GasAlarm(Alarm):
|
|
207
240
|
"""Mid tier. Looks up CPU and GPU presets and scales the per-step
|
|
208
|
-
estimate by their throughput vs. the generic baseline.
|
|
241
|
+
estimate by their throughput vs. the generic baseline.
|
|
242
|
+
|
|
243
|
+
Accepts three equivalent ways to name the hardware:
|
|
244
|
+
|
|
245
|
+
* ``cpu=CPUPreset(...)``, ``gpu=GPUPreset(...)`` — explicit objects.
|
|
246
|
+
* ``cpu_name=``, ``gpu_name=`` via :meth:`from_names` or the
|
|
247
|
+
:func:`gas_alarm` factory.
|
|
248
|
+
* ``preset="i7-7700hq"`` / ``preset="h100"`` — single-string
|
|
249
|
+
shortcut, resolved against GPU first then CPU.
|
|
250
|
+
"""
|
|
209
251
|
|
|
210
252
|
cpu: CPUPreset | None = None
|
|
211
253
|
gpu: GPUPreset | None = None
|
|
254
|
+
preset: str | None = field(default=None, kw_only=True)
|
|
212
255
|
|
|
213
256
|
def __post_init__(self) -> None:
|
|
214
257
|
object.__setattr__(self, "name", "GasAlarm")
|
|
258
|
+
if self.preset is not None:
|
|
259
|
+
c, g = _resolve_preset(self.preset)
|
|
260
|
+
if c is not None and self.cpu is None:
|
|
261
|
+
self.cpu = c
|
|
262
|
+
if g is not None and self.gpu is None:
|
|
263
|
+
self.gpu = g
|
|
215
264
|
|
|
216
265
|
@classmethod
|
|
217
266
|
def from_names(
|
|
@@ -220,12 +269,14 @@ class GasAlarm(Alarm):
|
|
|
220
269
|
*,
|
|
221
270
|
cpu_name: str | None = None,
|
|
222
271
|
gpu_name: str | None = None,
|
|
272
|
+
preset: str | None = None,
|
|
223
273
|
**kwargs: Any,
|
|
224
274
|
) -> GasAlarm:
|
|
225
275
|
return cls(
|
|
226
276
|
time_budget_seconds=time_budget_seconds,
|
|
227
277
|
cpu=cpu_preset(cpu_name) if cpu_name else None,
|
|
228
278
|
gpu=gpu_preset(gpu_name) if gpu_name else None,
|
|
279
|
+
preset=preset,
|
|
229
280
|
**kwargs,
|
|
230
281
|
)
|
|
231
282
|
|
|
@@ -396,10 +447,20 @@ def gas_alarm(
|
|
|
396
447
|
*,
|
|
397
448
|
cpu_name: str | None = None,
|
|
398
449
|
gpu_name: str | None = None,
|
|
450
|
+
preset: str | None = None,
|
|
399
451
|
**kw: Any,
|
|
400
452
|
) -> GasAlarm:
|
|
453
|
+
"""Construct a :class:`GasAlarm`.
|
|
454
|
+
|
|
455
|
+
``cpu_name`` / ``gpu_name`` resolve against ``CPU_PRESETS`` /
|
|
456
|
+
``GPU_PRESETS`` respectively. ``preset`` is a one-string alias
|
|
457
|
+
that resolves against GPU first, then CPU — use it when you just
|
|
458
|
+
want "the alarm for my card / chip" without caring which registry
|
|
459
|
+
the name comes from.
|
|
460
|
+
"""
|
|
401
461
|
return GasAlarm.from_names(
|
|
402
|
-
time_budget_seconds,
|
|
462
|
+
time_budget_seconds,
|
|
463
|
+
cpu_name=cpu_name, gpu_name=gpu_name, preset=preset, **kw,
|
|
403
464
|
)
|
|
404
465
|
|
|
405
466
|
|
|
@@ -423,6 +484,7 @@ def auto_alarm(
|
|
|
423
484
|
*,
|
|
424
485
|
cpu_name: str | None = None,
|
|
425
486
|
gpu_name: str | None = None,
|
|
487
|
+
preset: str | None = None,
|
|
426
488
|
warmup_step_fn: Callable[[], Any] | None = None,
|
|
427
489
|
detect_hardware: bool = True,
|
|
428
490
|
**kw: Any,
|
|
@@ -430,9 +492,24 @@ def auto_alarm(
|
|
|
430
492
|
"""Convenience entry point that returns a concrete alarm.
|
|
431
493
|
|
|
432
494
|
When ``detect_hardware=True`` (the default) and no ``cpu_name`` /
|
|
433
|
-
``gpu_name`` was supplied, :func:`detect_cpu_preset`
|
|
434
|
-
:func:`detect_gpu_preset` are consulted first.
|
|
495
|
+
``gpu_name`` / ``preset`` was supplied, :func:`detect_cpu_preset`
|
|
496
|
+
and :func:`detect_gpu_preset` are consulted first.
|
|
497
|
+
|
|
498
|
+
``preset`` is the one-string shortcut — resolved against GPU
|
|
499
|
+
presets first and CPU presets second.
|
|
435
500
|
"""
|
|
501
|
+
if preset is not None:
|
|
502
|
+
c, g = _resolve_preset(preset)
|
|
503
|
+
if c is not None and cpu_name is None:
|
|
504
|
+
for k, v in CPU_PRESETS.items():
|
|
505
|
+
if v is c:
|
|
506
|
+
cpu_name = k
|
|
507
|
+
break
|
|
508
|
+
if g is not None and gpu_name is None:
|
|
509
|
+
for k, v in GPU_PRESETS.items():
|
|
510
|
+
if v is g:
|
|
511
|
+
gpu_name = k
|
|
512
|
+
break
|
|
436
513
|
if detect_hardware and gpu_name is None:
|
|
437
514
|
det_gpu = detect_gpu_preset()
|
|
438
515
|
if det_gpu is not None:
|
|
@@ -245,6 +245,70 @@ def test_auto_alarm_with_warmup_picks_modern() -> None:
|
|
|
245
245
|
assert a.measured_step_seconds is not None
|
|
246
246
|
|
|
247
247
|
|
|
248
|
+
# Regression: GasAlarm(preset="i7-7700hq") used to raise
|
|
249
|
+
# "unexpected keyword argument 'preset'". Every constructor / factory
|
|
250
|
+
# now accepts ``preset=`` as a one-string shortcut that resolves
|
|
251
|
+
# against GPU_PRESETS first, then CPU_PRESETS.
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def test_gas_alarm_accepts_preset_cpu() -> None:
|
|
255
|
+
from hypernix import smoke_alarm
|
|
256
|
+
|
|
257
|
+
a = smoke_alarm.GasAlarm(time_budget_seconds=3600.0, preset="i7-7700hq")
|
|
258
|
+
assert a.cpu is not None
|
|
259
|
+
assert a.cpu.name.startswith("Intel Core i7-7700HQ")
|
|
260
|
+
assert a.gpu is None
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def test_gas_alarm_accepts_preset_gpu() -> None:
|
|
264
|
+
from hypernix import smoke_alarm
|
|
265
|
+
|
|
266
|
+
a = smoke_alarm.GasAlarm(time_budget_seconds=3600.0, preset="rtx-3080-ti")
|
|
267
|
+
assert a.gpu is not None
|
|
268
|
+
assert a.gpu.name.startswith("NVIDIA GeForce RTX 3080 Ti")
|
|
269
|
+
assert a.cpu is None
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def test_gas_alarm_factory_accepts_preset() -> None:
|
|
273
|
+
from hypernix import smoke_alarm
|
|
274
|
+
|
|
275
|
+
a = smoke_alarm.gas_alarm(time_budget_seconds=3600.0, preset="h100")
|
|
276
|
+
assert a.gpu is not None
|
|
277
|
+
assert "H100" in a.gpu.name
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def test_auto_alarm_accepts_preset() -> None:
|
|
281
|
+
from hypernix import smoke_alarm
|
|
282
|
+
|
|
283
|
+
a = smoke_alarm.auto_alarm(
|
|
284
|
+
time_budget_seconds=3600.0, preset="i7-7700hq",
|
|
285
|
+
detect_hardware=False,
|
|
286
|
+
)
|
|
287
|
+
assert isinstance(a, smoke_alarm.GasAlarm)
|
|
288
|
+
assert a.cpu is not None
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
def test_gas_alarm_unknown_preset_lists_valid() -> None:
|
|
292
|
+
import pytest
|
|
293
|
+
|
|
294
|
+
from hypernix import smoke_alarm
|
|
295
|
+
|
|
296
|
+
with pytest.raises(ValueError, match="unknown preset"):
|
|
297
|
+
smoke_alarm.GasAlarm(time_budget_seconds=3600.0, preset="not-real-cpu")
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def test_preset_does_not_override_explicit_cpu() -> None:
|
|
301
|
+
"""Explicit ``cpu=`` wins over a conflicting ``preset=`` hint."""
|
|
302
|
+
from hypernix import smoke_alarm
|
|
303
|
+
from hypernix.freezer import cpu_preset
|
|
304
|
+
|
|
305
|
+
explicit = cpu_preset("i7-14700k")
|
|
306
|
+
a = smoke_alarm.GasAlarm(
|
|
307
|
+
time_budget_seconds=3600.0, cpu=explicit, preset="i7-7660u",
|
|
308
|
+
)
|
|
309
|
+
assert a.cpu is explicit
|
|
310
|
+
|
|
311
|
+
|
|
248
312
|
def test_auto_alarm_with_gpu_name_picks_gas() -> None:
|
|
249
313
|
from hypernix import smoke_alarm
|
|
250
314
|
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Full per-release notes for `hypernix`. The top-level `wiki/Home.md`
|
|
4
|
+
keeps a running "recent highlights" list; this page is the canonical
|
|
5
|
+
history. Semver-ish: minor bumps add features, patch bumps are bug
|
|
6
|
+
fixes and UX papercuts. Dates are `YYYY-MM-DD` for PyPI-published
|
|
7
|
+
releases; in-branch commits between releases are grouped under the
|
|
8
|
+
next release header.
|
|
9
|
+
|
|
10
|
+
## Legend
|
|
11
|
+
|
|
12
|
+
- ✨ new feature
|
|
13
|
+
- 🐛 bug fix
|
|
14
|
+
- 🛡️ UX / error-message polish
|
|
15
|
+
- 📚 documentation
|
|
16
|
+
- 🔧 internal / plumbing
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 0.45.3
|
|
21
|
+
|
|
22
|
+
🛡️ **`smoke_alarm.GasAlarm` accepts `preset=`.** One-string shortcut
|
|
23
|
+
that resolves against `GPU_PRESETS` first, then `CPU_PRESETS`. Works
|
|
24
|
+
on the class (`GasAlarm(..., preset="i7-7700hq")`), on the factory
|
|
25
|
+
(`gas_alarm(..., preset="h100")`), and on the selector
|
|
26
|
+
(`auto_alarm(..., preset="rtx-3080-ti")`). Unknown names raise
|
|
27
|
+
`ValueError` with the full list of valid presets.
|
|
28
|
+
|
|
29
|
+
🛡️ Explicit `cpu=` / `gpu=` instances still win over a conflicting
|
|
30
|
+
`preset=` hint — no silent overwrite.
|
|
31
|
+
|
|
32
|
+
🔧 Shared `_resolve_preset` helper in `smoke_alarm.py`.
|
|
33
|
+
|
|
34
|
+
## 0.45.2
|
|
35
|
+
|
|
36
|
+
🐛 **Every pan accepts `context_length=` and `max_chars=`.** Reported:
|
|
37
|
+
`FryingPan(context_length=CONTEXT_LEN)` raised a bare `TypeError`.
|
|
38
|
+
Both are now keyword-only fields on the `Pan` base class; when set,
|
|
39
|
+
lines are truncated to fit. `context_length` is treated as
|
|
40
|
+
`max_chars = context_length * 4` (English-BPE heuristic); the direct
|
|
41
|
+
`max_chars=` wins when both are set. For precise chunking by tokens
|
|
42
|
+
use `hypernix.food_processor` instead.
|
|
43
|
+
|
|
44
|
+
## 0.45.1
|
|
45
|
+
|
|
46
|
+
🐛 **Pan positional-argument fix.** `Pan` inherited `name: str` as a
|
|
47
|
+
dataclass field, so `Skillet(src, "instruct")` silently set
|
|
48
|
+
`name="instruct"` and left `mode="chat"`. Fix: `name` is now a
|
|
49
|
+
`typing.ClassVar` on every pan — still the pan's label, no longer
|
|
50
|
+
part of `__init__`. `GrillPan._seen` (internal dedupe state) marked
|
|
51
|
+
`init=False`.
|
|
52
|
+
|
|
53
|
+
🛡️ `pick_pan` error messages now list valid tiers / valid kwargs
|
|
54
|
+
instead of raising `KeyError` or cryptic `TypeError`.
|
|
55
|
+
|
|
56
|
+
## 0.45.0
|
|
57
|
+
|
|
58
|
+
✨ **Espresso, blender, toaster, food_processor, smoker** — five new
|
|
59
|
+
appliances, each 4 tiers. Shared interface per module.
|
|
60
|
+
|
|
61
|
+
✨ **+3 microwave tiers** — now `defrost` (preheat-only) / `low_zap`
|
|
62
|
+
(deterministic one-liner) / `zap` (existing) / `high_zap`
|
|
63
|
+
(long-temp draft) / `chat_zap` (existing). Plus `reheat(oven,
|
|
64
|
+
prior_output)` for continuation without rebuild.
|
|
65
|
+
|
|
66
|
+
✨ **+2 coffee_maker tiers and one new type.**
|
|
67
|
+
`FrenchPressMaker` (batch), `PercolatorMaker` (cyclic with optional
|
|
68
|
+
convergence), and a new `ColdBrewMaker` (long single brew with
|
|
69
|
+
mandatory JSON checkpoints, resumes cleanly after a crash).
|
|
70
|
+
|
|
71
|
+
✨ **CLI `hypernix brew recipe.json`** — runs `instant_pot.brew`
|
|
72
|
+
from a JSON recipe. Supports `--set KEY=VALUE` overrides with JSON
|
|
73
|
+
literals.
|
|
74
|
+
|
|
75
|
+
📚 `wiki/Kitchen.md` gets full sections for every new appliance.
|
|
76
|
+
|
|
77
|
+
## 0.44.0
|
|
78
|
+
|
|
79
|
+
✨ **Kitchen modules + pressure_cooker optimizer.** Seven new
|
|
80
|
+
top-level modules (pans, microwave, table, sink, instant_pot,
|
|
81
|
+
coffee_maker, pressure_cooker) covering preprocessing, throwaway
|
|
82
|
+
inference, log inspection, file output, end-to-end pipelines,
|
|
83
|
+
scheduled repetition, and a custom optimizer.
|
|
84
|
+
|
|
85
|
+
✨ `pressure_cooker` — `torch.optim.Optimizer` subclass: AdamW +
|
|
86
|
+
three-phase LR schedule (linear warmup → plateau → cosine cooldown)
|
|
87
|
+
+ Zhang-et-al-2019 Lookahead "pressure seal". No separate scheduler
|
|
88
|
+
object; the LR lives inside the optimizer.
|
|
89
|
+
|
|
90
|
+
📚 README gains a **"Who this is actually for"** section framing the
|
|
91
|
+
package around the solo-GPU / consumer-card / QLoRA-to-Hub workflow,
|
|
92
|
+
with an explicit disclaimer that `train()` is a smoke-tester, not a
|
|
93
|
+
production trainer. New `wiki/Kitchen.md`.
|
|
94
|
+
|
|
95
|
+
## 0.43.0
|
|
96
|
+
|
|
97
|
+
✨ **`smoke_alarm`** — four-tier training-step planner + mid-run
|
|
98
|
+
monitor. `RadsAlarm` (constants, lightest), `GasAlarm` (CPU/GPU
|
|
99
|
+
presets), `ModernAlarm` (warmup-measured), `AutoAlarm` (selector).
|
|
100
|
+
|
|
101
|
+
✨ **16 CPU presets** (`hypernix.freezer.CPU_PRESETS`): i7 7th gen
|
|
102
|
+
(7660U / 7700HQ / 7700K), 11th–14th gen K/H/HX, Core Ultra Series 1
|
|
103
|
+
(Meteor / Lunar Lake), Series 2 (Arrow Lake, AVX10).
|
|
104
|
+
|
|
105
|
+
✨ **20 GPU presets** (`hypernix.freezer.GPU_PRESETS`): Hopper
|
|
106
|
+
(H100/H200), Ampere workstation (A4500–A6000), RTX PRO Ada +
|
|
107
|
+
Blackwell, RTX 4070 Ti Super / 4080 Super, RTX 3080 Ti, Turing
|
|
108
|
+
consumer (1660 Ti, 2080, 2080 Super, 2080 Ti), Pascal (1080, 1080 Ti).
|
|
109
|
+
|
|
110
|
+
📚 New `wiki/Alarms.md` with both preset tables.
|
|
111
|
+
|
|
112
|
+
## 0.42.0
|
|
113
|
+
|
|
114
|
+
✨ **`new_range` / `old_range` / `industrial_range`** — three
|
|
115
|
+
sophistication tiers of labeling rubrics that drop into
|
|
116
|
+
`mediocre_fridge.collect_responses_from(label_rule=...)`.
|
|
117
|
+
|
|
118
|
+
- `new_range` — zero-dep first-fail rubric (is_empty, is_refusal,
|
|
119
|
+
math_lacks_digit, is_repetition).
|
|
120
|
+
- `old_range` — weighted-mean scored rubric with `None` = "no
|
|
121
|
+
opinion", any-rule-at-0 short-circuits to BAD, references / keywords
|
|
122
|
+
/ stopword-filtered overlap built in.
|
|
123
|
+
- `industrial_range` — LLM-as-judge wrapper around any CodeOven;
|
|
124
|
+
pointwise + pairwise with caching.
|
|
125
|
+
|
|
126
|
+
📚 New `wiki/Ranges.md`.
|
|
127
|
+
|
|
128
|
+
## 0.41.0
|
|
129
|
+
|
|
130
|
+
✨ **CUDA 6.1 / Pascal support.** `compute_capability`, `is_pascal`,
|
|
131
|
+
`pascal_safe_dtype` (fp32 on CPU, fp16 on Pascal / Volta / Turing,
|
|
132
|
+
bf16 on Ampere+), `pascal_mode_hints` (one-stop dict of recommended
|
|
133
|
+
settings for sm_61).
|
|
134
|
+
|
|
135
|
+
✨ **`examples/train_hypernix_1_5_gtx1080.py`** — HyperNix 1.5,
|
|
136
|
+
verified 92,130,048 params, trains on an 8 GB Pascal card via
|
|
137
|
+
`auto_freezer` + `flash_freezer(slow=True)`.
|
|
138
|
+
|
|
139
|
+
📚 New `wiki/Pascal.md` with a full sm_61 playbook.
|
|
140
|
+
|
|
141
|
+
## 0.40.0
|
|
142
|
+
|
|
143
|
+
✨ **`freezer` module** — VRAM manager. `OldFreezer` (8 – 10 GB,
|
|
144
|
+
batch=1, fp16, empty_cache each step), `NewFreezer` (11 GB+, batch=8,
|
|
145
|
+
fp32/bf16), `FlashFreezer` (OOM-safe retry wrapper with exponential
|
|
146
|
+
backoff, wait-for-free-GB, and optional slow-mode that halves
|
|
147
|
+
`current_batch_size` on each retry).
|
|
148
|
+
|
|
149
|
+
📚 New `wiki/Freezer.md`.
|
|
150
|
+
|
|
151
|
+
## 0.36.0
|
|
152
|
+
|
|
153
|
+
✨ **`old_fridge` / `mediocre_fridge` / `new_fridge`** — memory
|
|
154
|
+
housekeeping (freeze/unfreeze/parameter_stats), judge-training dataset
|
|
155
|
+
synthesis, and training-curve plotting.
|
|
156
|
+
|
|
157
|
+
✨ `examples/train_hypernix_0_1_5_evaluator.py` — end-to-end example
|
|
158
|
+
wiring ovens + all three fridges.
|
|
159
|
+
|
|
160
|
+
📚 New `wiki/Fridges.md`.
|
|
161
|
+
|
|
162
|
+
## 0.35.0
|
|
163
|
+
|
|
164
|
+
✨ **Gemma 4, Qwen 3.5 & 3.6, GLM 5.x, Nix collection presets.** New
|
|
165
|
+
entries in both `ARCH_PRESETS` (for `new_oven`) and `KNOWN_MODELS`
|
|
166
|
+
(for short-name resolution). Config knobs verified against the actual
|
|
167
|
+
HuggingFace repos.
|
|
168
|
+
|
|
169
|
+
## 0.34.0
|
|
170
|
+
|
|
171
|
+
✨ **AutoModel fallback.** `load_snapshot` routes any non-HyperNix
|
|
172
|
+
`model_type` (Gemma, Phi, DeepSeek, GLM, GPT-OSS, …) through a thin
|
|
173
|
+
`transformers.AutoModelForCausalLM` wrapper. New ARCH_PRESETS covering
|
|
174
|
+
those families.
|
|
175
|
+
|
|
176
|
+
## 0.33.0
|
|
177
|
+
|
|
178
|
+
✨ **Windows + macOS support.** Cross-platform `doctor`, path
|
|
179
|
+
handling, `llama-quantize` resolution.
|
|
180
|
+
|
|
181
|
+
✨ **Python 3.13** support (sentencepiece 0.2.1 floor).
|
|
182
|
+
|
|
183
|
+
✨ **Runtime auto-install.** `HYPERNIX_AUTO_INSTALL` env var (default
|
|
184
|
+
on) lets missing runtime deps be installed lazily; `hypernix doctor
|
|
185
|
+
--fix` makes it explicit.
|
|
186
|
+
|
|
187
|
+
## 0.32.1
|
|
188
|
+
|
|
189
|
+
🐛 Fall back to the slow tokenizer when the `tokenizers` crate is too
|
|
190
|
+
old to decode a newer tokenizer.json.
|
|
191
|
+
|
|
192
|
+
## 0.32.0
|
|
193
|
+
|
|
194
|
+
✨ **torch 2.7+** (incl. CUDA 11.8 builds).
|
|
195
|
+
|
|
196
|
+
✨ One-shot PyPI publish via GitHub Actions Trusted Publishing.
|
|
197
|
+
|
|
198
|
+
## 0.31.0
|
|
199
|
+
|
|
200
|
+
✨ **Chat REPL.** `hypernix chat --repo-id <short-name>` plus
|
|
201
|
+
`CodeOven.chat(turns, ...)`.
|
|
202
|
+
|
|
203
|
+
✨ **Nano-nano / Nano-mini / nano-nano-927** family — new entries in
|
|
204
|
+
`KNOWN_MODELS`.
|
|
205
|
+
|
|
206
|
+
## 0.30.0
|
|
207
|
+
|
|
208
|
+
✨ **`old_oven` code-generation wrapper.** `preheat`, `CodeOven`,
|
|
209
|
+
`bake_code`, `fill_middle`, `save_pt` / `load_pt`. `--auto-oven`
|
|
210
|
+
top-level CLI shortcut.
|
|
211
|
+
|
|
212
|
+
## 0.21.0
|
|
213
|
+
|
|
214
|
+
✨ Download every file the model needs — not just weights — so the
|
|
215
|
+
output directory is a self-contained snapshot.
|
|
216
|
+
|
|
217
|
+
## 0.2.0
|
|
218
|
+
|
|
219
|
+
✨ First subcommand-based CLI. `train` module scaffold. Fixed
|
|
220
|
+
`tokenizer.ggml.merges` in GGUF output.
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Upgrading
|
|
225
|
+
|
|
226
|
+
`hypernix` follows no breaking-change policy yet. Patch releases
|
|
227
|
+
(`0.45.x`) are always safe to upgrade — they only fix bugs, UX
|
|
228
|
+
papercuts, or improve error messages.
|
|
229
|
+
|
|
230
|
+
Minor releases (`0.N.0`) add features. The usual gotcha is renamed
|
|
231
|
+
kwargs from the UX-polish patches above; when in doubt, check the
|
|
232
|
+
signature:
|
|
233
|
+
|
|
234
|
+
```python
|
|
235
|
+
import inspect
|
|
236
|
+
from hypernix import smoke_alarm, pans
|
|
237
|
+
|
|
238
|
+
print(inspect.signature(smoke_alarm.GasAlarm))
|
|
239
|
+
print(inspect.signature(pans.FryingPan))
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Contributing changelog entries
|
|
243
|
+
|
|
244
|
+
New features should land with a one-paragraph entry at the top of
|
|
245
|
+
this file, grouped by emoji legend. Patch releases get a couple of
|
|
246
|
+
bullet points; minor releases get a section per subsystem touched.
|
|
247
|
+
Keep the tone utilitarian — what changed, how the caller notices,
|
|
248
|
+
what to do instead if an old call stopped working.
|
|
@@ -18,6 +18,7 @@ see the [top-level README](../README.md).
|
|
|
18
18
|
| [Training](Training.md) | `init_from_scratch`, `expand_checkpoint`, `train`, AutoModel fallback. |
|
|
19
19
|
| [Quantization](Quantization.md) | GGUF pipeline, k-quants, `llama-quantize` integration. |
|
|
20
20
|
| [CLI](CLI.md) | Every subcommand, every flag, typical invocations. |
|
|
21
|
+
| [Changelog](Changelog.md) | Full per-release notes — features, fixes, UX papercuts. |
|
|
21
22
|
|
|
22
23
|
## The subsystem map
|
|
23
24
|
|
|
@@ -70,9 +71,12 @@ see the [top-level README](../README.md).
|
|
|
70
71
|
|
|
71
72
|
## Version history
|
|
72
73
|
|
|
73
|
-
|
|
74
|
-
|
|
74
|
+
Recent releases (see [Changelog](Changelog.md) for the full per-release
|
|
75
|
+
notes going all the way back to 0.2.0):
|
|
75
76
|
|
|
77
|
+
- **0.45.3** — `smoke_alarm` accepts `preset=` one-string kwarg
|
|
78
|
+
- **0.45.2** — pans accept `context_length` / `max_chars` (kw-only)
|
|
79
|
+
- **0.45.1** — pans init fix: positional args no longer bind to `name`
|
|
76
80
|
- **0.45.0** — espresso_maker, blender, toaster, food_processor, smoker; +3 microwave tiers; +2 coffee_maker tiers + cold_brew; CLI `brew`
|
|
77
81
|
- **0.44.0** — pans / microwave / table / sink / instant_pot / coffee_maker / pressure_cooker
|
|
78
82
|
- **0.43.0** — `smoke_alarm` (Rads / Gas / Modern / Auto) + 16 CPU + 20 GPU presets
|
|
@@ -86,3 +90,6 @@ bug fixes. Recent notable releases:
|
|
|
86
90
|
- **0.32.x** — CUDA 11.8 torch, slow-tokenizer fallback
|
|
87
91
|
- **0.31.x** — Chat REPL, Nano-nano / Nano-mini model family
|
|
88
92
|
- **0.30.x** — Code-generation oven (`old_oven.preheat`)
|
|
93
|
+
|
|
94
|
+
See [Changelog.md](Changelog.md) for per-release details including
|
|
95
|
+
patch versions, UX fixes, and bug reports.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|