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