PaddlePaddle / Knover

Large-scale open domain KNOwledge grounded conVERsation system based on PaddlePaddle
Apache License 2.0
674 stars 130 forks source link

有关NSPModel训练 #52

Open lonelydancer opened 3 years ago

lonelydancer commented 3 years ago

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 排序么?

sserdoubleh commented 3 years ago

1) 2.2的训练和其他 MLM+NSP 任务的模型训练方式是一样的,都是适用随机采样的负例 2) 使用的时候用2.1的模型生成,用2.2的模型对候选排序

lonelydancer commented 3 years ago

这样训练和预测会不会不一致呢? 为什么不做成一致的呢?

lonelydancer commented 3 years ago

再弱问一句,paper里的batch_size是524,288,能开这么大啊。 不是ernie中的token num的概念吧

sserdoubleh commented 3 years ago

batch size 按照 token 数计算的

jjj9china commented 3 years ago

NSPModel模型参数是由1阶段初始化的,还是2.1阶段初始化的?

sserdoubleh commented 3 years ago

NSPModel模型参数是由1阶段初始化的,还是2.1阶段初始化的?

用阶段1训好的参数来初始化的

lonelydancer commented 3 years ago

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

is_cn=true

init_params=output/step_160000 nsp_inference_model_path=output_nsp/step_220000

nsp_init_params=output_nsp/step_220000

infer_args="--ranking_score nsp_score --mem_efficient true --do_lower_case true"

ranking_score=nsp_score

num_samples=20

topk=5

sserdoubleh commented 3 years ago

nsp_init_params对应NSP Model,init_params对应PLATO

lonelydancer commented 3 years ago

@sserdoubleh 这个配置我是理解的,但是在代码infer.py没见到对应的。感觉infer只能加载一个model

sserdoubleh commented 3 years ago

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

lonelydancer commented 3 years ago

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。

sserdoubleh commented 3 years ago

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的结果应该是正常的吧?

lonelydancer commented 3 years ago

果然是训练的时候是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
sserdoubleh commented 3 years ago

那可能需要检查下训练过程了 @lonelydancer