2월 둘째주에 진행한 것들
시작하게 된 계기
"오픈소스 모델 중에 한국어 음성인식 뭐가 제일 좋아요?"라는 질문을 꽤 자주 받는다. 그런데 whisper 말고는 선택지가 없다. 그리고 위스퍼 이전에는 애초에 쓸만하다고 생각할만큼의 모델이 없었던것도 맞다.
최근에 Emilia 데이터셋(https://arxiv.org/abs/2501.15907)이 YODAS의 데이터까지 가공해서 공개하겠다고 한다. 기존에 한국어가 200시간 밖에 안됐던게 7000시간까지 늘어났고 이거 써서 TTS 학습을 해야겠다고 마음 먹었다. 다만, 음성인식에 whisper-medium을 썼다보니 이건 large로 다시 돌릴 필요가 있을 거 같아서 좀 돌려보는데 "한국어로 fine-tuning 좀만 해도 더 잘 되지 않을까?" 생각이 들었다.
위스퍼는 한국어 filler word는 다 지워버리고 음성인식을 수행한다. Ksponspeech 같은 경우에는 filler도 다 포함되어서 레이블링 되었다 보니 이 참에 한국어 데이터 좀 써가지고 finetuning을 하기로 결정했다. 그리고 매번 아쉬웠던 점이기도 했던게 AI Hub에 음성인식 데이터셋이 엄청 큰 볼륨으로 존재하는데 이거 많이 써서 학습한 모델을 몇 개 못봤다. 그래서 결정한게 적어도 1만시간 이상은 가공해서 large 모델을 finetuning하기로 결정하고 작업했다. 예산은 200불 정도고 이거보다 많이 쓸 생각은 없다.
데이터셋 처리
위스퍼 파인튜닝을 어떻게 하는지는 https://huggingface.co/blog/fine-tune-whisper 여기 같은 곳에 이미 잘 정리되어 있어서 코드를 짜는건 전혀 어려울게 없다.
문제는 데이터셋 처리다. 대량의 데이터셋을 학습하려면 내가 갖고 있는 4090 한장으로는 처리가 어려우며 클라우드에서 GPU 노드를 빌릴 때마다 가정집에 있는 데탑에서 그 클라우드로 업로드하는 것은 어렵다. 10000시간 정도의 음성은 대략 1TB다. 1TB를 100Mbps로 꾸준히 업로드한다 치면 20시간이 넘게 걸린다. 그리고 H100 한장은 한시간에 3불정도 든다. 빌려놓고 데이터 올리는데에만 60불을 날려야 한다는 뜻이다.
즉, 처리한 데이터셋을 GCP나 S3 같이 고대역폭 네트워크 스토리지에 저장한뒤에 학습 시에 여기서 땡겨와야 한다는 뜻이 된다. 이를 위해서는 Sequential I/O에 적합한 데이터 포맷으로 가공한 뒤에 저장이 필요하며 이런 포맷에는 webdataset이나 Mosaic의 StreamingDataset, Huggingface의 datasets가 사용중인 parquet, arrow 형식 등이 있다.
StreamingDataset은 사용해본적이 없다보니 webdataset을 쓰기로 결정했다. 지금 생각해보니 써본적 없었으니 이 참에 StreamingDataset을 써보는 것도 좋았겠다는 생각이 든다.
처리할 수 있는 리소스가 한정적이다 보니 아래 3개 데이터셋을 선택해서 webdataset 형태로 가공했다.
https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&dataSetSn=71556
https://www.aihub.or.kr/aihubdata/data/view.do?dataSetSn=464
한국어 음성(ksponspeech)는 librispeech 격인 데이터셋이니 당연히 넣었고 주소 음성은 한국 특화 주소들이다 보니 있는게 좋겠다 판단한거다. 추가로 어찌됐든 유튜브 음성이 메인 타겟이다 보니 비슷한 환경으로 생각되는 데이터셋 중 하나를 골라서 1만시간 분량을 가공했다. 욕심으로는 아래 두개는 더 가공해서 2만시간 분량은 쓰고 싶은데 base 모델 학습해보니까 비용압박 때문에 어려울 것 같다.
https://www.aihub.or.kr/aihubdata/data/view.do?dataSetSn=463
https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&dataSetSn=571
이거 외에도 머신 하나로 처리할라니까 좀 오래걸리기도 하고 500M bps 요금제를 쓰고 있긴 해도 QoS 이슈 때문에 다운로드 받고 업로드하는 데에 상당히 오래 걸린다.
학습
학습 코드작성이야 쉽다고 얘기했지만 실제 학습하는 과정은 좀 빡셌다. 뭐가 빡셌냐면 학습하는 노드의 대역폭, 그리고 네트워크 안정성 문제가 좀 터졌다.
webdataset 형태로 말아서 네트워크 스토리지에 올려둔 뒤에 학습시에는 curl+pipe를 사용해서 스트리밍 방식으로 데이터를 읽어오는데 중간 중간에 계속 curl에서 다양하게 에러(22, 56, 92)가 나와서 학습이 중단됐다.
이게 내가 빌린 노드 이슈인지, 클라우드 스토리지 이슈인지 참 알기가 어려워서 그냥 에러가 나오면 무시하고 다른 샤드를 들고 오게 짜서 회피하긴 했는데 이거보다 더 문제는 대역폭이슈였다.
vast.ai랑 runpod을 사용중인데 대역폭이 꾸준하게 나오질 않는다. 배치사이즈 256 기준으로 학습이 무난하게 진행되려면 100MiB 정도는 계속해서 나와줘야 한다. 그런데 runpod에서는 어떤 리전을 가도 이 속도가 보장이 안됐다. 애초에 저정도도 안나오는 리전도 많았고 저거만큼 나오다가도 중간에 너무 자주 10MiB 대로 떨어지기도 하는 등 개판이었다.
vast.ai도 솔직히 마찬가지였지만 그래도 저정도 속도가 꽤 길게 유지되는 provider를 찾아서 거기로 잡고 학습을 진행했다.
그렇게 해서 학습한 base 모델이 아래 두개다. 위에는 ksponspeech만 1에폭 본 것, 아래는 처리한 3개 데이터셋을 1에폭 본 것이다.
https://huggingface.co/seastar105/whisper-base-kspon
https://huggingface.co/seastar105/whisper-base-komix
둘 다 평가는 진행해봐야 하며 평가 데이터셋은 ksponspeech, fleurs, common voice 정도가 있긴 한데 좀 더 유튜브 스러운 도메인의 평가 데이터셋을 찾아보고 있다.
이후 계획
whisper-base의 경우 H100 한장으로 제일 잘 나온 스루풋이 batch 256기준에서 초당 1.5스텝이었다. 배치사이즈가 커질수록 성능이 좋아지는 것을 중간에 확인했다 보니 256을 쓰긴 써야 하는데 large-v3-turbo의 경우 H100 한장 썼을 때 2초에 1스텝 걸리는 것까지만 확인을 한 상태다.
1에폭을 보려면 20000 스텝은 학습해야하니 대략 4일 정도 걸리며 이건 내가 정했던 예산을 훨씬 넘어버린다. Tensor Research Program라고 TPU를 무료제공해주는 프로그램이 있는데 이거 사용이 가능할지를 확인해봐야 겠다. 그래서 다음주에 제일 먼저 할 것은 TPU로 whisper 파인튜닝 + webdataset 코드 베이스부터 확보하는 것이다.
그 다음은 파인튜닝한 large 모델로 YODAS 한국어 데이터셋 2만 시간 분량에 대해서 전부 새로 음성인식을 돌리고 이 데이터를 추가해서 총 3만 시간 분량으로 다시 large 모델을 파인튜닝한 게 최종 모델이 된다.
'Machine Learning > Worklog' 카테고리의 다른 글
Whisper 한국어 Fine-tuning 2주차 (0) | 2025.02.25 |
---|