Opake
Opake (/oʊˈpeɪk/, archaic opaque) — Functional DP-SGD and DP-FTRL for PyTorch.
Opake provides composable primitives for differentially private model
training in PyTorch: per-example gradient clipping, calibrated noise
injection, privacy accounting, and Poisson sampling. Built on torch.func,
it uses a functional API with explicit state — no hooks, no subclassing, no
hidden mutation.
Work in progress: Opake is research software under active development. Its differential-privacy mechanisms, accounting, and privacy guarantees are still being validated and may change. Do not rely on it for production or compliance-sensitive privacy guarantees without independent validation for your use case.
Packages
Install and depend on opake only. The repository is implemented as
PEP 420 namespace packages under the shared opake.* namespace:
| Distribution | Import roots | Purpose |
|---|---|---|
opake |
— | Convenience installer; pulls in a curated bundle of sub-packages |
opake-base |
opake.serialization |
Pure-Python serialization registry + dispatcher; the seam every other wheel registers handlers against |
opake-engine |
opake.{types,pytree,random,distributed,functional,scheduling,profiling} |
Torch substrate: pytree wrappers (ClippedPytree / NoisedPytree / PerGroup), RngKey, fixed + AUTO-S clipping, schedules + warmup, DDP plumbing, profiler |
opake-optimizers |
opake.optimizers |
Torchopt-based functional optimizer chain (DP-aware AdamW-BC and friends) |
opake-dpsgd |
opake.dpsgd |
Gaussian / per-group noise, Poisson samplers, adaptive clipping, DP-SGD-specific accounting factories |
opake-dpftrl |
opake.dpftrl |
DP-FTRL mechanisms (BLT, BSR, BiSR, band-MF, λ-CGD), private second moments, correlated-noise samplers, DP-FTRL-specific accounting factories |
opake-auditing |
opake.auditing |
Empirical privacy auditing (one-run, coin-flip, loss attacks) |
opake-patches |
opake.patches |
Unified patching entrypoint for PyTorch checkpointing, Hugging Face compat wrappers, Triton kernels, and PEFT/LoRA fusion |
opake-transformers |
opake.transformers |
Hugging Face trainer + integration; TRL-style SFTTrainer / DPOTrainer (opake.transformers.trl) built on DPTrainer |
opake-alignment |
opake.alignment |
Functional, mechanism-agnostic DP-safe SFT / DPO primitives: per-example losses, log-prob helpers, collators, reference helpers, reward metrics |
opake-accounting |
opake.accounting |
PLD privacy accounting (Rust/PyO3 backend); torch-free standalone |
Import layout
opake.serialization <- opake-base
opake.{types,pytree} <- opake-engine
opake.{random,distributed} <- opake-engine
opake.{functional,scheduling,profiling} <- opake-engine
opake.optimizers <- opake-optimizers
opake.dpsgd.{clipping,noise,sampling,accounting} <- opake-dpsgd
opake.dpftrl.{clipping,noise,sampling,accounting} <- opake-dpftrl
opake.auditing <- opake-auditing
opake.patches.{kernels,torch,transformers,peft} <- opake-patches
opake.transformers{,.trl} <- opake-transformers
opake.alignment.{sft,dpo,data,metric} <- opake-alignment
opake.accounting <- opake-accounting
Installation
Opake is published on PyPI, so a plain install works:
pip install opake
# Or with uv
uv add opake
Releases are mirrored to JetBrains Packages, which also carries .dev wheels
built from main:
pip install opake \
--index-url https://packages.jetbrains.team/pypi/p/fed/python/simple/
# Or with uv
uv add opake \
--index https://packages.jetbrains.team/pypi/p/fed/python/simple/
Extras:
pip install "opake[auditing]" # empirical privacy auditing
pip install "opake[dpftrl]" # correlated-noise DP-FTRL components
pip install "opake[alignment]" # DP-safe SFT / DPO primitives
pip install "opake[transformers]" # Hugging Face + patching components
pip install "opake[trl]" # converters that accept real trl configs
pip install "opake[all]" # all optional components
Each sub-package is also a separate distribution, so you can install only what you need (see the table above for which distribution provides each import path):
pip install opake-accounting # PLD privacy accounting (torch-free)
pip install opake-dpsgd # DP-SGD noise, clipping, sampling
pip install opake-dpftrl # matrix-factorization noise
pip install "opake-patches[transformers]" # HF compat + Triton kernels
Patching
Hugging Face and checkpoint patches are applied explicitly through
opake.patches:
from opake.patches import apply_model_patches, apply_runtime_patches
apply_runtime_patches()
# ... build / wrap the model, then patch the concrete instance
apply_model_patches(model)
apply_runtime_patches() enables the runtime-side checkpoint, collator, and
loss-mapping fixes. apply_model_patches(model) wires compat wrappers and
Triton kernels into the specific model instance, including PEFT/LoRA modules.
See the model-patches guide for patching details, model compatibility, and tuning knobs.
Example
A minimal DP-SGD training loop:
import torch
import opake.accounting as acc # cross-cutting (calibrate, budget)
import opake.dpsgd.accounting as dpsgd_acc # DP-SGD per-step factories
from opake.dpsgd.clipping import clipped_grad
from opake.dpsgd.noise import gaussian_noise
from opake.random import key
def loss_fn(params, x, y):
return ((x @ params - y) ** 2).sum()
# Calibrate noise for target privacy budget
result = acc.calibrate(
acc.epsilon_budget(3.0, delta=1e-5),
lambda nm: dpsgd_acc.poisson(dpsgd_acc.gaussian(nm), sample_rate=0.01) * 1000,
param_min=0.1, param_max=10.0,
)
batch_size = 64 # expected batch size for Poisson sampling
# DP-SGD components
grad_fn, clip_state = clipped_grad(
loss_fn, clipping_norm=1.0, batch_argnums=(1, 2),
normalize_by=batch_size,
)
noise_fn, noise_state = gaussian_noise(
noise_multiplier=result.param, key=key(42),
)
# Training loop
params = torch.randn(10, requires_grad=False)
lr = 0.01
for batch_x, batch_y in dataloader:
grads, clip_state = grad_fn(params, batch_x, batch_y, state=clip_state)
noisy_grads, noise_state = noise_fn(grads, noise_state)
params = params - lr * noisy_grads.pytree # or wire opake.optimizers
Features
- Per-example gradient clipping via
torch.func.vmap+torch.func.grad, with fixed, adaptive (Andrew et al. 2021), and AUTO-S (Bu et al. 2023) variants. - Noise injection: Gaussian and correlated matrix-factorization noise (band-MF, BLT, BSR, BiSR, DP-λCGD), including private second-moment streams for adaptive optimizers.
- Privacy accounting: Rust-based PLD engine with tight composition, multiple privacy metrics (ε-δ, f-DP advantage, error rates), and noise calibration via binary search.
- Sampling: DP-SGD Poisson (plain or capped), DP-FTRL Poisson (identity or banded), balls-in-bins, b-min-separation, and sequential batch samplers.
- Privacy auditing: empirical privacy validation via membership inference.
- Distributed training: DDP-compatible with synchronized noise and
gradient aggregation via
opake.distributed. - Hugging Face compatibility: automatic
vmappatching for LLaMA, Mistral, Qwen2/3, Phi-3, Gemma/Gemma2, Granite, Cohere/Cohere2, plus fused Triton kernels viaopake.patches.
Documentation
Development
uv sync --group dev --all-packages --extra all
uv run pytest -m "not cuda and not mps and not slow" # PR-equivalent suite
uv run ruff format packages/ # Format
uv run ruff check packages/ # Lint
uv run --group docs mkdocs build --strict # Build docs
cargo test --workspace
See CONTRIBUTING.md for the full development workflow. The development guide includes fork-based setup.
References
- Deep Learning with Differential Privacy (Abadi et al. 2016)
- JAX-Privacy — original inspiration
- Opacus — alternative PyTorch DP library (hook-based design)
License
Apache 2.0. See LICENSE.
Metadata
Release files for opake 0.16.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| opake-0.16.1-py3-none-any.whl | Python 3 | none | any | Details |
Release files / opake-0.16.1-py3-none-any.whl
| Download URL | opake-0.16.1-py3-none-any.whl |
|---|---|
| Size | 10.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5388a305dfae8f812702d485f7052300aaf085dd3767098551aa048fc7a6d9d3
|
|
BLAKE2b-256 checksum How to use checksums |
6bd31f07f4a31c0c128a6d1644dc47a2fbbd81ccb79a52daea6a7827aef14a90
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 13, 2026.
Transparency log