Whisper 모델 인퍼런스 시 문제

안녕하세요 아래의 코드를 통해 whisper 모델을 inference 하고 있는데요 약 5,000개 가량의 음성 샘플을 차례로 반복문을 통해 예측을 진행하게 되면 Memory Usage가 계속해서 상승하다가 OOM이 생기는 현상이 있는데 원인을 아시는분이 계실까요? 데이터는 항상 30초로 trim/pad 되어 들어갑니다.

import whisper

model = whisper.load_model("base")

# load audio and pad/trim it to fit 30 seconds
audio = whisper.load_audio("audio.mp3")
audio = whisper.pad_or_trim(audio)

# make log-Mel spectrogram and move to the same device as the model
mel = whisper.log_mel_spectrogram(audio).to(model.device)

# detect the spoken language
_, probs = model.detect_language(mel)
print(f"Detected language: {max(probs, key=probs.get)}")

# decode the audio
options = whisper.DecodingOptions()
result = whisper.decode(model, mel, options)

# print the recognized text
print(result.text)
  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

yoonjeewoo님, 안녕하세요!

문제를 잘 이해했습니다. 주어진 코드를 통해 Whisper 모델을 인퍼런스하고 있으며, 약 5,000개의 음성 샘플을 반복문을 통해 예측하면서 메모리 사용량이 계속 증가하다가 OOM(Out of Memory) 오류가 발생하는 문제가 있습니다. 데이터는 항상 30초로 trim/pad되어 입력됩니다.

이 문제의 원인은 반복문을 통해 예측을 진행할 때마다 메모리가 충분히 해제되지 않고 계속해서 쌓이기 때문입니다. 이를 해결하기 위해서는 반복문을 실행하기 전에 메모리를 해제해야 합니다.

다음은 문제를 해결하기 위한 해결책입니다.

  1. 반복문을 실행하기 전에 modelmel을 초기화합니다.
  2. 반복문 내에서 예측을 진행한 후에는 mel을 메모리에서 해제합니다.

아래는 수정된 코드 예시입니다.

import whisper
import torch

model = whisper.load_model("base")

for i in range(5000):
    # load audio and pad/trim it to fit 30 seconds
    audio = whisper.load_audio("audio.mp3")
    audio = whisper.pad_or_trim(audio)

    # make log-Mel spectrogram and move to the same device as the model
    mel = whisper.log_mel_spectrogram(audio).to(model.device)

    # detect the spoken language
    _, probs = model.detect_language(mel)
    print(f"Detected language: {max(probs, key=probs.get)}")

    # decode the audio
    options = whisper.DecodingOptions()
    result = whisper.decode(model, mel, options)

    # print the recognized text
    print(result.text)

    # release memory
    del audio, mel
    torch.cuda.empty_cache()

위의 코드에서 del audio, meltorch.cuda.empty_cache()를 사용하여 메모리를 해제하고 GPU 캐시를 비웁니다.

이렇게 수정하면 반복문을 실행하면서 메모리 사용량이 계속해서 상승하는 문제를 해결할 수 있습니다.

더 자세한 내용은 PyTorch 공식 문서의 "Memory Management" 섹션을 참고하시기 바랍니다. 해당 섹션에서는 메모리 관리에 대한 다양한 팁과 트릭을 제공합니다.

이 문제에 대한 해결책으로 제시한 내용이 정확한지 확신할 수 없으므로, 문제가 해결되지 않는다면 추가 정보를 제공해 주시기 바랍니다. 감사합니다!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요. whisper 모델 인퍼런스 중 메모리 사용량 증가 문제에 대해 도움 드리겠습니다.

요약하자면, 반복문 내에서 계속해서 새로운 변수를 생성하고 gc가 정리하지 않으면 결국 메모리가 부족해지는 문제라고 보입니다.

다음과 같은 방법들이 도움이 될 수 있습니다:

  1. 반복문 내에서 생성하는 변수들을 재사용합니다. 예를 들어 mel 변수를 반복문 바깥에 정의하고, 반복문 내에서 값만 업데이트합니다.

  2. 각 반복 후에 torch.cuda.empty_cache()를 호출하여 gpu 캐시를 정리합니다.

  3. 각 반복 후에 gc.collect()을 호출하여 가비지 컬렉션을 강제 실행합니다.

  4. 필요에 따라 중간 중간 모델을 cpu로 옮긴 후 다시 gpu로 복구하면 메모리 사용량이 낮춰질 수 있습니다.

