隐私保护指令对齐:基于 DP-SGD 与 DP 直方图重采样的 LLaMA 对齐流水线(dp_instructions 实战指南)

发布时间:2026/9/20 17:40:43
隐私保护指令对齐:基于 DP-SGD 与 DP 直方图重采样的 LLaMA 对齐流水线(dp_instructions 实战指南) 隐私保护指令对齐基于 DP-SGD 与 DP 直方图重采样的 LLaMA 对齐流水线dp_instructions 实战指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research导读本文围绕仓库中 dp_instructions 目录系统讲解如何复现论文《Privacy-preserving Instructions for Aligning Large Language Models》(arXiv:2402.13659) 的完整实验流水线从 LMSYS-Chat-1M 数据预处理、LLaMA 7B/13B 的差分隐私DP微调与采样、基于 DP 直方图的合成指令重采样到调用 OpenAI GPT-3.5-Turbo 标注并完成监督微调SFT最后给出基于 Huggingface TRL 的 RLHF 扩展方向。读完本文你将掌握每一阶段的核心原理、可复现的命令行参数含义以及底层源码实现如逐样本梯度裁剪、噪声乘子搜索、UnitedSignal 式重采样可直接按图索骥跑通整条对齐流水线。项目背景与五阶段流水线总览该仓库的核心目标是在不直接暴露真实用户指令的前提下为开源 LLMLLaMA 7B/13B构建一套可用于对齐Alignment的高质量指令数据并完成模型微调。整体实现分为五个阶段DP 微调 LLaMA 7B/13B在 Chatbot Arena 指令上做差分隐私微调阶段 1从微调模型采样生成初始合成指令阶段 2DP 直方图重采样对初始合成指令用差分隐私直方图方法UnitedSignal 思路重采样阶段 3OpenAI API 标注调用 GPT-3.5-Turbo 为真实/合成指令生成回答阶段 4监督微调SFT用 (指令, 回答) 数据对 LLaMA 7B/13B 做有监督微调阶段 5。此外对于 PPO 风格的 RLHF仓库明确采用 Huggingface TRL、resample_with_dp_histogram 与 query_gpt35_for_annotation 三个子目录顶层 README.md 给出了整体导航。环境安装与依赖解析仓库顶层提供了 requirements.txt安装命令为pip install -r requirements.txt从依赖清单可以看出技术选型依赖包作用torch2.2.0、transformers4.38.2、accelerate、datasets、tokenizersHuggingface 生态模型加载、训练与数据管理peftLoRA 参数高效微调冻结预训练权重、只更新 adapter 参数bitsandbytes低比特量化训练命令中--qbits 16用于降低显存占用prv_accountant基于 Poisson Subsampled Gaussian MechanismPRV的差分隐私隐私预算核算scikit-learn、faiss重采样阶段的 PCA 降维与 KMeans 聚类nltk数据预处理阶段的分词n-gram 去重openai调用 GPT-3.5-Turbo 进行指令标注absl-py、SentencePiece、protobuf、numpy通用基础设施与分词支持说明prv_accountant并非默认随 transformers 安装DP 相关实验前需单独确认安装成功。第一步预处理 LMSYS-Chat-1M 构建 Chatbot Arena 指令集在开始微调之前需要先申请 LMSYS-Chat-1M 数据集的访问权限然后运行顶层脚本python data_preprocess.py脚本会加载lmsys/lmsys-chat-1m的trainsplit处理结果以 HuggingfaceDatasetDict形式保存到dp_finetuning/data/目录具体为chatbot_arena_instructions_train180k。从 data_preprocess.py 源码看预处理共分四步对应论文 Appendix E基础过滤仅保留英文对话、剔除被 redact 的对话、剔除被 OpenAI moderation 工具标记flagged的对话并且只取每段对话的第一轮role 必须为user作为指令。序列级去重sequence-level de-duplication用字典对完全相同的指令字符串去重。n-gram 去重对每条指令分词nltk.word_tokenize后提取大小为 10 的 n-gram 集合一旦某 n-gram 已出现过即丢弃该指令用于去除高度相似的指令。异常重复过滤将指令转为小写后过滤掉“化学工业”类模板化重复如write an instruction of ... words in chemical industry、give me an introduction over ... a chemical company等四类模式。最终得到约 18.88 万条指令随后随机打乱并划分为 train前 180,000、val第 180,000–185,000、test其余保存为DatasetDict三列均为instruction。这正是后续所有 DP 实验使用的chatbot_arena_instructions_train180k数据集来源。第二步LLaMA 的差分隐私微调dp_finetuningdp_finetuning/README.md 定义了四种实验类型Type ADP 微调 LLaMA 7B/13B 以生成合成指令Type B从 Type A 微调好的模型采样生成合成指令Type C用带标注的 (指令, 回答) 对做监督微调SFTType D从 Type C 模型采样生成回答。实现基于 transformers、datasets、accelerate 与 PEFT。为降低显存开销采用LoRA 微调冻结预训练权重仅更新极少量 adapter 参数。DP 核心实现utils/dp_utils.py差分隐私训练的关键函数集中在 dp_finetuning/utils/dp_utils.py其三大支柱是逐样本梯度计算通过 PyTorch 的 forward/backward hook 挂到 LoRA 分支的lora_A、lora_B线性层上make_lora_model_dp。linear_forward_hook缓存层输入linear_backward_hook利用torch.einsum把批量激活与输出梯度做外积得到形状为(n, ...)的grad_samplen 为 batch 内样本数即每个样本各自的梯度token 级梯度在同一序列内求和。逐样本梯度裁剪与累积clip_grad_sample先逐样本计算 L2 范数get_grad_norm再按clip裁剪阈值对每个样本的梯度做缩放范数超过阈值则归一化到阈值clip_and_accumulate_perexample_grads负责把混合精度缩放还原除以 scaler scale后执行裁剪与跨微批micro-batch累积accumulated_grad实现标准 DP-SGD 的“裁剪-累积-加噪”流程。聚合梯度加噪累积完成后由训练主循环按 DP-SGD 方式加入高斯噪声噪声乘子由get_noise_multiplier求出。噪声乘子搜索get_noise_multiplier(eps, delta, steps, sampling_prob)以初值init_sigma10起步调用search_for_sigma以精度 1 → 0.1 → 0.01 逐级逼近找到使get_epsilon_prv计算出的上界 epsilon 不超过目标 eps 的最小噪声乘子若无法找到则抛出ValueError。epsilon 的计算基于prv_accountant的PoissonSubsampledGaussianMechanism与PRVAccountanteps_error0.1、delta_errordelta/10。训练命令生成器generate_train_command.py所有训练命令均由 dp_finetuning/generate_train_command.py 生成其解析的核心参数及含义参数默认值说明--dataset_namechatbot_arena_instructions_train180k数据集名含labelled前缀时视为 (指令,回答) SFT 数据集--model_nameyahma/llama-7b-hf基础模型实验中常用yahma/llama-13b-hf--job_sessdebug任务会话名作为输出目录前缀--perdevice_bs4每张 GPU 的 batch size--gpus1GPU 数量决定使用accelerate_config_nofsdp.cfg还是..._gpu{N}.cfg--max_seq_len2048最大序列长度--total_bs32总 batch size梯度累积步数 total_bs // (perdevice_bs * gpus)--num_epochs3训练轮数--lr3e-4学习率--lr_schedulerconstant学习率调度器--wd0.0权重衰减--clip-1逐样本梯度裁剪范数-1 表示不裁剪非 DP--eps-1(eps, delta)-DP 的目标 epsilon-1 表示不启用 DP--delta5e-7目标 delta--prompt_styleNonevicuna指令-回答格式或uncond_generation无条件生成指令--no_eval_at_startFalse是否跳过第 0 epoch 的评估DP 场景建议开启脚本内部根据steps num_epochs / (total_bs / 180000)与采样概率total_bs / 180000计算噪声乘子并打印例如Noise multiplier is {np} for ({eps,delta})-DP。最终生成的命令为accelerate launch --config_file ... train_clm.py ...并带--gradient_ckpt、--num_warmup_steps 30、--qbits 16等训练参数。会话名sess会编码模型、eps、delta、bs、maxseq、epoch、lr、clip、np、gpus 等超参数便于管理多次实验。Type ADP 微调生成合成指令非 DP 基线生成器13B3 epochpython generate_train_command.py --dataset_name chatbot_arena_instructions_train180k --model_name yahma/llama-13b-hf --job_sess debug --eps -1 --perdevice_bs 4 --gpus 1 --max_seq_len 1024 --total_bs 32 --num_epochs 3 --prompt_style uncond_generation --no_eval_at_start(2.86, 5e-7)-DP13B10 epoch单张 A100 约需 5 天python generate_train_command.py --dataset_name chatbot_arena_instructions_train180k --model_name yahma/llama-13b-hf --job_sess debug --eps 2.86 --delta 5e-7 --perdevice_bs 4 --gpus 1 --max_seq_len 1024 --total_bs 4096 --num_epochs 10 --prompt_style uncond_generation --lr 1e-3 --clip 0.5 --no_eval_at_start(5.94, 5e-7)-DP13Bpython generate_train_command.py --dataset_name chatbot_arena_instructions_train180k --model_name yahma/llama-13b-hf --job_sess debug --eps 5.94 --delta 5e-7 --perdevice_bs 4 --gpus 1 --max_seq_len 1024 --total_bs 4096 --num_epochs 10 --prompt_style uncond_generation --lr 1e-3 --clip 0.5 --no_eval_at_start注意DP 场景下total_bs提升到 4096配合 10 epochclip取 0.5学习率lr取 1e-3。训练 checkpoint 统一保存到outputs/[job_sess]目录。从源码可见使用chatbot_arena_instructions_train180k数据集时强制要求prompt_style uncond_generation。Type B从微调模型采样生成合成指令通过 generate_inference_command.py 生成推理命令。其解析的生成参数包括--no_sample贪心解码、--top_k、--top_p、--temperature、--repetition_penalty1.0 表示无惩罚、--enforce_min_new_tokens、--main_process_portaccelerate 端口默认 29500以及--adapter_pathLoRA 权重路径与--instruction_file。无条件生成合成指令的示例python generate_inference_command.py --instruction_file utils/syn_instruct.txt --model_name yahma/llama-13b-hf --adapter_path [path to the fine-tuned apater] --job_sess debug --max_seq_len 1024 --top_p 0.95 --prompt_style uncond_generation输出保存到inference_outputs/[job_sess]。源码对无条件生成做了约束instruction_file必须包含syn_instruct字样否则断言失败。实际部署中建议并行启动多个单 GPU 推理进程以加速合成指令生成每个进程产出一个文本文件供下一步合并。第三步用 DP 直方图重采样合成指令resample_with_dp_histogramresample_with_dp_histogram/README.md 描述了三个主组件整体思路源于 UnitedSignal 的差分隐私直方图匹配法get_instructions_from_generations.py把并行多进程生成的多份文本文件合并成一个 .pklpython list元素为字符串指令get_embeddings.py为 .pkl 中的指令计算 Sentence-T5 嵌入resample_with_embeddings.py基于嵌入做聚类与 DP 直方图重采样过滤合成指令。合并并行输出为 .pkl可选此步可选——只要 .pkl 内是字符串指令列表即可。若使用 dp_finetuning 并行采样产生的文本文件示例命令python get_instructions_from_generations.py --generation_folder [path to the folder, by default is inference_outputs/[job_sess]] --output_file [path to the output .pkl file]计算 Sentence-T5 嵌入get_embeddings.py 会自动下载 SentenceTransformer 模型默认sentence-transformers/sentence-t5-base可通过--model_name换为 xxl 变体按--batch_size默认 16分批编码--num_targets默认 180000条指令并输出到embeddings/embeddings_{base|xxl}_{start}_{end}_{name}.npypython get_embeddings.py --instruction_file [path to the .pkl file] --output_file [path to the output embedding .npy file] --num_targets 1000000源码显示嵌入维度为 (N, 768)--start_index支持分片计算超大批次。DP 直方图重采样核心脚本 resample_with_embeddings.py 的命令python resample_with_embeddings.py --real_embeddings_path [path to a .npy file] --syn_embeddings_path [path to a .npy file] --syn_instructions_path [path to a .pkl file] --output_name [a string] --num_buckets 1000 --histogram_sigma 10算法流程结合源码降维对 L2 归一化后的嵌入做 PCA取累计解释方差 ≥ 0.9 的维度get_pca_index聚类建桶用faiss.Kmeansniter500、nredo5在合成嵌入子集--num_samples默认 180000上聚成--num_buckets示例为 1000个桶得到 kmeans 与 PCA 参数构建直方图用同一聚类模型把真实指令与合成指令分别映射到桶得到真实分布 p_bins 与合成分布 q_binsbuild_histogram按密度归一化DP 化真实直方图privitize_p_bins对p_bins * n加高斯噪声N(0, sigma)--histogram_sigma默认 10再除以 n、截断负值得到 noisy_p_bins——这是隐私保护的关键一步按比值重采样计算每个桶的ratio noisy_p_bins / q_bins按 ratio 降序argsort(ratio)[::-1]逐桶抽取num_target_samples * noisy_p_bins[idx]个合成样本若桶内样本不足会打印警告并全部取用此时建议生成更多初始合成指令保存结果输出max{max_ratio}_subsampled_instructions_n{count}_{output_name}_seed{seed}.pkl与对应的嵌入 .npy 文件。--sampling_method仅支持uniform与distance默认 uniform--seed控制可复现性。重采样后的合成指令分布在分布上与真实指令对齐同时由于直方图注入了高斯噪声单个真实指令的信息不会直接泄露。第四步调用 OpenAI API 为指令生成回答query_gpt35_for_annotationquery_gpt35_for_annotation/README.md 说明首先需要把 query_openai_labelling.py 中的 OpenAI key 替换为自己的 key。脚本读取 .pkl 文件并选取指定数量的指令通过20 个并行进程调用 OpenAI GPT-3.5-Turbo API 进行标注。为避免长时间同步等待每次调用只标注 5000 条指令脚本会自动保存结果再次调用时自动跳过已标注指令。若想一次性标注 .pkl 中的全部指令使用端到端脚本 batch_label_commands.pypython batch_label_commands.py --instruction_file [path to .pkl] --output_file [path of the output .pkl] --samples_to_label [how many instructions to label in total?]--samples_to_label指定总共要标注多少条指令。标注对象既可以是预处理得到的真实指令data/chatbot_arena_instructions_train180k也可以是前一步 DP 重采样后的合成指令。第五步用 (指令, 回答) 对做监督微调Type C / Type D标注完成后进入监督微调阶段。需要先把指令提取为 python list元素为字符串并 dump 成 .pkl标注结果按 HuggingfaceDatasetDict组织包含 train/val/test 三个 split每个 split 是一个含instruction与answer两列的Dataset。数据集文件名必须以labelled开头——这正是 generate_train_command.py 判断 SFT 模式的依据elif labelled in dataset_name此时强制使用--prompt_style vicuna。Type C监督微调用真实指令-回答对做 (5.94, 5e-7)-DP SFT7Bpython generate_train_command.py --dataset_name labelled_real_arena180k --model_name yahma/llama-7b-hf --job_sess debug --eps 5.94 --delta 5e-7 --perdevice_bs 2 --gpus 1 --max_seq_len 2048 --total_bs 4096 --num_epochs 10 --prompt_style vicuna --lr 1e-3 --clip 1.0用合成指令-回答对做非 DP SFT7B数据来自 DP 重采样与 GPT-3.5 标注流水线如labelled_syn300k_13b_eps594_uncond_syn_clip05_13b_selected_sigma10_1000bins名字即编码了上游超参数13B 模型、eps5.94、clip0.5、sigma10、1000 binspython generate_train_command.py --dataset_name labelled_syn300k_13b_eps594_uncond_syn_clip05_13b_selected_sigma10_1000bins --model_name yahma/llama-7b-hf --job_sess debug --eps -1 --perdevice_bs 4 --gpus 1 --max_seq_len 1024 --total_bs 32 --num_epochs 3 --prompt_style vicunaType D为评测指令生成回答用 Type C 微调好的 checkpoint 为 Chatbot Arena 或 AlpacaEval 的评测指令生成回答vicuna 提示风格python generate_inference_command.py --instruction_file utils/alpaca_eval_instructions.txt --model_name yahma/llama-13b-hf --adapter_path [path to the fine-tuned apater] --job_sess debug --max_seq_len 1024 --top_p 0.95 --prompt_style vicuna输出同样保存在inference_outputs/[job_sess]可作为下游评测如 AlpacaEval的模型回答输入。进阶RLHFPPO扩展论文完整对齐流程还包括 RLHF 阶段。仓库明确表示 PPO 风格的 RLHF 直接复用 Huggingface TRLtrl的现成实现因此你可以在完成 Type C/D 的 SFT checkpoint 后基于 TRL 的PPOTrainer搭建 reward 模型与 PPO 训练环将本流水线产出的隐私保护对齐模型作为策略模型的初始化权重。该阶段不包含在本仓库代码内但流水线的前五步已完整覆盖数据侧与监督侧的全部隐私保护环节。复现要点与工程建议隐私参数闭环eps、delta、total_bs、num_epochs 共同决定噪声乘子generate_train_command.py会在启动前打印噪声乘子供核对建议先跑小规模--job_sess debug验证命令生成与 DP 核算无误再放大到完整配置。DP 与内存DP 需要逐样本梯度因此配合 LoRA只对lora_A/lora_B挂 hook与--qbits 16量化显著降低显存训练脚本还启用了--gradient_ckpt梯度检查点。超大规模嵌入get_embeddings.py支持--start_index分片与--num_targets控制便于在单机内存约束下处理百万级指令。并行与容错合成指令生成建议并行多进程产出文本后由get_instructions_from_generations.py合并GPT-3.5 标注按 5000 条/次分批、自动续标天然支持断点续跑。结果产物训练 checkpoint 在outputs/[job_sess]推理输出在inference_outputs/[job_sess]重采样结果以max{ratio}_subsampled_instructions_n{count}_{name}_seed{seed}.pkl命名便于按超参数检索。以上所有命令与参数均以当前仓库实际代码为准如果你要复现论文中的具体数值结果如 (2.86, 5e-7)-DP 下 13B 生成器的 5 天训练耗时需要具备与论文一致的硬件如单卡 A100与数据集访问权限。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询