본문 바로가기

블로그/딥러닝

[Faiss GPU 병렬 처리 오류] 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를 활용해 텍스트 유사도 검색하는 부분이 있었는데, 이를 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를 동기화함으로써 경쟁 상태를 효과적으로 해결할 수 있음.