chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:24:13 +08:00
commit 1037506f2e
6050 changed files with 1731598 additions and 0 deletions
@@ -0,0 +1,68 @@
# Ground-truth test case inputs
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.json" \
--output_file "${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.run_outputs.json" \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
python scripts/apps/extract_pseudo_outputs_as_label.py \
--input_file ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.run_outputs.json \
--output_file ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json \
--use_sc
# ================================================================
# Synthetic test case inputs
python scripts/apps/solution_run_pseudo_outputs_local.py \
--completion_file "${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.json" \
--output_file "${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_input_output.json" \
--num_workers 64 --completion_test_field "input_output" \
--pseudo_test_case ${DATA_PREFIX_PATH}/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json
# =================================================
# Synthetic test cases inputs with GPT-4o for output
python scripts/apps/pseudo_test_cases/combine_gpt_raw_requests.py \
--input_file ../msranlpintern/share/xcode_4o_oss_apps_test_inputs_v1_gpt_inputs.shuf.jsonl \
--raw_output_file ../msranlpintern/share/xcode_4o_oss_apps_test_inputs_v1_gpt_inputs.shuf.bing.x5.jsonl_out \
--output_file ../msranlpintern/share/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.json
python scripts/apps/solution_run_outputs_local.py \
--completion_file /mnt/fangkai_blob/share/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.json \
--output_file /mnt/fangkai_blob/share/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.4o_run_outputs.json \
--num_workers 64 --id_field problem_id --test_case_field input_output
python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ${DATA_PREFIX_PATH}/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.4o_run_outputs.json \
--output_file ${DATA_PREFIX_PATH}/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.4o_ps_test_cases.sc_and_non_sc.json \
--test_case_field "input_output"
#19795
#0
#15
#9.866784541550897
#9.013993432685021
#Counter()
# Non-sc-version
python vllm_inference.py fp16_bfloat16=True seed=42 split_id={split_id} \
exp_name=deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42 \
eval_sub_path=checkpoint-100 -cp conf/api/vllm/apps/deepseek_coder/r2c -cn general_combine_train_v2_0_4o_non_sc
python scripts/apps/construct_prefer_pair_soft.py \
--input_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/train.0shot.tem1.0.n10.*-of-32.v2.1.s42.json" \
--output_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/train.0shot.tem1.0.n10.v2.1.s42.prefer_pair.low0.5.m6.json" \
--response_field response --test_case_field input_output_non_sc --pass_case_margin 6 --pass_case_lower_bound 0.5
# SC-version
python scripts/apps/solution_run_outputs_local.py \
--completion_file "/mnt/fangkai_blob/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/train.0shot.tem1.0.n10.*-of-32.v2.1.s42.json" \
--output_file "/mnt/fangkai_blob/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/train.0shot.tem1.0.n10.v2.1.s42.run_outputs.json" \
--num_workers 64 --id_field id --test_case_field input_output
# bash scripts/apps/pseudo_test_cases/run_outputs_local.sh split_id
python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/train.0shot.tem1.0.n10.v2.1.s42.run_outputs.json" \
--output_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/train.0shot.tem1.0.n10.v2.1.s42.run_outputs.prefer_pair.low0.5.m6.4o-sc.json" \
--test_case_field "input_output" --pass_case_margin 6 --pass_case_lower_bound 0.5 --construct_prefer_pair
@@ -0,0 +1,224 @@
### Synthesis Test Case Inputs
Prepare inputs for prompting GPT-4o:
```bash
python scripts/apps/pp_test_case_gen_inputs_v2.0.py \
--split train --prompt_file prompts/apps/test_input_gen_2shot_v2.0.txt \
--output outputs/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.0.inputs.jsonl
python scripts/apps/pp_test_case_gen_inputs_v2.0.py \
--split train --prompt_file prompts/apps/test_input_gen_2shot_v2.1.txt \
--output outputs/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only.inputs.jsonl --function_only
```
Extract the corresponding outputs from GPT-4o and combine them to obtain the following file:
`../msranlpintern/share/gpt-chat-examples-outputs/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json`
For post-processing to align the format with oss data:
```bash
python scripts/apps/pseudo_test_cases/combine_pseudo_test_inputs.py \
--output_file ../msranlpintern/share/dataset/magicoder/apps-train.4o-test-func.json \
--pseudo_test_case ../msranlpintern/share/gpt-chat-examples-outputs/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json
```
For directly processing on APPs:
```bash
python scripts/apps/solution_run_pseudo_outputs_local.py \
--completion_file "../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.?-of-8.v2.0.json" \
--output_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json \
--pseudo_test_case outputs/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json
python scripts/apps/solution_run_pseudo_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.?-of-4.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_test_cases.v1.0.azure.json \
--pseudo_test_case ${DATA_PREFIX_PATH}/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json --num_workers 128
python scripts/apps/solution_run_pseudo_outputs_local.py \
--completion_file "${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.json" \
--output_file "${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_input_output.json" \
--num_workers 64 --completion_test_field "input_output" \
--pseudo_test_case ${DATA_PREFIX_PATH}/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json
```
Collect pseudo outputs and construct DPO training pairs
```bash
python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_test_cases.v1.0.azure.json \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.clean.dpo_m6_low0.5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5
```
Either, run execution again on existing pseudo test cases.
First, extract the pseudo label:
```bash
python scripts/apps/extract_pseudo_outputs_as_label.py \
--input_file ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_input_output.json \
--output_file ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json \
--use_sc --problem_id_field problem_id --test_case_field pseudo_test_cases
#Unaligned: 0
#Total number of pseudo test cases: 3901
#Average number of test cases: 36333 / 3901 = 9.313765701102282
```
Secondly, run execution on pseudo test cases:
```bash
python scripts/apps/solution_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.?-of-4.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.4o_pseudo_test_cases.v1.0.azure.json \
--pseudo_test_case ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json --num_workers 128
#Missing: 0.0002563445270443476
#Correct: 0.08203024865419123
#Correct at k: 0.1579082286593181
#Counter({False: 36311, True: 2689})
```
Construct (DPO) preference pair:
```bash
python scripts/apps/construct_prefer_pair.py \
--input_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.4o_pseudo_test_cases.v1.0.azure.json \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.4o_pseudo_test_cases.prefer_pair.json \
--test_case_field pseudo_input_output
# 3901 9165 2.3493975903614457
# Soft version
python scripts/apps/construct_prefer_pair_soft.py \
--input_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.4o_pseudo_test_cases.v1.0.azure.json \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.4o_pseudo_test_cases.dpo_m4_low0.5.json \
--test_case_field pseudo_input_output --pass_case_margin 4 --pass_case_lower_bound 0.5
# 3901 12851 3.294283517046911
```
Run process-DPO prefix execution
```bash
python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.${split_id}-of-256.v2.0.json" \
--output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.${split_id}-of-256.4o_pseudo_test_case.exec.json" \
--num_workers 64 \
--pseudo_test_case ../msranlpintern/share/gpt-chat-examples-outputs/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json \
--test_case_field input_output --id_field problem_id
```
Construct Process-DPO preference pair
```bash
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.*-of-256.4o_pseudo_test_case.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.4o_pseudo_test_case.prm_prefer_pair.json \
--pass_case_margin 4 --pass_case_lower_bound 0.5 --test_case_field pseudo_input_output --num_workers 24 --reduction avg
#Missing: 0
#Missing test cases: 0
#Counter({0: 1440638, 10: 108458, 1: 80861, 2: 34440, 3: 24141, 4: 18476, 5: 15235, 9: 14017, 6: 13494, 7: 12309, 8: 11546})
#Processed 354723 prefixes.
#Averaged 1.0 prefixes per problem.
#Processed 3900 problems.
```
---------------------------------------------------------------
Based on DPO-Iter-0 model to construct new test cases on magicoder
Run outputs on newly generated oss-apps-combine data
```bash
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.{split_id}-of-32.v2.1.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.{split_id}-of-32.v2.1.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
```
Combine oss outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
```bash
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.*-of-32.v2.1.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.v2.1.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
#11925
#11925
#117006
#0
#10.004442649434571
#9.823396226415094
#Counter({10: 73857, 0: 23639, 9: 3901, 1: 3222, 8: 2589, 5: 2251, 2: 2103, 7: 1976, 4: 1865, 6: 1865, 3: 1852, 11: 105, 20: 25})
```
We need to reuse the pre-synthesized pseudo test cases for APPs dataset for training.
```bash
python scripts/apps/solution_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.*-of-32.v2.1.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.v2.1.4o_pseudo_test_cases.exec.v1.0.json \
--pseudo_test_case ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json --num_workers 128
```
Construct (DPO) preference pair:
```bash
# Soft version
python scripts/apps/construct_prefer_pair_soft.py \
--input_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.v2.1.4o_pseudo_test_cases.exec.v1.0.json \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.v2.1.apps_only.4o_pseudo_test_cases.dpo_m4_low0.5.json \
--test_case_field pseudo_input_output --pass_case_margin 4 --pass_case_lower_bound 0.5
3901
3901 11364 2.913099205331966
```
---------------------------------------------------------------
Based on DPO-Iter-1 model to construct new test cases on magicoder and xcode
```bash
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.{split_id}-of-32.v2.1.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.{split_id}-of-32.v2.1.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
```
Combine oss outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
```bash
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.*-of-32.v2.1.s42.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.v2.1.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
# we have skipped split id 20 since it uses too much time.
#18608
#18608
#193834
#0
#10.003605287755375
#9.80116079105761
#Counter({10: 99051, 0: 37603, 1: 8459, 9: 7563, 2: 5656, 8: 5528, 3: 4714, 5: 4698, 7: 4306, 4: 4260, 6: 4070, 11: 136, 20: 34, 12: 2})
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.*-of-32.v2.1.s42.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.v2.1.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.all.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
# Added the skipped split id 20
#19051
#19051
#197647
#0
#10.003557222779161
#9.800902839745945
#Counter({10: 102049, 0: 38432, 1: 8511, 9: 7700, 2: 5688, 8: 5591, 3: 4783, 5: 4776, 7: 4358, 4: 4329, 6: 4119, 11: 136, 20: 34, 12: 4})
```
We need to reuse the pre-synthesized pseudo test cases for APPs dataset for training.
```bash
python scripts/apps/solution_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.*-of-32.v2.1.json" \
--output_file ${OUTPUT_PREFIX_PATH}/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.apps_only.4o_pseudo_test_cases.exec.v1.0.json \
--pseudo_test_case ${DATA_PREFIX_PATH}/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json --num_workers 128
```
Construct (DPO) preference pair:
```bash
# Soft version
python scripts/apps/construct_prefer_pair_soft.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300//train.0shot.tem1.0.n10.apps_only.v2.1.*-of-9.s42.4o_pseudo_test_cases.exec.v1.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.v2.1.apps_only.4o_pseudo_test_cases.dpo_m4_low0.5.json \
--test_case_field pseudo_input_output --pass_case_margin 4 --pass_case_lower_bound 0.5
```
@@ -0,0 +1,175 @@
import json
import argparse
import os.path
import re
from glob import glob
def load_file(file_path):
if os.path.exists(file_path):
if file_path.endswith(".json"):
return json.load(open(file_path, encoding="utf-8"))
else:
return [json.loads(line) for line in open(file_path).readlines()]
data = []
for file in glob(file_path):
print(file)
if file.endswith(".json"):
tmp = json.load(open(file, encoding="utf-8"))
else:
tmp = [json.loads(line) for line in open(file).readlines()]
data.extend(tmp)
return data
def extract_json(completion: str):
# Regular expression to match content between [BEGIN] and [END]
pattern = r'```(.*?)```'
match = re.search(pattern, completion, re.DOTALL)
if match:
item = match.group(1).strip()
if item.startswith("json"):
item = item[5:]
item = item.replace(",\n}", "\n}").replace(",}", "}").replace("None", "null")
item = item.replace("(", "[").replace(")", "]").replace("\'", "\"")
item = item.replace("True", "true").replace("False", "false")
return json.loads(item)
else:
return None
def load_test_cases(item):
try:
response = extract_json(item["response"])
except Exception as e:
print(e)
print(item["response"])
return {}
if not response:
return {}
if not isinstance(response, dict):
return {}
test_cases = {
"inputs": [],
}
for k, v in response.items():
if not k.startswith("test_case_"):
continue
test_cases["inputs"].append(v)
return test_cases
def load_func_head(item) -> str:
try:
response = extract_json(item["response"])
except Exception as e:
print(e)
print(item["response"])
return ""
if not response:
return ""
if "func_head" not in response:
return ""
return response["func_head"]
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--data_file", type=str)
parser.add_argument("--test_case_file", type=str)
parser.add_argument("--func_head_file", type=str)
parser.add_argument("--output_file", type=str)
args = parser.parse_args()
data = load_file(args.data_file)
test_cases = load_file(args.test_case_file)
id2test_cases = {}
test_num = 0
for item in test_cases:
tmp = load_test_cases(item)
if tmp:
id2test_cases[item["id"]] = tmp
test_num += 1
func_heads = load_file(args.func_head_file)
id2func_head = {}
func_num = 0
for item in func_heads:
tmp = load_func_head(item)
if tmp:
id2func_head[item["id"]] = tmp
func_num += 1
print(f"Test cases: {test_num} / {len(test_cases)}")
print(f"Func heads: {func_num} / {len(func_heads)}")
outputs = []
for item in data:
item_id = item["index"]
if item_id in id2test_cases:
test_inputs = id2test_cases[item_id]
else:
continue
if item_id in id2func_head:
func_head = id2func_head[item_id]
if not func_head:
continue
else:
continue
# item["input_output"] = test_cases
# item["input_output"]["fn_name"] = func_head
# outputs.append(item)
test_inputs["fn_name"] = func_head
outputs.append({
"input_output": test_inputs,
"question": item["problem"],
"problem_id": f"oss-instruct-{item_id}",
})
print(len(outputs))
json.dump(outputs, open(args.output_file, "w", encoding="utf-8"), indent=2, ensure_ascii=False)
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pseudo_test_cases/clean_oss_mistral_data.py \
--data_file ../msranlpintern/share/dataset/magicoder/data-oss_instruct-decontaminated-python.json \
--test_case_file "../msranlpintern/share/models/Mistral-Large-Instruct-2407/apps-test-inputs-gen/sub_dev.0shot.tem0.0.n1.*-of-16.v1.0.json" \
--func_head_file "../msranlpintern/share/models/Mistral-Large-Instruct-2407/apps-test-inputs-gen/oss_instruct_python.func_head_extract.tem0.0.n1.*-of-16.v1.0.json" \
--output_file ../msranlpintern/share/dataset/magicoder/data-oss_instruct-decontaminated-python.mistral-large-test-func.json
Test cases: 31134
Func heads: 23807
18214
Test cases: 32066
Func heads: 23807
18969
Test cases: 32185
Func heads: 23807
19280
Test cases: 33760
Func heads: 23807
20342
Test cases: 33760 / 38284
Func heads: 23807 / 38284
20342
"""
@@ -0,0 +1,131 @@
import json
import argparse
import os.path
import re
from glob import glob
def load_file(file_path):
if os.path.exists(file_path):
if file_path.endswith(".json"):
return json.load(open(file_path, encoding="utf-8"))
else:
return [json.loads(line) for line in open(file_path).readlines()]
data = []
for file in glob(file_path):
print(file)
if file.endswith(".json"):
tmp = json.load(open(file, encoding="utf-8"))
else:
tmp = [json.loads(line) for line in open(file).readlines()]
data.extend(tmp)
return data
def load_test_cases(item):
try:
input_output = json.loads(item["completion"])
except Exception as e:
print(e)
print(item["completion"])
return []
inputs = list(input_output.values())
return inputs
x_code_eval_template_v1 = """{description}
Input: {input_from}
Output: {output_to}
Time limit: {time_limit}
Memory limit: {memory_limit}
#### Input Format
{input_spec}
#### Output Format
{output_spec}
#### Notes
{notes}
#### Example Input-Output
{sample_input_output}
"""
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--data_file", type=str)
parser.add_argument("--test_case_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--test_file", type=str)
parser.add_argument("--val_file", type=str)
args = parser.parse_args()
data = load_file(args.data_file)
test_data = load_file(args.test_file)
test_ids = set([item["src_uid"] for item in test_data])
val_data = load_file(args.val_file)
test_ids.update([item["src_uid"] for item in val_data])
test_cases = load_file(args.test_case_file)
id2test_cases = {}
test_num = 0
for item in test_cases:
tmp = load_test_cases(item)
if tmp:
id2test_cases[item["src_uid"]] = tmp
test_num += 1
print(f"Test cases: {test_num} / {len(test_cases)}")
outputs = []
in_out_template = "Input\n```{}```\n\nOutput\n```{}```"
test_held = 0
for item in data:
if item["input_from"] != 'standard input':
continue
if item["src_uid"] in test_ids:
test_held += 1
continue
item_id = item["src_uid"]
if item_id in id2test_cases:
test_inputs = id2test_cases[item_id]
else:
continue
sample_input_output = []
for _in, _out in zip(item["sample_inputs"], item["sample_outputs"]):
sample_input_output.append(in_out_template.format(_in, _out))
item["sample_input_output"] = "\n\n".join(sample_input_output)
question = x_code_eval_template_v1.format(**item)
test_inputs = {
"inputs": test_inputs,
}
outputs.append({
"input_output": test_inputs,
"question": question,
"problem_id": f"xcode-eval-{item['src_uid']}",
})
print(len(outputs))
print(f"No test: {test_held}")
json.dump(outputs, open(args.output_file, "w", encoding="utf-8"), indent=2, ensure_ascii=False)
if __name__ == '__main__':
main()
@@ -0,0 +1,252 @@
import argparse
import collections
import copy
import json
import re
import sys
from argparse import ArgumentParser
from datasets import load_dataset
from collections import defaultdict
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
import os
from tqdm import tqdm
sys.set_int_max_str_digits(0)
def worker(item, pseudo_test_case_field):
inputs = item[pseudo_test_case_field]["inputs"]
outputs_counter = [
collections.Counter() for _ in inputs
]
output_str2orig_pred = [
{} for _ in inputs
]
resp2outputs = [
{} for _ in range(len(item["outputs"]))
]
assert len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]), (len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
for resp_id, (full_res, pg_outputs) in enumerate(zip(item["full_res"], item["outputs"])):
for case_j, (case_r, case_o) in enumerate(zip(full_res, pg_outputs)):
if case_j >= len(inputs):
break
if case_r != 0:
continue
# assert case_o # sometimes is could be `int` or `True` or `False`. We believe the `case_r` here.
if str(case_o) not in output_str2orig_pred[case_j]:
output_str2orig_pred[case_j][str(case_o)] = case_o
outputs_counter[case_j][str(case_o)] += 1
resp2outputs[resp_id][case_j] = str(case_o)
new_inputs = []
new_outputs = []
new_inputs_non_sc = []
new_outputs_non_sc = []
new_output_meta = []
sc_match_res = [[] for _ in range(len(item["pred"]))]
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
new_inputs.append(inputs[case_j])
sc_o = output_cnt.most_common(1)[0][0]
sc_o_real = output_str2orig_pred[case_j][sc_o]
new_outputs.append(sc_o_real)
# Non-sc output
if case_j in resp2outputs[0]:
new_inputs_non_sc.append(inputs[case_j])
new_outputs_non_sc.append(output_str2orig_pred[case_j][resp2outputs[0][case_j]])
new_output_meta.append({
"output_freq": output_cnt,
"output_str2orig_pred": output_str2orig_pred[case_j],
})
for pg_i in range(len(item["pred"])):
if case_j not in resp2outputs[pg_i]:
sc_match_res[pg_i].append(-2) # compilation error
continue
if resp2outputs[pg_i][case_j] == sc_o:
sc_match_res[pg_i].append(1)
else:
sc_match_res[pg_i].append(0)
return {
"inputs": new_inputs,
"outputs": new_outputs,
"inputs_non_sc": new_inputs_non_sc,
"outputs_non_sc": new_outputs_non_sc,
"output_meta": new_output_meta,
"sc_match_res": sc_match_res,
}
def main():
parser = ArgumentParser()
parser.add_argument("--pseudo_test_case_file", type=str, default=True)
parser.add_argument("--test_case_field", type=str, default="pseudo_test_cases")
parser.add_argument("--construct_prefer_pair", default=False, action="store_true")
parser.add_argument("--pass_case_margin", type=float, default=1)
parser.add_argument("--pass_case_lower_bound", type=float, default=0.5)
parser.add_argument("--output_file", type=str)
args = parser.parse_args()
data = json.load(open(args.pseudo_test_case_file))
outputs = []
cnt = 0
missing_predictions = 0
avg_test_case_num = 0
avg_non_test_case_num = 0
pass_cnt = collections.Counter()
for item in tqdm(data):
if "outputs" not in item:
print(item["pred"])
missing_predictions += 1
continue
result = worker(item, args.test_case_field)
if not result["inputs"]:
continue
item[args.test_case_field]["inputs"] = result["inputs"]
item[args.test_case_field]["outputs"] = result["outputs"]
item[args.test_case_field]["output_meta"] = result["output_meta"]
item[f"{args.test_case_field}_non_sc"] = copy.deepcopy(item[args.test_case_field])
item[f"{args.test_case_field}_non_sc"]["inputs"] = result["inputs_non_sc"]
item[f"{args.test_case_field}_non_sc"]["outputs"] = result["outputs_non_sc"]
item["sc_full_res"] = result["sc_match_res"]
avg_test_case_num += len(result["inputs"])
avg_non_test_case_num += len(result["inputs_non_sc"])
if args.construct_prefer_pair:
pred_pass_cnt = []
for pg_i, pg_res in enumerate(item["sc_full_res"]):
pred_pass_cnt.append(sum([1 for r in pg_res if r == 1]))
pass_cnt[pred_pass_cnt[-1]] += 1
pos = []
neg = []
pos_code = []
neg_code = []
num_test_cases = len(item[args.test_case_field]["inputs"])
assert num_test_cases == len(item["sc_full_res"][0])
assert len(pred_pass_cnt) == len(item["response"]) == len(item["pred"])
for i in range(len(pred_pass_cnt)):
resp_i = item["response"][i]
prog_i = item["pred"][i]
pass_cnt_i = pred_pass_cnt[i]
if pass_cnt_i / num_test_cases < args.pass_case_lower_bound:
continue
for j in range(len(pred_pass_cnt)):
if i == j:
continue
resp_j = item["response"][j]
prog_j = item["pred"][j]
pass_cnt_j = pred_pass_cnt[j]
if pass_cnt_i - pass_cnt_j >= args.pass_case_margin:
pos.append(resp_i)
pos_code.append(prog_i)
neg.append(resp_j)
neg_code.append(prog_j)
item["pos"] = pos
item["pos_code"] = pos_code
item["neg"] = neg
item["neg_code"] = neg_code
cnt += len(pos)
outputs.append(item)
print(len(outputs))
print(cnt)
print(missing_predictions)
print(avg_test_case_num / len(outputs) if outputs else 0)
print(avg_non_test_case_num / len(outputs) if outputs else 0)
print(pass_cnt)
json.dump(outputs, open(args.output_file, "w"), indent=2)
if __name__ == "__main__":
main()
"""
>>> python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json \
--output_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.clean.dpo_m2_low0.5.json \
--construct_prefer_pair --pass_case_margin 3 --pass_case_lower_bound 0.5
93%|██████████████████ | 4095/4418 [00:03<00:00, 629.19it/s]None
100%|█████████████████████████████| 4418/4418 [00:03<00:00, 1323.18it/s]
~~4299
~~82365
~~1
~~9.953477552919283
~~Counter({10: 15551, 0: 15150, 1: 2567, 2: 1722, 9: 1585, 3: 1235, 8: 1220, 7: 1060, 4: 1016, 5: 951, 6: 933})
4299
72724
1
9.953477552919283
Counter({10: 15551, 0: 15150, 1: 2567, 2: 1722, 9: 1585, 3: 1235, 8: 1220, 7: 1060, 4: 1016, 5: 951, 6: 933})
>>> python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json \
--output_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.clean.dpo_m2_low0.5.json \
--construct_prefer_pair --pass_case_margin 2 --pass_case_lower_bound 0.5
~~4299
~~82365
~~1
~~9.953477552919283
~~Counter({10: 15551, 0: 15150, 1: 2567, 2: 1722, 9: 1585, 3: 1235, 8: 1220, 7: 1060, 4: 1016, 5: 951, 6: 933})
4299
77024
1
9.953477552919283
Counter({10: 15551, 0: 15150, 1: 2567, 2: 1722, 9: 1585, 3: 1235, 8: 1220, 7: 1060, 4: 1016, 5: 951, 6: 933})
>>> python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json \
--output_file ../msranlpintern/share/models/deepseek-coder-7b-instruct-v1.5/apps/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.clean.dpo_m6_low0.5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5
4299
59226
1
9.953477552919283
Counter({10: 15551, 0: 15150, 1: 2567, 2: 1722, 9: 1585, 3: 1235, 8: 1220, 7: 1060, 4: 1016, 5: 951, 6: 933})
>>> python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_test_cases.v1.0.azure.json \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.clean.dpo_m6_low0.5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5
4712
59606
2
9.955220713073006
Counter({10: 17718, 0: 16091, 1: 2515, 2: 1841, 9: 1807, 3: 1364, 8: 1291, 6: 1172, 4: 1125, 5: 1115, 7: 1081})
>>> python scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py \
--pseudo_test_case_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_test_cases.v1.0.azure.json \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
4712
0
2
9.955220713073006
Counter()
"""
@@ -0,0 +1,55 @@
import json
import argparse
import os
import sys
import os
from tqdm import tqdm
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
from post_processors.code.clean import standard_cleaner_default
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input_file", type=str)
parser.add_argument("--raw_output_file", type=str)
parser.add_argument("--output_file", type=str)
args = parser.parse_args()
input_data = [json.loads(line) for line in open(args.input_file, encoding="utf-8").readlines()]
raw_outputs = [json.loads(line) for line in open(args.raw_output_file, encoding="utf-8").readlines()]
for o in tqdm(raw_outputs):
request_meta = o["request_metadata"]
s_id = int(request_meta["sid"].split("@")[1])
input_item = input_data[s_id]
assert o["request"]["messages"][1]["content"] in input_item["prompt"]
if "response" not in input_item:
input_item["response"] = []
if "content" not in o["response"]["choices"][0]["message"]:
print(o)
continue
input_item["response"].append(o['response']['choices'][0]['message']['content'])
missing_completion = 0
num_completions = 0
for item in input_data:
if "response" not in item:
missing_completion += 1
item["response"] = ""
item["pred"] = None
else:
preds = [standard_cleaner_default(resp) for resp in item["response"]]
item["pred"] = preds
num_completions += len(preds)
json.dump(input_data, open(args.output_file, "w", encoding="utf-8"))
print(f"Averaged number of completions: {num_completions / len(input_data)}")
if __name__ == '__main__':
main()
@@ -0,0 +1,122 @@
import json
import os
import sys
from argparse import ArgumentParser
from datasets import load_dataset
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
def extract_test_case_inputs(item):
if item["input_output"]:
item["input_output"] = json.loads(item["input_output"])
if "fn_name" in item["input_output"]:
function_call = True
else:
function_call = False
full_inputs = []
if function_call:
try:
response = json.loads(item["completion"])
except Exception as e:
# print(f"Cannot load response for {item['completion']}")
print(e)
return []
for k, v in response.items():
if not isinstance(v, list):
assert isinstance(v, str), v
v = [v]
full_inputs.append(v)
else:
try:
response = json.loads(item["completion"])
except Exception as e:
# print(f"Cannot load response for {item['completion']}")
print(e)
return []
for k, v in response.items():
inputs = v
full_inputs.append(inputs)
return full_inputs
def main():
parser = ArgumentParser()
parser.add_argument("--output_file", type=str)
parser.add_argument("--pseudo_test_case", type=str)
parser.add_argument("--completion_test_field", type=str, default="input_output")
args = parser.parse_args()
data = load_dataset("codeparrot/apps", split="train").to_list()
ps_test_cases = []
cnt = 0
if args.pseudo_test_case.endswith(".json"):
test_cases = json.load(open(args.pseudo_test_case))
for item in test_cases:
_input = extract_test_case_inputs(item)
if not _input:
continue
item["pseudo_inputs"] = _input
ps_test_cases.append(item)
else:
with open(args.pseudo_test_case) as f:
lines = f.readlines()
for line in lines:
try:
item = json.loads(line)
except:
print(f"Cannot load {line}")
cnt += 1
pass
_input = extract_test_case_inputs(item)
if not _input:
continue
item["pseudo_inputs"] = _input
ps_test_cases.append(item)
print(cnt)
print(f"Total number of pseudo test cases: {len(ps_test_cases)}")
id2item = {item["problem_id"]: item for item in ps_test_cases}
outputs = []
for item in data:
if item["problem_id"] not in id2item:
continue
test_cases = {
"inputs": id2item[item["problem_id"]]["pseudo_inputs"],
}
if item[args.completion_test_field]:
if not isinstance(item[args.completion_test_field], dict):
item[args.completion_test_field] = json.loads(item[args.completion_test_field])
if "fn_name" in item[args.completion_test_field]:
test_cases["fn_name"] = item[args.completion_test_field]["fn_name"]
# This is to align with oss data format.
new_item = {
"input_output": test_cases,
"question": item["question"],
"problem_id": f"apps-train-{item['problem_id']}",
"starter_code": item["starter_code"],
}
outputs.append(new_item)
print(f"Total number of items: {len(outputs)}")
json.dump(outputs, open(args.output_file, "w"), ensure_ascii=False, indent=2)
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pseudo_test_cases/combine_pseudo_test_inputs.py \
--output_file ../msranlpintern/share/dataset/magicoder/apps-train.4o-test-func.json \
--pseudo_test_case ../msranlpintern/share/gpt-chat-examples-outputs/apps/test_case_inputs_gen/apps.train.test_case_inputs.gen.v2.1.func_only_combine.outputs.gpt4o.n1.tem0.0.json_obj.json
"""
@@ -0,0 +1,36 @@
export OUTPUT_PREFIX_PATH=/mnt/fangkai_blob/reward_modeling/
#export exp_dir=deepseek-coder-v1.5-ins.7b.r2c.sft_ps_test_case.iter2.pdpo.V100.tp8dp32.v1.3.s42/oss-apps-xcode-combine/checkpoint-300/
export exp_dir=deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.pdpo.H100.dp8.v1.2.s42/oss-apps-xcode-combine/checkpoint-500/
p=$1
echo "Constructing process_rm sample for split 0"
echo "p" $p
# Just check the outputs on the previously generated data
#python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_takes_extra.py \
# --pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].run_outputs.json" \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.run_outputs.json" \
# --output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.pseudo_input_output_by_n64.v1.0.dpo_m6_low0.5_min5_p$p.json \
# --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5 --top_p $p
# Combine outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
#python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp.py \
# --pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.s[0-9].v2.0.run_outputs.json" \
# --output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5_p$p.json \
# --construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5 --top_p $p
## Combine outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
#python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp_compress.py \
# --pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.s[0-9].v2.0.run_outputs.json" \
# --output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.cp.dpo_m4_low0.3_min5_p$p.json \
# --construct_prefer_pair --pass_case_margin 4 --pass_case_lower_bound 0.3 --min_success_test_num 5 --top_p $p
# Combine outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp_compress.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.s[0-9].v2.0.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.cp.dpo_m4_low0.3_min5_p$p.json \
--construct_prefer_pair --pass_case_margin 4 --pass_case_lower_bound 0.3 --min_success_test_num 5 --top_p $p
@@ -0,0 +1,10 @@
OUTPUT_PREFIX_PATH=/mnt/fangkai_blob/reward_modeling/
split_id=$1
python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label_align_ts_num.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.${split_id}-of-256.v2.0.json" \
--output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.${split_id}-of-256.pseudo_test_case.exec.ctr_ts_num.v1.0.json" \
--num_workers 64 \
--pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
@@ -0,0 +1,7 @@
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.*-of-256.pseudo_test_case.exec.ctr_ts_num.v1.0.json" \
--output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.pseudo_test_case.ctr_ts_num.prefix_pass_num.fix_low0.5_m4.0_avg.json" \
--pass_case_lower_bound 0.5 --pass_case_margin 4 --test_case_field pseudo_input_output --reduction avg
@@ -0,0 +1,4 @@
python scripts/apps/solution_run_outputs_local.py \
--completion_file /mnt/fangkai_blob/share/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.json \
--output_file /mnt/fangkai_blob/share/xcode_4o_oss_apps_test_inputs_v1.shuf.combine.4o_run_outputs.json \
--num_workers 64 --id_field problem_id --test_case_field input_output
@@ -0,0 +1,230 @@
import argparse
import collections
import copy
import json
import re
import sys
from argparse import ArgumentParser
from datasets import load_dataset
from collections import defaultdict
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
import os
from tqdm import tqdm
sys.set_int_max_str_digits(0)
"""
Copied from `scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py`.
In the processing of oss combine data, the pseudo test cases are directly saved in `input_output` fields so I re-write this script.
"""
def worker(item, min_success_test_num: int = 1):
inputs = item["input_output"]["inputs"]
outputs_counter = [
collections.Counter() for _ in inputs
]
output_str2orig_pred = [
{} for _ in inputs
]
resp2outputs = [
{} for _ in range(len(item["outputs"]))
]
assert len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]), (len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
# if not len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]): # TODO: Figure it out why this happens
# print(len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
# return {
# "inputs": [],
# "outputs": [],
# "output_meta": [],
# "sc_match_res": [],
# }
for resp_id, (full_res, pg_outputs) in enumerate(zip(item["full_res"], item["outputs"])):
for case_j, (case_r, case_o) in enumerate(zip(full_res, pg_outputs)):
if case_j >= len(inputs):
break
if case_r != 0:
continue
# assert case_o # sometimes is could be `int` or `True` or `False`. We believe the `case_r` here.
if not str(case_o):
continue # some outputs could be empty string
if str(case_o) not in output_str2orig_pred[case_j]:
output_str2orig_pred[case_j][str(case_o)] = case_o
outputs_counter[case_j][str(case_o)] += 1
resp2outputs[resp_id][case_j] = str(case_o)
new_inputs = []
new_outputs = []
new_output_meta = []
sc_match_res = [[] for _ in range(len(item["pred"]))]
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
if sum(output_cnt.values()) < min_success_test_num:
continue
new_inputs.append(inputs[case_j])
sc_o = output_cnt.most_common(1)[0][0]
sc_o_real = output_str2orig_pred[case_j][sc_o]
new_outputs.append(sc_o_real)
new_output_meta.append({
"output_freq": output_cnt,
"output_str2orig_pred": output_str2orig_pred[case_j],
})
for pg_i in range(len(item["pred"])):
if case_j not in resp2outputs[pg_i]:
sc_match_res[pg_i].append(-2) # compilation error
continue
if resp2outputs[pg_i][case_j] == sc_o:
sc_match_res[pg_i].append(1)
else:
sc_match_res[pg_i].append(0)
return {
"inputs": new_inputs,
"outputs": new_outputs,
"output_meta": new_output_meta,
"sc_match_res": sc_match_res,
}
def main():
parser = ArgumentParser()
parser.add_argument("--pseudo_test_case_file", type=str, default=True)
parser.add_argument("--construct_prefer_pair", default=False, action="store_true")
parser.add_argument("--min_success_test_num", type=int, default=2)
parser.add_argument("--pass_case_margin", type=float, default=1)
parser.add_argument("--pass_case_lower_bound", type=float, default=0.5)
parser.add_argument("--output_file", type=str)
args = parser.parse_args()
if os.path.exists(args.pseudo_test_case_file):
print(f"Loading pseudo test cases from {args.pseudo_test_case_file}")
data = json.load(open(args.pseudo_test_case_file))
else:
data = []
for file in glob(args.pseudo_test_case_file):
print(file)
if file.endswith(".json"):
tmp = json.load(open(file))
else:
tmp = [json.loads(line) for line in open(file).readlines()]
data.extend(tmp)
outputs = []
before_test_num = 0
cnt = 0
missing_predictions = 0
avg_test_case_num = 0
pass_cnt = collections.Counter()
for item in tqdm(data):
if "outputs" not in item:
print(item["pred"])
missing_predictions += 1
continue
before_test_num += len(item["input_output"]["inputs"])
result = worker(item, min_success_test_num=args.min_success_test_num)
if not result["inputs"]:
continue
item["input_output"]["inputs"] = result["inputs"]
item["input_output"]["outputs"] = result["outputs"]
item["input_output"]["output_meta"] = result["output_meta"]
item["sc_full_res"] = result["sc_match_res"]
avg_test_case_num += len(result["inputs"])
if args.construct_prefer_pair:
pred_pass_cnt = []
for pg_i, pg_res in enumerate(item["sc_full_res"]):
pred_pass_cnt.append(sum([1 for r in pg_res if r == 1]))
pass_cnt[pred_pass_cnt[-1]] += 1
pos = []
neg = []
pos_code = []
neg_code = []
num_test_cases = len(item["input_output"]["inputs"])
assert num_test_cases == len(item["sc_full_res"][0])
assert len(pred_pass_cnt) == len(item["response"]) == len(item["pred"])
for i in range(len(pred_pass_cnt)):
resp_i = item["response"][i]
prog_i = item["pred"][i]
pass_cnt_i = pred_pass_cnt[i]
if pass_cnt_i / num_test_cases < args.pass_case_lower_bound:
continue
for j in range(len(pred_pass_cnt)):
if i == j:
continue
resp_j = item["response"][j]
prog_j = item["pred"][j]
pass_cnt_j = pred_pass_cnt[j]
if pass_cnt_i - pass_cnt_j >= args.pass_case_margin:
pos.append(resp_i)
pos_code.append(prog_i)
neg.append(resp_j)
neg_code.append(prog_j)
item["pos"] = pos
item["pos_code"] = pos_code
item["neg"] = neg
item["neg_code"] = neg_code
cnt += len(pos)
outputs.append(item)
print(len(outputs))
print(cnt)
print(missing_predictions)
print(before_test_num / len(data) if data else 0)
print(avg_test_case_num / len(outputs) if outputs else 0)
print(pass_cnt)
json.dump(outputs, open(args.output_file, "w"), indent=2)
if __name__ == "__main__":
main()
"""
>>> python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
13033
111756
2
10.003563932998059
9.762295710887747
Counter({10: 81281, 0: 22865, 9: 4529, 1: 4140, 8: 3010, 5: 2760, 2: 2636, 7: 2300, 4: 2256, 3: 2250, 6: 2158, 11: 120, 20: 24, 16: 1})
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min1.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 1
14899
136123
2
10.003563932998059
9.835290959124773
Counter({10: 84309, 0: 38044, 9: 4612, 1: 4199, 8: 3019, 5: 2823, 2: 2705, 7: 2356, 4: 2282, 3: 2275, 6: 2211, 11: 128, 20: 26, 16: 1})
"""
@@ -0,0 +1,382 @@
import collections
import copy
import functools
import json
import os
import sys
from argparse import ArgumentParser
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
# from pympler import asizeof
sys.set_int_max_str_digits(0)
"""
Copied from `scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py`.
In the processing of oss combine data, the pseudo test cases are directly saved in `input_output` fields so I re-write this script.
"""
def worker(item, min_success_test_num: int = 1, top_p: float = 0.0):
inputs = item["input_output"]["inputs"]
outputs_counter = [
collections.Counter() for _ in inputs
]
output_str2orig_pred = [
{} for _ in inputs
]
resp2outputs = [
{} for _ in range(len(item["outputs"]))
]
assert len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]), (len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
# if not len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]): # TODO: Figure it out why this happens
# print(len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
# return {
# "inputs": [],
# "outputs": [],
# "output_meta": [],
# "sc_match_res": [],
# }
for resp_id, (full_res, pg_outputs) in enumerate(zip(item["full_res"], item["outputs"])):
for case_j, (case_r, case_o) in enumerate(zip(full_res, pg_outputs)):
if case_j >= len(inputs):
break
if case_r != 0:
continue
# assert case_o # sometimes is could be `int` or `True` or `False`. We believe the `case_r` here.
if not str(case_o):
continue # some outputs could be empty string
if str(case_o) not in output_str2orig_pred[case_j]:
output_str2orig_pred[case_j][str(case_o)] = case_o
outputs_counter[case_j][str(case_o)] += 1
resp2outputs[resp_id][case_j] = str(case_o)
averaged_p = 0
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
sc_o_freq = output_cnt.most_common(1)[0][1]
averaged_p += sc_o_freq / len(item["full_res"])
averaged_p /= len(outputs_counter)
if averaged_p < top_p:
return {
"id": item["id"],
"inputs": [],
"outputs": [],
}
new_inputs = []
new_outputs = []
new_output_meta = []
sc_match_res = [[] for _ in range(len(item["pred"]))]
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
if sum(output_cnt.values()) < min_success_test_num:
continue
new_inputs.append(inputs[case_j])
sc_o = output_cnt.most_common(1)[0][0]
sc_o_real = output_str2orig_pred[case_j][sc_o]
new_outputs.append(sc_o_real)
new_output_meta.append({
"output_freq": output_cnt,
"output_str2orig_pred": output_str2orig_pred[case_j],
})
for pg_i in range(len(item["pred"])):
if case_j not in resp2outputs[pg_i]:
sc_match_res[pg_i].append(-2) # compilation error
continue
if resp2outputs[pg_i][case_j] == sc_o:
sc_match_res[pg_i].append(1)
else:
sc_match_res[pg_i].append(0)
# size_in_bytes = asizeof.asizeof(new_outputs)
# if size_in_bytes / (1024 ** 2) > 10: # 10MB
# return {
# "inputs": [],
# "outputs": [],
# "output_meta": [],
# "sc_match_res": [],
# }
return {
"id": item["id"],
"inputs": new_inputs,
"outputs": new_outputs,
# "output_meta": new_output_meta,
"sc_match_res": sc_match_res,
}
def load_files(file_path):
data = []
if os.path.exists(file_path):
print(f"Loading pseudo test cases from {file_path}")
if file_path.endswith(".json"):
data.extend(json.load(open(file_path)))
else:
data.extend([json.loads(line) for line in open(file_path).readlines()])
else:
for file in glob(file_path):
print(file)
if file.endswith(".json"):
data.extend(json.load(open(file)))
else:
data.extend([json.loads(line) for line in open(file).readlines()])
return data
def merge_key(item, value):
assert isinstance(item, list)
if isinstance(value, list):
item = item + value
else:
item.append(value)
return item
def merge_seed_sampled_data(data):
id2data = {}
for item in data:
if isinstance(item["response"], str):
print(f"Warning: {item['id']} has only one response. ---- {item['response']} \n\n {item['pred']}")
item["response"] = [item["response"]]
assert isinstance(item["pred"], str) or item["pred"] is None
item["pred"] = [item["pred"]]
if "res" not in item: # Sometimes all solutions do not entail the programs. Please turn back to `solution_run_outputs_local.py`.
results = []
full_results = []
all_outputs = []
preds = []
for _ in item["response"]:
preds.append("")
results.append(False)
full_results.append([-2] * 21)
all_outputs.append([None] * 21)
item["res"] = results
item["full_res"] = full_results
item["outputs"] = all_outputs
item["pred"] = preds
if item["id"] not in id2data:
id2data[item["id"]] = item
continue
tmp = id2data[item["id"]]
# if isinstance(tmp["res"], list):
# tmp["res"] = [tmp["res"]]
# if not isinstance(tmp["pred"], list):
# tmp["pred"] = [tmp["pred"]]
# if not isinstance(tmp["full_res"], list):
# tmp["full_res"] = [tmp["full_res"]]
# if "outputs" in tmp and not isinstance(tmp["outputs"], list):
# tmp["outputs"] = [tmp["outputs"]]
tmp["response"] = merge_key(tmp["response"], item["response"])
tmp["res"] = merge_key(tmp["res"], item["res"])
tmp["pred"] = merge_key(tmp["pred"], item["pred"])
tmp["full_res"] = merge_key(tmp["full_res"], item["full_res"])
# if "outputs" in tmp:
tmp["outputs"] = merge_key(tmp["outputs"], item["outputs"])
assert isinstance(tmp["pred"], list), tmp["pred"]
id2data[item["id"]] = tmp
return list(id2data.values())
def main():
parser = ArgumentParser()
parser.add_argument("--pseudo_test_case_file", type=str, default=True)
parser.add_argument("--construct_prefer_pair", default=False, action="store_true")
parser.add_argument("--min_success_test_num", type=int, default=2)
parser.add_argument("--pass_case_margin", type=float, default=1)
parser.add_argument("--pass_case_lower_bound", type=float, default=0.5)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=16)
parser.add_argument("--top_p", type=float, default=0.0)
args = parser.parse_args()
# if os.path.exists(args.pseudo_test_case_file):
# print(f"Loading pseudo test cases from {args.pseudo_test_case_file}")
# data = json.load(open(args.pseudo_test_case_file))
# else:
# data = []
# for file in glob(args.pseudo_test_case_file):
# print(file)
# if file.endswith(".json"):
# tmp = json.load(open(file))
# else:
# tmp = [json.loads(line) for line in open(file).readlines()]
# data.extend(tmp)
data = load_files(args.pseudo_test_case_file)
data = merge_seed_sampled_data(data)
id2data = {item["id"]: item for item in data}
missing_predictions = 0
before_test_num = 0
_mp_inputs = []
for item in tqdm(data, desc="Preparing Inputs"):
# TODO: Here we do not consider those bad solutions without even complete programs. These programs should also be penalized
# but we have already removed them here.
if "outputs" not in item:
print(item["pred"])
missing_predictions += 1
continue
before_test_num += len(item["input_output"]["inputs"])
_mp_inputs.append(item)
pbar = tqdm(_mp_inputs, desc="Submitting tasks")
_mp_outputs = []
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
_annotate = functools.partial(worker, min_success_test_num=args.min_success_test_num, top_p=args.top_p)
for _input in pbar:
future = executor.submit(_annotate, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
_mp_outputs.append(future.result())
sc_test_cases_outputs = []
prefer_pair_outputs = []
cnt = 0
avg_test_case_num = 0
pass_cnt = collections.Counter()
for result in tqdm(_mp_outputs):
if not result["inputs"]:
continue
item = id2data[result["id"]]
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
if "outputs" in item:
item.pop("outputs")
if "errors" in item:
item.pop("errors")
test_case_item = {
"problem_id": item["problem_id"],
"input_output": {
"inputs": result["inputs"],
"outputs": result["outputs"],
},
"sc_full_res": result["sc_match_res"],
}
sc_test_cases_outputs.append(test_case_item)
# test_case_item["input_output"]["inputs"] = result["inputs"]
# test_case_item["input_output"]["outputs"] = result["outputs"]
# item["input_output"]["output_meta"] = result["output_meta"]
# test_case_item["sc_full_res"] = result["sc_match_res"]
avg_test_case_num += len(result["inputs"])
if args.construct_prefer_pair:
pred_pass_cnt = []
for pg_i, pg_res in enumerate(test_case_item["sc_full_res"]):
pred_pass_cnt.append(sum([1 for r in pg_res if r == 1]))
pass_cnt[pred_pass_cnt[-1]] += 1
pos = []
neg = []
pos_code = []
neg_code = []
num_test_cases = len(test_case_item["input_output"]["inputs"])
assert num_test_cases == len(test_case_item["sc_full_res"][0])
assert len(pred_pass_cnt) == len(item["response"]) == len(item["pred"]), (len(pred_pass_cnt), len(item["response"]), len(item["pred"]))
for i in range(len(pred_pass_cnt)):
resp_i = item["response"][i]
prog_i = item["pred"][i]
pass_cnt_i = pred_pass_cnt[i]
if pass_cnt_i / num_test_cases < args.pass_case_lower_bound:
continue
for j in range(len(pred_pass_cnt)):
if i == j:
continue
resp_j = item["response"][j]
prog_j = item["pred"][j]
pass_cnt_j = pred_pass_cnt[j]
if pass_cnt_i - pass_cnt_j >= args.pass_case_margin:
pos.append(resp_i)
pos_code.append(prog_i)
neg.append(resp_j)
neg_code.append(prog_j)
item["pos"] = pos
item["pos_code"] = pos_code
item["neg"] = neg
item["neg_code"] = neg_code
cnt += len(pos)
item.pop("response")
item.pop("pred")
prefer_pair_outputs.append(item)
print(len(prefer_pair_outputs))
print(len(sc_test_cases_outputs))
print(cnt)
print(missing_predictions)
print(before_test_num / len(data) if data else 0)
print(avg_test_case_num / len(sc_test_cases_outputs) if sc_test_cases_outputs else 0)
print(pass_cnt)
json.dump(sc_test_cases_outputs, open(args.output_file.replace(".json", ".sc_test_cases.json"), "w", encoding="utf-8"), ensure_ascii=False, indent=2)
if args.construct_prefer_pair:
json.dump(prefer_pair_outputs, open(args.output_file, "w", encoding="utf-8"), ensure_ascii=False, indent=2)
if __name__ == "__main__":
main()
"""
>>> python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
13033
111756
2
10.003563932998059
9.762295710887747
Counter({10: 81281, 0: 22865, 9: 4529, 1: 4140, 8: 3010, 5: 2760, 2: 2636, 7: 2300, 4: 2256, 3: 2250, 6: 2158, 11: 120, 20: 24, 16: 1})
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min1.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 1
14899
136123
2
10.003563932998059
9.835290959124773
Counter({10: 84309, 0: 38044, 9: 4612, 1: 4199, 8: 3019, 5: 2823, 2: 2705, 7: 2356, 4: 2282, 3: 2275, 6: 2211, 11: 128, 20: 26, 16: 1})
"""
@@ -0,0 +1,362 @@
import collections
import copy
import functools
import json
import os
import sys
from argparse import ArgumentParser
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
# from pympler import asizeof
sys.set_int_max_str_digits(0)
"""
Copied from `scripts/apps/pseudo_test_cases/collect_pseudo_outputs.py`.
In the processing of oss combine data, the pseudo test cases are directly saved in `input_output` fields so I re-write this script.
A different saving format. One positive response is paired with a list of negative candidates.
"""
def worker(item, min_success_test_num: int = 1, top_p: float = 0.0):
inputs = item["input_output"]["inputs"]
outputs_counter = [
collections.Counter() for _ in inputs
]
output_str2orig_pred = [
{} for _ in inputs
]
resp2outputs = [
{} for _ in range(len(item["outputs"]))
]
assert len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]), (len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
for resp_id, (full_res, pg_outputs) in enumerate(zip(item["full_res"], item["outputs"])):
for case_j, (case_r, case_o) in enumerate(zip(full_res, pg_outputs)):
if case_j >= len(inputs):
break
if case_r != 0:
continue
# assert case_o # sometimes is could be `int` or `True` or `False`. We believe the `case_r` here.
if not str(case_o):
continue # some outputs could be empty string
if str(case_o) not in output_str2orig_pred[case_j]:
output_str2orig_pred[case_j][str(case_o)] = case_o
outputs_counter[case_j][str(case_o)] += 1
resp2outputs[resp_id][case_j] = str(case_o)
averaged_p = 0
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
sc_o_freq = output_cnt.most_common(1)[0][1]
averaged_p += sc_o_freq / len(item["full_res"])
averaged_p /= len(outputs_counter)
if averaged_p < top_p:
return {
"id": item["id"],
"inputs": [],
"outputs": [],
}
new_inputs = []
new_outputs = []
new_output_meta = []
sc_match_res = [[] for _ in range(len(item["pred"]))]
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
if sum(output_cnt.values()) < min_success_test_num:
continue
new_inputs.append(inputs[case_j])
sc_o = output_cnt.most_common(1)[0][0]
sc_o_real = output_str2orig_pred[case_j][sc_o]
new_outputs.append(sc_o_real)
new_output_meta.append({
"output_freq": output_cnt,
"output_str2orig_pred": output_str2orig_pred[case_j],
})
for pg_i in range(len(item["pred"])):
if case_j not in resp2outputs[pg_i]:
sc_match_res[pg_i].append(-2) # compilation error
continue
if resp2outputs[pg_i][case_j] == sc_o:
sc_match_res[pg_i].append(1)
else:
sc_match_res[pg_i].append(0)
return {
"id": item["id"],
"inputs": new_inputs,
"outputs": new_outputs,
# "output_meta": new_output_meta,
"sc_match_res": sc_match_res,
}
def load_files(file_path):
data = []
if os.path.exists(file_path):
print(f"Loading pseudo test cases from {file_path}")
if file_path.endswith(".json"):
data.extend(json.load(open(file_path)))
else:
data.extend([json.loads(line) for line in open(file_path).readlines()])
else:
for file in glob(file_path):
print(file)
if file.endswith(".json"):
data.extend(json.load(open(file)))
else:
data.extend([json.loads(line) for line in open(file).readlines()])
return data
def merge_key(item, value):
assert isinstance(item, list)
if isinstance(value, list):
item = item + value
else:
item.append(value)
return item
def merge_seed_sampled_data(data):
id2data = {}
for item in data:
if isinstance(item["response"], str):
print(f"Warning: {item['id']} has only one response. ---- {item['response']} \n\n {item['pred']}")
item["response"] = [item["response"]]
assert isinstance(item["pred"], str) or item["pred"] is None
item["pred"] = [item["pred"]]
if "res" not in item: # Sometimes all solutions do not entail the programs. Please turn back to `solution_run_outputs_local.py`.
results = []
full_results = []
all_outputs = []
preds = []
for _ in item["response"]:
preds.append("")
results.append(False)
full_results.append([-2] * 21)
all_outputs.append([None] * 21)
item["res"] = results
item["full_res"] = full_results
item["outputs"] = all_outputs
item["pred"] = preds
if item["id"] not in id2data:
id2data[item["id"]] = item
continue
tmp = id2data[item["id"]]
# if isinstance(tmp["res"], list):
# tmp["res"] = [tmp["res"]]
# if not isinstance(tmp["pred"], list):
# tmp["pred"] = [tmp["pred"]]
# if not isinstance(tmp["full_res"], list):
# tmp["full_res"] = [tmp["full_res"]]
# if "outputs" in tmp and not isinstance(tmp["outputs"], list):
# tmp["outputs"] = [tmp["outputs"]]
tmp["response"] = merge_key(tmp["response"], item["response"])
tmp["res"] = merge_key(tmp["res"], item["res"])
tmp["pred"] = merge_key(tmp["pred"], item["pred"])
tmp["full_res"] = merge_key(tmp["full_res"], item["full_res"])
# if "outputs" in tmp:
tmp["outputs"] = merge_key(tmp["outputs"], item["outputs"])
assert isinstance(tmp["pred"], list), tmp["pred"]
id2data[item["id"]] = tmp
return list(id2data.values())
def main():
parser = ArgumentParser()
parser.add_argument("--pseudo_test_case_file", type=str, default=True)
parser.add_argument("--construct_prefer_pair", default=False, action="store_true")
parser.add_argument("--min_success_test_num", type=int, default=2)
parser.add_argument("--pass_case_margin", type=float, default=1)
parser.add_argument("--pass_case_lower_bound", type=float, default=0.5)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=16)
parser.add_argument("--top_p", type=float, default=0.0)
args = parser.parse_args()
data = load_files(args.pseudo_test_case_file)
data = merge_seed_sampled_data(data)
id2data = {item["id"]: item for item in data}
missing_predictions = 0
before_test_num = 0
_mp_inputs = []
for item in tqdm(data, desc="Preparing Inputs"):
# TODO: Here we do not consider those bad solutions without even complete programs. These programs should also be penalized
# but we have already removed them here.
if "outputs" not in item:
print(item["pred"])
missing_predictions += 1
continue
before_test_num += len(item["input_output"]["inputs"])
_mp_inputs.append(item)
pbar = tqdm(_mp_inputs, desc="Submitting tasks")
_mp_outputs = []
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
_annotate = functools.partial(worker, min_success_test_num=args.min_success_test_num, top_p=args.top_p)
for _input in pbar:
future = executor.submit(_annotate, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
_mp_outputs.append(future.result())
sc_test_cases_outputs = []
prefer_pair_outputs = []
cnt = 0
avg_test_case_num = 0
pass_cnt = collections.Counter()
for result in tqdm(_mp_outputs):
if not result["inputs"]:
continue
item = id2data[result["id"]]
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
if "outputs" in item:
item.pop("outputs")
if "errors" in item:
item.pop("errors")
test_case_item = {
"problem_id": item["problem_id"],
"input_output": {
"inputs": result["inputs"],
"outputs": result["outputs"],
},
"sc_full_res": result["sc_match_res"],
}
sc_test_cases_outputs.append(test_case_item)
avg_test_case_num += len(result["inputs"])
if args.construct_prefer_pair:
pred_pass_cnt = []
for pg_i, pg_res in enumerate(test_case_item["sc_full_res"]):
pred_pass_cnt.append(sum([1 for r in pg_res if r == 1]))
pass_cnt[pred_pass_cnt[-1]] += 1
pos = []
neg = []
pos_code = []
neg_code = []
num_test_cases = len(test_case_item["input_output"]["inputs"])
assert num_test_cases == len(test_case_item["sc_full_res"][0])
assert len(pred_pass_cnt) == len(item["response"]) == len(item["pred"]), (len(pred_pass_cnt), len(item["response"]), len(item["pred"]))
for i in range(len(pred_pass_cnt)):
resp_i = item["response"][i]
prog_i = item["pred"][i]
pass_cnt_i = pred_pass_cnt[i]
pos2neg = []
pos2neg_code = []
if pass_cnt_i / num_test_cases < args.pass_case_lower_bound:
continue
for j in range(len(pred_pass_cnt)):
if i == j:
continue
resp_j = item["response"][j]
prog_j = item["pred"][j]
pass_cnt_j = pred_pass_cnt[j]
if pass_cnt_i - pass_cnt_j >= args.pass_case_margin:
# pos.append(resp_i)
# pos_code.append(prog_i)
# neg.append(resp_j)
# neg_code.append(prog_j)
pos2neg.append(resp_j)
pos2neg_code.append(prog_j)
if pos2neg:
pos.append(resp_i)
pos_code.append(prog_i)
neg.append(pos2neg)
neg_code.append(pos2neg_code)
item["pos"] = pos
item["pos_code"] = pos_code
item["neg"] = neg
item["neg_code"] = neg_code
cnt += len(pos)
item.pop("response")
item.pop("pred")
prefer_pair_outputs.append(item)
print(len(prefer_pair_outputs))
print(len(sc_test_cases_outputs))
print(cnt)
print(missing_predictions)
print(before_test_num / len(data) if data else 0)
print(avg_test_case_num / len(sc_test_cases_outputs) if sc_test_cases_outputs else 0)
print(pass_cnt)
json.dump(sc_test_cases_outputs, open(args.output_file.replace(".json", ".sc_test_cases.json"), "w", encoding="utf-8"), ensure_ascii=False, indent=2)
if args.construct_prefer_pair:
json.dump(prefer_pair_outputs, open(args.output_file, "w", encoding="utf-8"), ensure_ascii=False, indent=2)
if __name__ == "__main__":
main()
"""
>>> python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
13033
111756
2
10.003563932998059
9.762295710887747
Counter({10: 81281, 0: 22865, 9: 4529, 1: 4140, 8: 3010, 5: 2760, 2: 2636, 7: 2300, 4: 2256, 3: 2250, 6: 2158, 11: 120, 20: 24, 16: 1})
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min1.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 1
14899
136123
2
10.003563932998059
9.835290959124773
Counter({10: 84309, 0: 38044, 9: 4612, 1: 4199, 8: 3019, 5: 2823, 2: 2705, 7: 2356, 4: 2282, 3: 2275, 6: 2211, 11: 128, 20: 26, 16: 1})
"""
@@ -0,0 +1,329 @@
import collections
import functools
import json
import os
import sys
from argparse import ArgumentParser
from glob import glob
from concurrent.futures import ThreadPoolExecutor, as_completed
from pympler import asizeof
from tqdm import tqdm
sys.set_int_max_str_digits(0)
"""
Copied from `scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py`.
This script can accept external execution files for performing self-consistency over test cases.
"""
def worker(_input, min_success_test_num: int = 1, top_p: float = 0.0):
item, sc_item = _input
inputs = sc_item["input_output"]["inputs"]
outputs_counter = [
collections.Counter() for _ in inputs
]
output_str2orig_pred = [
{} for _ in inputs
]
resp2outputs = [
{} for _ in range(len(item["outputs"]))
]
assert len(inputs) == len(item["input_output"]["inputs"]), (len(inputs), len(item["input_output"]["inputs"]))
# assert len(sc_item["outputs"]) == item["outputs"], (len(sc_item["outputs"]), len(item["outputs"]))
assert len(sc_item["full_res"]) == len(sc_item["outputs"]) == len(sc_item["pred"]), (len(sc_item["full_res"]), len(sc_item["outputs"]),
len(sc_item["pred"]))
assert len(item["full_res"]) == len(item["outputs"]) == len(item["pred"]), (len(item["full_res"]), len(item["outputs"]), len(item["pred"]))
sc_prog_num = len(sc_item["full_res"])
# We use the external item to perform self-consistency over test cases.
for resp_id, (full_res, pg_outputs) in enumerate(zip(sc_item["full_res"], sc_item["outputs"])):
for case_j, (case_r, case_o) in enumerate(zip(full_res, pg_outputs)):
if case_j >= len(inputs):
break
if case_r != 0:
continue
# assert case_o # sometimes is could be `int` or `True` or `False`. We believe the `case_r` here.
if not str(case_o):
continue # some outputs could be empty string
if str(case_o) not in output_str2orig_pred[case_j]:
output_str2orig_pred[case_j][str(case_o)] = case_o
outputs_counter[case_j][str(case_o)] += 1
# We then record the target item's outputs
for resp_id, (full_res, pg_outputs) in enumerate(zip(item["full_res"], item["outputs"])):
for case_j, (case_r, case_o) in enumerate(zip(full_res, pg_outputs)):
if case_j >= len(inputs):
break
if case_r != 0:
continue
# assert case_o # sometimes is could be `int` or `True` or `False`. We believe the `case_r` here.
if not str(case_o):
continue # some outputs could be empty string
resp2outputs[resp_id][case_j] = str(case_o)
averaged_p = 0
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
sc_o_freq = output_cnt.most_common(1)[0][1]
averaged_p += sc_o_freq / sc_prog_num
averaged_p /= len(outputs_counter)
if averaged_p < top_p:
return {
"id": item["id"],
"inputs": [],
"outputs": [],
}
new_inputs = []
new_outputs = []
new_output_meta = []
sc_match_res = [[] for _ in range(len(item["pred"]))]
for case_j, output_cnt in enumerate(outputs_counter):
if not output_cnt:
continue
if sum(output_cnt.values()) < min_success_test_num:
continue
sc_o, sc_o_freq = output_cnt.most_common(1)[0]
sc_o_real = output_str2orig_pred[case_j][sc_o]
new_inputs.append(inputs[case_j])
new_outputs.append(sc_o_real)
new_output_meta.append({
"output_freq": output_cnt,
"output_str2orig_pred": output_str2orig_pred[case_j],
})
for pg_i in range(len(item["pred"])):
if case_j not in resp2outputs[pg_i]:
sc_match_res[pg_i].append(-2) # compilation error
continue
if resp2outputs[pg_i][case_j] == sc_o:
sc_match_res[pg_i].append(1)
else:
sc_match_res[pg_i].append(0)
return {
"id": item["id"],
"inputs": new_inputs,
"outputs": new_outputs,
"output_meta": new_output_meta,
"sc_match_res": sc_match_res,
}
def load_files(file_path):
data = []
if os.path.exists(file_path):
print(f"Loading pseudo test cases from {file_path}")
if file_path.endswith(".json"):
data.extend(json.load(open(file_path)))
else:
data.extend([json.loads(line) for line in open(file_path).readlines()])
else:
for file in glob(file_path):
print(file)
if file.endswith(".json"):
data.extend(json.load(open(file)))
else:
data.extend([json.loads(line) for line in open(file).readlines()])
return data
def merge_key(item, value):
assert isinstance(item, list)
if isinstance(value, list):
item = item + value
else:
item.append(value)
return item
def merge_seed_sampled_data(data):
id2data = {}
large_mem = 0
for item in data:
if isinstance(item["response"], str):
item["response"] = [item["response"]]
assert isinstance(item["pred"], str) or item["pred"] is None
item["pred"] = [item["pred"]]
if "outputs" in item:
size_in_bytes = asizeof.asizeof(item["outputs"])
if size_in_bytes / (1024 ** 2) > 10: # 10MB
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
if "outputs" in item:
item.pop("outputs")
if "errors" in item:
item.pop("errors")
large_mem += 1
if "res" not in item: # Sometimes all solutions do not entail the programs. Please turn back to `solution_run_outputs_local.py`.
results = []
full_results = []
all_outputs = []
for _ in item["response"]:
results.append(False)
full_results.append([-2] * 21)
all_outputs.append([None] * 21)
item["res"] = results
item["full_res"] = full_results
item["outputs"] = all_outputs
if item["id"] not in id2data:
id2data[item["id"]] = item
continue
tmp = id2data[item["id"]]
# if isinstance(tmp["res"], list):
# tmp["res"] = [tmp["res"]]
# if not isinstance(tmp["pred"], list):
# tmp["pred"] = [tmp["pred"]]
# if not isinstance(tmp["full_res"], list):
# tmp["full_res"] = [tmp["full_res"]]
# if "outputs" in tmp and not isinstance(tmp["outputs"], list):
# tmp["outputs"] = [tmp["outputs"]]
tmp["response"] = merge_key(tmp["response"], item["response"])
tmp["res"] = merge_key(tmp["res"], item["res"])
tmp["pred"] = merge_key(tmp["pred"], item["pred"])
tmp["full_res"] = merge_key(tmp["full_res"], item["full_res"])
tmp["outputs"] = merge_key(tmp["outputs"], item["outputs"])
assert isinstance(tmp["pred"], list), tmp["pred"]
id2data[item["id"]] = tmp
print(f"Too large outputs: {large_mem}")
return list(id2data.values())
def main():
parser = ArgumentParser()
parser.add_argument("--pseudo_test_case_file", type=str)
parser.add_argument("--completion_file", type=str)
parser.add_argument("--min_success_test_num", type=int, default=2)
parser.add_argument("--pass_case_margin", type=float, default=1)
parser.add_argument("--pass_case_lower_bound", type=float, default=0.5)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=24)
parser.add_argument("--top_p", type=float, default=0.0)
args = parser.parse_args()
external_ps_test_cases = load_files(args.pseudo_test_case_file)
external_ps_test_cases = merge_seed_sampled_data(external_ps_test_cases)
id2external_ps_test_cases = {item["id"]: item for item in external_ps_test_cases}
data = load_files(args.completion_file)
data = merge_seed_sampled_data(data)
id2item = {item["id"]: item for item in data}
before_test_num = 0
missing_predictions = 0
_mp_inputs = []
_mp_outputs = []
for item in tqdm(data):
if "outputs" not in item:
print(item["pred"])
missing_predictions += 1
continue
before_test_num += len(item["input_output"]["inputs"])
_mp_inputs.append((item, id2external_ps_test_cases[item["id"]]))
pbar = tqdm(_mp_inputs)
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
_annotate = functools.partial(worker, min_success_test_num=args.min_success_test_num, top_p=args.top_p)
for _input in pbar:
future = executor.submit(_annotate, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
_mp_outputs.append(future.result())
outputs = []
cnt = 0
avg_test_case_num = 0
pass_cnt = collections.Counter()
for result in _mp_outputs:
if not result["inputs"]:
continue
item = id2item[result["id"]]
item["input_output"]["inputs"] = result["inputs"]
item["input_output"]["outputs"] = result["outputs"]
item["input_output"]["output_meta"] = result["output_meta"]
item["sc_full_res"] = result["sc_match_res"]
avg_test_case_num += len(result["inputs"])
pred_pass_cnt = []
for pg_i, pg_res in enumerate(item["sc_full_res"]):
pred_pass_cnt.append(sum([1 for r in pg_res if r == 1]))
pass_cnt[pred_pass_cnt[-1]] += 1
pos = []
neg = []
pos_code = []
neg_code = []
num_test_cases = len(item["input_output"]["inputs"])
assert num_test_cases == len(item["sc_full_res"][0])
assert len(pred_pass_cnt) == len(item["response"]) == len(item["pred"])
for i in range(len(pred_pass_cnt)):
resp_i = item["response"][i]
prog_i = item["pred"][i]
pass_cnt_i = pred_pass_cnt[i]
if pass_cnt_i / num_test_cases < args.pass_case_lower_bound:
continue
for j in range(len(pred_pass_cnt)):
if i == j:
continue
resp_j = item["response"][j]
prog_j = item["pred"][j]
pass_cnt_j = pred_pass_cnt[j]
if pass_cnt_i - pass_cnt_j >= args.pass_case_margin:
pos.append(resp_i)
pos_code.append(prog_i)
neg.append(resp_j)
neg_code.append(prog_j)
item["pos"] = pos
item["pos_code"] = pos_code
item["neg"] = neg
item["neg_code"] = neg_code
cnt += len(pos)
outputs.append(item)
print(len(outputs))
print(cnt)
print(missing_predictions)
print(before_test_num / len(data) if data else 0)
print(avg_test_case_num / len(outputs) if outputs else 0)
print(pass_cnt)
json.dump(outputs, open(args.output_file, "w"), indent=2)
if __name__ == "__main__":
main()
@@ -0,0 +1,179 @@
import json
import json
import os
import sys
from argparse import ArgumentParser
from collections import Counter
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
from scripts.apps.utils_execute import check_correctness
def _worker(item):
if not item["pred"]:
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
return item
codes = item["pred"]
if isinstance(codes, str):
codes = [codes]
if any(x and y in x for x in item['pred'] for y in ["os.makedirs", "views.contact", "extract_metadata.py"]):
print(f"======================================================== item {item['problem_id']} ====================================================")
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
return item
results = []
full_results = []
for gen_solution in codes:
if not gen_solution:
results.append(False)
full_results.append([False] * 3)
continue
try:
res = check_correctness(item["input_output"], gen_solution, timeout=10, debug=False, return_output=False)
except Exception as e:
print(f"======================================================== item {item['problem_id']} ====================================================")
print(e)
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
return item
for tmp in res:
if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)):
print(tmp, tmp.__class__.__name__)
new_res = []
# res = [bool(tmp) if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)) else tmp for tmp in res]
for tmp in res:
try:
if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)):
new_res.append(bool(tmp))
else:
new_res.append(tmp)
except Exception as e:
print(e)
new_res.append(False)
res = new_res
if all(item is True for item in res) is True:
results.append(True)
else:
results.append(False)
full_results.append(res)
item["res"] = results
item["full_res"] = full_results
return item
def main():
"""
This file require the input file is in json format and has `pred` field to annotate the corresponding program solution.
:return:
"""
parser = ArgumentParser()
parser.add_argument("--completion_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=4)
parser.add_argument("--pseudo_test_cases", type=str)
args = parser.parse_args()
print("CPU Cores:", os.cpu_count())
if os.path.exists(args.completion_file):
if args.completion_file.endswith(".json"):
data = json.load(open(args.completion_file))
else:
data = [json.loads(line) for line in open(args.completion_file).readlines()]
else:
data = []
for file in glob(args.completion_file):
print(file)
if file.endswith(".json"):
data += json.load(open(file))
else:
data += [json.loads(line) for line in open(file).readlines()]
print(len(data))
depreciated_ids = {"oss-instruct-9410"}
pseudo_test_cases = json.load(open(args.pseudo_test_cases))
pseudo_test_cases = {item["problem_id"]: item for item in pseudo_test_cases}
new_data = []
for item in data:
problem_id, resp_id, prefix_id = item["prefix_id"].split("_")
# problem_id = int(problem_id)
item["problem_id"] = problem_id
if problem_id in pseudo_test_cases:
item["input_output"] = pseudo_test_cases[problem_id]["input_output"]
new_data.append(item)
data = new_data
print(f"Total number of items: {len(data)}")
data = [item for item in data if item["problem_id"] not in depreciated_ids]
missing = 0
corr = 0
corr_at_k = 0
pbar = tqdm(data)
cnt = Counter()
outputs = []
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
for _input in pbar:
future = executor.submit(_worker, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
outputs.append(future.result())
for item in outputs:
if "res" in item:
if item["res"][0] is True:
corr += 1
if any(item["res"]):
corr_at_k += 1
cnt.update(item["res"])
else:
missing += 1
print(f"Missing: {missing / len(outputs)}")
print(f"Correct: {corr / len(outputs)}")
print(f"Correct at k: {corr_at_k / len(outputs)}")
print(cnt)
json.dump(outputs, open(args.output_file, "w"), ensure_ascii=False, indent=2)
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.163-of-256.v2.0.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.163-of-256.pseudo_test_case.exec.json \
--num_workers 24 \
--pseudo_test_cases ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
"""
@@ -0,0 +1,154 @@
import json
import json
import os
import sys
from argparse import ArgumentParser
from collections import Counter
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
from scripts.apps.utils_execute import check_correctness
def _worker(item):
if not item["pred"]:
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
return item
codes = item["pred"]
if isinstance(codes, str):
codes = [codes]
results = []
full_results = []
for gen_solution in codes:
if not gen_solution:
results.append(False)
full_results.append([False] * 3)
continue
res = check_correctness(item["pseudo_input_output"], gen_solution, timeout=10, debug=False, return_output=False)
for tmp in res:
if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)):
print(tmp, tmp.__class__.__name__)
res = [bool(tmp) if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)) else tmp for tmp in res]
if all(item is True for item in res) is True:
results.append(True)
else:
results.append(False)
full_results.append(res)
item["res"] = results
item["full_res"] = full_results
return item
def main():
"""
This file require the input file is in json format and has `pred` field to annotate the corresponding program solution.
:return:
"""
parser = ArgumentParser()
parser.add_argument("--completion_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=4)
parser.add_argument("--pseudo_test_cases", type=str)
args = parser.parse_args()
print("CPU Cores:", os.cpu_count())
if os.path.exists(args.completion_file):
if args.completion_file.endswith(".json"):
data = json.load(open(args.completion_file))
else:
data = [json.loads(line) for line in open(args.completion_file).readlines()]
else:
data = []
for file in glob(args.completion_file):
print(file)
if file.endswith(".json"):
data += json.load(open(file))
else:
data += [json.loads(line) for line in open(file).readlines()]
print(len(data))
pseudo_test_cases = json.load(open(args.pseudo_test_cases))
pseudo_test_cases = {item["id"]: item for item in pseudo_test_cases}
new_data = []
for item in data:
problem_id, resp_id, prefix_id = item["prefix_id"].split("_")
problem_id = int(problem_id)
item["problem_id"] = problem_id
if problem_id in pseudo_test_cases:
item["pseudo_input_output"] = pseudo_test_cases[problem_id]["pseudo_test_cases"]
new_data.append(item)
data = new_data
print(f"Total number of items: {len(data)}")
missing = 0
corr = 0
corr_at_k = 0
pbar = tqdm(data)
cnt = Counter()
outputs = []
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
for _input in pbar:
future = executor.submit(_worker, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
outputs.append(future.result())
for item in outputs:
if "res" in item:
if item["res"][0] is True:
corr += 1
if any(item["res"]):
corr_at_k += 1
cnt.update(item["res"])
else:
missing += 1
print(f"Missing: {missing / len(outputs)}")
print(f"Correct: {corr / len(outputs)}")
print(f"Correct at k: {corr_at_k / len(outputs)}")
print(cnt)
json.dump(outputs, open(args.output_file, "w"), ensure_ascii=False, indent=2)
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.163-of-256.v2.0.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.163-of-256.pseudo_test_case.exec.json \
--num_workers 24 \
--pseudo_test_cases ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
Missing: 0.0
Correct: 0.467940813810111
Correct at k: 0.6097410604192355
Counter({False: 4524, True: 3586})
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.{split_id}-of-256.v2.0.json \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.{split_id}-of-256.pseudo_test_case.exec.json \
--num_workers 64 \
--pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
"""
@@ -0,0 +1,34 @@
#python scripts/apps/solution_run_outputs_local.py --completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/train.0shot.tem1.0.n10.?-of-8.v2.0.json" --output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/train.0shot.tem1.0.n10.v2.0.run_outputs.json --num_workers 24 --id_field "problem_id" --test_case_field "input_output"
python scripts/apps/solution_run_outputs_local.py --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.{split_id}-of-32.v2.0.json" --output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.{split_id}-of-32.run_outputs.json --num_workers 64 --id_field "problem_id" --test_case_field "input_output"
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.*-of-32.run_outputs.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
# Iter - 1: PRM
# Sample prefix
python scripts/apps/prm/sample_steps.py \
--input_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.*-of-32.v2.0.json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.prefix.upper0.8.r0.3.v2.0.json
python scripts/apps/prm/sample_steps.py \
--input_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.*-of-32.v2.0.json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 --sample_over_p 20 \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample20_per.json
# Execute the prefix completions
python scripts/apps/pseudo_test_cases/oss_combine_prefix_fail_extract_pseudo_label.py \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/train.tem1.0.n10.prefix.upper0.8.r0.3.sample20_per.completion.tem1.0.n3.*-of-256.v2.0.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/train.tem1.0.n10.prefix.upper0.8.r0.3.sample20_per.completion.tem1.0.n3.pseudo_input_output.exec.json \
--num_workers 24 \
--pseudo_test_cases ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/split-32/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json
# Construct preference pairs
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "$OUTPUT_PATH_PREFIX/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/train.tem1.0.n10.prefix.upper0.8.r0.3.sample20_per.completion.tem1.0.n3.pseudo_input_output.exec.*-of-256.json" \
--output_file $OUTPUT_PATH_PREFIX/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.process-dpo.V100.tp8dp16.v4.9.s42/oss-instruct-apps-train/checkpoint-700/train.tem1.0.n10.prefix.upper0.8.r0.3.sample20_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.fix.json \
--pass_case_lower_bound 0.5 --pass_case_margin 4 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
@@ -0,0 +1,27 @@
import json
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--prompt_file", type=str, default="prompts/apps/magicoder_cls_2shot.txt")
args = parser.parse_args()
data = [json.loads(line) for line in open(args.input_file, encoding='utf-8')]
prompt_template = open(args.prompt_file, 'r').read()
for i, item in enumerate(data):
prompt = prompt_template.replace("[[Question]]", item["instruction"])
prompt = prompt.replace("[[Solution]]", item["response"])
data[i]["prompt"] = prompt
data[i]["id"] = i
with open(args.output_file, 'w', encoding='utf-8') as f:
for item in data:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
if __name__ == "__main__":
main()
@@ -0,0 +1,27 @@
import json
import argparse
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--prompt_file", type=str, default="prompts/apps/magicoder_cls_2shot.txt")
args = parser.parse_args()
data = json.load(open(args.input_file, encoding="utf-8"))
prompt_template = open(args.prompt_file, 'r').read()
for i, item in enumerate(data):
prompt = prompt_template.replace("[[Question]]", item["problem"])
prompt = prompt.replace("[[Solution]]", item["solution"])
data[i]["prompt"] = prompt
data[i]["id"] = i
with open(args.output_file, 'w', encoding='utf-8') as f:
for item in data:
f.write(json.dumps(item, ensure_ascii=False) + '\n')
if __name__ == "__main__":
main()
@@ -0,0 +1,159 @@
import json
import os
import sys
from argparse import ArgumentParser
from collections import Counter
from concurrent.futures import ThreadPoolExecutor, as_completed
from glob import glob
from tqdm import tqdm
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
print(sys.path)
from apps.utils_execute import check_correctness
def _worker(item):
if not item["pred"]:
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
return item
codes = item["pred"]
if isinstance(codes, str):
codes = [codes]
results = []
full_results = []
for gen_solution in codes:
if not gen_solution:
results.append(False)
full_results.append([False] * 3)
continue
res = check_correctness(item["pseudo_input_output"], gen_solution, timeout=10, debug=False, return_output=False)
for tmp in res:
if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)):
print(tmp, tmp.__class__.__name__)
res = [bool(tmp) if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)) else tmp for tmp in res]
if all(item is True for item in res) is True:
results.append(True)
else:
results.append(False)
full_results.append(res)
item["res"] = results
item["full_res"] = full_results
return item
def main():
"""
This file require the input file is in json format and has `pred` field to annotate the corresponding program solution.
:return:
"""
parser = ArgumentParser()
parser.add_argument("--completion_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=4)
parser.add_argument("--pseudo_test_cases", type=str)
parser.add_argument("--test_case_field", type=str, default="pseudo_test_cases")
parser.add_argument("--id_field", type=str, default="id")
args = parser.parse_args()
print("CPU Cores:", os.cpu_count())
if os.path.exists(args.completion_file):
if args.completion_file.endswith(".json"):
data = json.load(open(args.completion_file))
else:
data = [json.loads(line) for line in open(args.completion_file).readlines()]
else:
data = []
for file in glob(args.completion_file):
print(file)
if file.endswith(".json"):
data += json.load(open(file))
else:
data += [json.loads(line) for line in open(file).readlines()]
print(len(data))
pseudo_test_cases = json.load(open(args.pseudo_test_cases))
pseudo_test_cases = {item[args.id_field]: item for item in pseudo_test_cases}
new_data = []
for item in data:
problem_id, resp_id, prefix_id = item["prefix_id"].split("_")
problem_id = int(problem_id)
item["problem_id"] = problem_id
if problem_id in pseudo_test_cases:
item["pseudo_input_output"] = pseudo_test_cases[problem_id][args.test_case_field]
new_data.append(item)
data = new_data
print(f"Total number of items: {len(data)}")
missing = 0
corr = 0
corr_at_k = 0
pbar = tqdm(data)
cnt = Counter()
outputs = []
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
for _input in pbar:
future = executor.submit(_worker, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
outputs.append(future.result())
for item in outputs:
if "res" in item:
if item["res"][0] is True:
corr += 1
if any(item["res"]):
corr_at_k += 1
cnt.update(item["res"])
else:
missing += 1
print(f"Missing: {missing / len(outputs)}")
print(f"Correct: {corr / len(outputs)}")
print(f"Correct at k: {corr_at_k / len(outputs)}")
print(cnt)
json.dump(outputs, open(args.output_file, "w"), ensure_ascii=False, indent=2)
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.163-of-256.v2.0.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.163-of-256.pseudo_test_case.exec.json \
--num_workers 24 \
--pseudo_test_cases ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
Missing: 0.0
Correct: 0.467940813810111
Correct at k: 0.6097410604192355
Counter({False: 4524, True: 3586})
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.{split_id}-of-256.v2.0.json \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.{split_id}-of-256.pseudo_test_case.exec.json \
--num_workers 64 \
--pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
"""
@@ -0,0 +1,174 @@
import json
import os
import sys
from argparse import ArgumentParser
from collections import Counter
from concurrent.futures import ThreadPoolExecutor, as_completed
import random
from glob import glob
from tqdm import tqdm
sys.set_int_max_str_digits(0)
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
from scripts.apps.utils_execute import check_correctness
"""
This script is used to control the amount of pseudo test cases are not more than the amount of ground truth test cases.
"""
def _worker(item):
if not item["pred"]:
if "res" in item:
item.pop("res")
if "full_res" in item:
item.pop("full_res")
return item
codes = item["pred"]
if isinstance(codes, str):
codes = [codes]
results = []
full_results = []
for gen_solution in codes:
if not gen_solution:
results.append(False)
full_results.append([False] * 3)
continue
res = check_correctness(item["pseudo_input_output"], gen_solution, timeout=10, debug=False, return_output=False)
for tmp in res:
if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)):
print(tmp, tmp.__class__.__name__)
res = [bool(tmp) if (not isinstance(tmp, bool)) and (not isinstance(tmp, int)) else tmp for tmp in res]
if all(item is True for item in res) is True:
results.append(True)
else:
results.append(False)
full_results.append(res)
item["res"] = results
item["full_res"] = full_results
return item
def main():
"""
This file require the input file is in json format and has `pred` field to annotate the corresponding program solution.
:return:
"""
parser = ArgumentParser()
parser.add_argument("--completion_file", type=str)
parser.add_argument("--output_file", type=str)
parser.add_argument("--num_workers", type=int, default=4)
parser.add_argument("--pseudo_test_cases", type=str)
parser.add_argument("--gd_test_case_field", type=str, default="test_cases")
args = parser.parse_args()
print("CPU Cores:", os.cpu_count())
if os.path.exists(args.completion_file):
if args.completion_file.endswith(".json"):
data = json.load(open(args.completion_file))
else:
data = [json.loads(line) for line in open(args.completion_file).readlines()]
else:
data = []
for file in glob(args.completion_file):
print(file)
if file.endswith(".json"):
data += json.load(open(file))
else:
data += [json.loads(line) for line in open(file).readlines()]
print(len(data))
pseudo_test_cases = json.load(open(args.pseudo_test_cases))
pseudo_test_cases = {item["id"]: item for item in pseudo_test_cases}
new_data = []
num_test_cases = 0
for item in data:
problem_id, resp_id, prefix_id = item["prefix_id"].split("_")
problem_id = int(problem_id)
item["problem_id"] = problem_id
if problem_id in pseudo_test_cases:
ps_test_cases = pseudo_test_cases[problem_id]["pseudo_test_cases"]
if not item[args.gd_test_case_field]:
continue
if len(ps_test_cases["inputs"]) > len(item[args.gd_test_case_field]["inputs"]):
idx = list(range(len(ps_test_cases["inputs"])))
random.shuffle(idx)
num_test_cases = len(item[args.gd_test_case_field]["inputs"])
ps_test_cases["inputs"] = [ps_test_cases["inputs"][i] for i in idx[:num_test_cases]]
ps_test_cases["outputs"] = [ps_test_cases["outputs"][i] for i in idx[:num_test_cases]]
item["pseudo_input_output"] = ps_test_cases
num_test_cases += len(item[args.gd_test_case_field]["inputs"])
new_data.append(item)
data = new_data
print(f"Total number of items: {len(data)}")
if len(data) == 0:
print("No data to process.")
return
print(f"Average number of test cases: {num_test_cases / len(data)}")
missing = 0
corr = 0
corr_at_k = 0
pbar = tqdm(data)
cnt = Counter()
outputs = []
with ThreadPoolExecutor(max_workers=args.num_workers) as executor:
futures = []
for _input in pbar:
future = executor.submit(_worker, _input)
futures.append(future)
pbar.update()
for future in tqdm(as_completed(futures), total=len(futures), desc="Collecting results"):
outputs.append(future.result())
for item in outputs:
if "res" in item:
if item["res"][0] is True:
corr += 1
if any(item["res"]):
corr_at_k += 1
cnt.update(item["res"])
else:
missing += 1
print(f"Missing: {missing / len(outputs)}")
print(f"Correct: {corr / len(outputs)}")
print(f"Correct at k: {corr_at_k / len(outputs)}")
print(cnt)
json.dump(outputs, open(args.output_file, "w"), ensure_ascii=False, indent=2)
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file "../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.163-of-256.v2.0.json" \
--output_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.163-of-256.pseudo_test_case.exec.json \
--num_workers 24 \
--pseudo_test_cases ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
Missing: 0.0
Correct: 0.467940813810111
Correct at k: 0.6097410604192355
Counter({False: 4524, True: 3586})
>>> python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
--completion_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.{split_id}-of-256.v2.0.json \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.{split_id}-of-256.pseudo_test_case.exec.json \
--num_workers 64 \
--pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.json
"""
@@ -0,0 +1,44 @@
export OUTPUT_PREFIX_PATH=/mnt/fangkai_blob/reward_modeling/
split_id=$1
echo "Constructing process_rm sample for split $split_id"
#export exp_dir=deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-apps-xcode-combine-4o-ps-tests/checkpoint-100/
#python scripts/apps/solution_run_outputs_local.py \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/${exp_dir}/train.0shot.tem1.0.n10.${split_id}-of-32.v2.1.s42.json" \
# --output_file "${OUTPUT_PREFIX_PATH}/experiments/${exp_dir}/train.0shot.tem1.0.n10.v2.1.${split_id}-of-32.s42.run_outputs.json" \
# --num_workers 64 --id_field id --test_case_field input_output
# Run 4o-based prm executing
#python scripts/apps/pseudo_test_cases/prefix_fail_extract_pseudo_label.py \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n5.${split_id}-of-256.v2.0.json" \
# --output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.tem1.0.n10.prefix.upper0.8.r0.3.completion.tem1.0.n5.v2.0.${split_id}-of-256.4o_pseudo_test_case.exec.json" \
# --num_workers 128 \
# --pseudo_test_case /mnt/fangkai_blob/share/gpt-chat-examples-outputs/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json \
# --test_case_field input_output --id_field problem_id
# 4o-DPO-Iter-0 run outputs
#python scripts/apps/solution_run_outputs_local.py \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.${split_id}-of-32.v2.1.json" \
# --output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.${split_id}-of-32.v2.1.run_outputs.json" \
# --num_workers 64 --id_field "problem_id" --test_case_field "input_output"
# 4o-DPO-Iter-0 run solutions on previous 4o-synthesized test cases (APPs only)
#python scripts/apps/solution_fail_extract_pseudo_label.py \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.*-of-32.v2.1.json" \
# --output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_4o_ps_test_case.dpo.H100.dp8.v1.0.s42/oss-instruct-apps-train/checkpoint-100/train.0shot.tem1.0.n10.v2.1.4o_pseudo_test_cases.exec.v1.0.json \
# --pseudo_test_case /mnt/fangkai_blob/share/gpt-chat-examples-outputs/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json --num_workers 128
# 4o-DPO-iter-1 run outputs
#python scripts/apps/solution_run_outputs_local.py \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.${split_id}-of-32.v2.1.s42.json" \
# --output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.${split_id}-of-32.v2.1.s42.run_outputs.json" \
# --num_workers 64 --id_field "problem_id" --test_case_field "input_output"
# 4o-DPO-Iter-1 run solutions on previous 4o-synthesized test cases (APPs only)
python scripts/apps/solution_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.apps_only.${split_id}-of-9.v2.1.s42.json" \
--output_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps-4o.mc-self.iter1.dpo.H100.dp32.v1.0.s42/oss-apps-xcode-combine/checkpoint-300/train.0shot.tem1.0.n10.apps_only.v2.1.${split_id}-of-9.s42.4o_pseudo_test_cases.exec.v1.0.json" \
--pseudo_test_case /mnt/fangkai_blob/share/gpt-chat-examples-outputs/apps-train-sub-train-eval-outputs-v2.1-gpt4o-tem0.0-seq4k-pipe-format.pseudo_test_cases.json --num_workers 128
@@ -0,0 +1,264 @@
export OUTPUT_PREFIX_PATH=../msranlpintern/reward_modeling/
python scripts/apps/pseudo_test_cases/clean_xcode_4o_test_inputs_data.py \
--data_file ../msranlpintern/share/xCodeEval/problem_descriptions.jsonl \
--test_case_file ../gpt_crawler/outputs/xcode_test_case_inputs_gen_v2.1.4o.tem0.0.n1.json_obj.jsonl \
--output_file ../msranlpintern/share/xCodeEval/xcode_train_4o_test_inputs_v1.json \
--test_file "../msranlpintern/share/xCodeEval/**/test/*.jsonl" \
--val_file "../msranlpintern/share/xCodeEval/**/validation/*.jsonl"
#Test cases: 7588 / 7635
#6163
#No test: 1372
# Run outputs on newly generated data
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/xcode-train/checkpoint-800/train.0shot.tem1.0.n10.*-of-16.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/xcode-train/checkpoint-800/train.0shot.tem1.0.n10.*-of-16.v2.0.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
# Combine outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/xcode-train/checkpoint-800/train.0shot.tem1.0.n10.*-of-16.v2.0.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/xcode-train/checkpoint-800/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
#5844
#79260
#0
#10.0
#9.7298083504449
#Counter({0: 15165, 10: 14577, 1: 5613, 9: 3884, 2: 3674, 8: 3100, 3: 2896, 4: 2561, 7: 2376, 5: 2350, 6: 2244})
# Run outputs on newly generated oss-apps-combine data
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-instruct-apps-train/checkpoint-800/train.0shot.tem1.0.n10.{split_id}-of-32.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-instruct-apps-train/checkpoint-800/train.0shot.tem1.0.n10.{split_id}-of-32.v2.0.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
# Combine oss outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-instruct-apps-train/checkpoint-800/train.0shot.tem1.0.n10.*-of-32.v2.0.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-instruct-apps-train/checkpoint-800/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
#14107
#106950
#1
#10.004038772213248
#9.794782731977033
#Counter({10: 96073, 0: 20843, 9: 4661, 1: 3399, 8: 3067, 5: 2755, 2: 2179, 7: 2116, 6: 2004, 3: 1940, 4: 1870, 11: 142, 20: 21})
# Sample steps for xcode
python scripts/apps/prm/sample_steps.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/xcode-train/checkpoint-800/train.0shot.tem1.0.n10.*-of-16.v2.0.json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 --sample_over_p 10 \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/xcode-train/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.json
# Total number of samples: 61630
# Sample steps for new oss-apps
python scripts/apps/prm/sample_steps.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-instruct-apps-train/checkpoint-800/train.0shot.tem1.0.n10.*-of-32.v2.0.json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 --sample_over_p 10 \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-instruct-apps-train/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.json
# Total number of samples: 247580
python scripts/apps/pseudo_test_cases/oss_combine_prefix_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.{split_id}-of-32.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.{split_id}-of-32.pseudo_input_output.exec.json \
--num_workers 128 --pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5_rm_large_meta.json
# Construct prm pairs
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.*-of-32.pseudo_input_output.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.fix.json \
--pass_case_lower_bound 0.5 --pass_case_margin 4 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.*-of-32.pseudo_input_output.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.fix.json \
--pass_case_lower_bound 0.6 --pass_case_margin 6 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
# Run outputs on apps-magicoder-xcode-combine newly generated data w/ n=64
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.*-of-16.v2.0.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
# Combine outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
# Just check the outputs on the previously generated data
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_takes_extra.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].run_outputs.json" \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.pseudo_input_output_by_n64.v1.0.dpo_m6_low0.5_min5.json \
--pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
#21790
#188616
#0
#10.003557222779161
#9.875906379072969
#Counter({10: 109418, 0: 55905, 1: 9618, 9: 8233, 2: 6063, 8: 5869, 5: 4976, 3: 4861, 4: 4392, 7: 4323, 6: 4073, 11: 146, 20: 23}) # TODO: Why there is 20 and 11????
#21790
#188616
#0
#10.003557222779161
#9.875906379072969
#Counter({10: 109418, 0: 55905, 1: 9618, 9: 8233, 2: 6063, 8: 5869, 5: 4976, 3: 4861, 4: 4392, 7: 4323, 6: 4073, 11: 146, 20: 23})
#python scripts/apps/pseudo_test_cases/oss_combine_prefix_fail_extract_pseudo_label.py \
# --completion_file "${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.{split_id}-of-32.v2.0.json" \
# --output_file ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.{split_id}-of-32.pseudo_input_output.exec.json \
# --num_workers 128 --pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.dpo.A100.tp4dp16.v1.2.s42/oss-apps-xcode-combine/checkpoint-800/train.0shot.tem1.0.n10.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5_rm_large_meta.json
#
# Starting from model w/ magicoder & apps - pdpo, repeat the process again.
# Run outputs on newly generated data
exp_dir=deepseek-coder-v1.5-ins.7b.r2c.sft_ps_test_case.iter2.pdpo.V100.tp8dp32.v1.3.s42/oss-apps-xcode-combine/checkpoint-300/
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.{split_id}-of-32.v2.0.s[0-8].json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.{split_id}-of-32.v2.0.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
# Sample steps for xcode
python scripts/apps/prm/sample_steps.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 --sample_over_p 10 \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample10_per.json
# Total number of samples: 61630
# Combine outputs with test case inputs to obtain self-consistency labels, and get dpo training pairs.
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.s[0-9].v2.0.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5.json \
--construct_prefer_pair --pass_case_margin 6 --pass_case_lower_bound 0.5 --min_success_test_num 5
#22303
#22303
#8588574
#0
#10.003557222779161
#9.884141146930906
#Counter({10: 767611, 0: 324963, 1: 57875, 9: 53845, 2: 37125, 8: 36508, 5: 31254, 3: 30650, 7: 28261, 4: 27218, 6: 26200, 11: 990, 20: 188})
# Run completion outputs
python scripts/apps/pseudo_test_cases/oss_combine_prefix_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.glo-{global_split_id}-of-8.loc-{split_id}-of-64.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.glo-{global_split_id}-of-8.loc-{split_id}-of-64.pseudo_input_output.exec.json \
--num_workers 128 --pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.dpo_m6_low0.5_min5sc_test_cases.json
# Construct prm pairs
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.glo-*-of-8.loc-*-of-64.pseudo_input_output.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.fix.json \
--pass_case_lower_bound 0.5 --pass_case_margin 4 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
#Missing: 890
#Missing test cases: 0
#Counter({0: 268084, 10: 15225, 1: 7396, 9: 2466, 2: 2270, 3: 1795, 8: 1696, 5: 1385, 4: 1371, 6: 1290, 7: 1207})
#Processed 101395 prefixes.
#Averaged 0.9912988219191475 prefixes per problem.
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n10.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.glo-*-of-8.loc-*-of-64.pseudo_input_output.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample10_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.fix.json \
--pass_case_lower_bound 0.3 --pass_case_margin 3 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
#Missing: 890
#Missing test cases: 0
#Counter({0: 268084, 10: 15225, 1: 7396, 9: 2466, 2: 2270, 3: 1795, 8: 1696, 5: 1385, 4: 1371, 6: 1290, 7: 1207})
#Processed 101395 prefixes.
#Averaged 0.9912988219191475 prefixes per problem.
#Processed 10172 problems.
exp_dir=deepseek-coder-v1.5-ins.7b.apps.r2c.sft_ps_test_case.iter1.pdpo.H100.dp8.v1.2.s42/oss-apps-xcode-combine/checkpoint-500/
python scripts/apps/prm/sample_steps.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 --sample_over_p 10 \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample10_per.json
#Too large outputs: 0
#Total number of samples: 309210
python scripts/apps/prm/sample_steps.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.v2.0.s[0-8].json" \
--upper_step_ratio 0.8 --sample_ratio 0.3 --sample_over_p 32 \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.json
#Too large outputs: 0
#Total number of samples: 989473
python scripts/apps/solution_run_outputs_local.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.{split_id}-of-32.v2.0.s{seed}.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.{split_id}-of-32.s{seed}.v2.0.run_outputs.json \
--num_workers 64 --id_field "problem_id" --test_case_field "input_output"
python scripts/apps/pseudo_test_cases/oss_combine_collect_pseudo_outputs_mp_compress.py \
--pseudo_test_case_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n8.*-of-32.s[0-9].v2.0.run_outputs.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.cp.dpo_m4_low0.3_min5_p$p.json \
--construct_prefer_pair --pass_case_margin 4 --pass_case_lower_bound 0.3 --min_success_test_num 5 --top_p $p
#p=0.0
#21662
#21662
#608162
#0
#10.003557222779161
#9.874849967685348
#Counter({10: 679443, 0: 368401, 1: 61978, 9: 52376, 2: 39749, 8: 36629, 3: 31688, 5: 31673, 4: 28822, 7: 28171, 6: 26357, 11: 909, 20: 170, 12: 2})
#p=0.2
#18373
#18373
#585808
#0
#10.003557222779161
#9.93577532248408
#Counter({10: 668678, 0: 205613, 9: 50259, 1: 46523, 8: 34864, 2: 33257, 5: 29338, 3: 28297, 7: 26725, 4: 26387, 6: 24873, 11: 886, 20: 170, 12: 2})
#p=0.4
#14583
#14583
#506479
#0
#10.003557222779161
#9.954878968662142
#Counter({10: 634922, 0: 95150, 9: 41702, 8: 28477, 1: 22680, 5: 20957, 7: 20445, 6: 18610, 2: 17527, 4: 16296, 3: 15538, 11: 838, 20: 170})
#=0.5
#12903
#12903
#452734
#0
#10.003557222779161
#9.960861815081763
#Counter({10: 609930, 0: 62866, 9: 36059, 8: 23682, 7: 16213, 5: 15332, 6: 14783, 1: 14003, 2: 11235, 4: 10667, 3: 10087, 11: 791, 20: 144})
# Run completion outputs
python scripts/apps/pseudo_test_cases/oss_combine_prefix_fail_extract_pseudo_label.py \
--completion_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.completion.tem1.0.n3.glo-{global_split_id}-of-16.loc-{split_id}-of-64.v2.0.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.completion.tem1.0.n3.glo-{global_split_id}-of-16.loc-{split_id}-of-64.v2.0.pseudo_input_output.exec.json \
--num_workers 128 --pseudo_test_cases ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.pseudo_input_output.v1.0.cp.dpo_m4_low0.3_min5_p0.0.sc_test_cases.json
# p=0.0
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.completion.tem1.0.n3.glo-*-of-16.loc-*-of-64.v2.0.pseudo_input_output.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.fix.json \
--pass_case_lower_bound 0.5 --pass_case_margin 4 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
#Missing: 4235
#Missing test cases: 0
#Counter({0: 1492601, 10: 211726, 1: 90982, 2: 45672, 9: 42604, 3: 34232, 8: 32685, 4: 29914, 5: 27977, 7: 26170, 6: 25720})
#Processed 686761 prefixes.
#Averaged 0.9938711656796856 prefixes per problem.
#Processed 21533 problems.
# p=0.2
python scripts/apps/prm/construct_process_rm_sample_fix.py \
--input_file "${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.completion.tem1.0.n3.glo-*-of-16.loc-*-of-64.v2.0.pseudo_input_output.p0.2.exec.json" \
--output_file ${OUTPUT_PREFIX_PATH}/experiments/$exp_dir/train.0shot.tem1.0.n64.v2.0.prefix.upper0.8.r0.3.sample32_per.completion.tem1.0.n3.pseudo_input_output.prefix_pass_num.p0.2.fix.json \
--pass_case_lower_bound 0.5 --pass_case_margin 4 --test_case_field pseudo_input_output --reduction avg --test_case_field input_output
#Missing: 2073
#Missing test cases: 0
#Counter({0: 952288, 10: 159840, 1: 54560, 9: 29678, 2: 27823, 8: 23059, 3: 21733, 4: 20014, 5: 18776, 7: 17984, 6: 17690})
#Processed 447815 prefixes.
#Averaged 0.995392186499751 prefixes per problem.
#Processed 14028 problems.
@@ -0,0 +1,64 @@
import json
import argparse
x_code_eval_template = """{description}
Input: {input_from}
Output: {output_to}
Time limit: {time_limit}
Memory limit: {memory_limit}
-----Input-----
{input_spec}
-----Output-----
{output_spec}
-----Notes-----
{notes}
-----Example-----
{input_output}
"""
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--input_file")
parser.add_argument("--output_file")
parser.add_argument("--prompt_file", type=str, default="prompts/apps/test_input_gen_2shot_v2.1.txt")
args = parser.parse_args()
in_out_template = "Input\n```{}```\n\nOutput\n```{}```"
prompt_tem = open(args.prompt_file).read()
data = [json.loads(line) for line in open(args.input_file).readlines()]
outputs = []
for item in data:
input_output = []
for _in, _out in zip(item["sample_inputs"], item["sample_outputs"]):
input_output.append(in_out_template.format(_in, _out))
item["input_output"] = "\n\n".join(input_output)
question = x_code_eval_template.format(**item)
prompt = prompt_tem.replace("[[Question]]", question)
item["prompt"] = prompt
outputs.append(item)
with open(args.output_file, "w") as f:
for item in outputs:
f.write(json.dumps(item) + "\n")
print(len(outputs))
if __name__ == '__main__':
main()