Machine Learning/DL - NLP

사전학습 언어모델 추가학습 (feat. KoElectra, GCP)

IP_DataScientist 2022. 10. 3.
반응형

Intro.

자연어 처리 일을 하다보면 모델의 파인튜닝(아랫물) 성능을 올리기 위해 데이터 처리, 하이퍼파라미터 튜닝 등 대부분의 작업을 통해 이룰 수 있는 성능에는 한계가 있다.

성능을 1~2퍼 센트라도 더 올리기 위해서는 파인튜닝시 활용하는 사전학습 언어모델(윗물)에 Task의 도메인을 추가 학습하여 성능 향상을 기대해 볼 수 있지만, 왠만한 컴퓨팅 사양으로는 한계가 있다.

파인 튜닝 성능의 향상을 도모하기 위해 사전학습 언어모델에 추가학습을 함으로 써 윗물을 조금 더 맑게 해보고 싶었다.

 

"윗물이 맑아야 아랫물이 맑다" - 한국어 임베딩 (이기창 저)

 

사전학습 언어모델을 추가학습을 하기 위해서는 GPU성능이 좋을 수록 좋은데 이를 위해서는 Google Cloud Platform(GCP)과 Tensorflow Research Cloud(TFRC)를 활용하면 좋다.

Tensorflow Research Cloud를 신청하면 TPU API를 약 한달간 무료로 채험해 볼 수 있는데 우선 TPU는 Tensor Processing Unit이며 구글에서 제작한 Neural Processing Unit (NPU) 이다.

TPU란?

https://voidint.com/CPU GPU TPU NPU 에 따르면, TPU/NPU 는 GPU의 신경망에서 처리해야 하는 곱셈 연산을 나눠서 시키는 불편함과 자원의 낭비를 줄이고, NPU제작 업체가 필요한 사양을 추가하는 등의 Neural Network Processing에 특화된 칩셋을 말한다고 합니다.
해당 블로그의
GPU vs NPU 구조 및 NPU 목적 에 따르면, GPU는 일련의 학습 과정을 수행하기 위해 CUDA(c언어 기반)와 cuDNN(CUDA Deep Neural Network library) 를 통해 GPU의 계산을 스케줄링 할 수 있도록 하였고, TPU/NPU는 설계될때 하드웨어 적으로 딥러닝 네트워크를 구성하는 각 layer를 실리콘으로 구현한 칩셋이라고 합니다.
모든 것에는 Trade-off가 있듯이 NPU를 이용하는 딥러닝 모델은 GPU와 cuDNN 을 사용할 때와 같은 100%의 자유도를 가지고 네트워크를 구성할 수가 없는데, 실리콘으로 구현된 뉴런은 칩 설계시 정해져 있어서 TPU/NPU에 구현되지 않은 뉴런이 딥러닝 네트워크에 포함되어 있다면, 그 부분은 하드웨어 가속을 타지 못하고 CPU로 연산을 수행해야 한다고 합니다.
해당 블로그의 설명을 좀더 TMI로 설명을 하자면, GPU의 유일한 단점은 비용인데, 우리가 스마트폰과 같은 디바이스에서 추론을 진행 하고자 한다면 GPU 시스템은 휴대도 불가능하며, 전력소비 문제 또한 있는데, 해당 작업을 서버를 통해 GPU연산을 수행하는것은 상당히 비효율 적이며 실시간성을 갖을 수가 없습니다.
하지만 디바이스에 장착할 수 있는 NPU를 이용한다면 모델은 GPU로 학습하고 추론은 NPU로 하면 해결 되는 것이죠.

자 그럼 TPU의 trade-off에도 불구 하고 TPU를 사용한 이유는 

  1. 비싼 GPU 가 없는 경우 한달간 무료로 사용할 수 있다.
  2. 뒤에 설명하겠지만, electra 모델을 학습 하기 위해선 기본 코드 구조로는 tensorflow-1.15.5버전을 사용해야 하는데 요즘 나오는 GPU의 CUDA버전과 호환이 되지 않는다. (GCP의 TPU-node는 tensorflow-1.15.5버전을 제공한다.)
  3. GPU는 CPU보다 많은(apx. 2500개) 산술논리연산장치(Arithmetic Logic Unit) 이 있는데 TPU의 ALU는 약 3만개로써 더 빠른 학습 속도를 기대해 볼 수 있다. (CPU, GPU, TPU 간단 비교)

