본문 바로가기

AI/AI model

일렉트라(electra) 모델 사전학습 feat. RTX 3060 12G

일렉트라 모델 사전학습 feat. RTX 3060 12G




본 글은 일렉트라 모델 사전학습 테스트 과정과, 일반 RTX GPU를 사전학습에  활용할 수 있을까에  대한 테스트 및 결과를 기록하기 위한 글입니다.


목적

- 일렉트라 모델의 파이프라인 테스트 및 요약
- RTX 라인 단일 GPU 환경에서의 사전학습 효용성 평가




일렉트라 사전학습 파이프라인

electra model 테스트 파이프라인


1. 말뭉치 수집
- 일렉트라 모델 사전학습을 위한 말뭉치(코퍼스)를 수집하는 단계
- 주로 데이터를 수집한 후 파싱하는 과정을 거친다. 사전학습에는 한 줄씩 파싱된 텍스트 파일(utf-8)이 필요하므로 dump 형식의 데이터나, json 데이터를 텍스트 파일로 변환(파싱)하는 과정이 필요하다.
- 수집한 말뭉치는 wiki-한국어 dump 와 AI-Hub의 웹데이터 기반 말뭉치, 온라인 구어체 말뭉치, 모두의 말뭉치의 신문기사 말뭉치, 문어 말뭉치를 사용했으며, 전처리 후 말뭉치 사이즈는 11기가 정도이다.




2. 말뭉치 전처리
- 학습목표에 의미가 없는 문자(특수문자, 한문 등) 를 제거하거나, html 태그 제거, 너무 긴 문장을 분리, 너무 짧은 의미없는 단어를 제거하거나 하는 전처리 과정
- 전처리를 위해 사전학습용 전처리 툴을 제작, 문장분리, 정규식 옵션, 최소, 최대 길이 설정 등의 기능을 넣었고, ray를 활용한 병렬처리를 적용해 전처리 속도를 높혔다.

https://github.com/sputnik7565/ko_corpus_preprocessor

 

GitHub - sputnik7565/ko_corpus_preprocessor: korean corpus preprocessor for PLM Pre-training

korean corpus preprocessor for PLM Pre-training. Contribute to sputnik7565/ko_corpus_preprocessor development by creating an account on GitHub.

github.com

 






3. 단어사전 생성
- 모델 학습에 필요한 vocab.txt를 생성하는 과정
- 단어사전 생성에는 전처리된 말뭉치가 필요하고, 학습 조건에 맞는 단어사전 길이 정의 및 토큰 설정이 필요하다.
본 테스트의 파라미터는 최대한 monologg 님의 koelectra-small 모델과 비교하기 위해, 동일한 파라미터를 적용했다.
vocab size: 32200개, 이 중 unused 토큰은 200개





4. 사전학습용 데이터셋 생성
- 일렉트라모델 사전학습을 위해서는 사전학습용 데이터셋이 필요함
- 사전학습용 데이터셋 생성에는 전처리된 코퍼스와, 단어사전이 필요함
- 전처리된 코퍼스를 특정 갯수로 분할하면 데이터셋 생성 옵션에서 병렬처리 개수를 지정해 데이터셋 생성 속도를 향상시킬 수 있음

사전학습용 데이터셋





5. 사전학습
- 일렉트라모델 사전학습에는 사전학습용 데이터셋과 단어사전이 필요함
- base 모델을 학습시킬 것인지, small 모델을 학습시킬 것인지에 따라 파라미터가 달라짐(google electra 공식 레퍼런스 및 monologg님의 KoELECTRA 파라미터 참고)

사전학습된 ckpt

 

사전학습 모델의 loss

- loss 그래프가 90만 스탭 이후 갑자기 뛴 것을 확인할 수 있다. 이때 사전학습 돌리던 PC가 멈추는 바람에 백업 후 포맷, 환경세팅을 다시 진행하고 이어서 학습을 시켰는데...갑자기 저렇게 뛴 이유는 모르겠다.
- 90만 스탭의 체크포인트와 100만 스탭의 체크포인트 점수는 대략 2.5점 정도가 차이가 나서 nsmc만 파인튜닝 해봤는데 정확도는 100만 스탭의 체크포인트가 더 높았음





