오랜만에 블로그를 작성하는 것 같다. 최근에 서비스에 STT 모델을 학습시켜 사용해야하는 Task 때문에 정신이 없었다.
또한, 수요 예측 관련된 Task는 그냥 Base로 깔고가는 편이라, 너무 정신이 없었달까...
2021.05.24 - [논문으로 현업 씹어먹기] - 딥러닝 STT 모델 - ESPNet (2 - 톺아보기)
서론
ESPNet의 소스를 분석해보고, Training 환경을 구성해보고, Inference 환경까지 테스트해봤으며, 현재 완성된 모델은 실제 서비스에 들어갈 예정이다. (때문에, ESPNet의 근간이 되는 OpenSource 규격이나, 진행 간의 내가 느낀 노하우는 설명이 가능하겠지만, 구체적으로 소스가 어떻게 구성되었고, 스크립트 또한 어떻게 생겨먹었는지 하나하나 짚고 넘어가기는 힘들 것으로 판단된다.)
해당 작업을 하면서 느낀 점이, OpenSource 베이스를 너무 Wrapper 형태로 개발해놓으면, 오히려 규격이나 규칙들이 너무 딱딱하고, 많고, 정교해지면서, 폴더 구조나, 작은 데이터의 형태 규칙들이 강해지고, 때문에 참고해야하는 레퍼런스가 길어진다던지, 규격을 맞추고 이해하기위한 부가적인 수고로움이 너무 많아진다는 점이 단점같았다.
때문에, 숙지해야될 점들이 드럽게 많았다. 또한 음향처리라는 것이, 자연어랑은 다르게 전처리 부분에서 매우 심오한 부분들이 많았기 때문에, 도메인도 숙지해야될 점이 무척이나 많았다.
그래서,
1. ESPNet과 Kaldi의 설치 (Kaldi가 곁다리로 들어가면서 매우 복잡해진다.)
2. Kaldi에 대한 기본적인 이해
3. ESPNet을 사용하기 위한 최소 조건 규격들 (폴더구조, 데이터의 형식 등)
================== 이번 시간에는 여기까지!
4. 음향처리 도메인 지식
2021.05.14 - [논문으로 현업 씹어먹기] - 딥러닝 STT 모델 - ESPNet (1)
5. 딥러닝 도메인 지식
- Embedding, Self-Attention, Attention, Attention에서의 Masked 처리
정도는 기본적으로 알고 있어야 ESPNet을 이상없이 사용할 수 있으며, 우분투와 C 컴파일, 파이썬 3가지의 박자가 조금이라도 어색하거나 이해를 잘 못하고 접근한다면, 정상적인 사용이 불가할 수 있다....ㅋㅋㅋ
설명할 것도 많고, 한번에 구성하기엔 내용이 너무 벅차, 이번 주제는 상당히 글 개수가 길어지지 않을까 싶다.
위에 5가지 조건을 전부 차근차근 설명하긴 하겠으며, 도메인 지식은 등장하는 구간에서 추가로 해당 사용성을 위주로 설명을 하도록 하겠다.
ESPNet과 Kaldi의 설치
1. 일단 git pull부터 받아야 한다.
https://github.com/espnet/espnet
2. Python에서 호출하여 사용하기 위해, espnet git의 Installation을 따라한다.
3. 만약에 Kaldi를 사용해야 한다면, 아래의 Installation까지 전부 따라해야한다.
(단 한라인도 무시하고 설치되면 안되며, 컴파일간 에러가 중간에 넘어가는 경우도 있어서, 설치하면서 콘솔을 잘 확인해야한다.)
내가 몇까지 겪으면서 고생한 부분을 작성해보자면,
1) {kaldi_home}/tools/extras에서 Intel이라면 install_mkl.sh를, amd라면 install_blas.sh를 꼭 실행해줘야 한다.
2) kaldi에서 configure, make되는 파일은 전부 kaldi 밑에만 생성되며, 우분투 혹은 리눅스의 전역파일을 생성하지 않는다. 즉, 우분투가 더러워질까봐 docker 세팅등을 하지는 않아도 된다는 점!
3) espnet에서 make되는 파일은 pip는 전역 파이썬에 설치되니까, docker는 안써도 되지만, 가상환경정도는 사용하는 것이 유용할 수 있다는 점!
4) pip install espnet과 espnet의 make install 과정 간 espnet 버전이 상이하면, requirement 설치 간, 종속성 문제가 발생할 수 있다. espnet make install 과정에서는 {espnet_home}/espnet/version.txt 파일을 사용하므로, 설치환경에 맞는 stable 버전으로 통일해야된다.
(해당 이슈는 뭔가 베타버전이 사용되면서 pip install에서는 베타버전이 설치되고, make install 과정에서는 stable 버전이 설치되면서 계속 상호간 지우고 난리부르스 떤 적이 있었다... 여튼 조심)
5) 최근에 있었던 이슈로 portaudio 홈페이지가 장애가 나서, wget이 안되서 kaldi 설치가 안되는 이슈가 있었다. 이럴때는 wget으로 받아야 하는 파일을 archive 형태로 다운받아서 진행해야한다. (지금은 해결)
6) ./configure 및 make과정은 전부 누락이 없어야 하며, 설치 간 권장되는 설정 및 추가설치는 대부분 진행하는 것이 좋다.
7) python 2.7은 기본적으로 설치정도는 되어있어야 한다.
8) kaldi가 버그가 얼마나 많으면, 개발자들끼리 빠르게 버그를 파악해서 수정하는, https://github.com/Bug-Reaper/kaldi git이 있을정도다. 필요하면 참고하자.
해당 과정까지 전부 빠짐없이 진행을 하면,
1. espnet 소스경로+필요 Python Package
- 실제로 Deep Learning 학습을 진행하기 위한 세팅
2. kaldi 소스경로 + kaldi의 make compile 산출물
- kaldi를 이용한 Data 전처리와 전처리간 데이터 검증을 위한 C 소스 세팅
이 세팅되게 된다.
이거 은근 짧아서 설치 쉬워보이는데, 하다보면 잘 안되는 경우 많다....ㅋㅋ
Kaldi의 기본적인 이해
ESPNet2에서는 Kaldi를 걷어냈다고 하나, 필자는 ESPNet2를 사용했으나, 전처리는 Kaldi를 사용했기 때문에, 결국 Kaldi에 대해서 알고 넘어가긴 해야한다.
ESPNet에서는 Kaldi의 일부 기능만 사용하며, 때문에 ESPNet 관점에서의 Kaldi는 '한마디'로 정의된다.
Kaldi는, 음향 데이터 전처리 Toolkit이다.
흔히 딥러닝으로 뭔가 회귀 예측을 진행한다고 가정해보자.
테이블에서의 여러 데이터를 이용하여, 우리는 Scale 작업도 하고, 버릴 데이터들은 버리고, 여러가지 데이터 전처리를 Scikit-Learn에서 제공하는 함수를 이용하던, 우리가 직접 작성하던 해서 사용한다.
Kaldi는 음향 모델계의 Scikit-Learn이다.
다만, 우리가 ESPNet에서 사용하는 부분은, Scikit-Learn에서의, from sklearn import preprocessing 영역에 해당하는 부분만 사용한다. (Kaldi도 전처리 뿐만 아니라, Kaldi만의 Training용 소스도 내포하고 있긴하다. https://kaldi-asr.org/doc/ )
본인이 C나 Python, 혹은 다른 기타 언어를 이용해서, 푸리에 변환, Filter-Bank, MFCC 추출, 정규화 등 음향 데이터 학습을 위한 Cepstral 데이터를 추출할 수 있다면, 굳이 Kaldi를 사용하지 않아도 된다.
(필자같은 경우에는, Training에서는 Kaldi를 사용했지만, Inference 하는 부분에서는, pykaldi를 참고해서 사용하였다. 병렬처리를 효과적으로 하거나 속도적 이점을 위해서라면, Kaldi의 C base소스를 개량하는 것도 방법일 수 있겠다.)
이 쯤이면 Kaldi에 대한 기본적인 이해는 됐을 것이라 생각된다.
ESPNet을 사용하기 위한 최소 조건 규격들
처음에 생각했을때는, wav 파일이랑 txt 파일만 있으면 될 줄 알았는데, 왠걸 규격이라는게 있을줄이야...ㅠ
심지어 Kaldi와 ESPNet이 둘다 폴더 구조 규격이 존재한다.
(이거는 파이썬이나 쉘 스크립트로, txt내용을 읽어서, 파일명 등을 활용해서 적절히 필요에 맞게 자동화 시킬수도 있긴하다. 다만 현업에서 어떤 데이터와 어떤 파일명으로, 화자분리를 할지 말지 등 어떤 상황일지 몰라서 이 소스는 공유하기 좀 애매하다.)
Kaldi 규격 맞추기
https://kaldi-asr.org/doc/data_prep.html
개발자 가이드를 차근차근 톺아보다보면, 어떻게 구성해야하는지 대략적인 형태는 나오나, 매우 포괄적인 부분을 상세하게 설명하고 있다보니, 해당 조건을 전부 만족시켜야하는지, 필요한 부분은 어떻게 떼어내서 써야하는지 정확하게 눈에 절대 안들어온다...ㅋㅋㅋㅋ (차라리 예제를 찾아보는게 빠를 지경이다.)
필자가 추천하는 튜토리얼 사이트로는, 해당 사이트를 참고하면 좋을 것이다.
https://hanseokhyeon.tistory.com/entry/Kaldi-tutorial-Data-preparation
상단의 Kaldi 개발자 사이트를 한글로 번역하여, 설명까지 작성되어있는 사이트다.
ESPNet 규격 맞추기
ESPNet역시 폴더구조에 대한 기본적인 Structure가 존재한다. 해당 문서를 참고하면 되긴 되는데,
이게 참 골때리는게 Kaldi따로, ESPNet따로 보면 나름대로 이해가 된다. 근데 두개를 합쳐서,
데이터 처리를 위한 Kaldi용 Data Directory Structure + 학습을 진행하기 위한 ESPNet Directory Structure를 구성하려니, 막상 막막하다. 심지어 개발자 가이드에 잘 나와있지도 않다...!
이럴때는 역시 예제를 보는 것이 깔끔하긴하다. ESPNet git 소스에 예제들을 참고하는 것이 좋다.
https://github.com/espnet/espnet/tree/master/egs2/TEMPLATE
여기에 Kaldi에 대한 내용이 나오니, 위의 내용과 참고하여 만들어도 좋고, 필자는 솔직히,
https://github.com/espnet/espnet/tree/master/egs2/zeroth_korean/asr1
실제로 제공되는 개발되어 있는 예제를 참고하는 것이 더 편리했다.
대충 여기까지 이해해서 폴더를 구성해보면
/ 프로젝트명
/ asr1
/ conf
/ scripts (추가로 사용할 스크립트 등 선택으로 활용)
/ steps -> {각자의 kaldi}/tools/kaldi/egs/wsj/s5/steps
/ utils -> {각자의 kaldi}/tools/kaldi/egs/wsg/s5/utils
/ 뭔가 학습에 쓰고자하는 데이터 폴더
/ train 폴더 (필수)
/ 데이터.wav
/ 데이터.txt
/ spk2utt
/ text
/ utt2spk
/ wav.scp
/ dev 폴더 (선택)
/ train 폴더 참고
/ test 폴더 (선택)
/ train 폴더 참고
/ asr.sh
/ cmd.sh
/ path.sh
과 같이 구성된다. 해당 조건은 최소 조건일뿐이라는 점 명심하자.
규격 이후의, asr.sh 등은 어떻게 작성할 것인가?
기본적으로 사용성은 TEMPLATE 폴더를 참고하면 된다. 내가 이렇게밖에 설명할 수 없는 이유는,
음향데이터라는 것이 MFCC까지 다 된것을 사용할 것인지, Filter Bank값을 사용할 것인지, 혹은 Filter Bank + @의 값을 사용할 것인지, 1개의 음향에서 단계별로 고려해볼 수 있는 다양한 음향 Feature들이 존재하고, 그 음향 Feature들에 맞는 단계(Stage) 별로 shell script를 알아서 작성하길 강요되기 때문이다.
최초에 프로젝트를 진행한다면, 데이터 Set를 어떻게 구성할지 미리 고민해보고, 실습 예제를 좀 돌려보는 것이 중요하다고 생각된다. (해당 단계까지 진행될 수 있도록 Kaldi Tutorial을 참고하여 Kaldi 전처리를 이용, ESPNet의 Shell Script를 작성하였다. 말만 뻔지르르하지 거의 템플릿 그대로다...ㅋㅋ)
TEMPLATE에서 제공되는 asr.sh의 예제는 기본적으로, 원본으로 데이터 셋을 가져다 놓으면, 해당 데이터셋을 계속 복사하여 폴더를 새롭게 만들어서 Stage별로 별도로 사용하게 되어있으며, 때문에 stage를 지정하여 해당 동작만 수행할 수 있도록 작성되어있는 쉘 스크립트다. (원본을 해치지 않기 때문에 부담없이 돌려보면서 이것저것 테스트 해가며 수정하는 것이 좋다.)
Stage는 15까지 있고, 'log "stage' 로 file find를 해보면 각 stage별로 행위가 명확하게 나와있기는 한데,
Stage 1~4는 data preprocess에 대한 부분 (필수)
(우리가 고생해서 Kaldi를 설치한 것은 Stage 1~4에서 추진력을 얻기 위함이었다....!!!!!)
Stage 5~9는 lm, ngram 학습을 위한 부분 (언어모델 사용시 필요하며 Optional하다.)
Stage 10~11은 실제 Training (필수)
Stage 12~13은 Evaluation (선택이지만 이거 안하면 딥알못 ㅇㅈ?)
Stage 14~15는 zip등으로 packing하여 Zenodo로 Upload (Optional) (Zenodo는 논문 아카이브 사이트다)
하는 역할을 수행하며, 필요에 따라 골라서 다른 예제들을 참고해가면서 수정해서 사용하면 된다.
(거의 대부분 필수만 사용할 것 같고, lm같은 경우에는 RNN-LM, Ngram-LM 등을 활용해볼 수 있다.)
이 정도로 구성하여서,
1. 개발 환경 설치
2. 데이터 규격과 학습을 위한 폴더 규격 정리
3. 데이터 전처리->학습을 진행시키기 위한 쉘 스크립트 작성
작업을 진행하게 되며, 모두 완료되면 작성되어있는 소스코드로 Training이 가능해지게 된다.
지금 거의 5~10분 읽을만한 아티클을 작성한 것 같음에도, 고작 환경을 구성해서 시작하기 직전까지 구성하는데 그쳤다.
다음시간에는 실제로 스크립트를 수행하여, 학습이 진행되게 되면 어떤 Flow로 진행이 되는지에 대해 알아볼 것이며, 그 다음시간에는 Inference가 어떻게 진행되며, Training과 Inference의 과정에서 도메인 지식들은 어떻게 소스로 작성될 수 있고 사용되는지 알아보도록 하겠다.
'딥러닝으로 하루하루 씹어먹기' 카테고리의 다른 글
딥러닝 STT 모델 - ESPNet (5 - 음성처리 도메인) (0) | 2021.10.25 |
---|---|
딥러닝 STT 모델 - ESPNet (4 - Training 시작!) (10) | 2021.10.22 |
딥러닝 STT 모델 - ESPNet (2 - 톺아보기) (2) | 2021.05.24 |
딥러닝 STT 모델 - ESPNet (1) (5) | 2021.05.14 |
LSTM으로 수요 예측하기 - 9장 (마무리) (7) | 2021.05.07 |
댓글