정도가 되겠다.

 

GCP (Google Cloud Platform)

아마 GCP 를 통한 사전학습 진행을 하는 가장 최신글이 아닐까 싶다..

여기서는 GCP를 통해 일어날 수 있는 삽질을 최대한 줄이는 것을 도움을 주고자 한다..

 

GCP에서는 VM Instance를 생성하고 활용하여 컴퓨팅 작업을 TFRC에서 제공하는 TPU-node와 함께 진행해 볼 수 있다.

 

TFRC에서 제공하는 TPU목록

1. TFRC 등록

https://sites.research.google/trc/about/

 

TPU Research Cloud - About

Machine learning researchers around the world have done amazing things with the limited computational resources they currently have available. We'd like to empower researchers from many different backgrounds to think even bigger and tackle exciting new cha

sites.research.google

  • Tensorflow Research Cloud (TFRC)는 1달 동안 TPU를 무료로 사용할 수 있게 해주는 프로그램이다.
  • 신청을 하게 되면 메일이 하나 오게 된다
    • 해당 메일에서 요구하는 대로 신청서를 추가로 작성한 후 제출하면 얼마 후 아래와 같이 답장이 오게 되고, 그 때부터 GCP에서 TPU를 무료로 사용할 수 있게 된다:)

2. GCP 클라우드 설정 방법

GCP 개념:

  • bucket은 하드디스크
  • vm instance는 컴퓨터의 cpu, 메모리
  • TPU API는 컴퓨터의 GPU

라고 생각하면 수월하다.

 

※ zone 설정을 잘 하자!! zone은 말 그대로 지역이다. TPU version및 제공가능한 node 의 수는 위 TFRC에서 제공하는 TPU quota를 잘 참고하자..!

또한 추가 정보로 us-central1-f 가 europe-west4-a 보다 TPU를 할당 받기가 조금 더 수월하다.

  • 이유는 TPU 버전이 v2인 관계로 TPU-v3보다는 조금 더 적은 양의 메모리를 제공해서 배치 사이즈를 v3보다는 적게 설정해야 하기 때문에 europe-west4-a의 인기가 더 많아서 그런거 같다.

https://cloud.google.com/tpu/docs/regions-zones#us

2.1 Bucket

우선 가장 기본적인 Bucket에 대해 설명하겠다.

Bucket은 구글 드라이브와 같은 클라우드 스토리지 공간이라고 생각하면 편하다.

Bucket을 생성할때 주의할 점은 사용하려는 TPU zone과 동일하게 생성해야 한다는것 외에는 없다.

  1. 사용할 TPU와 동일한 Region에 Bucket 만드는 것을 권장
    1. 버킷 이름 지정
    2. 데이터 저장 위치 선택
      1. 위치 유형 → region
      2. 위치 → europe-west4
  2. 생성된 Bucket에 pretrain_tf-records파일, vocab, 추가학습을 진행 할 model을 업로드 하자. (사진은 아래 순서 밑에 차례로 첨부)
    1. tf-records 준비  
    2. GCP의 bucket에 업로드할 때는 google SDK를 설치해서 명령어로 업로드 하는게 파일을 drag and drop으로 업로드 하는것 보다 더 수월하다 (drag-and-drop을 해보면 알겠지만, 한번에 1000개가 올라가지 않고 끊어서 올려야 한다.)
python build_pretraining_dataset.py --corpus-dir [CORPUS-DIR] --vocab-file [vocab.txt DIR] --output-dir [tf-records OUTPUT-DIR] --max-seq-length 512 --blanks-separate-docs True

tf-records 0 ~1000
추가학습 진행할 모델 선택

150만 steps학습된 KoELECTRA-Base-V3의 Tensorflow-v1 model을 받아서 30만스텝을 더 학습할 예정이다.

koelectra-base-v3

이렇게 준비된 파일들을 GoogleSDK를 사용해서 bucket에 업로드 진행해 준다.

우선 gcloud auth login명령어를 통해 사용하는 콘솔의 계정으로 project에 로그인을 진행 후 아래 명령어와 같이 업로드를 진행한다.

