hiyouga/EasyR1

SFT+GRPO推理性能与训练过程中val精度不一致

Open

#327 opened on Jun 4, 2025

 (11 comments) (0 reactions) (0 assignees)Python (384 forks)github user discovery
help wanted

Repository metrics

Stars
 (5,117 stars)
PR merge metrics
 (Avg merge 12h 49m) (2 merged PRs in 30d)

Description

使用纯GRPO进行训练,val中的acc和模型merge以后推理acc基本相同。 使用SFT后的ckp再进行GRPO,val中的acc很高,但训练后merge再推理,发现有严重的复读现象,且acc相差很大。

推理代码如下:

from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor from qwen_vl_utils import process_vision_info import re import pandas as pd import base64 from tqdm import tqdm

df = pd.read_parquet('val.parquet') model_dir="SFT_GRPO/global90" model = Qwen2_5_VLForConditionalGeneration.from_pretrained( model_dir, torch_dtype="auto", device_map="auto") processor = AutoProcessor.from_pretrained(model_dir) results = [] for inx in tqdm(range(len(df))): img_bytes = (df.iloc[inx].images)[0]['bytes'] img_base64 = base64.b64encode(img_bytes).decode('utf-8') data_url = f"data:image/png;base64,{img_base64}" messages = [
{ "role": "system", "content": "You are a helpful assistant." }, { "role": "user", "content": [ { "type": "image", "image": data_url, }, {"type": "text", "text": "my prompt"}, ], } ]

text = processor.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True ) image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(
text=[text], images=image_inputs, videos=video_inputs, padding=True, return_tensors="pt", ) inputs = inputs.to("cuda")
generated_ids = model.generate(**inputs, max_new_tokens=1024) generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids) ] output_text = processor.batch_decode( generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False ) match = re.search(r'\boxed{([^}]+)}', output_text[0]) pred = match.group(1) if match else "ERROR" actual = df.iloc[inx].answer results.append(f"Predicted: {pred}, Actual: {actual}\n") print((f"index: {inx} Predicted: {pred}, Actual: {actual}\n"), flush=True)

Contributor guide