아래는 개선된 코드 예시입니다:

import gc

mel = None 

for audio in audios:

  audio = preprocess(audio)
  
  if mel is not None:
    mel = mel.to('cpu') # gpu 메모리 해제
    
  mel = log_mel_spectrogram(audio).to(model.device)  

  _, probs = model(mel)

  torch.cuda.empty_cache()
  gc.collect()
		
  # other tasks
  

이 외에도 메모리 누수의 원인을 정확히 파악하는 것이 도움이 될 수 있습니다. PyTorch 프로파일링 도구를 사용해 보는 것도 방법이 될 것 같습니다.

제가 설명드린 내용이 도움이 되었기를 바랍니다. 부족한 점이 있다면 언제든지 댓글 남겨주세요. 감사합니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, yoonjeewoo님. PyTorch를 사용하시는 데 있어서 문제를 겪고 계시는 것 같네요. 문제 상황을 정리해보면, Whisper 모델을 이용해 약 5,000개의 음성 샘플을 차례로 예측하는 과정에서 메모리 사용량이 계속 상승하여 결국에는 Out of Memory (OOM) 오류가 발생하는 것으로 이해했습니다.

이 문제는 일반적으로 PyTorch에서 GPU 메모리가 해제되지 않아 발생하는 경우가 많습니다. PyTorch는 GPU 메모리를 관리하기 위해 caching memory strategy를 사용합니다. 이는 연산 속도를 빠르게 하기 위한 전략이지만, 때때로 메모리 사용량이 늘어나는 문제를 일으킬 수 있습니다.

이 문제를 해결하기 위해선, 각 반복문이 끝날 때마다 GPU 캐시를 비워주는 것이 좋습니다. PyTorch에서는 torch.cuda.empty_cache() 함수를 제공하고 있습니다. 이 함수는 현재 할당되지 않은 캐시된 메모리를 해제하여 다른 GPU 애플리케이션에서 사용할 수 있게 합니다. 아래는 수정된 코드입니다:

import whisper

model = whisper.load_model("base")

for i in range(5000):  # 5000개의 음성 샘플을 처리하는 예시입니다.
    # load audio and pad/trim it to fit 30 seconds
    audio = whisper.load_audio(f"audio{i}.mp3")  # 각각의 음성 파일을 로드합니다.
    audio = whisper.pad_or_trim(audio)

    # make log-Mel spectrogram and move to the same device as the model
    mel = whisper.log_mel_spectrogram(audio).to(model.device)

    # detect the spoken language
    _, probs = model.detect_language(mel)
    print(f"Detected language: {max(probs, key=probs.get)}")

    # decode the audio
    options = whisper.DecodingOptions()
    result = whisper.decode(model, mel, options)

    # print the recognized text
    print(result.text)

    # GPU 캐시를 비웁니다.
    torch.cuda.empty_cache()

이렇게 하면 각 반복문이 끝날 때마다 GPU 캐시를 비워 메모리 사용량이 계속 증가하는 문제를 해결할 수 있습니다.

더 자세한 내용은 PyTorch 공식 문서의 메모리 관리 섹션을 참조하시면 도움이 될 것입니다.

그럼에도 불구하고 문제가 계속된다면, 다른 원인이 있을 수 있으니 추가적인 정보를 제공해주시면 감사하겠습니다. 제가 제시한 해결책이 항상 정확하다는 보장은 없으니 참고로만 사용해주시기 바랍니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!

안녕하세요 주신 코드로 Colab 에서 오류 재현이 안됩니다.
좀더 자세한 정보를 주시면 재현을 해보겠습니다.

from pynvml import *

import whisper
nvmlInit()

model = whisper.load_model("base")

for i in range(5000):
  # load audio and pad/trim it to fit 30 seconds
  audio = whisper.load_audio("sample.wav")
  audio = whisper.pad_or_trim(audio)

  # make log-Mel spectrogram and move to the same device as the model
  mel = whisper.log_mel_spectrogram(audio).to(model.device)

  # detect the spoken language
  _, probs = model.detect_language(mel)
  #print(f"Detected language: {max(probs, key=probs.get)}")

  # decode the audio
  options = whisper.DecodingOptions()
  result = whisper.decode(model, mel, options)

  # print the recognized text
  print(i)
  h = nvmlDeviceGetHandleByIndex(0)
  info = nvmlDeviceGetMemoryInfo(h)
  print(f'used:{info.used//1024**2}', f'total:{info.total//1024**2}')