EXPERIMENTAL NATIVE-FACTOR ADAPTER CANDIDATE. Separate copy. Supports only validated LittleBit v1 plain Llama factors in FP32. Packed signs expand to FP32 factor matrices; full dense W is not reconstructed. Factor output-head loss uses exact token-row chunking; full-model memory fit remains unverified. Original Studio checkpoints and third-party adapter runtimes are not compatible with this new graph. Full-model/GPU validation pending.
CUSTOM ENGINE / REAL BACKPROPAGATION

Your corpus.
Model-specific adapters.

Train on your own JSONL corpus with validated, model-specific LoRA paths, exact token budgets and resumable optimizer checkpoints. Experimental multi-family release.

READY
Trainable A/B adapters change selected transformer projections and/or the output head on supported dense models. GPT-oss uses output-head adapters only; its transformer and experts stay frozen. All original base weights remain frozen. This is adapter fine-tuning, not full-weight pretraining. Full-checkpoint quality and Radeon throughput have not been established.

Starting…

Idle
01 / MODEL & ENGINE

Load a supported GGUF model

No model loaded

Registered architecture contracts only; unsupported variants fail before loading.

Standard F32 / F16 / BF16, Q8_0, Q4_0/Q4_1, Q5_0/Q5_1, Q4_K, Q5_K and Q6_K tensors are admitted by dense handlers. Base matrices use the selected FP16 or FP32 storage; this is not memory-efficient QLoRA. LittleBit/NHSC1 containers are not supported in this version.

V2.4.0-ALPHA / COMPATIBILITY CONTRACTS

Choose a supported graph, not just a .gguf extension

GGUF stores many different architectures. This build checks architecture metadata, tokenizer, every tensor shape and supported weight encoding before loading. Unknown graph features fail explicitly.

Dense-family weights are expanded to FP16 or FP32. Quantized input does not imply QLoRA memory use. Supported types vary by handler; IQ/TQ, LittleBit/NHSC1, split files, arbitrary chat-template execution and unimplemented architectures are rejected. The application budget is a user limit, not a VRAM measurement. Large admitted models can still fail device buffer or memory limits.

Verification: synthetic forward/gradient/learning and checkpoint tests plus retained reference tokenizer fixtures. Software-WebGPU tests use CPU SwiftShader, not the user's Radeon. A one-token finite-logit smoke test runs on the selected model before the app says it is ready; this is not full-checkpoint numerical parity or a quality benchmark.

PERFORMANCE / MEASURE ON YOUR GPU

Keep the GPU supplied with work

The loaded-model test uses the comparison prompt below, identical tokens, one warm-up and three measured passes per mode. It changes no model or adapter weights. Queue-overhead testing uses a separate tiny synthetic model. Benchmarks do not measure hardware utilization directly. The matrix comparison includes non-aligned dimensions and checks output error. Validation checks independent-example gradients and mixed-precision learning on your device.

No benchmark run on this device yet.

No GPU submissions yet.

