texttron / tevatron

Tevatron - A flexible toolkit for neural retrieval research and development.
http://tevatron.ai
Apache License 2.0
494 stars 94 forks source link

Trainset 형태를 바꾸려던 중 에러입니다 #98

Closed hzlcodus closed 10 months ago

hzlcodus commented 10 months ago

현재까지 한 작업:

  1. build_train_hn.py의 load_ranking에서 query, pos_passages, neg_passages에 더해 neg_scores까지 리턴하도록 바꾸었습니다. 제가 디버깅해보니 train.rank.tsv에 positive passage(gold)에 대한 score는 없는 건지, pos_score는 안 나왔습니다.
  2. 이후 build_train_hn.py를 보면 processor로 SimpleTrainPreProcessor를 사용하므로, preprocessor_tsv.py의 L75의 process_one 함수에서 neg_score을 같이 리턴해주었습니다.
  3. 이렇게 해서 create_hn.sh를 돌려서 /data/cme/marco/bert/train-hn-withscore 디렉토리에 HN 파일들을 저장했습니다. (여기까지 성공 완료)
  4. train.py의 L95를 보면 TrainDataset을 사용하므로, data.py의 L46 getitem 함수에서 neg_score를 함께 처리해 리턴하도록 했습니다.
  5. 그리고 이 함수가 원래 pos_passage와 neg_passage를 통합해 하나의 passages 형태로 리턴하고 있는데, 추가로 pos_passage들도 리턴하도록 했습니다. 1번에서 pos_score가 얻지 못했기 때문에, 추후 encoder의 forward function에서 쿼리와 positive passage는 encoding해서 train time에 유사도를 계산하는 방식을 그대로 가져가야 할 것 같습니다.. encoder 내부 함수들의 인풋의 편의를 위해 pos_passage를 데이터로 같이 넣어주었습니다.
  6. encoder.py에서 forward function(L96)에서 인자를 바꿔 positive_passage와 neg_score를 함께 받았습니다. L145: teacher_scores를 계산해야 하는데, 기존 코드에서는 쿼리와 모든 passage를 original LM으로 encoding 후 similarity를 구하는 과정이 있었지만, 지금은 쿼리와 positive_passage에 대해서만 따로 이 과정을 진행하고, 나머지는 neg_score로 사용하려고 합니다. 이 부분은 디버깅하기 전에 이미 에러가 나 버려서 dimension/type 확인을 더 해봐야 할 것 같습니다.
  7. 테스트용으로 train_cme_hn.sh를 돌려본 결과, HFTrainDatasetload_dataset 함수에서 문제가 발생하는데 고치지를 못하고 있습니다 ㅠㅠ sh 파일과 에러 전문은 아래에 있습니다. train.py의 L88을 보면, L95에서 TrainDataSet을 쓰기 전에, HFTrainDataset 상태로 한 번 process를 해주는데.. 문제가 발생한 건 dataset.py의 HFTrainDataset의 L24인데, 이 load_dataset 함수는 파이썬 내부 함수라서 제가 손을 댈 수가 없습니다. 어딘가 argument 설정하는 데가 있을 거라고 생각했는데, data_args.dataset_name, dataset_language는 의미없는 변수들이었습니다. (data_args는 arguments.py의 L45부터 모두 확인할 수 있습니다)

script (train_cme_hn.sh)

저는 CUDA 메모리가 부족해서 batch size 2로 돌리고 있는데, 8이 돌아간다면 8로 해주시면 좋을 것 같습니다

#!/bin/bash
#SBATCH --job-name=train_cme_hn       # Submit a job named
#SBATCH --nodes=1                             # Using 1 node
#SBATCH --gres=gpu:1                          # Using 1 gpu
#SBATCH --time=0-72:00:00                     # 1 hour timelimit
#SBATCH --mem=100000MB                         # Using 10GB CPU Memory
#SBATCH --cpus-per-task=8                     # Using 4 maximum processor

export RANK=0
export WORLD_SIZE=1
export MASTER_ADDR=localhost
export MASTER_PORT=2345

CUDA_VISIBLE_DEVICES=2 python -m tevatron.driver.train --output_dir ./cme_model_KL_initbert --model_name_or_path Luyu/co-condenser-marco-retriever --save_steps 20000 --train_dir /data/cme/marco/bert/train-hn-withscore --fp16 --per_device_train_batch_size 8 --learning_rate 5e-6 --num_train_epochs 2 --dataloader_num_workers 2

에러

에러 전문은 아래와 같습니다.

You can remove this warning by passing 'token=True' instead.
  warnings.warn(
Downloading data files: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 7781.64it/s]
Extracting data files: 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:00<00:00, 295.37it/s]
Generating train split: 59572 examples [00:04, 12072.66 examples/s]
Traceback (most recent call last):
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/builder.py", line 1940, in _prepare_split_single
    writer.write_table(table)
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/arrow_writer.py", line 572, in write_table
    pa_table = table_cast(pa_table, self._schema)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/table.py", line 2328, in table_cast
    return cast_table_to_schema(table, schema)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/table.py", line 2286, in cast_table_to_schema
    raise ValueError(f"Couldn't cast\n{table.schema}\nto\n{features}\nbecause column names don't match")
ValueError: Couldn't cast
query: list<item: int64>
  child 0, item: int64
positives: list<item: list<item: int64>>
  child 0, item: list<item: int64>
      child 0, item: int64
negatives: list<item: list<item: int64>>
  child 0, item: list<item: int64>
      child 0, item: int64
to
{'query': Sequence(feature=Value(dtype='int64', id=None), length=-1, id=None), 'positives': Sequence(feature=Sequence(feature=Value(dtype='int64', id=None), length=-1, id=None), length=-1, id=None), 'negatives': Sequence(feature=Sequence(feature=Value(dtype='int64', id=None), length=-1, id=None), length=-1, id=None), 'neg_score': Sequence(feature=Value(dtype='float64', id=None), length=-1, id=None)}
because column names don't match

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/cme/tevatron/src/tevatron/driver/train.py", line 120, in <module>
    main()
  File "/home/cme/tevatron/src/tevatron/driver/train.py", line 88, in main
    train_dataset = HFTrainDataset(tokenizer=tokenizer, data_args=data_args,
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/cme/tevatron/src/tevatron/datasets/dataset.py", line 24, in __init__
    self.dataset = load_dataset(data_args.dataset_name,
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/load.py", line 2153, in load_dataset
    builder_instance.download_and_prepare(
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/builder.py", line 954, in download_and_prepare
    self._download_and_prepare(
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/builder.py", line 1049, in _download_and_prepare
    self._prepare_split(split_generator, **prepare_split_kwargs)
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/builder.py", line 1813, in _prepare_split
    for job_id, done, content in self._prepare_split_single(
  File "/home/chaeyeonjin/miniconda3/lib/python3.11/site-packages/datasets/builder.py", line 1958, in _prepare_split_single
    raise DatasetGenerationError("An error occurred while generating the dataset") from e
datasets.builder.DatasetGenerationError: An error occurred while generating the dataset