Files
2026-07-13 13:24:13 +08:00

153 lines
4.9 KiB
Python

import json
import argparse
import os
from glob import glob
import sys
import random
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
sys.set_int_max_str_digits(0)
from post_processors.code.clean import get as get_code_cleaner
def sample_step(response: str, code: str, upper_step_ratio: float, sample_ratio: float):
if code:
assert code in response, (code, "\n\n========================\n\n", response)
end_of_response = response.find(code) + len(code)
response = response[:end_of_response]
orig_lines = response.split("\n")
lines = [(i, line) for i, line in enumerate(orig_lines)]
lines = [(i, line) for i, line in lines if line.strip()]
if len(lines) < 5:
return []
upper_step = int(len(lines) * upper_step_ratio)
if upper_step == 0:
return []
sample_step_num = int(upper_step * sample_ratio)
if sample_step_num == 0:
return []
sample_steps = random.sample(lines[:upper_step], sample_step_num)
if len(sample_steps) == 0:
return []
step_prefixes = []
for i, line in sample_steps:
step_prefixes.append("\n".join(orig_lines[:(i + 1)]))
return step_prefixes
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 item["id"] not in id2data:
id2data[item["id"]] = item
continue
tmp = id2data[item["id"]]
tmp["response"] = merge_key(tmp["response"], item["response"])
tmp["pred"] = merge_key(tmp["pred"], item["pred"])
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 = argparse.ArgumentParser()
parser.add_argument("--input_file", type=str, )
parser.add_argument("--output_file", type=str, )
parser.add_argument("--upper_step_ratio", type=float)
parser.add_argument("--sample_ratio", type=float)
parser.add_argument("--filter_all_correct", action="store_true")
parser.add_argument("--sample_over_p", type=int, default=-1)
args = parser.parse_args()
data = load_files(args.input_file)
data = merge_seed_sampled_data(data)
outputs = []
num = 0
for item in data:
if args.filter_all_correct and all(item["res"]):
continue
prefixes = []
prefix_ids = []
if not item["response"]:
item["prefix"] = []
continue
for resp_id, resp in enumerate(item["response"]):
response_prefixes = sample_step(resp, item["pred"][resp_id], args.upper_step_ratio, args.sample_ratio)
prefixes.extend(response_prefixes)
prefix_ids.extend([f"{item['id']}_{resp_id}_{i}" for i in range(len(response_prefixes))])
if args.sample_over_p > 0:
if len(prefixes) > args.sample_over_p:
prefixes = random.sample(prefixes, args.sample_over_p)
prefix_ids = random.sample(prefix_ids, args.sample_over_p)
item["prefix"] = prefixes
item["prefix_id"] = prefix_ids
outputs.append(item)
num += len(prefixes)
json.dump(outputs, open(args.output_file, "w", encoding="utf-8"), indent=2, ensure_ascii=False)
print(f"Total number of samples: {num}")
if __name__ == '__main__':
main()
"""
>>> python scripts/apps/prm/sample_steps.py \
--input_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.?-of-4.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.gpt4o.distil.V100.w8.v3.1.dp4.tp4.s42/apps/checkpoint-200/train.0shot.tem1.0.n10.prefix.upper0.8.r0.3.json
Total number of samples: 470010
"""