상황: Faiss GPU를 활용해 텍스트 유사도 검색하는 부분이 있었는데, 이를 ThreadPoolExcutor를 활용하여 병렬 처리 구성하였을 경우 발생한 오류
Faiss assertion 'p + size == head_' failed in void faiss::gpu::StackDeviceMemory::Stack::returnAlloc(char*, size_t, cudaStream_t) at /project/faiss/faiss/gpu/utils/StackDeviceMemory.cpp:144
Faiss GPU는 Faiss CPU와 다르게, 읽기 전용 함수에서도 thread safe 하지 않기 때문에 해당 오류가 발생한다. 이러한 점은 Faiss 공식 문서에서도 나와 있다.
해당 오류에 관한 이슈,
https://github.com/facebookresearch/faiss/issues/2175, https://github.com/facebookresearch/faiss/issues/321
이를 해결하기 위해는 Faiss-GPU Search에서 mutual exclusion(상호 배제) 을 활용하여 스레드 경쟁 상태(Race Condition) 를 해소해야한다.
해결 방법:
- Python threading 패키지의 Lock 활용
- Lock을 acquire() 하면 특정 스레드만 공유 데이터에 접근할 수 있으며, release() 해야 다른 스레드에서 접근이 가능함.
- 이를 활용하여 병렬 처리 환경에서 Faiss Search 실행 시 단일 스레드만 faiss-gpu를 실행하도록 제한.
즉, threading의 Lock을 활용하여 Faiss Search를 동기화함으로써 경쟁 상태를 효과적으로 해결할 수 있음.
'블로그 > 딥러닝' 카테고리의 다른 글
[RAG] RAG 성능 향상을 위한 Re-ranking (1) | 2024.07.11 |
---|---|
딥러닝의 과대적합(Overfitting)을 해결하자 (0) | 2023.04.24 |
단층에서부터 Deep한 다층 퍼셉트론까지(Universal Approximation Theorem) (0) | 2022.08.13 |
[이상치 탐지] 금형 센서 데이터 이상 탐지 사례 (0) | 2022.07.06 |
역전파 알고리즘(Back Propagation)과 Delta Rule(1) (0) | 2022.07.06 |