Skip to content

Commit 118aab9

Browse files
docs: Create intro dev note (#495)
# Summary Create first dev note with introduction to Safe Synthesizer. Other changes: - Renames from `docs/blog` to `docs/dev-notes` to match existing naming patterns. - Adds `docs/dev-notes/.authors.yml` for the mkdocs blog plugin to add author info to posts. Signed-off-by: Kendrick Boyd <kendrickb@nvidia.com> Co-authored-by: Matt Kornfield <mkornfield@nvidia.com>
1 parent e3b5ff1 commit 118aab9

9 files changed

Lines changed: 152 additions & 37 deletions

File tree

.cursor/rules/writing-docs.mdc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ docs/
7575
├── developer-guide/ # Explanations
7676
├── product-overview/ # Product feature docs
7777
├── tutorials/
78-
└── blog/
78+
└── dev-notes/
7979
```
8080

8181
## Build Commands

CONTRIBUTING.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ All documentation lives under `docs/`. The structure follows the [Diataxis](http
530530
| `user-guide/` | How-tos & reference | CLI, configuration, SDK |
531531
| `architecture/` | Explanations | Design decisions |
532532
| `reference/` | API reference | Auto-generated (see below) |
533-
| `blog/` | Dev notes | Release notes, design posts |
533+
| `dev-notes/` | Dev notes | Release notes, design posts |
534534

535535
### Adding or Editing a Page
536536

docs/blog/posts/welcome.md

Lines changed: 0 additions & 29 deletions
This file was deleted.

docs/dev-notes/.authors.yml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
authors:
5+
ahaushalter:
6+
name: Alexa Haushalter
7+
description: Product Manager at NVIDIA
8+
avatar: https://github.com/alexahaushalter.png
9+
kendrickb:
10+
name: Kendrick Boyd
11+
description: Researcher at NVIDIA
12+
avatar: https://github.com/kendrickb-nvidia.png
File renamed without changes.
2.2 MB
Loading
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
---
2+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3+
# SPDX-License-Identifier: Apache-2.0
4+
date: 2026-05-19
5+
authors:
6+
- ahaushalter
7+
- kendrickb
8+
---
9+
10+
# Private by Design: Introducing NeMo Safe Synthesizer
11+
12+
Every organization working on AI faces the same challenge: the data that would make their models most useful is also proprietary data with the highest barriers to access. The data is right there: patient records, financial transactions, customer support logs, and datasets full of names, account numbers, and personal details. It is rich and perfectly suited to the task, but legal and compliance teams have marked it off-limits for good reason.
13+
14+
We built [NeMo Safe Synthesizer](https://github.com/NVIDIA-NeMo/Safe-Synthesizer) to break that deadlock by helping organizations create synthetic versions of sensitive tabular data.
15+
16+
<!-- more -->
17+
18+
![From real world data to a safe, synthetic version for AI](assets/introducing-nemo-safe-synthesizer/safe-synthesizer-hero.png)
19+
20+
## The Approach
21+
22+
The core insight behind Safe Synthesizer is that modern language models are remarkably good at learning the joint distribution of structured data, as long as you represent that data in a way they can understand. A row of a tabular dataset, serialized to JSON, is just text. An LLM fine-tuned on thousands of such rows can learn which field values co-occur, which correlations hold across columns, and which categorical distributions look realistic.
23+
24+
Instead of fitting an explicit statistical model, Safe Synthesizer fine-tunes an LLM to generate new rows that look like they came from the same distribution. The generated records are novel, with no one-to-one mapping to any original record. The model samples from what it has learned about the data distribution, not from the data itself.
25+
26+
That distinction matters for privacy: LLM-based synthesis is designed to maintain statistical utility while reducing exposure of specific individuals. For especially sensitive use cases, Safe Synthesizer also offers optional differential privacy through DP-SGD.
27+
28+
## What Makes Safe Synthesizer Different
29+
30+
- End-to-end pipeline: PII replacement, LLM fine-tuning, vLLM-powered generation, and evaluation ship together in one tool. No stitching together separate libraries.
31+
- Defense in depth: PII replacement scrubs sensitive content before the model ever sees it. Optional differential privacy adds formal privacy guarantees on top.
32+
- Mixed-type table support: LLM fine-tuning handles numeric, categorical, and free-text columns in the same dataset without separate architectures for different column types.
33+
- Built-in evaluation: Every run produces a Synthetic Quality Score and a Data Privacy Score, plus additional charts and details in an HTML report.
34+
- Flexible interfaces: Run from the CLI, integrate with Jupyter notebooks through the Python SDK, or configure jobs with YAML files and CLI flags.
35+
- Sensible defaults, tunable depth: Autoconfigured model defaults and preflight checks get you running quickly, while documented parameters let you go deeper when needed.
36+
37+
## The Pipeline
38+
39+
NeMo Safe Synthesizer runs as a multi-stage pipeline. Point it at input data (CSV file, Parquet file, pandas DataFrame), provide a config, and it produces a synthetic dataset plus a detailed evaluation report.
40+
41+
```mermaid
42+
flowchart LR
43+
data[("Input Data")]
44+
data --> pii["PII Replacement<br/>(optional, on by default)"]
45+
pii --> assemble["Assemble Examples"]
46+
assemble --> train["Fine-tune LLM"]
47+
train --> generate["Generate"]
48+
generate --> evaluate["Evaluate"]
49+
```
50+
51+
### Stage 1: PII Replacement
52+
53+
Before the model sees any data, Safe Synthesizer can detect sensitive values and replace them with realistic synthetic alternatives. A name stays a name and a phone number stays a phone number, but neither maps to a real person.
54+
55+
In this context, data like addresses, phone numbers, emails, social security numbers, and credit card numbers are referred to as entities, and we include those by default as replacement targets. Dozens of additional entity types are supported, and custom entities are configurable. PII replacement is on by default and can be disabled when your data does not contain PII.
56+
57+
Safe Synthesizer uses NVIDIA's fine-tuned [GLiNER PII model](https://huggingface.co/nvidia/gliner-PII#evaluation-datasets) for free-text columns and LLM-based classification for whole-column entities. For the complete entity list and replacement modes, see [PII Replacement](../../product-overview/pii_replacement.md).
58+
59+
### Stage 2: Fine-Tuning
60+
61+
Data is then transformed into LLM-friendly samples which are used to LoRA fine-tune a pretrained LLM. Three models are supported out of the box:
62+
63+
- `HuggingFaceTB/SmolLM3-3B` (default)
64+
- `TinyLlama/TinyLlama-1.1B-Chat-v1.0`
65+
- `mistralai/Mistral-7B-Instruct-v0.3`
66+
67+
For use cases that require formal privacy assurances, [differential privacy](../../product-overview/data_synthesis.md#differential-privacy) via DP-SGD is available as an opt-in training mode.
68+
69+
### Stage 3: Generation
70+
71+
The fine-tuned LoRA adapter is loaded onto the pretrained model and vLLM drives novel record generation, validating each synthetic record before accepting it. Optional structured generation can constrain outputs to the expected record format when a pipeline needs stricter schema conformance.
72+
73+
### Stage 4: Evaluation
74+
75+
Every run produces an HTML report with two high-level scores:
76+
77+
- Synthetic Quality Score (SQS): aggregates column correlation stability, deep structure stability, column distribution stability, text structure similarity, and text semantic similarity into a single quality score out of 10.
78+
- Data Privacy Score (DPS): uses empirical membership inference and attribute inference attacks to estimate privacy risk, also out of 10. PII replay is reported separately as an additional privacy signal.
79+
80+
Each score maps to concrete remediation guidance in the documentation. The [Product Overview](../../product-overview/pipeline.md) covers the full pipeline in more detail, and [Evaluation](../../product-overview/evaluation.md) explains the metrics.
81+
82+
## Getting Started
83+
84+
[Install](../../user-guide/getting-started.md#installation) the package on a Linux machine with an NVIDIA GPU:
85+
86+
```bash
87+
pip install "nemo-safe-synthesizer[cu129,engine]" \
88+
--extra-index-url https://download.pytorch.org/whl/cu129 \
89+
--extra-index-url https://flashinfer.ai/whl/cu129 \
90+
--extra-index-url https://wheels.vllm.ai/88d34c6409e9fb3c7b8ca0c04756f061d2099eb1/cu129
91+
```
92+
93+
The quickest way to run your first pipeline is the CLI:
94+
95+
```bash
96+
safe-synthesizer run --data-source data.csv
97+
```
98+
99+
If you prefer a programmatic interface, the Python SDK lets you chain configuration with a fluent interface:
100+
101+
```python
102+
from nemo_safe_synthesizer.sdk.library_builder import SafeSynthesizer
103+
104+
synthesizer = (
105+
SafeSynthesizer()
106+
.with_data_source("data.csv")
107+
.with_train(learning_rate="auto")
108+
.with_generate(num_records=5000)
109+
.with_evaluate(enabled=True)
110+
)
111+
synthesizer.run()
112+
results = synthesizer.results
113+
```
114+
115+
The [Safe Synthesizer 101 tutorial](../../tutorials/safe-synthesizer-101.ipynb) is the fastest path from zero to a running synthetic data job using a publicly available dataset.
116+
For more details, read [Running Safe Synthesizer](../../user-guide/running.md) or use the [Configuration Reference](../../user-guide/configuration.md) to learn about available parameters.
117+
118+
## Summary
119+
120+
NeMo Safe Synthesizer takes sensitive tabular data through a layered privacy pipeline: PII is detected and replaced before the model ever sees it, an LLM is fine-tuned on the anonymized data using LoRA, optional differential privacy can add formal guarantees, new records are generated through vLLM, and the synthetic data is evaluated for both quality and privacy in an automated HTML report.
121+
122+
The result is a synthetic dataset with no one-to-one mapping to your original records. It preserves statistical utility for downstream AI tasks while giving you quantitative, interpretable evidence about privacy protection.
123+
124+
## Key Resources
125+
126+
- [NeMo Safe Synthesizer on GitHub](https://github.com/NVIDIA-NeMo/Safe-Synthesizer)
127+
- [Documentation](../../index.md)
128+
- [Safe Synthesizer 101 Tutorial](../../tutorials/safe-synthesizer-101.ipynb)
129+
- [Differential Privacy Tutorial](../../tutorials/differential-privacy.ipynb)
130+
- [Evaluation Metrics Reference](../../product-overview/evaluation.md)
131+
132+
Have questions or want to share what you are building? Open a [GitHub discussion](https://github.com/NVIDIA-NeMo/Safe-Synthesizer/discussions) or file a [feature request](https://github.com/NVIDIA-NeMo/Safe-Synthesizer/issues).

docs/index.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,13 @@ NeMo Safe Synthesizer creates private, safe versions of sensitive tabular datase
6464

6565
[:octicons-arrow-right-24: Developer Guide](developer-guide/architecture.md)
6666

67-
- **Developer Notes**
67+
- **Dev Notes**
6868

6969
---
7070

71-
Read developer blog posts and check release notes.
71+
Read developer blog posts.
7272

73-
[:octicons-arrow-right-24: Developer Notes](blog/index.md)
73+
[:octicons-arrow-right-24: Developer Notes](dev-notes/index.md)
7474

7575
</div>
7676

mkdocs.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ hooks:
8383
plugins:
8484
- search
8585
- blog:
86-
blog_dir: blog
86+
blog_dir: dev-notes
8787
blog_toc: true
8888
post_date_format: long
8989
post_url_format: "{slug}"
@@ -194,5 +194,5 @@ nav:
194194
- Observability: developer-guide/observability.md
195195
- Preflight Plugins: developer-guide/preflight-plugins.md
196196
- API Reference: reference/
197-
- Developer Notes:
198-
- blog/index.md
197+
- Dev Notes:
198+
- dev-notes/index.md

0 commit comments

Comments
 (0)