gsutil cp -r [upload-file-dir] [gs://bucket name]

학습 파일 bucket에 업로드 결과

2.2 VM Instance

vm instance는 단순 선택으로 설정하는 방법과 코드 한방으로 설정하는 방법 두가지가 있는데, 코드로 할 경우 TPU 까지 한번에 생성할 수 있다는 장점이 있지만, 다른 연구자들의 TPU선점으로 인해 TPU생성이 실패할 경우 vm-instance만 생성된다는 점을 참고하자.

gcloud compute tpus execution-groups create --name=[your vm/tpu name] --zone=europe-west4-a --tf-version=1.15.5 --machine-type=n1-standard-1 --accelerator-type=v3-8

위 코드는 europe-west4-a 지역에 tensorflow==1.15.5 버전의 v3-8 타입의 TPU 노드와 n1-standard-1 의 성능을 갖는 vm-instance를 한번에 생성하는 코드이다. 또한 명심할것은 GCP에서 TPU 노드를 따로 생성하거나 할 경우 무조건 vm-instance와 이름이 같아야 한다.

학습은 vm-instance에서 ssh접속을 통해 진행하면 된다.

  • ssh 접속 및 monologg/KoElectra gitclone
  • configure_pretraining.py, config/base-v3.json 설정
  • run pretraining.py 순으로 vim 을 활용하여 진행하면 된다.

2.3 TPU - API

TPU-API

TPU API를 활성화 하기 위해 위에 ENABLE버튼을 누른 후, TFRC에 GCP의 프로젝트를 하나 생성해서 해당 프로젝트의 번호(project number)를 이메일로 전달받은 google form에 작성해서 전달해야 한다.

주의 : TPU node와 VM Instance의 이름이 동일해야함

TPU 노드 만들기로 사용하고자 하는 vm-instance와 동일한 이름으로 만들어 주어도 된다.

운이 좋아서 us지역과 europe지역의 TPU 모두 할당받을 수 있었는데 europe은 거의 일주일간 매일 한두번씩 시도해서 할당 받을 수있었다.

 

3. VM Instance (ssh) 를 통한 모델 학습

사전학습 모델 추가학습 진행 : 150만 스탭부터 학습이 시작되는것을 볼 수 있다.
bucket에 koelectra 모델이 30만step 추가학습된 결과
KoElectra 180만 step까지의 loss

4. SDK 활용 모델 다운로드

이전에 bucket에 업로드 한것과 같이 다운을 받으면된다.

gsutil -m cp -r ["gs://bucket-name"] [download-dir]

5. TF -> pytorch-model 변환

tensorflow로 학습된 모델은 converting하는 코드를 활용해서 pytorch.bin 파일로 만들어 사용이 가능하다.

6. 활용

여기서 추가학습을 진행해본 말뭉치는 심리상담 도메인의 내담자들의 사연 (구어채) 였는데, 아시겠지만 KoElectra는 문어체로 학습이 되어있는 모델이다. 왜 KcElectra를 추가학습 하지 않았냐고 물으신다면 그건 tensorflow-v1모델이나 pytorch의 generator모델이 공유되지 않은 관계로 추가학습을 진행해 볼 수 없었다.

KOTE 데이터셋을 파인튜닝 하며 느낀점은 KoElectra가 KcElectra를 구어채도메인에서 뛰어 넘으려면 심리상담 도매인 외의 말뭉치를 훨씬더 많이 추가학습을 하는 방법도 있겠지만 심리상담 도메인이 포함된 말뭉치를 KcElectra에 사용된 말뭉치와 함께 처음부터 사전학습을 진행했으면 더 좋았을것 같다.

그래도 신기한 점은 아주 큰 향상은 아니지만 KoElectra로 KOTE를 파인튜닝한 결과 보다 추가학습 모델에서의 파인튜닝 성능이 F1 스코어에서 약 1% 정도 성능 향상이 있었다.

Fine-tuning시 학습 loss를 보면 추가학습되는 그래프가 좀 더 떨어지는 것을 확인해 볼 수 있었다.

KOTE-finetuned F1-score from KoElectra-v3
KOTE-finetuned MCC from KoElectra-v3
KOTE-finetuned F1-score from KoElectra additional training
KOTE-finetuned MCC from KoElectra additional training

결론

파인튜닝 하고자 하는 데이터셋이 구어체 라면, 역시 윗물도 구어체로 학습된 사전학습 모델을 활용하는 것이 파인튜닝에서 결과가 더 좋다는 것을 확인해 보는 계기가 되었다.

 

윗물이 맑아야 아랫물이 맑다~!

Reference

https://monologg.kr/2020/05/02/koelectra-part1/

반응형

댓글

💲 Google Ads.