Batched mode queues four layers per submission group, removes intermediate backward-pass waits, and reads gradient-norm statistics together. Generation reads only the final row of logits. The default is 64 target tokens across 4 independent examples, with shared-memory GEMM and fused operations. Compare 16, 32 and 64 target tokens per microbatch and compare real tokens/sec at the same model and sequence length. More accumulation changes effective batch size; it does not itself run microbatches simultaneously. A higher GPU utilization percentage is not a guarantee of higher speed.
Earlier synthetic-engine measurement (not multi-family throughput)
{
  "queue": {
    "scope": "Synthetic 2-layer transformer; GPU workload and optimizer identical between modes",
    "results": [
      {
        "mode": "reference",
        "medianStepMs": 110.46385450000002,
        "steps": 8,
        "targetsPerStep": 3,
        "lastLoss": 2.11680805683136,
        "counters": {
          "submissions": 544,
          "syncs": 56,
          "readbacks": 248,
          "readbackBytes": 1088
        }
      },
      {
        "mode": "batched",
        "medianStepMs": 117.46003999999994,
        "steps": 8,
        "targetsPerStep": 3,
        "lastLoss": 2.11680805683136,
        "counters": {
          "submissions": 64,
          "syncs": 16,
          "readbacks": 16,
          "readbackBytes": 1088
        }
      }
    ],
    "ratio": 0.9404377395069854,
    "note": "Host-observed median latency, including submission, synchronization and UI yielding; not an estimate of full-model Radeon speed.",
    "hardware": "Dawn / SwiftShader software Vulkan, not Radeon"
  },
  "matrix_kernels": {
    "scope": "64\u00d7257 by 259\u00d7257 forward GEMM, non-tile-aligned bounds; 1 warmup + 5 measured runs",
    "results": [
      {
        "mode": "Scalar FP32",
        "medianMs": 12.621147999999948,
        "maxAbsoluteError": 0
      },
      {
        "mode": "Tiled FP32",
        "medianMs": 29.64636399999995,
        "maxAbsoluteError": 0
      }
    ],
    "note": "Includes queue synchronization. Small synthetic kernel benchmark; measure training tokens/sec on your own model. No GPU utilization estimate.",
    "hardware": "SwiftShader software Vulkan (not Radeon)"
  }
}
02 / YOUR TRAINING DATA

Import your own corpus

No corpus prepared. Import your own JSONL file to train.

No training examples are loaded automatically. You may explicitly choose the Nexus demonstration corpus, or load a supported GGUF model and tokenize your own UTF-8 JSONL corpus.

Raw completion adds no role labels, separators, default system message or extra newline. Supply any delimiter in your prompt. Changing format clears prepared tokens.

At least five independent prompt families are required. Only the supervised answer and its terminator contribute to the training token budget. Held-out records never enter training.
How to make a compatible JSONL corpus
  1. Write one JSON object per physical line in a UTF-8 .jsonl file. Do not wrap the file in an array or insert blank lines. Use escaped \n inside strings for line breaks.
  2. Choose one formatting mode for the whole file. Verified chat accepts prompt and answer strings with optional context, or a messages array. Messages allow an optional initial system message, followed by alternating user and assistant messages ending in assistant. The loaded model must supply a supported verified text-chat template; tool calls, images and separate reasoning-content fields are not accepted.
  3. Raw completion accepts prompt plus completion (or answer), without messages or context. It inserts no role labels, separator or extra newline. Put any delimiter in your prompt. The prompt and continuation are tokenized together; a token crossing their boundary is supervised as part of the answer. A verified EOS token is required.
  4. Include at least five independent prompt families. Give related prompts or paraphrases the same optional family_id. If absent, split_component_id is used; otherwise preceding chat messages or the raw prompt define the family.
  5. Choose 5–30% held-out families (default 10%). Sorted family identifiers determine the split: the first fraction, rounded down with at least one family, is held out. The split field is ignored. Changing formatting clears prepared tokens; re-tokenize before training.
  6. Start with a short session and evaluate on held-out data. Exact resume requires the same model, corpus, formatting mode and holdout setting.

Schema examples only, never loaded automatically. Chat mode:

{"prompt":"Your input question","answer":"Your desired response","family_id":"topic-01"}
{"messages":[{"role":"user","content":"Your input question"},{"role":"assistant","content":"Your desired response"}],"family_id":"topic-02"}

Raw-completion mode (use a separate raw-format corpus):

{"prompt":"Question: Your input question\nAnswer: ","completion":"Your desired response","family_id":"topic-03"}
These lines illustrate formats; they are not a complete corpus. Use your own examples across at least five families. Only supervised answer tokens and their terminator contribute to the budget. The importer accepts at most 100,000 records and files below 50,000,000 bytes, with additional text/token limits. Long records use bounded sliding windows.
03 / ADAPTER TARGETS

Choose where the model learns

