使用HuggingFace和Opacus的差分隐私转换器
项目描述
dp-transformers
:warning: 此存储库旨在用于研究项目和原型。虽然我们尝试为所有功能提供测试,但该存储库(尚未)经过对部署关键性质系统(如隐私)所必需的详细审查过程。
简介
有关对存储库的简要介绍,请参阅 dp-transformers。
安装
要安装dp-transformers
包,您只需输入
pip install .
示例
请参阅./examples
,了解如何使用该库的端到端示例。
一个基本示例可以在examples/nlg-reddit/sample-level-dp/fine-tune-dp.py
中找到。首先,通过执行conda env create -f examples/nlg-reddit/sample-level-dp/environment.yml
创建Anaconda环境。然后,您可以使用以下命令运行示例(此处假设机器中有16个GPU,因此设置--nproc_per_node 16
)
python -m torch.distributed.run --nproc_per_node 16 examples/nlg-reddit/sample-level-dp/fine-tune-dp.py \
--output_dir scratch \
--model_name gpt2 \
--sequence_len 128 \
--per_device_train_batch_size 32 \
--gradient_accumulation_steps 2 \
--evaluation_strategy steps \
--eval_steps 45 \
--log_level info \
--per_device_eval_batch_size 64 \
--eval_accumulation_steps 1 \
--seed 42 \
--target_epsilon 8 \
--per_sample_max_grad_norm 1.0 \
--prediction_loss_only \
--weight_decay 0.01 \
--remove_unused_columns False \
--num_train_epochs 3 \
--logging_steps 5 \
--max_grad_norm 0 \
--lr_scheduler_type constant \
--learning_rate 1e-4 \
--disable_tqdm True \
--dataloader_num_workers 2
🤗 Transformers with Opacus
训练器
Huggingface的训练器提供回调钩子,我们可以使用它来确保在隐私引擎中调用所需的方法。
您可以使用以下示例演示的回调
privacy_engine = opacus.PrivacyEngine(module=model, ...)
# No need to attach the privacy engine to the optimizer. The callback will automatically attach the optimizer.
trainer = transformers.Trainer(
model = model,
[...],
callbacks = [dp_transformers.PrivacyEngineCallback(privacy_engine)] # <-- Add this line to make sure the privacy engine is used in the trainer
[...]
)
数据整理
🤗 Transformers 库通常提供合理的默认参数。例如,如果没有提供 position_ids
,库将自动使用递增的整数。这种实现方式是通过首先创建一个形状为 [1, sequence_length]
的张量,填充递增的整数。在第二步中,整个批次的张量被复制。然而,复制是计算图的一部分,因此 Opacus 无法从输入张量中推断批大小。
因此,我们实现了一个自定义的数据合并器(见 dp_transformers.DataCollatorForPrivateCausalLanguageModeling
),它可以自动使用 torch.repeat
创建 position_ids
输入张量。这对于 opacus 来说是可行的,因为 position_ids
张量在计算图中作为不同批大小的输入出现。
GPT2
🤗 Transformers 的 GPT2 实现使用了一个自定义的层类型,即 Conv1D
。不清楚为什么引入了这个层,因为它本质上是一个常规的线性层。这会导致 Opacus 出现问题,因为它不确定如何为这个层应用反向钩子。
在这个仓库中,我们提供了一种处理此类层的实现。请参阅 dp_transformers.grad_sample.transformers.conv_1d
。
所有必要的梯度采样器都可以通过在模型训练之前导入 conv_1d
来注册。有关更多详细信息,请参阅下面的已知问题部分。
DP 训练的一般技巧
在本节中,我们收集了一些针对 DP 训练模型的有用策略。Opacus 的常见问题解答(FAQ)中也有一些关于如何开始 DP 训练的提示(见 Opacus FAQ)
超参数
较大的批次大小有助于 DP 训练。一般而言,可以从 $\sqrt{|D|}$ 开始,其中 $D$ 是训练数据集。由于 Opacus 显著增加了内存消耗,这仅可以通过梯度累积来实现。
我们发现对剪裁范数的依赖性出奇的小。一般而言,可以以 0.1 为剪裁参数的起点。
更长时间地微调模型也是有帮助的。
部署 DP 训练的模型
请注意使用了哪个伪随机数生成器(PRNG)。PyTorch 的默认(梅森旋转)可能存在攻击风险。请参阅 Opacus FAQ 确保在使用模型之前使用更好的 PRNG。
已知问题
在训练过程的后期注册自定义梯度采样器
在注册自定义梯度采样器(如 dp_transformers.grad_sample.transformers.conv_1d
)时,会将函数添加到 Opacus 处理的全局字典中。这个全局字典用于确定模型是否与 Opacus 兼容以及如何处理每个样本的梯度计算。所有梯度采样器都需要尽早注册,肯定是在使用 GradSampleModule
包装模型之前。
如何引用
@misc{dp-transformers,
author = {Lukas Wutschitz and Huseyin A. Inan and Andre Manoel},
title = {dp-transformers: Training transformer models with differential privacy},
year = {2022},
month = {August},
howpublished = {\url{https://www.microsoft.com/en-us/research/project/dp-transformers}}
}
贡献
本项目欢迎贡献和建议。大多数贡献都需要您同意一份贡献者许可协议(CLA),声明您有权,并且实际上确实授予我们使用您贡献的权利。有关详细信息,请访问 https://cla.microsoft.com。
在提交拉取请求时,CLA-bot 将自动确定您是否需要提供 CLA,并适当地装饰 PR(例如,标签、注释)。只需遵循机器人提供的说明即可。您只需在整个使用我们的 CLA 的所有存储库中做一次。
本项目已采用 Microsoft 开源行为准则。有关更多信息,请参阅 行为准则 FAQ 或联系 opencode@microsoft.com,如有任何其他问题或评论。
对于任何其他问题,请随时在 GitHub 上提交问题。
项目详情
下载文件
下载适用于您平台的应用文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源分发
构建分发
dp-transformers-1.0.0.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | d8fa6c549531006239efcc27f4afcc2ee0558923f33acb748713febb41a28953 |
|
MD5 | 0abf1e43b30aa5c2eb865baca1962145 |
|
BLAKE2b-256 | ae714f8237352a21df06f578ccbed21bc7ec27c58b0b0d3c3ce5ddfc1ac2f3e4 |
dp_transformers-1.0.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 716dff8787cdeb55d0fb2da72a07acc946e151b4a7c772e3c0b70b8feef3542e |
|
MD5 | 19ff642a8c73d871db1963238c1a9da8 |
|
BLAKE2b-256 | e310ac8565cdb6a0e48545da245b65ae3cf9ab0339fedd8d25873d3f2162cdeb |