PaddleNLP icon indicating copy to clipboard operation
PaddleNLP copied to clipboard

【Hackathon + GradientCache】

Open Zhiyuan-Fan opened this issue 2 years ago • 26 comments

PR types

PR changes

Description

    已完成gradient_cache策略,在batch_size==512,chunk_size==16的情况下,Recall@10 和 Recall@50分别为50.195 65.067;也可以进超大batch训练,已经测试batch_size==12800,显存占用符合要求。

Zhiyuan-Fan avatar Mar 18 '22 11:03 Zhiyuan-Fan

您好,我在paddleNLP中没有找到论文中使用的natural question数据集,从Google上下载下来的原始数据集也和baseline中使用的数据集格式不太一样。想问下paddle有可以直接使用的NQ数据集吗?或者说该怎么处理NQ数据集?

Zhiyuan-Fan avatar Mar 19 '22 09:03 Zhiyuan-Fan

本论文中使用的数据集和 DPR Paper 中使用的数据集是对齐的,可以参考 DPR 官方 Repo 的数据下载及数据处理。

tianxin1860 avatar Mar 19 '22 12:03 tianxin1860

我在阅读DPR源码的时候看到他们的bi-encoder用到了两个编码器:question_encoder和ctx_encoder,但是paddleNLP的example中的baseline和In-batch策略,Hardest策略的模型都只用到了一个编码器。想问下我是按照DPR的模型重新做还是按照我现在已经实现的基于baseline的模型?

Zhiyuan-Fan avatar Mar 19 '22 13:03 Zhiyuan-Fan

可以确认下 Gradient Cache Paper 细节,我理解 Gradient Cache 为了和 DPR 公平对比,除了训练策略不一致之外,其余部分例如: 训练数据、模型结构和 DPR 部分应该是完全一致的。

tianxin1860 avatar Mar 20 '22 02:03 tianxin1860

我在阅读DPR源码的时候看到他们的bi-encoder用到了两个编码器:question_encoder和ctx_encoder,但是paddleNLP的example中的baseline和In-batch策略,Hardest策略的模型都只用到了一个编码器。想问下我是按照DPR的模型重新做还是按照我现在已经实现的基于baseline的模型?

GradientCache 复现的精度目标是和 Paper 中汇报的指标对齐,所以实现层面需要以 DPR Paper、Gradient Cache Paper 中的实现为准,不必局限于 PaddleNLP semantic_indexing 中已有算法的实现方式。

tianxin1860 avatar Mar 20 '22 02:03 tianxin1860

@yingyibiao CodeStyle 是什么问题啊?大概通过什么方式解决呀?

TCChenlong avatar Mar 21 '22 03:03 TCChenlong

@yingyibiao CodeStyle 是什么问题啊?大概通过什么方式解决呀?

参考 https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/10_contribution/local_dev_guide_cn.html#pre-commit 添加 pre-commit

yingyibiao avatar Mar 21 '22 03:03 yingyibiao

DPR 和 GradientCache 算法和论文对齐数据、策略之后的指标可以提供一下,作为算法实现正确性判断的参考依据。

tianxin1860 avatar Mar 30 '22 05:03 tianxin1860

@tianxin1860 已完成基于paddleNLP的gradient_cache,除此之外,已完成google数据集Natural Question的读取和处理工具类(在文件NQdataset.py中),已完成DPR策略和基于gradient_cache策略的DPR训练(核心代码在biencoder_base_model.py和train_gradient_cache_DPR.py中),已测试最终结果,为85.032和83.021(测试一次耗时过长,故目前只测试了这两次)。

Zhiyuan-Fan avatar Mar 31 '22 15:03 Zhiyuan-Fan

@tianxin1860 已完成基于paddleNLP的gradient_cache,除此之外,已完成google数据集Natural Question的读取和处理工具类(在文件NQdataset.py中),已完成DPR策略和基于gradient_cache策略的DPR训练(核心代码在biencoder_base_model.py和train_gradient_cache_DPR.py中),已测试最终结果,为85.032和83.021(测试一次耗时过长,故目前只测试了这两次)。

85.032 和 83.021 分别对应 DPR 和 DPR + GradientCache 在 NQ 数据集上的 Top100 召回指标么?@Elvisambition

tianxin1860 avatar Apr 01 '22 06:04 tianxin1860

