Open lonelydancer opened 3 years ago
1) 2.2的训练和其他 MLM+NSP 任务的模型训练方式是一样的,都是适用随机采样的负例 2) 使用的时候用2.1的模型生成,用2.2的模型对候选排序
这样训练和预测会不会不一致呢? 为什么不做成一致的呢?
再弱问一句,paper里的batch_size是524,288,能开这么大啊。 不是ernie中的token num的概念吧
batch size 按照 token 数计算的
NSPModel模型参数是由1阶段初始化的,还是2.1阶段初始化的?
NSPModel模型参数是由1阶段初始化的,还是2.1阶段初始化的?
用阶段1训好的参数来初始化的
plato-2分支 跑2.1和2.2的时候,用infer.py可以吗;我配了两个model,但没找到代码中对应load两个model的地方
vocab_path="./package/dialog_cn/med.vocab" spm_model_file="./package/dialog_cn/med.model" infer_file="./data/valid_filelist" data_format="raw" file_format="filelist" config_path="./package/dialog_cn/plato/24L.json" output_name="response" save_path="output" model=Plato task=DialogGeneration do_generation=true is_distributed=false save_steps=10000
init_params=output/step_160000 nsp_inference_model_path=output_nsp/step_220000
infer_args="--ranking_score nsp_score --mem_efficient true --do_lower_case true"
nsp_init_params对应NSP Model,init_params对应PLATO
@sserdoubleh 这个配置我是理解的,但是在代码infer.py没见到对应的。感觉infer只能加载一个model
https://github.com/PaddlePaddle/Knover/blob/plato-2/plato-2/scripts/24L_plato_interact.sh 参考这个吧,不知道你用plato-2分支的时候用的是哪一个运行脚本 conf文件只是一个辅助的方法,具体的调用可以查看对应的运行shell脚本
如果你使用到的是scripts/local/infer.sh(会进一步调用scripts/distributed/infer.sh),要不你把nsp_inference_model_path放到infer_args里面试试?如:infer_args="XXXX --nsp_inference_model_path output_nsp/step_220000" 因为,nsp_inference_model_path没有在https://github.com/PaddlePaddle/Knover/blob/plato-2/scripts/distributed/infer.sh 预先定义使用到,需要放到用于指定额外arguments的infer_args里
infer.py只会定义一个主模型,用于完成给定task的inference,一些与task相关的辅助模型(如对话生成任务的后排序模型)是定义在Task里面,可以看https://github.com/PaddlePaddle/Knover/blob/plato-2/tasks/dialog_generation.py
https://github.com/PaddlePaddle/Knover/blob/plato-2/plato-2/scripts/24L_plato_interact.sh 参考这个吧,不知道你用plato-2分支的时候用的是哪一个运行脚本 conf文件只是一个辅助的方法,具体的调用可以查看对应的运行shell脚本
如果你使用到的是scripts/local/infer.sh(会进一步调用scripts/distributed/infer.sh),要不你把nsp_inference_model_path放到infer_args里面试试?如:infer_args="XXXX --nsp_inference_model_path output_nsp/step_220000" 因为,nsp_inference_model_path没有在https://github.com/PaddlePaddle/Knover/blob/plato-2/scripts/distributed/infer.sh 预先定义使用到,需要放到用于指定额外arguments的infer_args里
infer.py只会定义一个主模型,用于完成给定task的inference,一些与task相关的辅助模型(如对话生成任务的后排序模型)是定义在Task里面,可以看https://github.com/PaddlePaddle/Knover/blob/plato-2/tasks/dialog_generation.py
我使用了类似 plato-2/scrips/24L_plato_infer.sh的脚本,但是我发现nsp_predictor的输出是NAN。
https://github.com/PaddlePaddle/Knover/blob/plato-2/plato-2/scripts/24L_plato_interact.sh 参考这个吧,不知道你用plato-2分支的时候用的是哪一个运行脚本 conf文件只是一个辅助的方法,具体的调用可以查看对应的运行shell脚本 如果你使用到的是scripts/local/infer.sh(会进一步调用scripts/distributed/infer.sh),要不你把nsp_inference_model_path放到infer_args里面试试?如:infer_args="XXXX --nsp_inference_model_path output_nsp/step_220000" 因为,nsp_inference_model_path没有在https://github.com/PaddlePaddle/Knover/blob/plato-2/scripts/distributed/infer.sh 预先定义使用到,需要放到用于指定额外arguments的infer_args里 infer.py只会定义一个主模型,用于完成给定task的inference,一些与task相关的辅助模型(如对话生成任务的后排序模型)是定义在Task里面,可以看https://github.com/PaddlePaddle/Knover/blob/plato-2/tasks/dialog_generation.py
我使用了类似 plato-2/scrips/24L_plato_infer.sh的脚本,但是我发现nsp_predictor的输出是NAN。
运行脚本能发来看下吗?训练的时候,Validation的结果应该是正常的吧?
果然是训练的时候是NAN..
#!/bin/bash
set -eux
export CUDA_VISIBLE_DEVICES=0
# change to Knover working directory
SCRIPT=`realpath "$0"`
KNOVER_DIR=`dirname ${SCRIPT}`/../..
cd $KNOVER_DIR
model_size=24L
export vocab_path=./package/dialog_cn/med.vocab
export spm_model_file=./package/dialog_cn/med.model
export config_path=./package/dialog_cn/plato/${model_size}.json
nsp_init_params=./${model_size}/NSP
nsp_init_params=output_nsp/step_250000/
if [ ! -e "${nsp_init_params}/__model__" ]; then
export model=NSPModel
export task=NextSentencePrediction
export init_params=$nsp_init_params
./scripts/local/save_inference_model.sh
fi
export model=Plato
export task=DialogGeneration
export init_params=output_fine_model4/step_320000
export infer_file=./data/test.data.diag
#export infer_file=./data/test.data.debug
export save_path=./plato-2/output
export output_name="response"
export batch_size=10
export infer_args="\
--do_generation true \
--nsp_inference_model_path ${nsp_init_params} \
--ranking_score nsp_score"
mkdir -p ${save_path}
./scripts/distributed/infer.sh
那可能需要检查下训练过程了 @lonelydancer
1)我看paper中的NSPModel,“To select the most appropriate responses generated by the fine-grained generation model, the evaluation model is trained to estimate the coherence of the responses.” 理解为用stage 2.1生成的候选 + label 做分类model 而代码中的 mix_negative_sample 实现是随机替换tgt做负例,感觉不一致。 2)最后上线的模型是 用2.1 先生成候选 再用2.2 排序么?