Multi Threading 적용 및 사용자 피드백 기반 유지 보수 - 100-hours-a-week/12-marong-Wiki GitHub Wiki
멀티 스레딩 적용을 통한 장소 추천 속도 최적화
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=3) as executor:
futures = [
executor.submit(process_pair, pair, week_index, chroma_client, embedding_model, mbti_model)
for pair in pairs
]
ThreadPoolExecutor를 통해 스레드의 개수를 3으로 정하고 멀티스레딩
max_worker 값 | 평균 응답 시간 (ms) | 안정성 | 비고 |
---|---|---|---|
2 | 498ms | 안정적 | 별도 오류 없음, 모든 기기에서 안정 작동 |
3 | 267ms | 안정적 | 속도 대폭 개선, 오류 없이 안정 작동 |
4 이상 | 230ms | 일부 불안정 | 특정 기기(CPU 환경)에서 illegal instruction / segmentation fault 와 같은 C++ 관련 오류가 발생하기도 함 |
멀티 스레드 개수를 과다하게 증가하였을 때 발생하는 문제
zsh: illegal hardware instruction python main.py
- C++ 레벨에서 CPU instruction set을 잘못 사용하거나 메모리 접근 충돌 발생
- 따라서 안정성과 속도 최적화 측면을 고려할 때
max_worker=3
이 가장 균형적인 멀티 스레드 개수라고 판단하여 코드에 반영
- 추천 로직 특성 상 MBTI, 선호/비선호 음식, 식당/카페의 메타데이터(거리, 평균 별점)이 반영되며 본인과 마니띠의 성향을 평균내어 추천하는 방식이므로 개인이 싫어하는 음식이 충분히 고려되지 않는 문제가 있었음
- 따라서 싫어하는 음식의 음의 가중치 반영을 더욱 강화하였음
# 기존 코드
def recommend(self, lat, lng, radius_km=10.0, top_k=5, like_foods=[], dislike_foods=[]):
try:
food_embs = []
for food in like_foods:
food_embs.append(1.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
for food in dislike_foods:
food_embs.append(-1.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
# 변화 코드
def recommend(self, lat, lng, radius_km=10.0, top_k=5, like_foods=[], dislike_foods=[]):
try:
food_embs = []
for food in like_foods:
food_embs.append(1.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
for food in dislike_foods:
food_embs.append(-4.5 * self.embedding_model.encode(food, convert_to_tensor=True, device=self.device))
향후 사용자와 마니띠의 추천 점수를 별도 계산하여 유지, 보수 기간에 다음과 같이 추천 산식을 정교화할 계획임.
후보 함수: 시그모이드 함수, 가우시안 함수(RBF)
경우 | 추천 점수 |
---|---|
두 수가 양이고 임베딩 벡터 간 차이가 작다 | 높음 |
두 수가 양이지만 임베딩 벡터 간 차이가 크다 | 낮음 |
두 수가 음이고 임베딩 벡터 간 차이가 작다 | 낮음 |
두 수가 음이고 임베딩 벡터 간 차이가 크다 | 매우 낮음 |
# 시그모이드 함수
import math
def sigmoid(x):
return 1 / (1 + math.exp(-x))
# 가우시안 함수
import math
def gaussian_similarity(a, b, sigma=1.0):
diff = a - b
return math.exp(- (diff ** 2) / (2 * sigma ** 2))