6. 파인튜닝
- 사전학습된 모델을 KoELECTRA 모델과의 성능 평가를 위해 각 Subtask에 대해 학습 테스트
- 파인튜닝 파이프라인은 monologg 님이 작성해 주신 허깅페이스 모델용 finetuning 코드를 활용
- 이를 위해, 사전학습된 ckpt 데이터를 torch 모델로 포팅하는 과정을 거침

github monologg/KoELECTRA 점수





사전학습 결과

- 전처리된 코퍼스 11g, 단어사전 길이 32200, electra-small 모델 기준으로 총 100만 스탭을 학습
- 단일 gpu 3060 12g 기준 electra-small 모델 사전학습 train batch-size 는 12가 최대, 100만 스탭 학습에는 9일 정도가 소요됨(쉽게 말해, 일반 가정에 있는 게이밍 데스크탑 PC로 사전학습을 수행한 결과라고 생각하면 됨) * gpu 3080 8g, 2060 super 8g 의 경우 small 모델 기준 train batch-size 는 4가 최대였음

- finetune 점수

  NSMC
(acc)
Naver NER
(F1)
PAWS
(acc)
KorNLI
(acc)
KorSTS
(spearman)
Question Pair
(acc)
KorQuaD (Dev)
(EM/F1)
Korean-Hate-Speech (Dev)(F1) Train Steps, Batch Size Train Time
KoElectra-Small 88.83 84.38 73.1 76.45 76.56 93.01 58.04/86.76 63.03 30m step, batch size 512 3일
Test Electra-Small 85.06 75.64 69.2 74.17 73.01 91.95 56.75/84.14 55.72 37.5m step,
batch size 12
3일
Test Electra-Small 87.6 82.29 69.9 75.34 74.54 93.13 57.88/85.19 57.24 100m step,
batch size 12
9일

 

이미지

* 학습 결과 PAWS, KHS 태스크를 제외한 태스크의 Ko-Electra와의 정확도 차이는 1~2 점 사이 이내를 보이며, Question Pair 의 경우는 근소하게나마 높은 점수를 보였다.

 


인사이트


1. 사전학습 시 loss 값의 차이보다 train-batchsize와 train-step 의 양이 정확도 향상에 주요 요인으로 보임
2. 공식 모델의 경우, 사전학습 파라미터를 그대로 유지하면 학습이 도중 끊어지더라도 재학습시 이어서 학습 가능
3. train-batchsize를 높일 수록 학습에 들어가는 시간을 줄일 수 있음
4. 특정 도메인에 맞춰 사전학습이 요구 될 경우, TPU나 서버용 GPU를 활용하는 방법이 가장 효율적으로 보이나,
일반 RTX gpu 환경(memory 12g 이상)에서도 일정 수준의 정확도를 보여주는 사전학습이 가능했음.
이는 환경이 열악한 개발 업체나 학생 등도 일렉트라 모델 사전학습을 수행하고 활용할 수 있다는 것을 확인할 수 있음




테스트 중 발생한 이슈


1. 일렉트라 공식 모델은 TF 1.15 버전이 요구되는데 RTX3000번대 환경은 TF 1.15 버전의 경우 메모리 이슈가 있어
구동이 어려웠음. 이를 해결하기 위한 방법은
가. TF 2.X 번대의 모델을 찾거나,
나. TF 1.15 -> TF 2.X 번대로 마이그레이션,
다. WLS2 환경에서 TF 1.15 세팅,
라. 직접 TF 2.X 버전으로 작성 하는 방법을 생각할 수 있었음.
기타. 2000번대 gpu를 구하던지..

