boostcampaitech7 / level2-mrc-nlp-06

level2-mrc-nlp-06 created by GitHub Classroom
3 stars 1 forks source link

[BUG] Sparse Embedding Model 절대 경로 관련 이슈 #18

Closed LeeJeongHwi closed 1 week ago

LeeJeongHwi commented 1 week ago

Describe the bug

Possible Solution

minjijeong98 commented 1 week ago

@LeeJeongHwi 정휘님, 남겨주신 이슈에서 수정할 사항을 명확히 하고자 두가지 질문드립니다.

    # retrieval/sparse/src/sparse_retrieval.py
   # 기존 vectorizer 로딩 코드 (예: TF-IDF; BM25도 유사한 방식으로 구성되어 있음)

    def get_sparse_embedding_tfidf(self) -> NoReturn:
        pickle_name = f"{self.embedding_method}_sparse_embedding.bin"
        vectorizer_name = f"{self.embedding_method}.bin"
        emb_path = os.path.join("../model", pickle_name)
        vectorizer_path = os.path.join("../model", vectorizer_name)

        if os.path.isfile(vectorizer_path) and os.path.isfile(emb_path):
            logger.info("Loading TF-IDF pickle files.")
            with open(vectorizer_path, "rb") as file:
                self.tfidfv = pickle.load(file)
            with open(emb_path, "rb") as file:
                self.p_embedding = pickle.load(file)
{
    "corpus_data_path": "/data/ephemeral/home/datasets/v0.0.1/wikipedia_documents.json",
    "vectorizer_path": "/data/ephemeral/home/minji/retrieval/sparse/model/bm25.bin",
    "embedding_method": "bm25",
    "topk": 10,
    "tokenizer_model_name": "klue/bert-base",
    "eval_data_path": "/data/ephemeral/home/datasets/v0.0.1/train_dataset",
    "eval_metric": ["hit", "mrr"]
}
LeeJeongHwi commented 1 week ago

@minjijeong98 남겨주신 질문에 대해서 답변 드리겠습니다.

답변1. config에서 경로를 직접 받아오는 편이 좋을 것 같습니다. 현재 inference 코드는 ODQA 폴더 내에 있는 inference.py 코드를 실행시키기때문에 ../ 상대 경로를 사용할 시 inference.py가 있는 폴더를 기준으로 불러오게 됩니다. 그래서 질문에서 말씀하신대로 config에 있는 경로로 바로 받을 수 있도록 하는게 좋을 것 같습니다. 맨 아래 config 예시의 vectorizer_path에서 bm25.bin 부분만 제외하면 될 것 같습니다. ex) vectorizer_path = os.path.join(args.vectorizer_path, vectorizer_name)

답변2. 현재 아직 PR을 올리지 않은 상태라 github에선 볼 수 없지만, 알고리즘은 다음과 같습니다.

  1. sparseRetrieval.py에서 선택된 method를 기반으로 SparseRetrieval class에 대한 객체 생성
  2. 생성된 객체에 있는 함수인 SparseRetrieval.get_sparse_embedding_{method} 함수 실행
  3. embedding 생성 후 SparseRetrieval.retrieve() 함수를 사용하여 dataframe을 받아옴
  4. 받아온 dataframe으로 Reader로 전달

이 과정에서 2번에 해당하는 부분에 vectorizer_path가 필요합니다.

minjijeong98 commented 1 week ago

아하 상대경로로 되어 있어서 호출이 잘 안되는 문제를 말씀하신거군요~ 이해했습니다. 절대경로라고 적혀있어서 헷갈렸네요. 그 부분 수정한 뒤에 댓글 남기겠습니다

minjijeong98 commented 1 week ago

@LeeJeongHwi 정휘님 PR 남겼으니 확인 부탁드려요:)