Skip to content

Differential privacy for aggregates - add dp_laplace and dp_gaussian built-in functions with budget accounting#2539

Open
andersonm-ibm wants to merge 26 commits into
apache:mainfrom
andersonm-ibm:diff_privacy_pub
Open

Differential privacy for aggregates - add dp_laplace and dp_gaussian built-in functions with budget accounting#2539
andersonm-ibm wants to merge 26 commits into
apache:mainfrom
andersonm-ibm:diff_privacy_pub

Conversation

@andersonm-ibm

@andersonm-ibm andersonm-ibm commented Jul 9, 2026

Copy link
Copy Markdown
  • Add two native DML built-ins for differentially private aggregate release "colMeans", "colSums" or "identity":
result = dp_laplace(X, "colMeans", sensitivity, epsilon)
result = dp_gaussian(X, "colSums", sensitivity, epsilon, delta)
  • Wire them through the full compilation pipeline:
    Builtins → BuiltinFunctionExpression → ParameterizedBuiltinOp HOP → ParameterizedBuiltin LOP → DPBuiltinCPInstruction.

  • Introduce DPBudgetAccountant, a session-scoped privacy budget tracker stored on ExecutionContext. Laplace releases use exact pure-ε composition; Gaussian releases use Rényi DP composition (Mironov 2017) with RDP → (ε,δ) conversion for tighter bounds. Raises DMLRuntimeException if cumulative spend exceeds the budget.

  • Unit tests covering constructor validation, Laplace/Gaussian composition, budget exhaustion for both mechanisms, mixed composition, release counting, and RDP mathematical invariants (sensitivity cancellation, ε-monotonicity).

  • End-to-end DML integration tests in DPBuiltinDMLTest verify noisy output differs from clean means by a statistically plausible amount.

  • Differential Privacy Benchmark:
    Four federated workers simulated on localhost, a logistic regression FedAvg loop in DML where the coordinator applies dp_gaussian to the aggregated gradient, a sweep over ε ∈ {0.5, 1, 4, 8} plus a non-private baseline, and a matplotlib accuracy-vs-ε plot saved as a PNG.

CC @ywcb00

@ywcb00 ywcb00 self-assigned this Jul 10, 2026
Maya Anderson added 6 commits July 15, 2026 00:13
…ransformation matrix T internally, returning T %*% X with noise fused into a single matrix multiply.
Lets a DML script declare its session-wide differential-privacy budget once at the top, instead of always falling back to the hardcoded default.
Resolved entirely at compile time: epsilon/delta must be literals, validated in BuiltinFunctionExpression and stored on DMLProgram during HOP construction, then read by ExecutionContext.getDPBudgetAccountant().
Four federated workers simulated on localhost, a logistic regression FedAvg loop in DML where the coordinator applies dp_gaussian to the aggregated gradient, a sweep over ε ∈ {0.5, 1, 4, 8} plus a non-private baseline, and a matplotlib accuracy-vs-ε plot saved as a PNG.

Add clip_norm (default 4.0) as a script parameter. Inside the private == 1 branch, each row's gradient contribution is clipped to L2-norm less than clip_norm.
@andersonm-ibm
andersonm-ibm marked this pull request as ready for review July 14, 2026 22:38
@andersonm-ibm andersonm-ibm changed the title WIP: Differential privacy for aggregates - add dp_laplace and dp_gaussian built-in functions with budget accounting Differential privacy for aggregates - add dp_laplace and dp_gaussian built-in functions with budget accounting Jul 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

2 participants