hiyouga / LLaMA-Factory

Efficiently Fine-Tune 100+ LLMs in WebUI (ACL 2024)
https://arxiv.org/abs/2403.13372
Apache License 2.0
31.15k stars 3.84k forks source link

训练过的奖励模型执行 train_bash do_predict 和 api_demo 输出分值的量纲和结论不一致 #2806

Closed LexieeWei closed 3 months ago

LexieeWei commented 6 months ago

Reminder

Reproduction

api_demo 部署: CUDA_VISIBLE_DEVICES=1 python .../LLaMA-Factory/src/api_demo.py \ --stage rm \ --model_name_or_path xxxx/checkpoint-280 \ --template qwen \ --finetuning_type full

train_bash --do_predict 测试 CUDA_VISIBLE_DEVICES=0 python train_bash.py \ --stage rm \ --model_name_or_path xxxx/checkpoint-280-backup \ --do_predict \ --dataset_dir ... \ --dataset ...\ --template qwen \ --finetuning_type full \ --per_device_eval_batch_size 4 \ --output_dir... \ --overwrite_output_dir \ --fp16

Expected behavior

背景:我已经微调过奖励模型RM,需要部署一个接口,给到其他模块使用

现象:我使用 train_bash 的 --do_predict 模式,对一批数据对进行测试,这时的分数不是归一化的,根据分值相对大小来判断候选答案好坏的结果也基本符合业务预期(记为设置A);但是我使用api_demo部署RM接口后,发现输出的分值在0~1之间,且相对大小不再合理(记为设置B)。

问题:

  1. 我个人理解:A是loss,B是预测分数,两者之间没有严格的一致关系。是这样吗?
  2. 能否让api_demo的接口输出非归一化的分值,和设置A输出的分值一致呢?

System Info

No response

Others

No response

hiyouga commented 6 months ago

理论上我们没有做归一化,不排除是一些计算上的 bug

LexieeWei commented 6 months ago

理论上我们没有做归一化,不排除是一些计算上的 bug

希望api_demo get_scores 接口能输出 train_bash --do_predict 一样的chosen/reject分数,LLama_factory 框架是否支持呢

LexieeWei commented 6 months ago

还发现一个问题,每次api_demo的服务拉起来后,同一case的推理分值是不同的,很奇怪

Hzzhang-nlp commented 5 months ago

还发现一个问题,每次api_demo的服务拉起来后,同一case的推理分值是不同的,很奇怪

可以分享一个调用API程序的借口吗?

Chen-Song commented 4 months ago

` chosen_trunc_rewards = chosen_rewards[i, div_index:end_index] # shape 69 rejected_trunc_rewards = rejected_rewards[i, div_index:end_index] # shape 69

loss = -torch.nn.functional.logsigmoid(chosen_trunc_rewards - rejected_trunc_rewards).mean()` 请教一个问题。RM模型计算loss的时候,应该是sentence级别或者sequence级别去计算sigmoid loss吧?因为逻辑上是要求某个sentence的回答比另一个sentence的回答的分数高。但是实现的时候,是token级别的去计算sigmoid loss,然后取mean了。不知道是我哪里理解有问题呢?谢谢