Otherwise continue the loaded/trained adapter and Adam moments. Changing rank or target layers requires a fresh adapter. Export current work before initializing fresh.
04 / TRAINING SESSION

Define the learning budget

Tokens are shared across examples. Attention and rotary positions reset for each example; padding is excluded from loss and the token budget. Increase to 8 only if measured tokens/sec improves.

Prepare a corpus to calculate passes.

0 / 0 trained answer tokens · stops exactly at the budget

TRAINING LOSS—
OPTIMIZER STEPS0
TOKENS / SEC—
ALLOCATED GPU—
PRECISIONNot loaded
Loss chart autoscales the latest 160 updates. Long records use sliding context windows; tokens outside the selected window are not attended to. Every answer target is still scheduled once per pass. Accumulated gradients are normalized by actual target-token count. Pause finishes the current microbatch and update.
05 / CHECKPOINTS

Save the full adapter training state

Contains LoRA weights, Adam first/second moments, optimizer step, training configuration, cursor and checksums. Bound to the complete base-model and tokenizer hashes. For exact resume: load the same model → prepare the same corpus → import checkpoint → Resume. No base weights are included. This is a custom Nexus format, not PEFT, GGUF LoRA, or the previous head-only JSON format.
06 / EVALUATION

Compare against the frozen base

No held-out evaluation yet.
Teacher-forced answer-token cross-entropy and perplexity on identical windows. This is a bounded development check, not an independent final benchmark or proof of safe OS decisions.

Frozen base

Transformer / head adapter

Greedy decoding, recomputed context, maximum 256-token inference window. The reference training engine prioritizes inspectable math; it is not a high-throughput chat runtime.
07 / VERIFICATION & SCOPE

Measured capability, clear boundaries

The receipt below is historical evidence from the original engine build. The custom-corpus packaging update does not establish new hardware performance or full-model validation.

Run GPU validation to check your own WebGPU device.
Original engine test receipt (excerpt)
{
  "numerical_webgpu": {
    "passed": true,
    "scope": "Synthetic two-layer transformer, GQA, all seven projection adapters plus head",
    "forwardMaxAbsoluteError": 1.3888656269500643e-07,
    "gradientTensors": 30,
    "maxGradientAbsoluteError": 5.3425629970682564e-05,
    "before": 2.1903289556503296,
    "after": 0.40764403343200684,
    "checkpointLossDifference": 0,
    "baseFrozen": true,
    "hardware": "Dawn WebGPU / SwiftShader software Vulkan (not Radeon)",
    "note": "Does not establish full SmolLM2 model quality or Radeon throughput"
  },
  "accelerated": {
    "hardware": "Dawn WebGPU / SwiftShader software Vulkan (not Radeon)",
    "passed": true,
    "fusedTiledGradientError": 1.1920928955078125e-07,
    "batchGradientError": 1.1920928955078125e-07,
    "batchLossError": 0,
    "batchLogitError": 0,
    "fp16": "SKIPPED: shader-f16 unavailable",
    "matrixEdges": {
      "shape": [
        19,
        21,
        23
      ],
      "forwardDxDwMaxError": 0
    }
  },
  "mixed_precision_emulation": {
    "hardware": "SwiftShader WebGPU with packed FP16 storage; FP16 arithmetic emulated using pack2x16float/unpack2x16float. Native f16 compiled separately on Dawn null backend; no native FP16 hardware execution.",
    "passed": true,
    "fusedTiledGradientError": 1.1920928955078125e-07,
    "batchGradientError": 1.1920928955078125e-07,
    "batchLossError": 0,
    "batchLogitError": 0,
    "fp16GradientMaxAbsoluteError": 0.0016841888427734375,
    "fp16LossError": 2.7489662170587792e-05,
    "fp16Before": 2.273624897003174,
    "fp16After": 0.887896728515625,
    "fp16CheckpointLossDifference": 0,
    "matrixEdges": {
      "shape": [
        19,
        21,
        23
      ],
      "forwardDxDwMaxError": 0
    }
  },
  "application_workflow": {
    "passed": true,
    "checks": [
      "Real WebGPU exact 9-token session: one full 7-token pass + 2 targets",
      "Pause commits one accumulated optimizer update, 3 targets (short final microbatch)",
      "Resume reaches exact goal without duplicated exposures",
      "Complete checkpoint restores optimizer and matching corpus cursor",
      "Corrupt checkpoint rejected",
      "Held-out base/adapter comparison executed on real WebGPU",
      "Sliding-window planner exhaustive boundary coverage",
      "Standalone UI: unique controls, no embedded application/iframe",
      "Loaded-model queue A/B logits agree; final-row generation readbacks preserve output",
      "Independent-example scheduler: 2/4/8 examples, 1/3/16/64 targets, exact pass coverage and serialized cursors",
      "Actual multi-example GPU training pauses, checkpoint-restores, and resumes to exact 11-token budget",
      "Invalid settings, adapter OOM, forward OOM and malformed session checkpoint preserve adapter and release allocations",
      "Start/export/local restore UI handlers, IndexedDB checkpoint persistence, and control wiring",
      "Malformed model import preserves loaded model, adapter and session",
      "Synthetic GGUF parsed, byte-BPE tokenized, loaded, forwarded, backpropagated and updated"
    ],
    "environment": "JSDOM UI + actual Dawn WebGPU / SwiftShader (software Vulkan)",
    "limitations": "No Radeon or full-size SmolLM2 run; no browser layout screenshot"
  }
}
What this build implements

