기록하는삶

[파이썬/Python] 한국어 STT, kospeech 활용기(4) _ 코랩&구글 드라이브 활용해 모델 학습하기 본문

AI/kospeech(한국어 STT)

[파이썬/Python] 한국어 STT, kospeech 활용기(4) _ 코랩&구글 드라이브 활용해 모델 학습하기

mingchin 2021. 12. 31. 16:44
728x90
반응형

지난 글: https://mingchin.tistory.com/222

 

[파이썬/Python] 한국어 STT, kospeech 활용기(3) _ 학습을 위한 코드 수정, configs 변경

지난 글: https://mingchin.tistory.com/221 [파이썬/Python] 한국어 STT, kospeech 활용기(2) _ 폴더 위치 변경 및 모듈 설치 지난 글: https://mingchin.tistory.com/201 [파이썬/Python] 한국어 STT, kospeech..

mingchin.tistory.com

지난 글까지의 작업이 끝나면 데이터 상황에 맞게 configs들을 조정하고, augmentation 여부를 정하고, pre-process 과정에서 생성한 글자 사전을 사용하도록 지정하여 학습할 준비를 마친 상태다. 필자는 30만개 약 110GB의 음성 데이터를 학습에 활용해야하는 상황이었고, 이는 gpu조차 내장되어있지 않은 나의 귀여운 노트북에서는 불가능에 가까운 일이었기 때문에 구글 코랩을 사용하기로 했다.

 

1) 구글 드라이브 연동

코랩은 구글 서버를 사용하는 개념이기 때문에, 서버와 연결을 할 때마다 사용하고 싶은 파일 혹은 데이터가 있다면 서버에 올려주어야 하는 번거로움이 있다. 이를 해결할 수 있는 것이 구글 드라이브 연동이다.

코랩을 사용하는 계정과 구글 드라이브 계정이 꼭 일치할 필요는 없으며, 간단한 코드로 구글 드라이브와 코랩을 사용하는 서버를 연결할 수 있다.

from google.colab import drive
drive.mount('/content/drive') #mount안에 경로를 던져준다.

colab은 기본적으로 working directory가 /content로 지정되어 있고, 원한다면 mount() 안에 던지는 인자를 바꾸어 지정하면 된다.

자세한 과정은 이미 기록해둔 것이 있어 생략한다.(https://mingchin.tistory.com/167)

 

2) 무료 코랩을 활용한 학습 시도(실패)

이제 와 돌아보니 조금 아쉬운 선택이지만, 처음 코랩을 사용할 때만 해도 코랩을 쓴다고 학습이 실제로 가능할 지 확신이 없었다. 코랩이 제공하는 gpu 성능이 어느 정도이고, 그래서 학습 속도가 얼마나 나올 것이며, 학습이 진행되는 과정에서 또 다른 오류가 발생하지 않으리라는 보장이 없었기 때문이다. 그래서 무료 버전으로 돌려보고, 가능성을 점쳐본 뒤에 필요하다면 colab pro를 결제하기로 했다.

 

로컬에서 학습이 시작되고 코드가 문제 없이 작동함을 확인한 후에 kospeech-latest 폴더를 통째로 구글 드라이브에 업로드 한 뒤, 30만 개의 음성 데이터 역시 구글 드라이브에 업로드 해주었다. 이 과정에서 정말 x고생을 했는데, 결과적으로 윈도우용 구글드라이브 소프트웨어를 깔아서 사용하는 것이 좋다.

https://support.google.com/a/users/answer/9965580?hl=ko

 

데스크톱용 Google Drive 설치 및 설정하기 - Google Workspace 학습 센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

구글 드라이브를 마치 하나의 하드디스크처럼 활용할 수 있으며, 파일의 복사, 이동, 삭제 등을 코드로도 접근할 수 있어 용이하다. 위 링크의 프로그램을 설치하면 C:/, D:/ 드라이브처럼 G:/ 드라이브가 만들어진다. 110GB에 달하는 데이터를 zip파일로 구글 드라이브에 업로드 한 뒤 풀어준다거나, 여러 개로 나누어 직접 업로드 하는 것은 너무 시간이 오래걸리는 일이었고 코드를 이용해 로컬에 있는 파일을 복사하거나 혹은 통째로 G:/ 드라이브로 이동시키는 것이 가장 좋은 방법이다. (오른쪽 아래의 시작메뉴에서 구글 드라이브 아이콘을 클릭해 동기화가 잘 되는지 확인할 수 있다.) 나는 이 방법을 나중에야 알아서 거의 3일을 데이터를 나누고 압축하고 올리고 다시 압축 해제하느라 x고생을 했다.

 

