Shinzmann's picture
Add W&B training curves to model card
9267bff verified
|
Raw
History Blame Contribute Delete
3.51 kB
---
license: apache-2.0
base_model: google/gemma-4-E4B-it
library_name: peft
pipeline_tag: text-generation
tags:
- age-verification
- explanation
- lora
- qlora
- multilingual
- africa
---
# Kámárí Gemma Explanation LoRA (v0)
A QLoRA adapter for `google/gemma-4-E4B-it` that turns Kámárí's CNN + policy signals into a safe,
multilingual, **strict-JSON** explanation. **Gemma explains a decision; it never estimates age and
never invents a reason code.**
- LoRA r=32, alpha 64, `target_modules="all-linear"`, 4-bit nf4 QLoRA, 3 epochs on H200.
- Output schema: `decision, reason_code, user_message, admin_summary, next_step, language,
safety_note`. Reason codes come from a fixed list.
## Intended use
Input: `{cnn_result, policy_context:{decision, reason_code, legal_threshold, challenge_threshold},
language}`. Output: one strict-JSON object with the message in the requested language. Languages in
the SFT set: en, sw, yo, ha, am, fr, ar (more in the app picker). Non-English strings should get
native-speaker review before release.
## Training data
Synthesized from the Kámárí policy engine, not from child faces: sampled signals run through the same
`decide()` rules, and approved per-reason, per-language templates render the message. The set is
reason-code balanced (so it is not dominated by ALLOW): 8,000 rows, 7,200 train / 800 eval.
## Evaluation
Training loss converged from 3.00 to a best eval loss of 0.087, at 96.3% eval token accuracy
(3 epochs / 675 steps, about 35 minutes on an H200; tracked in Weights & Biases, project `kamari`).
Evaluated through the **served
endpoint** (the manual KV-cached greedy decode used in production, not the buggy `generate()` path),
over **n=70** cases across 5 reason codes and 7 languages (en, sw, yo, ha, am, fr, ar):
| Metric | Value |
|---|---|
| JSON validity | 1.00 |
| Schema compliance | 1.00 |
| Decision consistency | 1.00 |
| Policy consistency (reason code) | 1.00 |
| Language correctness | 1.00 |
| Invented-code rate (lower is better) | 0.00 |
The endpoint validates output and falls back to an approved template on any model failure, so the
system always returns valid, schema-correct, policy-consistent JSON; language correctness reflects
in-language generation by the model. (An earlier v0 eval showed 0.0 across the board because it ran
through the buggy `generate()` path; those numbers are superseded.) Non-English strings still benefit
from a native review.
## Training curves
Pulled from the Weights & Biases run (project `kamari`, run `gemma4b-lora-r32`). Cross-entropy loss
converges from 3.00 to a best eval loss of 0.087, and mean token accuracy rises to 96.3%, with train
and eval tracking closely across 675 steps (3 epochs).
![Gemma training curves](https://raw.githubusercontent.com/Mystique1337/kamari/main/docs/assets/training/gemma_training_curves.png)
## Serving
Load base Gemma 4 + this adapter, `merge_and_unload()`, and decode greedily token by token (avoid
`generate()`). On any validation failure, return a deterministic safe fallback so the caller always
gets valid JSON. Served on a Modal L4 GPU, always-on.
Methodology: https://github.com/Mystique1337/kamari/blob/main/docs/methodology.md
## License
Apache-2.0. Every output carries: this is an estimate, not a legal age determination.
## Links
- Code (Apache-2.0): https://github.com/Mystique1337/kamari
- Live demo: https://kamari.shinzii.tech
- Methodology: https://github.com/Mystique1337/kamari/blob/main/docs/methodology.md