The Llama path has full adapter backpropagation through causal grouped-query attention, rotary positions, residuals, RMSNorm and SwiGLU. Additional dense handlers implement their own differentiable operations. GPT-oss exposes output-head backpropagation only. Low-rank A/B adapters on all selected attention and feed-forward projections; optional output head. Token-normalized accumulation, global gradient clipping, AdamW, warmup/cosine scheduling, deterministic shuffling, family-separated validation, exact token budgets, and checkpointed optimizer state.

16×16 shared-memory matrix kernels in forward and backward passes; FP16 matrix operands with FP32 accumulation, gradients and Adam state; fused LoRA epilogues, rotary-gradient accumulation and parallel cross-entropy. Norms and attention remain FP32. Frozen base matrices; no quantized backward kernels, activation checkpoint recomputation, distributed training, fused FlashAttention, or full-weight updates. The maximum training window is 512 tokens. FP16 uses a fixed loss scale of 128; non-finite results stop the session before an optimizer update. Select FP32 and reload if mixed precision is unstable. Large models/ranks/windows can exceed VRAM or be slow. Begin with a short session and measure on your hardware.

Provenance and model compatibility

The GGUF quantization decoders, tokenizer, metadata reader and streaming SHA-256 code are reused from your supplied NexusAI Repository. New standalone WebGPU/autodiff code provides the training forward/backward graph. There is no embedded Nexus chat app, facial-expression runtime, Python backend, PyTorch or llama.cpp dependency. The Expression Starter was inspected; vision assets do not participate in language-model training.

SmolLM2 is by Hugging Face / HuggingFaceTB. Its admitted Llama-family graph uses GGUF-converted Q/K weights with adjacent rotary pairs. Gemma3 and Qwen use their separately implemented NeoX layouts; GPT-oss uses its frozen YaRN/MoE route. Original Hugging Face safetensors with unconverted half-split Q/K are not accepted as GGUF. A full-size SmolLM2 numerical equivalence benchmark and Radeon performance benchmark have not been completed for this build.

SmolLM2 model · LoRA paper · WGSL specification

Opening this standalone file

Open this HTML in a WebGPU-capable desktop browser. If file access policies disable WebGPU or local checkpoints, serve its folder on localhost and open it there. Inference and training stay local; no remote model service is needed. Browser storage can be cleared, so export .nxadapter files for durable backups. Resume can differ slightly across GPU implementations despite using the same data order.

Activity log (bounded)