가. TF 2.X 버전 일렉트라 모델
- nvidia에서 제공하는 공식 모델이 있으나, 멀티 및 서버용 GPU 기반으로 작성되어 있음.
- 일반적인 RTX환경에서의 테스트는 시간이 오래 걸릴 것으로 판단

나, 다의 방법이 가장 리소스를 적게 들이면서 테스트 할 수 있는 방법이었음. 실제로 사전학습까지 성공했고,
둘 사이의 테스트 결과는 차이가 없는 것으로 확인 후 2번 방법으로 테스트를 수행

라. 직접 TF 2.0버전으로 작성하는 방법은 리소스가 너무 많이 소모될 것으로 예상되어 패스함



2. 동일한 코퍼스로 electra-base 모델 사전학습 테스트 결과

- train batchsize 4 까지 돌아가고, 70만 스탭(약 4일)을 학습 후 nsmc 만 테스트 해본 결과, 정확도가 50점 대로 학습이 제대로 이루어 지지 않은 것을 확인

- 단일 GPU 12g 로는 electra-base 모델은 사전학습이 어려운 것으로 결론

 

 



ELECTRA Reference를 RTX 30XX 번대 기준 tensorflow=1.15 버전 구동시 메모리 오류 발생.

해결 방안

1. electra 레퍼런스를 tensorflow=2.X 번대로 마이그레이션 -> https://www.tensorflow.org/guide/migrate?hl=ko,
마이그레이션 시에 contrib 라이브러리 관련 문제(기존 contrib 라이브러리 대신 tf-slim 이나 tf.keras 모듈 사용) -> https://toramko.tistory.com/entry/tensorflow-%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C%EC%9A%B0-contrib-v1-v2-%EC%BD%94%EB%93%9C-%EC%97%85%EA%B7%B8%EB%A0%88%EC%9D%B4%EB%93%9C-3,


2. wsl Ubuntu 환경에서 TF1.15 세팅 후 구동 -> https://www.pugetsystems.com/labs/hpc/How-To-Install-TensorFlow-1-15-for-NVIDIA-RTX30-GPUs-without-docker-or-CUDA-install-2005/


3. wsl 환경에서 pre-train 시 화면 멈춤 증상 발생 -> 윈도우 커멘드에서 wsl 업데이트 실행





Reference

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

 

2주 간의 KoELECTRA 개발기 - 1부

2주 간의 KoELECTRA 개발을 마치고, 그 과정을 글로 남기려고 한다. 이 글을 읽으신 분들은 내가 했던 삽질(?)을 최대한 덜 하길 바라는 마음이다:) 1부에는 실제 학습을 돌리기 전까지의 과정을 다룰

monologg.kr


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

 

2주 간의 KoELECTRA 개발기 - 2부

2주 간의 KoELECTRA 개발을 마치고, 그 과정을 글로 남기려고 한다. 이 글을 읽으신 분들은 내가 했던 삽질(?)을 최대한 덜 하길 바라는 마음이다:) 2부에는 Pretraining, Finetuning 등을 다룰 예정이다. Gith

monologg.kr


https://github.com/google-research/electra

 

GitHub - google-research/electra: ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators

ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators - GitHub - google-research/electra: ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators

github.com


https://github.com/monologg/KoELECTRA

 

GitHub - monologg/KoELECTRA: Pretrained ELECTRA Model for Korean

Pretrained ELECTRA Model for Korean. Contribute to monologg/KoELECTRA development by creating an account on GitHub.

github.com


https://github.com/NVIDIA/DeepLearningExamples/tree/master/TensorFlow2/LanguageModeling/ELECTRA

 

GitHub - NVIDIA/DeepLearningExamples: Deep Learning Examples

Deep Learning Examples. Contribute to NVIDIA/DeepLearningExamples development by creating an account on GitHub.

github.com

 

반응형

'AI > AI model' 카테고리의 다른 글

RTX 30XX 번대 GPU에서 구글 공식 Electra 레퍼런스 구동  (0) 2022.08.08
Electra  (0) 2022.07.20
transfer learning  (0) 2022.04.26