Views
No views yet
| Base Model | Variant | DP | Target ε | Achieved ε | Adapter Path |
|---|---|---|---|---|---|
| ibm-granite/granite-4.0-h-tiny | base | No | — | — | granite-4.0-h-tiny/base/adapter/ |
| ibm-granite/granite-4.0-h-tiny | dp3 | Yes | 3.0 | 2.99 | granite-4.0-h-tiny/dp3/adapter/ |
| ibm-granite/granite-4.0-h-tiny | dp8 | Yes | 8.0 | 8.00 | granite-4.0-h-tiny/dp8/adapter/ |
| bigcode/starcoder2-7b | base | No | — | — | starcoder2-7b/base/adapter/ |
| bigcode/starcoder2-7b | dp3 | Yes | 3.0 | 3.00 | starcoder2-7b/dp3/adapter/ |
| bigcode/starcoder2-7b | dp8 | Yes | 8.0 | 8.00 | starcoder2-7b/dp8/adapter/ |
| Qwen/Qwen3-4B-Instruct-2507 | base | No | — | — | qwen3-4b-instruct/base/adapter/ |
| Qwen/Qwen3-4B-Instruct-2507 | dp3 | Yes | 3.0 | 2.99 | qwen3-4b-instruct/dp3/adapter/ |
| Qwen/Qwen3-4B-Instruct-2507 | dp8 | Yes | 8.0 | 8.00 | qwen3-4b-instruct/dp8/adapter/ |
1from transformers import AutoModelForCausalLM, AutoTokenizer
2from peft import PeftModel
3
4base_model_name = "ibm-granite/granite-4.0-h-tiny"
5adapter_path = "melihcatal/codedp-cpt-models"
6subfolder = "granite-4.0-h-tiny/dp8/adapter"
7
8tokenizer = AutoTokenizer.from_pretrained(base_model_name, trust_remote_code=True)
9model = AutoModelForCausalLM.from_pretrained(base_model_name, trust_remote_code=True)
10model = PeftModel.from_pretrained(model, adapter_path, subfolder=subfolder)| Parameter | Value |
|---|---|
| Rank (r) | 16 |
| Alpha (α) | 32 |
| Dropout | 0.05 |
| Target modules | q_proj, k_proj, v_proj, o_proj |
| Modules to save | lm_head |
| Parameter | No-DP (base) | DP variants |
|---|---|---|
| Epochs | 2 | 2 |
| Micro-batch size (per GPU) | 8 | 8 |
| Learning rate | 1e-4 | 2e-4 |
| Optimizer | AdamW | AdamW |
| LR scheduler | Cosine | Cosine |
| Warmup ratio | 5% | 5% |
| Max gradient norm | 1.0 | 1.0 |
| Sequence length | 1024 | 1024 |
| Precision | bfloat16 | bfloat16 |
| Seed | 42 | 42 |
| Model | GPUs | No-DP | DP ε=3 / ε=8 |
|---|---|---|---|
| Granite-4.0-H-Tiny | 4 | 256 (8×8×4) | 512 (8×16×4) |
| StarCoder2-7B | 4 | 256 (8×8×4) | 512 (8×16×4) |
| Qwen3-4B-Instruct | 8 | 256 (8×4×8) | 512 (8×8×8) |
| Parameter | Value |
|---|---|
| Engine | Opacus PrivacyEngine |
| Mechanism | Gaussian (DP-SGD) |
| Per-sample gradients | Hook-based |
| Clipping | Flat (global) |
| Target δ | 1e-5 |
| Target ε | 3.0 or 8.0 |
| Privacy accounting | RDP (Rényi Differential Privacy) |
| Variant | pass@1 | pass@5 | pass@10 |
|---|---|---|---|
| No fine-tuning | 13.5% | 18.4% | 20.4% |
| CPT (no DP) | 10.1% | 16.6% | 18.4% |
| CPT + DP (ε=3) | 13.7% | 19.1% | 21.4% |
| CPT + DP (ε=8) | 14.5% | 21.1% | 23.3% |
| Model | No-DP | DP ε=3 | DP ε=8 |
|---|---|---|---|
| Granite-4.0-H-Tiny | 0.946 | 1.044 | 1.038 |
| StarCoder2-7B | 0.745 | 0.843 | 0.841 |
| Qwen3-4B-Instruct | 0.808 | 0.941 | 0.925 |
| Model | Variant | Loss AUC | Embedding AUC | Empirical ε (p=0.01) |
|---|---|---|---|---|
| Granite-4.0-H-Tiny | base | 1.000 | 1.000 | 3.02 |
| Granite-4.0-H-Tiny | dp3 | 0.543 | 0.513 | 0.00 |
| Granite-4.0-H-Tiny | dp8 | 0.564 | 0.508 | 0.16 |
| StarCoder2-7B | base | 1.000 | 0.916 | 3.02 |
| StarCoder2-7B | dp3 | 0.526 | 0.521 | 0.00 |
| StarCoder2-7B | dp8 | 0.520 | 0.523 | 0.00 |
| Qwen3-4B-Instruct | base | 0.969 | 0.884 | 3.02 |
| Qwen3-4B-Instruct | dp3 | 0.505 | 0.515 | 0.00 |
| Qwen3-4B-Instruct | dp8 | 0.515 | 0.516 | 0.00 |
| PII Type | BoW AUC | ± std | n |
|---|---|---|---|
| Overall | 0.099 | 0.018 | 400 |
| api_key | 0.033 | 0.047 | 80 |
| db_url | 0.311 | 0.105 | 80 |
| 0.078 | 0.099 | 80 | |
| internal_ip | 0.028 | 0.021 | 80 |
| password | 0.055 | 0.048 | 80 |
1from sklearn.ensemble import RandomForestClassifier
2from sklearn.feature_extraction.text import CountVectorizer
3from sklearn.model_selection import StratifiedKFold
4from sklearn.metrics import roc_auc_score
5import numpy as np, json
6from datasets import load_dataset
7
8ds = load_dataset("melihcatal/codedp-bench-canary-mia", split="train")
9records = list(ds)
10
11def bow_shift(texts, labels, n_folds=5):
12 X = CountVectorizer(max_features=5000, stop_words="english").fit_transform(texts)
13 y = np.array(labels)
14 aucs = []
15 for tr, te in StratifiedKFold(n_folds, shuffle=True, random_state=42).split(X, y):
16 clf = RandomForestClassifier(100, random_state=42, n_jobs=-1)
17 clf.fit(X[tr], y[tr])
18 aucs.append(roc_auc_score(y[te], clf.predict_proba(X[te])[:, 1]))
19 return np.mean(aucs), np.std(aucs)
20
21# Overall
22texts = [r["input"] for r in records]
23labels = [r["label"] for r in records]
24print("Overall:", bow_shift(texts, labels))
25
26# Per PII category
27for pii_type in sorted(set(r["pii_type"] for r in records)):
28 cat = [r for r in records if r["pii_type"] == pii_type]
29 print(f"{pii_type}:", bow_shift([r["input"] for r in cat], [r["label"] for r in cat]))├── granite-4.0-h-tiny/
│ ├── base/ # No-DP baseline
│ ├── dp3/ # DP ε=3
│ └── dp8/ # DP ε=8
├── starcoder2-7b/
│ ├── base/
│ ├── dp3/
│ └── dp8/
└── qwen3-4b-instruct/
├── base/
├── dp3/
└── dp8/adapter/ — LoRA adapter weights (PEFT-compatible)tokenizer/ — Tokenizer with any added audit tokensresolved_config.yaml — Full training configurationsummary.json — Training and audit metricsaudit_results.json, audit_scores.npz — Privacy audit artifactsmetrics.jsonl, scalars.csv — Training logstensorboard/ — TensorBoard eventscodecarbon.csv — Carbon emissions trackingepochs/ — Per-epoch checkpoints and audit results