> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.nvidia.com/nemo/curator/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.nvidia.com/nemo/curator/_mcp/server.

> Release notes for NeMo Curator 26.07 (v1.3.0), including new features, fixes, breaking changes, and dependency updates

# NeMo Curator Release Notes: 26.07 (v1.3.0)

NeMo Curator 26.07 expands text, audio, video, and synthetic-data curation, and makes pipeline resource configuration more consistent across execution backends.

**Python 3.11 or later is required.** NeMo Curator 26.07 supports Python 3.11 through 3.13. Before upgrading, review the [26.07 migration checklist](/about/release-notes/26-07-migration), especially framework-owned task IDs, sentinel task construction, pipeline resumability, video caption variant names, typed inference-server configuration, the removed video preprocessing option, the audio ASR worker rename, and architecture-specific dependency changes. The Python range changed in [#1855](https://github.com/NVIDIA-NeMo/Curator/pull/1855).

## What's New

### Nemotron-CLIMB Data Curation

The new [Nemotron-CLIMB tutorial](/curate-text/tutorials/nemotron-climb) implements the data-mixture optimization workflow introduced in [#1727](https://github.com/NVIDIA-NeMo/Curator/pull/1727) and completed in [#2072](https://github.com/NVIDIA-NeMo/Curator/pull/2072). The workflow:

* Embeds and clusters candidate documents.
* Prunes and merges clusters with FastText classifiers.
* Produces Megatron-compatible `.bin` and `.idx` token files.
* Samples Dirichlet data mixtures, trains and evaluates proxy models, and fits a LightGBM predictor.
* Narrows the mixture search from 64 candidates to 32, 16, and a final selected mixture.

The output workflow also includes the [#1427](https://github.com/NVIDIA-NeMo/Curator/pull/1427) utility for merging multiple file prefixes produced by `MegatronTokenizerWriter` into one Megatron dataset.

See [Nemotron-CLIMB stages](/curate-text/tutorials/nemotron-climb/stages) for the stage-by-stage API.

### Audio Tagging, Quality, and Punctuation-and-Capitalization Preparation

The generic ASR and TTS preparation pipeline from [#1679](https://github.com/NVIDIA-NeMo/Curator/pull/1679) and the [audio tagging tutorial](/curate-audio/tutorials/audio-tagging) added in [#1863](https://github.com/NVIDIA-NeMo/Curator/pull/1863) compose resampling, diarization, long-segment splitting, ASR alignment, bandwidth estimation, SQUIM quality metrics, and TTS or ASR manifest preparation. Optional second-pass ASR enables pairwise WER scoring. The pipeline can also apply inverse text normalization and Chinese text conversion when their optional dependencies are available.

New public stages include `BandwidthEstimationStage`, `TorchSquimQualityMetricsStage`, `ComputeWERStage`, `GetPairwiseWerStage`, and `PrepareModuleSegmentsStage`.

### Interactive DNS Challenge Read Speech Tutorial

The [Read Speech tutorial](/curate-audio/tutorials/readspeech) now includes an interactive notebook for exploring the DNS Challenge workflow before running the complete Hydra pipeline ([#1870](https://github.com/NVIDIA-NeMo/Curator/pull/1870)).

### Long-Form Audio Pretraining Pipeline

The [audio pretraining tutorial](/curate-audio/tutorials/audio-pretrain) from [#1898](https://github.com/NVIDIA-NeMo/Curator/pull/1898) turns diarized and transcribed long-form recordings into bounded, mono training snippets. It includes overlap filtering, snippet cut planning, repeated-content filtering, extraction, tar and JSONL writers, metrics, and a dry-run mode through `build_audio_pretrain_pipeline()`.

### Nemotron OCR Synthetic Data Generation

The [Nemotron OCR pipeline](/curate-text/synthetic/nemotron-ocr) added in [#1899](https://github.com/NVIDIA-NeMo/Curator/pull/1899) generates OCR training records from Hugging Face datasets with `OCRNemotronV2Stage`. An optional `OCRScoringQAStage` uses Nemotron Nano Omni to score generated records and create question-answer data. See the [OCR tutorial](/curate-text/synthetic/nemotron-ocr/tutorial) for an end-to-end example.

### Interleaved Image-Text Getting Started Workflow

The interleaved data quickstart moved into a dedicated getting-started workflow in [#1774](https://github.com/NVIDIA-NeMo/Curator/pull/1774). It demonstrates reading, transforming, filtering, and writing MINT-1T-style image-text records. Start with [Interleaved Data](/curate-text/process-data/interleaved), then use the linked I/O and filter guides for production configuration.

### Pipeline Resumability

Pipelines can now pass a local `checkpoint_path` to `Pipeline.run()` to track completed source partitions in LMDB and skip them when a run is restarted ([#2063](https://github.com/NVIDIA-NeMo/Curator/pull/2063)). Resumability requires a pre-existing Ray cluster and every stage in the pipeline to be marked resumability-safe. `NoneTask` records intentionally filtered branches, while `FailedTask` keeps a source pending for retry. See [Resumable Processing](/reference/infra/resumable-processing).

### SLURM Job Arrays

NeMo Curator can shard deterministic source tasks across independent SLURM array jobs, record one durable completion manifest per successful shard, and discover only the shards that require retry ([#2059](https://github.com/NVIDIA-NeMo/Curator/pull/2059)). The reference workflow supports JSONL and Parquet, single-node or multi-node Ray within each array task, logical shard counts larger than the scheduler array limit, and downstream `FailedTask` recovery. See [SLURM Job Arrays](/admin/deployment/slurm-arrays).

### Video Caption Quality Evaluation

The [caption evaluation workflow](/curate-video/process-data/caption-evaluation) from [#1980](https://github.com/NVIDIA-NeMo/Curator/pull/1980) builds a diverse benchmark from sampled OpenVid clips, summarizes captions to the model's token budget, and uses Cosmos-Embed1 cosine similarity to evaluate video-text alignment. Summaries are cached so repeated evaluations do not regenerate them.

The removed `--captioning-model-does-preprocess` option appears in an older benchmark README. Do not use it with 26.07; follow the [video preprocessing migration](/about/release-notes/26-07-migration#4-remove-the-video-model-preprocessing-option).

### Expanded Video Caption Models

Video captioning now supports Qwen2.5-VL, Qwen3-VL, NVIDIA Nemotron Nano 12B V2 VL in BF16, FP8, and NVFP4 variants, and Nemotron 3 Nano Omni ([#1827](https://github.com/NVIDIA-NeMo/Curator/pull/1827), [#1883](https://github.com/NVIDIA-NeMo/Curator/pull/1883)). The [captions and preview guide](/curate-video/process-data/captions-preview) provides the model matrix, precision behavior, preparation and generation controls, and second-pass refinement options.

The unversioned `qwen` variant was removed. Existing pipelines must select `qwen2.5` to preserve the former behavior or choose `qwen3` explicitly; see the [caption variant migration](/about/release-notes/26-07-migration#5-replace-the-unversioned-video-caption-variant).

### Typed Inference Server Backends

`InferenceServer` now uses typed backend configuration for Ray Serve and NVIDIA Dynamo. Use `RayServeModelConfig` for Ray Serve, or combine `DynamoVLLMModelConfig` and `DynamoServerConfig` for aggregated or disaggregated Dynamo serving. The expanded [Inference Server guide](/curate-text/synthetic/inference-server) covers model replicas, routing, runtime environments, resource placement, HAProxy ingress, pipeline coexistence, and troubleshooting ([#1813](https://github.com/NVIDIA-NeMo/Curator/pull/1813), [#1820](https://github.com/NVIDIA-NeMo/Curator/pull/1820), [#1833](https://github.com/NVIDIA-NeMo/Curator/pull/1833), [#1834](https://github.com/NVIDIA-NeMo/Curator/pull/1834), [#1861](https://github.com/NVIDIA-NeMo/Curator/pull/1861), [#1895](https://github.com/NVIDIA-NeMo/Curator/pull/1895), [#1957](https://github.com/NVIDIA-NeMo/Curator/pull/1957)).

`InferenceModelConfig` was removed. Migrate existing Ray Serve configuration to `RayServeModelConfig`, or select a Dynamo model and server configuration explicitly; see the [inference-server migration](/about/release-notes/26-07-migration#6-replace-inferencemodelconfig).

### Expanded Translation Controls

The translation workflow introduced in [#1844](https://github.com/NVIDIA-NeMo/Curator/pull/1844) gained production-oriented `TranslationStage` controls in [#2038](https://github.com/NVIDIA-NeMo/Curator/pull/2038), including segmentation mode and minimum segment length, prompt and generation configuration, concurrency and health checks, FAITH quality scoring and filtering, output modes, message reconstruction, and already-translated record handling. See [Translation](/curate-text/process-data/language-management/translation) for the complete configuration surface.

### Nemotron-Parse Throughput Tuning and Metrics

Nemotron-Parse now forwards `engine_kwargs` such as `max_num_seqs` and `enforce_eager` to vLLM and reports per-task inference time, pages, prompt and output tokens and characters, truncation, empty results, and retry counts. PDF partitioning also fans work out across workers. These changes landed in [#2054](https://github.com/NVIDIA-NeMo/Curator/pull/2054); see [Parse PDFs with Nemotron-Parse](/curate-text/load-data/nemotron-parse-pdf).

### Consistent Stage Scheduling and `with_()` Overrides

Stage scheduling was standardized in [#2077](https://github.com/NVIDIA-NeMo/Curator/pull/2077) and [#2086](https://github.com/NVIDIA-NeMo/Curator/pull/2086):

* Use fixed `ActorPoolStrategy` or `TaskPoolStrategy` worker counts for Ray Data.
* Use minimum, maximum, and initial worker bounds for autoscaling actor pools.
* Describe Xenna resources per worker or per node.
* Apply per-instance scheduling overrides with `stage.with_(...)`.

See [Stage worker sizing](/reference/infra/stage-worker-sizing) before carrying custom worker settings forward.

## Improvements

### Memory-Efficient Semantic Deduplication Fitting

K-means can fit centroids from a file-level sample and then assign the full dataset in a memory-bounded second pass ([#1927](https://github.com/NVIDIA-NeMo/Curator/pull/1927)). Configure `KMeansStage.fit_data_fraction`, `SemanticDeduplicationWorkflow.fit_data_fraction`, or `TextSemanticDeduplicationWorkflow.kmeans_fit_data_fraction`. A directly constructed `KMeansStage` can also save `kmeans_centroids.npy` through `cache_path`. See [Semantic Deduplication](/curate-text/process-data/deduplication/semdedup) for sampling, memory, and I/O tradeoffs.

### Faster Optional-Dependency Imports

* Text classifier modules now load their implementations lazily, reducing cold-import cost and avoiding eager loading of unused optional dependencies ([#1888](https://github.com/NVIDIA-NeMo/Curator/pull/1888)).
* `AsyncOpenAIClient` now creates its OpenAI client lazily, so constructing stages does not initialize a network client until it is needed ([#1890](https://github.com/NVIDIA-NeMo/Curator/pull/1890)).

### Repository Getting Started Agent Skill

The repository includes a Getting Started agent skill with modality-specific environment and pipeline verification scripts ([#1746](https://github.com/NVIDIA-NeMo/Curator/pull/1746)). It helps coding agents select installation extras and validate text, image, video, audio, Ray, and CPU pipeline setup directly from a source checkout.

### Deduplication Input Extension Discovery

Deduplication workflows now infer input extensions from `input_filetype` in [#2045](https://github.com/NVIDIA-NeMo/Curator/pull/2045): Parquet scans `.parquet`, while JSONL scans both `.jsonl` and `.json`. Explicit `input_file_extensions` still takes precedence, and unsupported file types fail early. See [Deduplication](/curate-text/process-data/deduplication).

### Reliable FLEURS Downloads

The FLEURS tutorial now uses the Hugging Face content cache and retry behavior through `hf_hub_download`, supports `cache_dir`, and lets benchmarks set `auto_download=False`. This reduces rate-limit failures and repeated downloads ([#2057](https://github.com/NVIDIA-NeMo/Curator/pull/2057)).

### Safer ArXiv Extraction

`ArxivIterator(extract_tmp_dir=None)` now extracts into the system temporary directory by default instead of the download directory. Set `extract_tmp_dir` to retain explicit placement ([#2055](https://github.com/NVIDIA-NeMo/Curator/pull/2055)).

### Dynamo Server Configuration

[Dynamo fixes in #2053](https://github.com/NVIDIA-NeMo/Curator/pull/2053) propagate `DynamoServerConfig.subprocess_env` to the frontend and workers, support explicit `dyn_chat_processor="vllm"` routing for pass-through multimodal requests, validate hybrid KV-cache settings, and render false-valued CLI options as `--no-*` flags.

### NeMo Data Designer Tutorial Guidance

The NDD tutorial now configures stage workers with `.with_(num_workers=2)` rather than a Xenna-only stage spec ([#2104](https://github.com/NVIDIA-NeMo/Curator/pull/2104)). It also documents a workaround for local multi-GPU `InferenceServer` startup hangs on PCIe systems: restart Ray or the kernel and either set `NCCL_P2P_DISABLE=1` or use `tensor_parallel_size=1` ([#2114](https://github.com/NVIDIA-NeMo/Curator/pull/2114)). See [NeMo Data Designer](/curate-text/synthetic/nemo-data-designer).

### Video CPU Stage Scheduling

`VideoFrameExtractionStage` and `ClipTranscodingStage` now request one Ray Data CPU so adjacent CPU stages can be fused more effectively ([#2110](https://github.com/NVIDIA-NeMo/Curator/pull/2110)). Their Xenna resource declarations remain larger because they describe worker capacity for FFmpeg work; the Ray reservation does not reduce the computation performed by the stage.

## Fixes

* **Full TCP port range:** Automatic port selection now includes port 65535 ([#2024](https://github.com/NVIDIA-NeMo/Curator/pull/2024)).
* **UTF-8 JSONL output:** `JsonlWriter` preserves non-ASCII characters by default instead of escaping them as Unicode sequences ([#1762](https://github.com/NVIDIA-NeMo/Curator/pull/1762)).
* **Distinct Nemotron-CC stage metrics:** The five Nemotron-CC task stages now use distinct stage names in metrics and diagnostics ([#1763](https://github.com/NVIDIA-NeMo/Curator/pull/1763)).
* **URL filter matching:** URL-ratio and repetition filters correctly treat `-` as a literal character in their URL-matching character class ([#1880](https://github.com/NVIDIA-NeMo/Curator/pull/1880)).

## Breaking Changes

The [26.07 migration checklist](/about/release-notes/26-07-migration) provides before-and-after examples for every item below.

* **Framework-owned task IDs:** `Task.task_id` is no longer accepted by task constructors. Executors assign deterministic IDs at stage boundaries ([#2036](https://github.com/NVIDIA-NeMo/Curator/pull/2036), [#2058](https://github.com/NVIDIA-NeMo/Curator/pull/2058)).
* **Sentinel task classes:** Construct empty sentinels with `EmptyTask()` and check them with `isinstance`. `SentinelTask` is the payloadless base class ([#2062](https://github.com/NVIDIA-NeMo/Curator/pull/2062), [#2070](https://github.com/NVIDIA-NeMo/Curator/pull/2070)).
* **Video preprocessing option removed:** Remove `model_does_preprocess` and `--captioning-model-does-preprocess`; video models now use vLLM or Hugging Face preprocessing ([#2109](https://github.com/NVIDIA-NeMo/Curator/pull/2109)).
* **Video caption variant renamed:** Replace the removed `qwen` variant with `qwen2.5` for equivalent behavior, or select `qwen3` explicitly ([#1827](https://github.com/NVIDIA-NeMo/Curator/pull/1827), [#1883](https://github.com/NVIDIA-NeMo/Curator/pull/1883)).
* **Inference server configuration is typed:** Replace the removed `InferenceModelConfig` with `RayServeModelConfig` or Dynamo's `DynamoVLLMModelConfig` and `DynamoServerConfig`.
* **Audio ASR worker rename:** Replace stage argument `num_workers` with `dataloader_num_workers`. `num_workers` is now reserved for execution-worker configuration through `with_()` ([#2086](https://github.com/NVIDIA-NeMo/Curator/pull/2086)).

## Dependency Changes

* **Final CUDA and serving stack:** The release container uses CUDA 12.9.1. Core Ray dependencies require `ray[default,data]>=2.55.1`; the inference-server extra adds `ray[serve,llm]>=2.55.1`, `vllm>=0.14.1,<0.19`, and `ai-dynamo==1.1.0` on supported x86\_64 non-macOS systems. The 26.07 lock resolves Ray 2.55.1, vLLM 0.18.1, and AI-Dynamo 1.1.0. The container builds HAProxy 2.8.20 for Ray Serve HAProxy ingress ([#1895](https://github.com/NVIDIA-NeMo/Curator/pull/1895), [#1957](https://github.com/NVIDIA-NeMo/Curator/pull/1957)).
* **PyTorch and CUDA wheels:** Dependency resolution pins PyTorch and torchaudio 2.10.0 and torchvision 0.25.0. Linux x86\_64 and aarch64 installations resolve the CUDA 12.9 builds (`torch==2.10.0+cu129`, `torchaudio==2.10.0+cu129`, and `torchvision==0.25.0+cu129`).
* **`nemo_text_processing` on Arm:** The audio extra installs `nemo_text_processing` on x86\_64 Linux, but no longer installs it on aarch64 or macOS because its `pynini` dependency is not supported there. Audio stages that import it, including inverse text normalization and WER processing, must be omitted or supplied through a separately supported environment on those platforms ([#2049](https://github.com/NVIDIA-NeMo/Curator/pull/2049)).
* **`flash-attn` is no longer a direct video dependency:** The `video_cuda12` extra no longer pins or installs `flash-attn`. Built-in video pipelines use their declared dependencies; custom code that imports FlashAttention must install a compatible build explicitly ([#2107](https://github.com/NVIDIA-NeMo/Curator/pull/2107)). This applies to both x86\_64 and aarch64.

See the [architecture dependency matrix](/about/release-notes/26-07-migration#8-review-architecture-specific-dependencies) for upgrade actions.

## Upgrade Checklist

1. Create a Python 3.11, 3.12, or 3.13 environment.
2. Apply every relevant code change in the [26.07 migration checklist](/about/release-notes/26-07-migration).
3. Reinstall the modality extras used by your pipeline and verify the architecture-specific dependency matrix.
4. Run a representative pipeline with a small input set and inspect generated task IDs, worker counts, and output manifests.
5. For resumable runs, start Ray before calling `Pipeline.run(checkpoint_path=...)`, use a local checkpoint directory, and verify that every stage is resumability-safe.