hiyouga/EasyR1

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

Aperta

#327 aperta il 4 giu 2025

 (11 commenti) (0 reazioni) (0 assegnatari)Python (385 fork)github user discovery
help wanted

Metriche repository

Star
 (5124 stelle)
Metriche merge PR
 (Merge medio 12h 49m) (2 PR mergiate in 30 g)

Descrizione

使用纯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)

Guida contributor