무튼 이렇게 시행착오를 겪고 구글 드라이브에 원하는 파일을 모두 업로드 한 뒤, 학습을 시작했다. 학습 방법은 로컬 파일이 아닌 (구글 드라이브를 연동한)코랩 서버 상의 파일을 사용하니 경로를 조금 수정하는 것 외에는 동일하다. 로컬에 비해 대충 봐도 10배는 빨라 보이긴 했지만, 여전히 30만개의 데이터에 대해 1epoch도 돌아가지 못한 채 런타임이 끊기는 문제가 발생했다.

 

해결해야 하는 문제는 2개였다.

① 학습 시간이 더 빨라져야한다. -> 구글 colab pro 결제($9.99)

② 런타임이 최소 1epoch은 돌아가 모델을 저장한 뒤 끊겨야 한다. -> 구글 colab pro 결제($9.99) + 데이터를 6등분하여 나누어 학습시키기

 

학습 과정에서 찍히는 log에 근거하여 약 1/4epoch이 학습된 뒤에 런타임이 끊기는 것을 보고 안전하게 저장되게 하기 위하여 + 한 번 시도해보고 그 결과를 확인하기 위하여 6등분하여 학습을 진행해보았다.

/bin/kospeech/data/label_loader.py에 보면, 생성한 transripts.txt로부터 오디오 파일 명과 글자 사전을 이용해 숫자로 전사한 숫자 전사를 불러오는 코드가 있다. 이 부분의 idx를 이용해, 'if idx%6==k (k= 0~5)'의 조건문을 부여해가며 5만개씩만 리스트에 담도록 했다. 전체 데이터 개수를 손봤으니, 이전 글에서 지정했던 train_num/valid_num 역시 조정이 필요하다.

 

3) colab pro를 활용한 학습

이제 학습할 준비를 마쳤으니, 학습을 진행하면 된다.

gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
  print('Not connected to a GPU')
else:
  print(gpu_info)
  
  
from psutil import virtual_memory
ram_gb = virtual_memory().total / 1e9
print('Your runtime has {:.1f} gigabytes of available RAM\n'.format(ram_gb))

if ram_gb < 20:
  print('Not using a high-RAM runtime')
else:
  print('You are using a high-RAM runtime!')

먼저 colab이 결제한 pro를 사용하도록 설정해 준 뒤(런타임 -> 런타임 유형 -> 런타임 구성: 고용량 RAM),

 위 코드로 확인했을 때 다음과 같은 결과나 나와야한다.

이제 학습을 진행해보면,

%cd "/content/drive/MyDrive/폴더명/kospeech-latest"

!pip install -e .

!python ./bin/main.py model=ds2 train=ds2_train train.dataset_path="/content/drive/MyDrive/code/train wav"

참고로 코랩은 리눅스 환경 + 자체적으로 갖추어져 있는 환경 덕분인지, !pip install -e . 만으로 필요한 모듈이 모두 설치된다.

성공적으로 gpu를 할당받고, 학습을 진행하며 로그가 찍히는 모습이다. 해당 예시는 데이터 전체(30만개)를 할당하여 진행 중인 모습이고, 데이터를 6분할하면 1/6의 시간보다 덜 걸리는 빠른 속도로 학습을 진행한다.

지정한 checkpoint_every의 step마다 모델을 outputs 폴더에 저장하게 된다.

모델을 불러와 학습을 진행하고 싶을 경우에는, 이전 글에서 언급했듯 configs에서 resume=True로 설정하고, 가장 최신 모델을 읽어와 이어 학습하도록 하면 된다.

 

이제 이렇게 학습해 만들어진 모델을 이용해 예측을 진행하는 것만 남았다!

728x90
반응형