ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PFPO 如何用 GPT-4o 合成解法并在 APPs 数据上完成代码 SFT?

PFPO 如何用 GPT-4o 合成解法并在 APPs 数据上完成代码 SFT? PFPO 如何用 GPT-4o 合成解法并在 APPs 数据上完成代码 SFT【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm如果你要给一个 7B 级的代码模型补强算法题能力直接拿 GPT-4o 的输出做蒸馏数据有个明显风险模型生成的解法里混着错误代码。PFPOPreference Optimization for Reasoning with Pseudo FeedbackICLR 2025代码位于本仓库PFPO/目录的代码实验采用了一条“先合成、后用官方测试用例过滤、再 SFT”的路径以deepseek-coder-7b-instruct-v1.5为底模用 GPT-4o 按 APPs 题目批量生成解法只保留能通过 APPs 自带input_output测试用例的解法然后启动 SFT 训练。下面按这条路径还原仓库中给出的完整操作步骤与验证方式。准备环境PFPO/README.md 给出的依赖安装方式大部分依赖列在 requirements.txt按该文件安装即可flash-attention 需要单独自行安装pip install需要匹配的 CUDA/PyTorch 环境官方也提供 docker 镜像一条命令拉取docker pull jiaofangkai/normal:torch-2.5.1-vllm-0.6.4.post1-eval-1206注意拉取镜像只完成环境准备不替代后续任何步骤。合成解法和过滤脚本需要网络执行环境见下文 sandbox 说明SFT 训练需要多机 GPU 资源仓库中的配置按 2 台 8xV100 节点编写。第一步从 APPs 训练集生成 GPT-4o 提示词README 在 “SFT on APPs” 小节中说明团队用一种特殊格式从 GPT-4o 收集 SFT 数据提示词模板的生成入口是python scripts/apps/pp_solution_gen_inputs.py阅读 pp_solution_gen_inputs.py 可以看到它的具体行为从 HuggingFace 加载codeparrot/apps数据集的train分片可用--split参数更换对每条数据把question字段填入内置的vanilla提示词模板要求模型按“先分析复杂度、再逐步设计算法、最后写出 Python 程序”的顺序作答并把代码放在BEGIN和END标签之间结果写入一个 JSON Lines 文件每行在原 APPs 字段含question、problem_id、input_output等之外多出一个prompt字段。这里有一个 README 命令中没有写出的必选参数脚本的--output_file是requiredTrue实际执行时必须指定例如python scripts/apps/pp_solution_gen_inputs.py --output_file outputs/apps/apps.train.r2c.vanilla.gpt-4o.prompts.jsonl--prompt_type默认为vanilla当前仓库中只有这一种模板无需修改。生成好带prompt的请求文件后将请求发给 GPT-4o 服务获取解法。仓库提供了两个 API 调用入口openai_api_caller_v1.pyOpenAI API 推理入口基于 Hydra 配置和 service_api_caller_v1.py服务化 API 入口。两者都是标准的hydra.main(config_pathconf, config_nameconfig)程序用-cp/-cn指定PFPO/conf/下的配置目录与配置名来驱动。README 没有给出合成 APPs 解法这一环节对应的具体配置名执行前请在PFPO/conf/下确认你使用的 GPT-4o 服务版本并把产出保存为下文过滤脚本所需的 completion 文件。第二步用 APPs 官方测试用例过滤 GPT-4o 解法拿到 completion 文件GPT-4o 的原始输出后运行 README 给出的过滤命令python scripts/apps/solution_fail_extract.py --completion_file $completion_file --output_file $output_file --num_workers 16$completion_file是上一步的 GPT-4o 输出文件也支持 glob 模式脚本会按problem_id去重合并多个分片文件$output_file是过滤结果的保存路径。阅读 solution_fail_extract.py 可以确认它的判定逻辑这也是“可核对”的关键用正则BEGIN(.*?)END从每条 completion 中提取代码提取失败的解法直接判为不可用results记为False对提取成功的代码调用 utils_execute.py 中的check_correctness在 APPs 数据自带的input_output测试用例上逐条执行超时 10 秒某解法全部测试用例通过时才记True只要有任一用例失败即为False结果写入$output_file每个条目带pred提取出的解法、res各 completion 是否全部通过、full_res逐用例结果、outputs、errors等字段。脚本跑完后会在终端打印三行统计这是本步骤的验证信号Missing: {missing / len(outputs)} Correct: {corr / len(outputs)} Correct at k: {corr_at_k / len(outputs)}这是文档示例形式的输出模板具体数值取决于你的 completion 数据。Missing表示无法从输出中提取出代码的比例Correct表示首个 completion 通过全部测试用例的比例Correct at k表示至少一个 completion 通过的比例。若Missing偏高说明 GPT-4o 输出没有稳定遵守BEGIN/END标签格式需要回到提示词或服务配置环节检查。过滤产出的文件同时承担了下一个步骤的“正样本表”SFT 配置通过extra_file从中按problem_id取出通过测试的解法。第三步配置并启动 SFT 训练训练入口是trainer_base_ds_mul_fs_tp.pyREADME 给出的 APPs SFT 启动命令为torchrun --nnodes 2 --nproc_per_node 8 --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT trainer_base_ds_mul_fs_tp.py \ -cp conf/exp/apps/r2c_generation/deepseek_coder/sft/ -cn gpt4o-distil-v3.1-v100$NODE_RANK、$MASTER_ADDR、$MASTER_PORT是两节点分布式训练的环境变量在各节点上按你的集群设置导出。README 明确该实验运行在 2 台 8xV100 节点上GPU 更少时按 README 中数学部分给出的方法相应调大配置里的gradient_accumulation_steps。对应配置文件是 gpt4o-distil-v3.1-v100.yaml其中与“GPT-4o 解法 SFT”直接相关的字段train_file: hf:codeparrot/apps从 HuggingFace 加载 APPs 训练集由data.apps.APPsWithFunctionName读取apps.pytrain_sub_split: train表示先按 apps_train_sub_val_ids.json 剔除留出验证子集use_starter_code: True表示把题目自带的 starter code 拼进questionextra_file: ${data_path_prefix}outputs/apps/apps.train.r2c.vanilla.gpt-4o.tem1.0.n11.exec.dpo_v1.0.json这就是第二步过滤结果文件的路径通过field_extract_aligner按problem_id提取pos字段即通过测试的 GPT-4o 解法再经recompose_template拼入训练样本。你的实际产物路径不同时需要在这里改成自己的文件prompt指向 r2c_prompt_0shot_v1.0.txt与第一步的 vanilla 模板一致要求把代码写在BEGIN与END之间model_name_or_path: ${model_path_prefix}/deepseek-coder-7b-instruct-v1.5model_path_prefix默认为../pretrained-models/底模 deepseek-coder-7b-instruct-v1.5 需放在该相对路径下或修改前缀指向你的模型目录训练超参learning_rate: 1e-5、per_gpu_train_batch_size: 1、gradient_accumulation_steps: 16、max_steps: 500、max_seq_length: 3072collator 内、fp16: True、save_steps: 100输出目录${output_path_prefix}experiments/${exp_name}exp_name形如deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42checkpoint 按save_steps周期性落盘。训练启动后以 loss 日志logging_steps: 5与experiments/exp_name/apps/checkpoint-*目录下产出 checkpoint 作为进行中的检查点本配置中do_eval: False训练过程不含验证集评估。一个需要在启动前确认的限制该配置tp_size: 4即启用了基于 FairScale 的张量并行模型加载走models.llama_tp.LlamaForCausalLM.from_pretrained。README 的 “Enable Tensor Parallel based on FairScale” 小节说明启用张量并行前需要用scripts/model_converter/convert_llama_to_llama_tp.py把原始模型转换为张量并行格式且该脚本目前只支持Llama、Qwen和Mistral系列当前仓库PFPO/scripts/model_converts/下并未包含这个转换脚本只有llama_hf_mp_split.py和pad_model_embedding.py。因此如果你的底模不在上述受支持系列内不能直接照搬该配置需要先解决张量并行模型的转换问题或参照 README 数学部分的说明把tp_size置 1 并另行处理并行配置。结果验证用仓库评测配置跑 SFT 模型训练结束后README 的 “Evaluation Configs” 小节给出的评测方式是python vllm_inference.py -cp $config_path -cn $config_name评测包含在推理过程中不需要单独的评估命令。代码任务对应的配置文件APPsconf/api/vllm/apps/deepseek_coder/r2c/dev_v2_0.yamlHumanEvalconf/api/vllm/human_eval/ds_coder/r2c/test_v2_2_local.yamlMBPP-257conf/api/vllm/mbpp_sanitized/r2c/test_v1_0_local.yamlREADME 的 APPs 结果表中列出了这条 SFT 路径的参考成绩deepseek-coder-7B-v1.5底模阶段APPs OverallHumanEvalMBPP底模 Instruct14.375.673.9w/ SFT (APPs)15.472.072.8这是论文实验值作为判断你复现结果是否落在合理区间的参考而不是固定预期。边界与下一步整条链路里 GPT-4o 解法的合法性完全由 APPs 自带测试用例保证check_correctness全通过才保留不要把未过滤的原始 completion 直接喂给 SFT 配置solution_fail_extract.py会在本地多线程执行模型生成的 Python 代码每条用例 10 秒超时README 在类似的伪测试用例执行环节明确建议“in sandbox”运行本步骤执行任意生成代码前请同样做好隔离完成 SFT 后README “DPO on APPs based Ground-truth Test Cases” 一节给出了下一步用 SFT checkpoint 跑vllm_inference.py配置conf/api/vllm/apps/deepseek_coder/r2c/train_v2_0采样完整轨迹再用 construct_prefer_pair.py 依据测试用例结果构造偏好对做 DPO 训练。这属于 PFPO 偏好优化阶段与本文的 SFT 任务是独立环节按需参考。【免费下载链接】unilmLarge-scale Self-supervised Pre-training Across Tasks, Languages, and Modalities项目地址: https://gitcode.com/GitHub_Trending/un/unilm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表