처리량 최적화하기
처리량 최적화하기 (fastembed-fastembed-optimize)
기본적으로 FastEmbed는 메인 처리 스레드에서 문서를 순차적으로 처리해요. 문서가 많아지면 이 방식이 병목이 될 수 있는데요, FastEmbed는 문서를 병렬로 처리하는 방법을 제공합니다. 어떤 파라미터를 어떻게 쓰면 되는지 하나씩 살펴볼게요.
출처: Qdrant 공식문서
병렬 처리를 활성화하면 FastEmbed는 데이터셋을 여러 워커(worker)로 나누고, 각 워커가 임베딩 모델의 독립된 복사본을 실행해요. 내부적으로 문서는 배치 단위로 나뉘어 공유 입력 큐(input queue)에 들어갑니다. 각 배치는 워커 중 하나가 처리한 뒤 공유 출력 큐에 쌓이고, 다시 수집되어 원래 입력 순서에 맞게 재정렬됩니다.
병렬 처리 설정 파라미터
FastEmbed를 병렬 처리로 구성하려면 다음 파라미터를 사용하세요.
parallel: 워커의 수.None(기본값)으로 설정하면 임베딩 모델이 메인 프로세스에서 실행됩니다.0으로 설정하면 FastEmbed가 사용 가능한 CPU 코어 수를 감지해 그만큼의 워커로 병렬화합니다.1이상으로 설정하면 지정한 수의 워커를 사용합니다.
- 배치 크기(batch size): 각 워커가 각 배치에서 처리하는 문서의 수. 메모리 사용량과 처리 속도의 균형을 맞추도록 조정합니다. 로컬 추론 중 메모리가 부족하면 낮추고, 메모리가 충분하고 큰 문서 집합을 처리한다면 처리량을 높이기 위해 올리세요.
배치 크기를 구성하려면 다음을 사용합니다.
batch_size: 배치 처리를 위한 독립형 FastEmbed 파라미터. 텍스트는 기본256, 이미지는16입니다.local_inference_batch_size: 배치 처리를 위한 Qdrant Client 파라미터. 기본값은8입니다.lazy_load: 추론이 필요해질 때까지 임베딩 모델을 로드하지 않도록True로 설정합니다. 지연 로딩을 켜면 여러 워커를 사용할 때 메인 프로세스에서 모델을 로드하지 않아서 메모리를 아끼고 시작 시간을 줄입니다.
Qdrant Client와 함께 사용하기
Qdrant Client와 함께 FastEmbed를 쓸 때는 클라이언트를 초기화하면서 local_inference_batch_size 파라미터를 지정해 배치 크기를 구성하면 돼요. 예를 들면 다음과 같습니다.
client = QdrantClient ( url = QDRANT_URL , api_key = QDRANT_API_KEY , local_inference_batch_size = 256 , # FastEmbed batch size )
다음으로 포인트를 만들 때 추론 객체에서 lazy_load를 True로 설정해 메인 프로세스에서 임베딩 모델을 로드하지 않도록 합니다.
point = models . PointStruct ( id = 1 , vector = models . Document ( text = "The text to embed" , model = "BAAI/bge-small-en-v1.5" , options = { "lazy_load" : True , }, ) )
fastembed-gpu를 사용한다면 GPU 가속을 켜기 위해 cuda도 True로 설정합니다.
point = models . PointStruct ( id = 1 , vector = models . Document ( text = "The text to embed" , model = "BAAI/bge-small-en-v1.5" , options = { "lazy_load" : True , "cuda" : True , }, ) )
마지막으로 포인트를 업로드할 때 parallel 파라미터를 원하는 워커 수로 설정합니다.
client . upload_points ( collection_name = COLLECTION_NAME , points = points , parallel = 4 # use 4 workers to process documents in parallel )
독립형 라이브러리로 사용하기
FastEmbed를 독립형 라이브러리로 사용할 때는 먼저 임베딩 모델의 지연 로딩을 활성화하세요.
model = TextEmbedding ( model_name = "BAAI/bge-small-en-v1.5" , lazy_load = True , # don't load the model until first embed call )
여러 GPU 디바이스에 워크로드 분산
FastEmbed는 여러 GPU 디바이스에 워크로드를 분산하는 것을 지원합니다. 활성화하려면:
fastembed-gpu를 설치합니다.- GPU 가속을 켜기 위해
cuda를True로 설정합니다. - 워커를 배정할 GPU 디바이스 ID 목록으로
device_ids를 구성합니다. 예를 들어device_ids=[0, 1]은 워커를 GPU 0과 1에 배정합니다. 지정하지 않으면 FastEmbed는 모든 워커를 기본 GPU 디바이스에 배정합니다.
model = TextEmbedding ( model_name = "BAAI/bge-small-en-v1.5" , lazy_load = True , # don't load the model until first embed call cuda = True , # enable GPU acceleration device_ids = [ 0 , 1 ], # spread workers across GPUs 0 and 1 )
임베딩을 생성할 때는 batch_size로 배치 크기를, parallel로 워커 수를 설정하세요.
embeddings = list ( model . embed ( docs , batch_size = 256 , parallel = 4 ))