LLaMA-Factory icon indicating copy to clipboard operation
LLaMA-Factory copied to clipboard

请问为什么train_bash.py (--do_predict) 与api_demo.py用相同的模型预测出的结果有差异呢?

Open renzhangzhe opened this issue 1 year ago • 3 comments

Reminder

  • [X] I have read the README and searched the existing issues.

Reproduction

模型预测

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
--stage sft \
--do_predict \
--model_name_or_path openchat_3.5 \
--adapter_name_or_path openchat_explain_org_add_v1/checkpoint-180 \
--dataset metric_explain \
--template openchat \
--finetuning_type lora \
--output_dir metric_sft_predict_result \
--per_device_eval_batch_size 8 \
--max_samples 100 \
--predict_with_generate \
--fp16

api部署预测

CUDA_VISIBLE_DEVICES=0 python src/api_demo.py
--model_name_or_path openchat_3.5
--adapter_name_or_path openchat_explain_org_add_v1/checkpoint-180
--template openchat
--finetuning_type lora

Expected behavior

No response

System Info

No response

Others

No response

renzhangzhe avatar Jan 16 '24 08:01 renzhangzhe

具体是什么差异?

hiyouga avatar Jan 16 '24 10:01 hiyouga

  1. train_bash.py (--do_predict)保存在jsonl中的预测结果: "predict": "将 stadent 替换为 student。单词 stadent 是正确的拼写,但在这个句子中应该使用 student 来表示一个在学习的人\n错误类型: 拼写错误"

  2. 直接用api接口(api_demo.py)预测的结果 --- 为了保证每次模型输出一致性, 我将do_sample设置为False: "predict": "将 stadent 替换为 student。单词 stadent 是正确的单词的拼写错误,应该改为 student\n错误类型: 拼写错误"

明显下面的预测结果会更好。

想请教一下,在用train_bash.py (--do_predict)预测时是大模型有随机性吗? 但是我用train_bash.py (--do_predict)脚本生成两次jsonl,里面的数据都是一样的,都是上面的预测结果,望解疑

renzhangzhe avatar Jan 17 '24 01:01 renzhangzhe

同样有类似的问题,不过是API的预测结果明显更差

yuxie avatar Jan 22 '24 10:01 yuxie

可能的原因是 do_predict 时候做 batch inference 使用了 left-padding,会导致 RoPE embedding 不同,理论上 API 应该会更好

hiyouga avatar Mar 25 '24 07:03 hiyouga