[project#2] 학습한 모델이 train_dataset 대해서 ODQA 성능이 어떻게 나오는지 알고 싶다면 평가(`--do_eval`)를 진행하면 되는데 오류가 발생한다면?

sujin·2024년 10월 10일
0

nlp_project2

목록 보기
1/8
post-thumbnail
post-custom-banner

README.md를 읽어보면, ###inference 부분에 아래와 같이 작성되어있다.

* 학습한 모델이 train_dataset 대해서 ODQA 성능이 어떻게 나오는지 알고 싶다면 평가(`--do_eval`)를 진행하면 됩니다.

(참고) ###eval 부분은 mrc 모델 평가를 하는 부분이다.

코드를 —do_eval로 변경해서 실행하면, 아래와 같은 오류가 발생한다.

    Traceback (most recent call last):
      File "/data/ephemeral/home/sujin/code/inference.py", line 314, in <module>
        main()
      File "/data/ephemeral/home/sujin/code/inference.py", line 93, in main
        datasets = run_sparse_retrieval(
      File "/data/ephemeral/home/sujin/code/inference.py", line 155, in run_sparse_retrieval
        datasets = DatasetDict({"validation": Dataset.from_pandas(df, features=f)})
      File "/data/ephemeral/home/sujin/.local/lib/python3.10/site-packages/datasets/arrow_dataset.py", line 866, in from_pandas
        table = table.cast(features.arrow_schema)
      File "/data/ephemeral/home/sujin/.local/lib/python3.10/site-packages/datasets/table.py", line 901, in cast
        return InMemoryTable(table_cast(self.table, *args, **kwargs))
      File "/data/ephemeral/home/sujin/.local/lib/python3.10/site-packages/datasets/table.py", line 2332, in table_cast
        return cast_table_to_schema(table, schema)
      File "/data/ephemeral/home/sujin/.local/lib/python3.10/site-packages/datasets/table.py", line 2290, 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
    question: string
    id: string
    context: string
    original_context: string
    answers: struct<answer_start: list<item: int64>, text: list<item: string>>
      child 0, answer_start: list<item: int64>
          child 0, item: int64
      child 1, text: list<item: string>
          child 0, item: string
    -- schema metadata --
    pandas: '{"index_columns": [{"kind": "range", "name": null, "start": 0, "' + 840
    to
    {'answers': Sequence(feature={'text': Value(dtype='string', id=None), 'answer_start': Value(dtype='int32', id=None)}, length=-1, id=None), 'context': Value(dtype='string', id=None), 'id': Value(dtype='string', id=None), 'question': Value(dtype='string', id=None)}
    because column names don't match

이 에러 메시지는 Dataset.from_pandas 메서드를 사용하여 판다스 프레임을 Hugging Face의 DatasetDict로 변환할 때, 스키마가 일치하지 않아서 발생하는 문제이다. 구체적으로, 데이터 프레임의 스키마와 변환하고자하는 데이터셋의 스키마가 다르기 때문에 변환이 실패한 것이다.

Features로 제공된 스키마는 다음과 같이 정의되어있다.

Features(
    {
        "answers": Sequence(
            feature={
                "text": Value(dtype="string", id=None),
                "answer_start": Value(dtype="int32", id=None),
            },
            length=-1,
            id=None,
        ),
        "context": Value(dtype="string", id=None),
        "id": Value(dtype="string", id=None),
        "question": Value(dtype="string", id=None),
    }
)

하지만, 실제 데이터프레임에는 original_context라는 추가적인 컬럼이 존재하고 있다.

question: string
id: string
context: string
original_context: string
answers: struct<answer_start: list<item: int64>, text: list<item: string>>

이를 해결하기 위해서는, 컬럼을 제거하는 코드를 추가하면 된다.

    # 데이터프레임에서 'original_context' 컬럼 제거
    if "original_context" in df.columns:
        df = df.drop(columns=["original_context"])

    # Dataset 변환
    datasets = DatasetDict({"validation": Dataset.from_pandas(df, features=f)})
    return datasets

inference_bm25.py를 사용한다면 아래의 코드를 실행하면 된다.

python inference_bm25.py --output_dir ./outputs/train_dataset/ --dataset_name ../data/train_dataset/ --model_name_or_path ./models/train_dataset/ --do_eval --eval_retrieval
profile
감자 그리고 NLP
post-custom-banner

0개의 댓글