hiyouga/EasyR1

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

Aberta

#327 aberto em 4 de jun. de 2025

 (11 comentários) (0 reação) (0 responsável)Python (386 forks)github user discovery
help wanted

Métricas do repositório

Stars
 (5.126 estrelas)
Métricas de merge de PR
 (Mesclagem média 12h 49m) (2 fundiu PRs em 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)

Guia do colaborador