请问为什么train_bash.py (--do_predict) 与api_demo.py用相同的模型预测出的结果有差异呢?
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
具体是什么差异?
-
train_bash.py (--do_predict)保存在jsonl中的预测结果: "predict": "将 stadent 替换为 student。单词 stadent 是正确的拼写,但在这个句子中应该使用 student 来表示一个在学习的人\n错误类型: 拼写错误"
-
直接用api接口(api_demo.py)预测的结果 --- 为了保证每次模型输出一致性, 我将do_sample设置为False: "predict": "将 stadent 替换为 student。单词 stadent 是正确的单词的拼写错误,应该改为 student\n错误类型: 拼写错误"
明显下面的预测结果会更好。
想请教一下,在用train_bash.py (--do_predict)预测时是大模型有随机性吗? 但是我用train_bash.py (--do_predict)脚本生成两次jsonl,里面的数据都是一样的,都是上面的预测结果,望解疑
同样有类似的问题,不过是API的预测结果明显更差
可能的原因是 do_predict 时候做 batch inference 使用了 left-padding,会导致 RoPE embedding 不同,理论上 API 应该会更好