@tianxin1860 均为DPR+gradient cache实现,DPR本身的训练实现需要依靠8×V100显卡。

Zhiyuan-Fan avatar Apr 01 '22 07:04 Zhiyuan-Fan

@tianxin1860 均为DPR+gradient cache实现,DPR本身的训练实现需要依靠8×V100显卡。

指标含义是什么?

tianxin1860 avatar Apr 01 '22 07:04 tianxin1860

@tianxin1860 分别为两次训练下TOP-100的召回指标

Zhiyuan-Fan avatar Apr 01 '22 07:04 Zhiyuan-Fan

@tianxin1860 那两个指标的意思是:在gradient cache策略下训练了两次,指标分别为第一次和第二次训练后得到的结果。

Zhiyuan-Fan avatar Apr 01 '22 12:04 Zhiyuan-Fan

建议和论文中的训练超参、评估指标对齐,给出 Top5、Top20、Top100 的评估指标。@Elvisambition image

tianxin1860 avatar Apr 06 '22 11:04 tianxin1860

@tianxin1860 已对齐指标,多次试验后指标在论文指标附近波动。请尽快review主体代码逻辑,后续代码我会一起提交。

Zhiyuan-Fan avatar Apr 13 '22 03:04 Zhiyuan-Fan

@tianxin1860 已对齐指标,多次试验后指标在论文指标附近波动。请尽快review主体代码逻辑,后续代码我会一起提交。

好的,把对齐后最终指标贴出来吧。代码 Review 进行中。

tianxin1860 avatar May 09 '22 07:05 tianxin1860

@tianxin1860 85.2 78.7 68.2

Zhiyuan-Fan avatar May 09 '22 10:05 Zhiyuan-Fan

请补充 README,写清楚 GradientCache 的数据准备、模型训练、效果评估这些步骤。Review 的过程中会根据你的 README 提供的命令再训练一次并验证精度。

tianxin1860 avatar May 09 '22 11:05 tianxin1860

@tianxin1860 已提交PR修改

Zhiyuan-Fan avatar May 16 '22 02:05 Zhiyuan-Fan

@tianxin1860 已完成修改,已按照paddlenlp格式新建README_gradient_cache.md

Zhiyuan-Fan avatar Jun 18 '22 11:06 Zhiyuan-Fan

  1. examples/semantic_indexing/dense_passage_retrieval/model.py 为空?确认一下是否有留下来的必要?
  2. examples/semantic_indexing/utils.py 为空? 确认一下是否有留下来的必要?
  3. 请用https://pre-commit.com/ 检查一下代码格式

w5688414 avatar Jul 05 '22 07:07 w5688414

@w5688414 有些空行删掉之后,代码风格检查的时候又自动加上了😭

Zhiyuan-Fan avatar Sep 05 '22 04:09 Zhiyuan-Fan

@w5688414 有些空行删掉之后,代码风格检查的时候又自动加上了😭

好的,python 类加上注释,都检查一下

w5688414 avatar Sep 05 '22 04:09 w5688414

@w5688414 这些路径我之前都是写死的啊,是你们review的时候让我改成现在这种格式的。

Zhiyuan-Fan avatar Sep 10 '22 02:09 Zhiyuan-Fan

@w5688414 这些路径我之前都是写死的啊,是你们review的时候让我改成现在这种格式的。

我在复现您的代码的时候发现了这个问题,体验不是很好;您应该理解的有问题,应该不是让您写成这种,比如数据就放在data目录下,然后请给出一个默认路径,让用户能够在不修改的情况下跑通,并且模型保存在另一个默认的目录下。请参考下面的命令:

python -u -m paddle.distributed.launch --gpus "0,1,2,3" \
    train_batch_neg.py \
    --device gpu \
    --save_dir ./checkpoints/ \
    --batch_size 64 \
    --learning_rate 5E-5 \
    --epochs 3 \
    --output_emb_size 256 \
    --save_steps 500 \
    --max_seq_length 64 \
    --margin 0.2 \
    --train_set_file semantic_pair_train.tsv \

w5688414 avatar Sep 10 '22 11:09 w5688414

precommit检查一下代码风格

w5688414 avatar Sep 28 '22 11:09 w5688414

LGTM

w5688414 avatar Sep 28 '22 13:09 w5688414