THUIR / T2Ranking

T2Ranking: A large-scale Chinese benchmark for passage ranking.

Home Page:https://huggingface.co/datasets/THUIR/T2Ranking

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用发布的cross-encoder.p进行验证发现结果对不上?

wulaoshi opened this issue · comments

您好,再次麻烦一下作者:
我使用你发布的Ranker与代码跑了一下推理,发现和你公布的指标不不一致,不清楚哪里有diff:
#####################
MRR @10: 0.1631831178768475
QueriesRanked: 24831
recall@1: 0.028713886926983487
recall@1000: 0.15787172501933877
recall@50: 0.04702687249857061
#####################

其中改动的地方只有将多卡推理变成了单卡推理:

  # local_start = time.time()
  # local_rank = torch.distributed.get_rank()
  local_rank = 0
  # world_size = torch.distributed.get_world_size()
  num = 0
  with torch.no_grad():
      model.eval()
      scores_lst = []
      qids_lst = []
      pids_lst = []
      for record1, record2 in tqdm(dev_loader):
          with autocast():
              scores = model(_prepare_inputs(record1))
          qids = record2['qids']
          pids = record2['pids']
          scores_lst.append(scores.detach().cpu().numpy().copy())
          qids_lst.append(qids.copy())
          pids_lst.append(pids.copy())
          num += 1
          if num > 10 and args.debug:
              break
      qids_lst = np.concatenate(qids_lst).reshape(-1)
      pids_lst = np.concatenate(pids_lst).reshape(-1)
      scores_lst = np.concatenate(scores_lst).reshape(-1)
      file_name = args.warm_start_from.split('/')[-1]
      file_name = f"output/res_{file_name}"
      with open(file_name, 'w') as f:
          for qid,pid,score in zip(qids_lst, pids_lst, scores_lst):
              f.write(str(qid)+'\t'+str(pid)+'\t'+str(score)+'\n')
      # torch.distributed.barrier()
      if local_rank==0:
          # merge(epoch)
          calc_mrr(args.dev_qrels, file_name)

推理的时候一共跑了2000W的数据?不知道这正不正常。
期待你的回复,谢谢

重新用8卡GPU跑了一下代码,指标:
dev_qrels=data/dev.dpr.tsv:
#####################
MRR @10: 1.0
QueriesRanked: 24831
recall@1: 0.001
recall@1000: 1.0
recall@50: 0.05
#####################

这会正在跑dev_qrels=qrels.retrieval.dev.tsv与dev_qrels=dev.bm25.tsv。等跑完发布结果。

dev_qrels=data/qrels.retrieval.dev.tsv
dev_top1000=data/dev.dpr.tsv
warm_start_from=data/cross-encoder.p
您好,我这边使用上述设置的结果是正常的,单卡的我没有试过,如果您那边改好了方便的话可以提个pull request,十分感谢~

多卡的话使用本仓库的代码是完全可以复现的。建议更新代码后在尝试一下

多卡的话使用本仓库的代码是完全可以复现的。建议更新代码后在尝试一下

指标是用下述指令跑出来的吗?
python src/convert2trec.py output/res.step-20 && python src/msmarco_eval.py data/qrels.retrieval.dev.tsv output/res.step-20.trec && path_to/trec_eval -m ndcg_cut.5 data/qrels.dev.tsv res.step-20.trec

那我这个流程正确吗:我先用 warm_start_from=cross-encoder.p (你们发布已经训练好的)
跑了 一遍validate_multi_gpu,存储数据为 --> res.step-0;然后用 res.step-0 来计算指标。

MRR可以通过下面的指令得到:
sh script/train_cross_encoder.sh
NDCG@k可以通过:
python src/convert2trec.py output/res.step-20 && python src/msmarco_eval.py data/qrels.retrieval.dev.tsv output/res.step-20.trec && path_to/trec_eval -m ndcg_cut.5 data/qrels.dev.tsv res.step-20.trec

MRR可以通过下面的指令得到: sh script/train_cross_encoder.sh NDCG@k可以通过: python src/convert2trec.py output/res.step-20 && python src/msmarco_eval.py data/qrels.retrieval.dev.tsv output/res.step-20.trec && path_to/trec_eval -m ndcg_cut.5 data/qrels.dev.tsv res.step-20.trec

OK,谢谢。等我把 dev_qrels=data/qrels.retrieval.dev.tsv 的结果跑完,结果对齐了,再改一个单卡的单独测评脚本出来 pull request