Skip to content
Back to skills

Dataset Writing

ASecurity

"Convert indexable datasets or already-available WebDataset shards

  • 247 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
businesspythongo

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add VectorSpaceLab/AREX-Skill --skill dataset-writing --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Dataset Writing?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Dataset Writing
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/vectorspacelab-dataset-writing/badge)](https://www.skillsdirectory.com/skills/vectorspacelab-dataset-writing)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: dataset-writing
description: "Convert indexable datasets or already-available WebDataset shards
  into validated FFCV .beton files, with ordered fields, writer controls,
  built-in/custom fields, and read-back troubleshooting."
metadata:
  disco-role: operating
disable-model-invocation: true
license: Apache 2.0
---

# FFCV dataset writing

Use this sub-skill when a Researcher must serialize an indexable dataset, or
already-available local WebDataset shards, into an FFCV `.beton` file. It owns
`DatasetWriter`, field mapping/order, writer resource controls, built-in and
custom field encoding, and validation of the resulting file. It does not own
training-time loader pipelines, augmentation design, or obtaining shards.

## Operating contract

**Inputs**

- A destination `.beton` path. `DatasetWriter.prepare()` opens it in `wb` mode,
  so treat an existing destination as replaceable output.
- Either an object with `__len__` and `__getitem__`, or a list of local shard
  paths plus a worker-safe WebDataset pipeline.
- A mapping of short ASCII field names to `ffcv.fields.Field` instances.
  Python mapping insertion order is the sample serialization order.
- A source adapter whose returned tuple/list has exactly the same positions as
  the field mapping. The writer zips values and does not provide a reliable
  schema/arity check for you.
- Optional indexed-dataset controls: `indices`, `shuffle_indices`, and
  positive `chunksize`; optional writer controls: `page_size` and
  `num_workers`.

**Outputs and acceptance observations**

- `from_indexed_dataset(...)` or, when the optional dependency is installed,
  `from_webdataset(...)` completes without a worker exception.
- `Reader(path)` opens the file, the sample count and logical field names match
  the intended output, and fixed metadata or decoded payloads match a source
  check. A path merely existing is not success.
- Variable-length bytes/JSON are checked with their length/terminator contract,
  not compared as if every batch had the original unpadded length.
- A custom type-255 field is opened with the required reader registration and
  its decoder returns the intended representation.

## Non-negotiable rules

1. `DatasetWriter` pairs `fields.values()` with each sample by position. A
   mapping's insertion order is useful for the **field mapping**, but a sample
   dict iterates its keys, not its values. Convert dict samples explicitly to a
   tuple in the same named order.
2. Use unique ASCII names no longer than 16 bytes. The on-disk descriptor has a
   16-byte name slot and this build truncates longer names rather than rejecting
   them; truncation can collide or make a field inaccessible.
3. `NDArrayField` and `TorchTensorField` are fixed shape/dtype fields.
   `BytesField` and `JSONField` allocate variable-size payloads. The normal
   bytes decoder allocates each decoded batch to its largest item, so preserve
   lengths or use a delimiter/terminator protocol when exact trimming matters.
4. `JSONField` writes UTF-8 JSON followed by a NUL byte. Decode with
   `BytesDecoder` and call `JSONField.unpack`; do not pass padded bytes directly
   to `json.loads`.
5. A non-exact built-in `Field` subclass is written with type id 255. The
   writer has no custom registry; the reader needs a field-name-to-class
   registration (`Loader(custom_fields=...)` or `Reader(custom_handlers=...)`).
6. WebDataset is optional and local-only here. `from_webdataset` imports it on
   demand, counts each shard before writing, and then processes shards in
   workers. No network or download procedure belongs in this skill.

## Fast route

1. Inspect a small, typical, and largest/most variable sample in the parent
   process. Check tuple arity, scalar types, array shape/dtype, image layout,
   byte-array format, and JSON encodability.
2. Define a short ordered mapping and, for dict-shaped data, an explicit
   `FIELD_ORDER` adapter. Start with a tiny subset and `num_workers=1`.
3. Use the recipes in [references/workflows.md](references/workflows.md) for
   indexed conversion, `indices`/shuffle/chunk controls, local WebDataset
   conversion, structural read-back, JSON unpacking, and custom registration.
4. Choose writer resources only after the smoke file passes. `page_size` is a
   power of two in `[1 << 21, 1 << 32)`; one allocation must fit in one page.
   `num_workers=-1` resolves to the process CPU affinity, and `chunksize`
   controls indexed work-queue granularity.
5. For field-specific input and serialization rules, use
   [references/fields-and-formats.md](references/fields-and-formats.md).
6. For failures, reduce to one worker and a small failing index, then use
   [references/troubleshooting.md](references/troubleshooting.md). Preserve
   the smallest failing sample and the exact field mapping.

## Built-in field selection

- `IntField` and `FloatField`: fixed scalar integer/float metadata (int64 and
  float64 in this build).
- `NDArrayField(dtype, shape)`: fixed-size NumPy arrays; ragged rows need a
  deliberate padding scheme or `BytesField` plus a length contract.
- `TorchTensorField(torch_dtype, shape)`: fixed-size CPU torch tensors whose
  `.numpy()` conversion succeeds; normalize CUDA or grad-tracking tensors in
  the source adapter before writing.
- `RGBImageField`: HWC RGB `uint8` NumPy arrays or PIL images, with raw/JPEG,
  smart/proportion, and optional max-resolution preprocessing. Normalize torch
  images to CPU HWC `uint8`; this writer implementation does not accept a CHW
  torch tensor directly.
- `BytesField`: one-dimensional NumPy `uint8` arrays. Convert Python `bytes`
  explicitly with `np.frombuffer` and define how the original length is kept.
- `JSONField`: JSON-compatible Python values, usually dicts; use its NUL-aware
  `unpack` helper after a `BytesDecoder` read-back.

## Evidence and verified baseline

This operating graph was distilled from `setup.py`, `ffcv/writer.py`,
`ffcv/reader.py`, the field implementations, `docs/writing_datasets.rst`,
`docs/quickstart.rst`, and the requested writer/custom-field/JSON/WebDataset
tests. The inspected environment reported distribution metadata `1.0.1`,
`ffcv.__version__` `1.0.2`, Python 3.11, a passing CPU smoke conversion, and a
successful compiled-extension import. Treat the distribution/module version
split as a provenance warning: recreate and read files with the same installed
build rather than assuming labels alone prove format compatibility.

No bundled executable script is included. A generic writer script would have to
guess the user's schema, source lifetime, output replacement policy, optional
WebDataset availability, page size, worker count, and custom-field classes;
its multiprocessing and disk allocation side effects make reference-only
recipes safer for this sub-skill.

Files in this skill

  • SKILL.md6.7 KB
  • references/fields-and-formats.md8.5 KB
  • references/troubleshooting.md6.4 KB
  • references/workflows.md7.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.