오늘 한 일

GIGACHAD 처형식

발단

  • 때는 어제부터 GIGACHAD를 학습시켜놓고 gradient checkpointing에 대해 자료를 찾아보고 있을 때였다.
  • 그러다가 점심시간이 되어서 밥을 먹으러 갔는데 팀원 중 한 분이 슬랙으로 GPU가 비었는데 학습이 꺼진 것 같다고 제보를 해주셨다.
  • 그래서 밥먹다 말고 확인해봤는데 진짜 학습이 꺼져있었다.

전개

  • 뭔가 싶었지만, 일단 학습을 다시 시켜보는 게 나을 것 같아서 다시 학습을 하려고 했는데…
  • 다른 팀원분이 이렇게 된 거 중간 체크포인트로 성능을 좀 확인해보는 것 어떠냐고 제안을 주셨다.
  • 30 epochs 중 9 epochs 정도만 돌아간 상태여서 이를 제출해봤는데 성능이 좀 애매했지만, 그래도 더 돌려보면 나쁘지 않을 것 같다고 생각했다.

위기

  • 위기는 효율성을 확인해볼 때 발생했다.
  • 당연히 BEATs라는 audio encoder를 거치지 않고 Whsiper만 사용하니 용량은 그렇다고 쳐도 더 빠르지 않을까 추측했는데…
  • 평균 메모리 사용량도 거의 2GB 정도 더 많이 나오고, 어떻게 측정해도 SALMONN이 GIGACHAD보다 더 빠르게 찍히는 것이었다.

절정

  • 진짜 오랫동안(거의 5시간?), 코드마다 시간이 얼마나 걸리는지 확인하면서 어떤 부분의 코드가 병목인지 확인을 해보았다.
  • 그런데 진짜 어이없는 부분에서 더 시간이 오래 걸리는 것을 확인할 수 있었다.
    • 같은 tensor를 to('cuda')를 이용해서 GPU로 옮기는 부분이 SALMONN에 비해 GIGACHAD가 10배 느렸다…!
  • 코드 자체가 느리게 동작한다고 보기엔 똑같은 코드에서 걸리는 시간이 달랐기 때문에 도대체 뭐가 문제인지… 팀원들 사이에서 의견을 긴 시간 주고 받았다.
  • 그러다가 nvitop으로 GIGACHAD가 GPU utilization 값이 MAX를 찍는 것을 확인할 수 있었다.

결말

  • 결과적으로는 특정 코드가 느리게 동작한다기 보다는 GPU를 이미 최대로 활용하고 있어서 전체적으로 늘어나는 동작 시간이 일종의 상수로 작용해서, 코드를 수정해도 큰 의미가 없다는 것을 알 수 있었다.
    • time.sleep(1)를 같은 코드 실행 전에 삽입하여, GPU 활용도를 낮춘 상태에서 코드가 동작될 때는 둘 다 빠르게 동작한다는 걸 확인할 수 있었다.
  • SALMONN에서 병목이라고 생각했던 BEATs도 GPU 활용도를 낮춘 상태에서 동작되게 하면 실행 시간이 빨라서, GIGACHAD나 도찐개찐이지 않을까하는 결론을 내렸고…
  • 그렇게 GIGACHAD는 폐기되었다.

다음에 할 일

  • 강 모 캠퍼님께서 만드신 CLI 보조해서 merge 작업 진행
  • gradient checkpoint 기술 조사 (이젠 의미가 없을지도?)
  • 발표 자료 마저 만들기