chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
import json
|
||||
import argparse
|
||||
import sys
|
||||
import collections
|
||||
import glob
|
||||
import os
|
||||
|
||||
sys.set_int_max_str_digits(0)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument("--completion_file", type=str, required=True)
|
||||
parser.add_argument("--reward_file", type=str, required=True)
|
||||
parser.add_argument("--lower_bound", type=float, default=0.0)
|
||||
parser.add_argument("--margin", type=float, default=1.0)
|
||||
args = parser.parse_args()
|
||||
|
||||
solutions = json.load(open(args.completion_file))
|
||||
if "difficulty" in solutions[0]:
|
||||
all_diff = collections.Counter([item["difficulty"] for item in solutions])
|
||||
all_diff_success = {k: 0 for k in all_diff}
|
||||
else:
|
||||
all_diff = None
|
||||
all_diff_success = None
|
||||
|
||||
if os.path.exists(args.reward_file):
|
||||
rewards = json.load(open(args.reward_file))
|
||||
else:
|
||||
rewards = []
|
||||
for file in glob.glob(args.reward_file):
|
||||
rewards += json.load(open(file))
|
||||
|
||||
id2reward = collections.defaultdict(dict)
|
||||
for item in rewards:
|
||||
index = item["index"]
|
||||
orig_id, pred_id = list(map(int, index.split("_")))
|
||||
if isinstance(item["reward"], list):
|
||||
id2reward[orig_id][pred_id] = item["reward"][0]
|
||||
else:
|
||||
id2reward[orig_id][pred_id] = item["reward"]
|
||||
|
||||
outputs = []
|
||||
success = 0
|
||||
num_pairs = 0
|
||||
for item in solutions:
|
||||
problem_id = item["id"]
|
||||
|
||||
if not item["response"]:
|
||||
continue
|
||||
if not item["pred"]:
|
||||
continue
|
||||
|
||||
assert isinstance(item["response"], list)
|
||||
assert isinstance(item["pred"], list)
|
||||
assert len(item["response"]) == len(item["pred"])
|
||||
|
||||
tuples = []
|
||||
for j, (resp, pred) in enumerate(zip(item["response"], item["pred"])):
|
||||
if pred:
|
||||
tuples.append((j, resp, pred, id2reward[problem_id][j]))
|
||||
|
||||
if not tuples:
|
||||
continue
|
||||
|
||||
tuples = sorted(tuples, key=lambda x: x[3], reverse=True)
|
||||
# Construct preference pairs: collect pairs with margin greater than args.margin
|
||||
pos = []
|
||||
neg = []
|
||||
for i in range(len(tuples)):
|
||||
if tuples[i][3] < args.lower_bound:
|
||||
break
|
||||
for j in range(i + 1, len(tuples)):
|
||||
if tuples[i][3] - tuples[j][3] < args.margin:
|
||||
continue
|
||||
pos.append(tuples[i][1])
|
||||
neg.append(tuples[j][1])
|
||||
outputs.append({
|
||||
"id": problem_id,
|
||||
"pos": pos,
|
||||
"neg": neg
|
||||
})
|
||||
num_pairs += len(pos)
|
||||
|
||||
_pred_id = tuples[0][0]
|
||||
if item["res"] and item["res"][_pred_id]:
|
||||
success += 1
|
||||
if all_diff is not None:
|
||||
all_diff_success[item["difficulty"]] += 1
|
||||
|
||||
print(f"Success rate: {success / len(solutions)}")
|
||||
if all_diff is not None:
|
||||
for k, v in all_diff.items():
|
||||
print(f"Difficulty {k}: {all_diff_success[k] / v}")
|
||||
|
||||
json.dump(outputs, open(args.completion_file.replace(".json", f".lower-{args.lower_bound}.mar-{args.margin}.json"), "w"), ensure_ascii=False, indent=2)
|
||||
print(f"Number of pairs: {num_pairs}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
||||
"""
|
||||
>>> python scripts/apps/construct_prefer_pair_rm.py --completion_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.r2c.gpt4o.distil.A100.w8.v3.0.s42/apps/checkpoint-400/train.0shot.tem1.0.n10.v1.1.json --reward_file ../msranlpintern/reward_modeling/experiments/deepseek-coder-v1.5-ins.7b.apps.pair-rm.gpt4o-worsen.A100.w8.v1.2.s42/r2c.sft.step-400.train.n10/test-checkpoint-50/eval_predictions_rank0.json --lower_bound 0.0 --margin 1.0
|
||||
|
||||
Success rate: 0.3566
|
||||
Number of pairs: 29584
|
||||
"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user