Skip to main content

Strict validator for fine-tuning datasets. Run before you train.

Project description

parallelogram

Strict validator for fine-tuning datasets. Run it before you train.

Every fine-tuning framework assumes your data is clean. None of them verify it. Axolotl will start a run on malformed data and either crash mid-way or — worse — complete silently while producing a broken model. TRL will truncate samples that exceed the context window without telling you. Unsloth will train on duplicates that cause your model to memorize instead of generalize.

parallelogram sits between your raw dataset and your training run. It hard-blocks on anything that would silently corrupt training. If it exits 0 with all rules enabled, your run won't fail because of data.

Install

pip install parallelogram

For an exact context-window count, install the tokenizer extras — HuggingFace tokenizers for open-weight models and tiktoken for OpenAI models:

pip install 'parallelogram[tokenizer]'

Without the extras (or for a model with no offline tokenizer, like Claude), the context-window check still runs using an approximate length-based count.

Use

parallelogram check data.jsonl

With a model-specific tokenizer for an exact context-window count — an OpenAI model, or any HuggingFace repo or short alias (mistral, qwen, llama-3, …):

parallelogram check data.jsonl \
  --tokenizer Qwen/Qwen2.5-7B \
  --max-seq-len 8192

Omit --tokenizer and the check still runs with an approximate count, reported as warnings instead of errors.

Write only the clean records to a new file:

parallelogram check data.jsonl --output clean.jsonl

ShareGPT datasets ({"conversations": [{"from": ..., "value": ...}, ...]}) are validated with --format sharegpt — every rule runs identically, and --output (with or without --fix) writes the surviving records back in ShareGPT shape:

parallelogram check data.jsonl --format sharegpt

--fix — mechanical repair

When parallelogram check finds errors, --fix attempts to repair what it can without touching the model. Mechanical fixes are free, local, and require no network call.

parallelogram check data.jsonl --fix --output clean.jsonl

Fixes applied in order:

  1. encoding — strip BOM markers, replace mojibake (don’tdon't)
  2. empty-content — drop empty/whitespace-only message turns
  3. context-window — truncate the longest user message until the record fits
  4. duplicates — keep the first occurrence, drop subsequent

After fixes are applied, the dataset is re-validated. Anything still erroring is dropped from the output. The CLI tells you exactly what was unchanged, fixed, and dropped:

✓ encoding · 4 fixes
✓ duplicates · 12 fixes

✗ dropped:
    data.jsonl:23 → roles (unfixable)
    data.jsonl:147 → schema (unfixable)

547 records  531 unchanged  4 fixed  11 dropped  1 unparseable

Errors that need understanding the content (broken role sequences, incomplete assistant turns) are not fixable mechanically. These will be addressed by a hosted SLM tier in a future release. For now, they are dropped.

Use --dry-run to preview without writing:

parallelogram check data.jsonl --fix --dry-run

--disable and the exit-0 guarantee

Rules can be disabled by id (e.g. --disable encoding), but with three constraints:

  • The schema rule cannot be disabled. Every other rule depends on its structural guarantees, and disabling it would let other rules silently no-op on malformed records.
  • Unknown rule ids are rejected. Typos like --disable encding exit non-zero with a list of valid options rather than silently doing nothing.
  • Whenever any rule is disabled, a loud stderr warning names exactly which ones, and reminds you that the exit-0 guarantee no longer applies. The terminal output and JSON report (disabled_rules field) both surface this so CI tooling can refuse to merge a PR that disabled rules.

The guarantee is precise: a clean exit with all rules enabled means your run won't fail because of data. A clean exit with rules disabled means only that the rules you left enabled passed — which may or may not be enough.

Options

Flag Description
--format, -f Dataset format: openai-chat (default) or sharegpt.
--tokenizer, -t Model or tokenizer for the context-window check — an OpenAI model (gpt-4o), or an HF repo/alias (Qwen/Qwen2.5-7B, mistral). Optional: omit for an approximate count.
--max-seq-len Token budget per record (default 4096).
--output, -o Write error-free records to this file. With --fix, writes the repaired dataset.
--fix Attempt mechanical repair of fixable issues.
--dry-run With --fix, report what would change without writing.
--json Machine-readable report on stdout.
--disable Disable a rule by id. Repeatable.
--no-color Plain output.

Exit codes

Code Meaning (check) Meaning (--fix)
0 Clean. All records emitted clean.
1 Warnings only. Some records dropped (partial fix).
2 Errors. Nothing fixable.

These map directly to CI gates without any extra wiring.

Rules

id severity catches
schema error malformed records, missing fields, wrong types
roles error bad role sequences (system out of place, no alternation, doesn't end on assistant)
empty-content error empty or whitespace-only message content
context-window error / warning records exceeding max_seq_len (TRL truncates these silently) — error with an exact tokenizer, warning when the count is approximate
duplicates error exact-content duplicate records (memorization → poor generalization)
encoding warning BOM markers, mojibake patterns

Status

v0.4 — solo dev, local, pre-training run. No telemetry, no network, no upload boundary.

Roadmap

  • --fix mechanical tier (dedupe, truncate, normalize encoding) ✓ shipped in v0.2
  • Model-specific tokenizers (tiktoken/HF) with approximate fallback ✓ shipped in v0.3
  • ShareGPT format ({"conversations": [...]}) ✓ shipped in v0.4
  • raw-completion format

License

Apache-2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

parallelogram-0.4.0.tar.gz (36.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

parallelogram-0.4.0-py3-none-any.whl (39.6 kB view details)

Uploaded Python 3

File details

Details for the file parallelogram-0.4.0.tar.gz.

File metadata

  • Download URL: parallelogram-0.4.0.tar.gz
  • Upload date:
  • Size: 36.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for parallelogram-0.4.0.tar.gz
Algorithm Hash digest
SHA256 4200e8ea2178fcdc8deadf03683d83d52c71fb8577c58a3483960d5001c6a490
MD5 c709068a6ee67aff8066714ec785952f
BLAKE2b-256 ac376a654475bc869eeeed8b86010e4e4af4bc28b234f9d315cb7117bf4ee495

See more details on using hashes here.

Provenance

The following attestation bundles were made for parallelogram-0.4.0.tar.gz:

Publisher: release.yml on Thatayotlhe04/Parallelogram

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file parallelogram-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: parallelogram-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 39.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for parallelogram-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 380a56a82ff8bd790c400f37226978c001702cb73b737d13b8f799e8539b819e
MD5 be74ca02cf069c36d402871cc6ccb3ac
BLAKE2b-256 15d2599b2f1594de8c45d47742ea0b560bea357d75b040069464104383d3c843

See more details on using hashes here.

Provenance

The following attestation bundles were made for parallelogram-0.4.0-py3-none-any.whl:

Publisher: release.yml on Thatayotlhe04/Parallelogram

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page