개발자

ubuntu flask 서버 메모리 지속적으로 증가 막는 방법

2023년 09월 11일조회 231

안녕하세요. 지금 회사에서 프로젝트를 진행중입니다. 프로젝트 내용은 Spring boot에서 text를 입력 후 분석 버튼을 클릭하면 1. DB에 데이터 삽입 2. post로 ubuntu에서 flask 서버 호출 이 이루어집니다. ubuntu에서 flask서버에서는 1. fine-tuning된 T5, koBERT모델로 요약 및 긍부정 평가 2. 요약, 긍부정 결과 DB에 데이터 삽입 3. return 값 호출 이 이루어져서 return 값을 받은 후 Spring boot에서는 DB에서 값을 가져와 사용자에게 요약, 긍부정 결과를 확인하게 됩니다. 이 과정에서 ubuntu flask서버에서는 처음에 서버를 키면 500mb 정도를 차지하고 그 이후 계속 사용자가 요청한 분석을 하면 할 수록 메모리가 올라가 10회에서 20회정도 되면 메모리가 1300mb정도를 차지합니다. 이러한 메모리 점유를 없애기 위해 어떤식으로 처리해야하는지 모르겠습니다. 분석을 할 때마다 메모리가 계속 쌓이는 이유와 어떤식으로 처리할지 도와주세요.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

박범수님의 프로필 사진

메모리 누수의 원인을 찾는 것은 굉장히 어려운 일에 속합니다. 딱 집어 고쳐드릴 수 있는 쉬운 방법은 없습니다. 프로파일러나 디버거를 이용해 코드의 실행을 한 단계씩 추적하며 찾아야 합니다. 다만 말씀하신 사례는 메모리 누수가 극단적으로 빨리 일어나고 있는데요 . 이런 경우 흔한 원인 중 하나는 전역으로 사용하는 딕셔너리나 리스트에 값을 계속 담기만 하고 지우지 않는 것입니다. DB에 데이터를 삽입하기 전에 이런 컬렉션에 값을 담지 않는지 확인해보시기 바랍니다.

박범철님의 프로필 사진

박범철

작성자

인텐스소프트 인공지능 엔지니어2023년 09월 13일

감사합니다 말대로 전역으로 사용한 딕셔너리가 담기고만 있어서 모델을 돌린 후 초기화 해주니 전혀 메모리가 쌓이지 않습니다 감사합니다

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 09월 11일

여러 요인이 메모리 증가에 영향을 미칠 수 있습니다. 1. Flask 웹서버 구현 시 할당된 메모리가 제대로 반환되지 않는 경우가 발생할 수 있습니다. 2. 또한, 사용하신 딥러닝 모델(T5, koBERT 등)이 GPU 메모리를 많이 소모하는 것도 문제일 수 있습니다. 즉, 특정 작업 후에 메모리 반환에 문제가 있다거나, 분석 작업을 처리하는 모듈에서 메모리 누수 현상이 발생하는 것으로 보입니다. 다음은 이러한 문제를 해결하기 위해 고려해볼 수 있는 몇 가지 방법입니다: 1. 마이크로 서비스 패턴: 각각의 분석작업을 독립적인 프로세스로 만들면서 프로세스 종료 후 OS에서 자동으로 리소스를 회수하도록 하는 방법입니다. 2. 객체 참조 확인: 파이썬은 가비지 컬렉션이 동작하지만 강한 참조 때문에 일부 객체가 메모리에서 삭제되지 않을 수 있습니다. 따라서 각 요청 후에 변수를 적절하게 삭제하고 GC(garbage collector)를 명시적으로 호출하여 확인할 필요가 있습니다. 3. 모델 최적화: 사용 중인 딥러닝 모델이 너무 큰 경우, 모델을 작게 만들거나 필요한 부분만 추출하여 메모리 사용량을 줄일 수 있습니다. 4. 코드 프로파일링: 메모리 누수를 찾아내는 도구를 사용해 어느 부분에서 메모리를 가장 많이 소비하는지 확인하고 그 부분을 최적화할 수 있습니다. 5. 멀티스레딩 대신 멀티프로세싱 사용: 파이썬의 GIL 때문에 멀티스레드 환경에서는 여러 코어를 제대로 활용하지 못합니다. 따라서 가능한 경우, 아래와 같이 프로세스 기반 병렬처리를 고려해볼 수 있습니다. ```python from multiprocessing import Process, Queue def worker(input_queue): # Do some task item = input_queue.get() print(f'Processed {item}') if __name__ == "__main__": queue = Queue() processes = [Process(target=worker, args=(queue,)) for _ in range(NUM_WORKERS)] for p in processes: p.start() for item in items_to_process: queue.put(item) queue.join() # Blocks until all items are processed ``` 위 방법 중 하나 혹은 복합적으로 이용하여 문제를 해결해 보시기 바랍니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!