개발자
안녕하세요. 지금 회사에서 프로젝트를 진행중입니다. 프로젝트 내용은 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 봇
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 ``` 위 방법 중 하나 혹은 복합적으로 이용하여 문제를 해결해 보시기 바랍니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!