Skip to content

jepa.cpp v0.1.1

Latest

Choose a tag to compare

@github-actions github-actions released this 01 Sep 16:14
· 11 commits to main since this release
curl -sSLO https://github.com/aselimc/jepa.cpp/releases/download/v0.1.1/jepa-0.1.1-linux-x86_64.tar.gz
tar xzf jepa-0.1.1-linux-x86_64.tar.gz && jepa-0.1.1-linux-x86_64/bin/jepa-info --version

Linux x86-64, CPU only, built for x86-64-v3 (AVX2/FMA/F16C/BMI2) against glibc 2.35.
SHA256SUMS next to the archive is its checksum; the copy inside lists every packaged file.

Added

  • Hardening of the untrusted-input paths — a GGUF is a download and an image is bytes off a
    network, and both are now range-checked before anything is allocated. The loader validates every
    jepa.* integer and float against a documented bound, refuses an unknown activation or attention
    mode, checks that each tensor's bytes are actually inside the file, that its dtype is one the
    engine can compute with, and that every weight, bias and vector of every block has the shape and
    the f32-ness the graph will assume — so a file that promises a predictor or a head it does not
    carry is refused at load rather than aborting on first use. Call-time guards cover non-positive
    and overflowing shapes, ids off the predictor's grid, and the $JEPA_MAX_GRAPH_MIB ceiling, which
    now also applies to the masked predictor and the LeWM rollout. The image pipeline caps the
    intermediate of the shortest-edge resize at 64 megapixels. Nothing is clamped silently: every
    refusal names the key or tensor, on stderr and in jepa_error_text().
    docs/architecture.md "Robustness".
  • Thread-safety contract, stated in include/jepa.h and checked by the new threads ctest
    suite: a jepa_model is immutable after load and shareable across threads, a jepa_context
    belongs to one thread, jepa_error_text() is thread-local, preprocessing is re-entrant, and
    concurrent encodes through per-thread contexts are bit-identical to the same work run serially.
  • errors and threads ctest suites (tests/test-errors.cpp, tests/test-threads.cpp), and a
    GGUF loader fuzz target (tests/fuzz/fuzz-gguf-load.cpp, -DJEPA_FUZZ=ON, off by default)
    with a corpus generator (scripts/make_fuzz_corpus.py). The first two need no weights, so the
    ASAN+UBSAN CI job runs them; the fuzz target is build-only in CI.

Fixed

  • Fourteen input classes that crashed, hung or over-allocated the loader or a tool now return an
    error: a zero head count (SIGFPE), an integer-typed matmul weight (a null kernel pointer),
    block vectors of the wrong length, an f16 table in the f32 graph, tensor bytes beyond the end of
    the file, an unknown activation, a promised predictor or head with no tensors, an odd head width
    on a 3-D RoPE family, mask or frame counts past their tables, RoPE interpolation without a
    reference grid, signed overflow in the rollout and batch size arithmetic, a degenerate image
    aspect ratio, and a 32-bit seek that made GGUFs over 2 GB unloadable on Windows. Every case has a
    regression test in tests/test-errors.cpp.
  • A data race on the engine's one-shot warning flags (now atomic).