ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BERT] BERT에 대해 쉽게 알아보기2 - colab으로 BERT Pretraining(수정)
    ✨ AI/NLP 2020. 3. 26. 16:14

    ** 이전 포스팅 코랩 노트북을 따라하시다가 오류가 난다는 분이 많아서, 코드를 쭉 수정하였습니다.

     

    ● BERT모델로 대량의 코퍼스 사전훈련 시키기

     

     

    구글이 만든 사전훈련 모델 'BERT'로 대량의 코퍼스를 가지고 사전훈련을 시키는 방법을 포스팅 하도록 하겠습니다.

    그리고 이 다음 포스팅에서는 사전훈련된 모델로 NLP모델 Task에 전이학습 시키는 방법을 포스팅 할 예정입니다.

     

    BERT는 위키디피아 같은 대량의 코퍼스를 사용해서 사전훈련을 시키고 언어의 기본적인 패턴을 이해한 워드임베딩을 추출해냅니다. 이렇게 사전훈련을 통해 생성된 임베딩으로 새로운 문제에 적용하는 전이학습(transfer learning)을 수행하여 적은데이터로 기존 ML, DL모델에 적용하여 빠르게 학습이 가능합니다.

     

     

    BERT가 무엇인지 알아보려면 이전 포스팅을 참고해주세요.

    2020/02/12 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기1 - BERT는 무엇인가, 동작 구조

     

    [BERT] BERT에 대해 쉽게 알아보기1 - BERT는 무엇인가, 동작 구조

    ● 언어모델 BERT BERT : Pre-training of Deep Bidirectional Trnasformers for Language Understanding 구글에서 개발한 NLP(자연어처리) 사전 훈련 기술이며, 특정 분야에 국한된 기술이 아니라 모든 자연어..

    ebbnflow.tistory.com

     

    이미 훈련된 BERT모델을 Hugging Face(파이토치)나 텐서플로우 허브를 가져와 Bert-layer로 주입시켜 사용하는 방법도 있으나, 특정 도메인에 대한 Pretrained 모델이 필요할 경우 직접 bert pretrain을 진행할 수 있고 이번 포스팅에서 다뤄보도록 하겠습니다.

     

     

    텐서플로우 BERT 공식 페이지

     

    google-research/bert

    TensorFlow code and pre-trained models for BERT. Contribute to google-research/bert development by creating an account on GitHub.

    github.com

     

    원래는 T academy 김성현님의 PPT 파일을 참고하여 pretrain 코드를 작성했으나,

    이번에는 Beomi님의 KcBert 코드를 사용하여 pretrain코드를 작성했습니다.

     

     

     


     

     

    1. colab 설정

    !pip list | grep tensorflow
    # console result
    tensorflow                    2.4.1         
    tensorflow-datasets           4.0.1         
    tensorflow-estimator          2.4.0         
    tensorflow-gcs-config         2.4.0         
    tensorflow-hub                0.11.0        
    tensorflow-metadata           0.29.0        
    tensorflow-probability        0.12.1     

    코랩은 기본적으로 tensorflow 2버전대가 설정되어있습니다. 구글에서 공개한 Bert 모델을 사용하기 위해서는 1버전대가 필요합니다.

     

    %tensorflow_version 1.x
    # console result
    TensorFlow 1.x selected.

    1.x 버전대로 설정해줍니다.

     

    from google.colab import drive
    drive.mount('/content/gdrive')

    그리고 내 google drive와 연동을 해줍니다.

     

    !mkdir "content/gdrive/My Drive/Colab Notebooks/bert-pretrain-v2"
    %cd "/content/gdrive/My Drive/Colab Notebooks/bert-pretrain-v2"

    그리고 bert pretrain을 위한 폴더를 하나 생성해주고, 해당 폴더로 이동합니다.

     

    코랩 TPU 학습을 위해서는 구글 클라우드 스토리지인 GCS가 필요합니다.

    GCS는 AWS S3와 같은 클라우드 저장소 입니다. 처음 계정을 생성하면 90일간 사용할 수 있는 300불을 줍니다.

    GCS 계정이 없다면 console.cloud.google.com/?hl=ko에서 계정과 버킷을 생성해줍니다.

     

     

     

     

    2. TPU 설정 및 Data set 준비

     

    이전에는 직접 txt 파일을 다운받아 학습을 진행했었는데,

    이번에는 Korpora라는 한국어 데이터를 위한 패키지를 설치하고 Korpora를 이용해서 데이터를 다운로드 하도록 하겠습니다.

     

    Korpora 페이지

     

    Korpora가 제공하는 말뭉치 목록은 다음과 같습니다.

    Corpus Name Description Link
    korean_chatbot_data 챗봇 트레이닝용 문답 페어 https://github.com/songys/Chatbot_data
    kcbert KcBERT 모델 학습용 댓글 데이터 https://github.com/Beomi/KcBERT
    korean_hate_speech 한국어 혐오 데이터셋 https://github.com/kocohub/korean-hate-speech
    korean_petitions 청와대 국민 청원 https://github.com/lovit/petitions_archive
    kornli Korean NLI https://github.com/kakaobrain/KorNLUDatasets
    korsts Korean STS https://github.com/kakaobrain/KorNLUDatasets
    kowikitext 한국어 위키 텍스트 https://github.com/lovit/kowikitext/
    namuwikitext 나무위키 텍스트 https://github.com/lovit/namuwikitext
    naver_changwon_ner 네이버 x 창원대 개체명 인식 데이터셋 https://github.com/naver/nlp-challenge/tree/master/missions/ner
    nsmc NAVER Sentiment Movie Corpus https://github.com/e9t/nsmc
    question_pair 한국어 질문쌍 데이터셋 https://github.com/songys/Question_pair
    modu_news 모두의 말뭉치: 신문 https://corpus.korean.go.kr
    modu_messenger 모두의 말뭉치: 메신저 https://corpus.korean.go.kr
    modu_mp 모두의 말뭉치: 형태 분석 https://corpus.korean.go.kr
    modu_ne 모두의 말뭉치: 개체명 분석 https://corpus.korean.go.kr
    modu_spoken 모두의 말뭉치: 구어 https://corpus.korean.go.kr
    modu_web 모두의 말뭉치: 웹 https://corpus.korean.go.kr
    modu_written 모두의 말뭉치: 문어 https://corpus.korean.go.kr
    aihub_translation 한국어-영어 번역 말뭉치 https://aihub.or.kr/aidata/87
    open_subtitles 영화 자막 한영 병렬 말뭉치 http://opus.nlpl.eu/OpenSubtitles-v2018.php
    korean_parallel_koen_news 한국어-영어 병렬 말뭉치 https://github.com/jungyeul/korean-parallel-corpora

     

    우리는 이 중 KcBERT 트레인 데이터를 사용하도록 하겠습니다.

    KcBERT 데이터
    "공개된 한국어 BERT는 대부분 한국어 위키, 뉴스 기사, 책 등 잘 정제된 데이터를 기반으로 학습한 모델입니다. 한편, 실제로 NSMC와 같은 댓글형 데이터셋은 정제되지 않았고 구어체 특징에 신조어가 많으며, 오탈자 등 공식적인 글쓰기에서 나타나지 않는 표현들이 빈번하게 등장합니다.KcBERT는 위와 같은 특성의 데이터셋에 적용하기 위해, 네이버 뉴스에서 댓글과 대댓글을 수집해, 토크나이저와 BERT모델을 처음부터 학습한 Pretrained BERT 모델입니다." - github.com/Beomi/KcBERT

     

    !pip install -q Korpora
    !pip install -q tokenizers
    !git clone -q https://github.com/google-research/bert
    # console result
    	|████████████████████████████████| 61kB 1.8MB/s 
         |████████████████████████████████| 81kB 2.5MB/s 
         |████████████████████████████████| 102kB 6.0MB/s 
         |████████████████████████████████| 3.3MB 6.7MB/s 
    fatal: destination path 'bert' already exists and is not an empty directory.

    Korpora, tokenizer, bert를 google drive에 다운로드 합니다.

    # dependencies import
    import os
    import sys
    import json
    import random
    import logging
    
    import nltk
    import tensorflow as tf
    from tensorflow.keras.utils import Progbar
    
    from glob import glob
    from google.colab import auth, drive
    
    sys.path.append("bert")
    
    from bert import modeling, optimization, tokenization
    from bert.run_pretraining import input_fn_builder, model_fn_builder

    그리고 필요한 모듈들을 import하고 다운로드 받은 bert의 경로를 추가해줍니다.

    glob는 파일들의 리스트를 뽑을 때 사용하는 모듈이고, google.colab의 auth, driver 모듈을 이용해 GCS를 코랩과 연동합니다.

     

    # GCS 계정 연동
    auth.authenticate_user()

    링크가 뜨면 버킷을 생성한 계정으로 접속해서 토큰을 복사하고 다시 코랩으로 돌아와 붙여넣어주면 연동 성공입니다.

     

     

    # log 정의
    logger = logging.getLogger('tensorflow')
    logger.setLevel(logging.INFO)
    # log format 정의
    formatter = logging.Formatter('%(asctime)s : %(message)s')
    sh = logging.StreamHandler()
    sh.setFormatter(formatter)
    logger.handlers = [sh]
    
    # colab TPU 설정
    if 'COLAB_TPU_ADDR' in os.environ:
      logger.info('Using TPU runtime')
      USE_TPU = True
      TPU_ADDRESS = 'grpc://' + os.environ['COLAB_TPU_ADDR']
      # 세션이 변경되면 tpu 주소가 바뀌기 때문에 설정
    
      with tf.Session(TPU_ADDRESS) as session:
        logger.info('TPU address is ' + TPU_ADDRESS)
        with open('/content/adc.json', 'r') as f: 
          # GCS /content/abc.json에 설정한 과정이 저장되고 이 설정파일로 TPU 사용
          auth_info = json.load(f)
        tf.contrib.cloud.configure_gcs(session, credentials=auth_info)
    
    else:
      raise Exception("런타임 -> 런타임 유형변경 -> TPU")

    그리고 로그를 tensorflow.log라는 파일에 저장하기 위해 logging을 설정해주고, 포맷까지 설정해줍니다.

    그리고 세션이 변경되면 tpu 주소가 바뀌기때문에 COLAB_TPU_ADDR 환경변수를 통해 tpu 주소를 가져옵니다.

    GCS에 /content/abc.json에 위에 설정한 과정이 저장되고 이 설정파일로 TPU를 사용하게 됩니다.

    이렇게 설정해주면 세션이 변경되도 계속 학습을 진행할 수 있게 됩니다.

     

     

    # Korpora를 통해 kcbert 데이터를 불러옵니다.
    from Korpora import Korpora
    
    Korpora.fetch('kcbert', root_dir='.')
    # console result
    [kcbert] download kcbert-train.tar.gzaa: 100%|██████████| 2.10G/2.10G [00:35<00:00, 59.4MB/s]
    [kcbert] download kcbert-train.tar.gzab: 100%|██████████| 2.10G/2.10G [00:31<00:00, 66.9MB/s]
    [kcbert] download kcbert-train.tar.gzac: 671MB [00:09, 73.6MB/s]                           
    Unzip tar. It needs a few minutes ... done

    Korpora 패키지를 통해 kcbert 데이터셋을 내 드라이브경로/kcbert/ 에 다운로드 해줍니다.

     

    !ls kcbert/
    # console result
    20190101_20200611_v2.txt  kcbert-train.tar.gzab
    kcbert-train.tar.gzaa	  kcbert-train.tar.gzac

    그리고 데이터가 잘 다운 됬는지 확인해봅시다.

     

    # 이미 전처리가 완료된 데이터
    check_data = []
    with open('kcbert/20190101_20200611_v2.txt', 'r') as f:
      for i in range(10):
        check_data.append(f.readline())
    check_data
    # console result
    ['우리에게 북한은 꼭 없애야 할 적일뿐\n',
     '문재앙 탄핵 원하면 추천 눌러주세요!! 여론의 힘을 보여줍시다\n',
     '김정은이 트럼프를 개호구 문재인으로 착각했나봄ㅋㅋ\n',
     '부칸이 밑장빼기하다가 딱 걸렸군\n',
     '북한 욕하면 친일이란 그딴 사고방식은 김일성 종합대학에서 배웠니? ㅋㅋ\n',
     '처음부터 북한은 비핵화할 생각이 없다고 보았는데\n',
     'ㅋㅋㅋ 북한 핵돼지 60시간 넘게 개고생하면서 기차 타고 왔는데 트럼프가 빅엿 날리네ㅋㅋㅋ\n',
     '문모씨의 북한팔이도 이제 끝이네요\n',
     '뻔하지머. 트럼프: 비핵화 플랜 내놔라. 김정은: 우선 경제 제재부터 풀어달라. 끝~\n',
     '문재인 작살났네. 개성공단 개박살났네. 금강산 불났네. 남북철도연결은 폭탄맞았네.\n']

    데이터를 10줄만 확인해봅시다. kcbert 데이터는 이미 전처리가 완료된 데이터므로 그대로 vocab 생성에 사용하면 됩니다.

    만약 전처리가 안된 데이터들이라면 따로 전처리후 학습 txt 파일을 생성해주어야 합니다.

     

     

     

     

     

    3. vocab 생성

     

    KcBERT 데이터는 12GB로 Colab으로 실행시 Colab 시간 제약 시간인 24시간 안에 끝낼 수 없다고 합니다.

    총 데이터 중 100만개만 학습해보도록 하겠습니다.

    DEMO_MODE = True #@param {type:"boolean"}
    
    if DEMO_MODE:
        CORPUS_SIZE = 1000000 #@param {type:"number"}
        !(head -n $CORPUS_SIZE kcbert/20190101_20200611_v2.txt) > dataset.txt  
    else:
        !mv kcbert/20190101_20200611_v2.txt dataset.txt

     

    !ls -lh dataset.txt
    # console result
    -rw------- 1 root root 144M Apr 16 02:22 dataset.txt

     

    # 데이터셋 split
    !mkdir ./shards
    !split -a 4 -l 256000 -d dataset.txt ./shards/shard_
    !ls ./shards/
    # console result
    shard_0000  shard_0001	shard_0002  shard_0003

    그리고 데이터셋을 256000개씩 나눠줍니다. 그러면 4개의 파일이 생성됩니다.

     

    # huggingface의 Tokenizer 라이브러리로 Tokenizer 생성
    from tokenizers import BertWordPieceTokenizer
    
    tokenizer = BertWordPieceTokenizer(lowercase=False, strip_accents=False)
    tokenizer.train(['dataset.txt'], vocab_size=13004, limit_alphabet=3000)

    그리고 google의 wordpiece 토크나이저를 통해 vocab을 생성해주는데,

    vocab사이즈는 만개정도, 단일 글자 최대는 3000개, bert문자는 4개로 생성해줍니다.

     

    BertWordPieceTokenizer의 옵션에서 한국어를 사용할 때 lowercase=False를 지정해주는데, 이와 동시에 strip_accents 옵션도 False로 지정해주어야 합니다. 그렇지 않으면 ㄱ ㅡ ㄴ 와 같이 단어가 분리된 형태까지 학습되어서 토크나이저 학습이 잘 되지 않습니다. 

    저의 경우는 여기부터 모델이꼬여버려서 loss 값이 굉장히 이상하게 나왔는데,

    중간 중간 토큰을 잘 확인해줍시다..

     

    tokenizer.save_model('.')
    # console result
    ['./vocab.txt']

    이렇게 생성한 vocab은 내 google 드라이브/생성한폴더/vocab.txt에 저장합니다.

     

    !tail -n 20 vocab.txt
    # console result
    나몰라라
    남여
    못잡
    우익
    주머니
    프랑
    ##키스탄
    ##공립
    반대한다
    정도껏
    행동은
    다니고
    네이버는
    알아야지
    저러니
    오르면
    소리는
    자진
    쪽발
    철면피

     

    단어 맨 끝에 20개 확인

    vocab을 생성할 때 wordpiece, sentencepiece, 형태소 분석기 등을 사용할 수 있고 vacab을 생성한 뒤, Tokenizer로 텍스트를 자릅니다. 학습된 vocab을 BERT가 이해하려면 _로 시작한 토큰을 ##로 바꿔주고 [PAD], [UNK],[CLS], [SEP], [MASK]와 같은 BERT에서 사용하는 특수 토큰 정보를 추가해주어야 합니다. 이를 BertWordPieceTokenizer가 해준뒤 생성된 토큰을 한줄 한줄 저장한 vocab.txt에 저장하였습니다.

     

     

     

     

    4. BERT 파라미터 설정

     

    BERT Parameters

    • MAX_SEQ_LENGTH: BERT의 모델 입력의 최장 토큰 길이 이 이상으로는 BERT모델이 이해하지 못한다.
    • MASKED_LM_PROB: BERT의 학습 중 Masked LM의 비율을 조정한다.
    • MAX_PREDICTIONS: Sequence별 예측할 최대 숫자
    • DO_LOWER_CASE: 영문자를 lower(소문자화) 할 지.
    • PROCESSES: 전처리할때 CPU 몇개 쓸지
    • PRETRAINING_DIR: 프리트레인 데이터 폴더 이름
    • VOC_FNAME: 방금 만들어준 vocab.txt 위치
    MAX_SEQ_LENGTH = 128 #@param {type:"integer"}
    MASKED_LM_PROB = 0.15 #@param
    MAX_PREDICTIONS =  20#@param {type:"integer"}
    DO_LOWER_CASE = False #@param {type:"boolean"}
    PROCESSES = 4 #@param {type:"integer"}
    PRETRAINING_DIR = "pretraining_data" #@param {type:"string"}
    VOC_FNAME = 'vocab.txt' #@param {type:"string"}

     

     

    XARGS_CMD = ("ls ./shards/ | "
                 "xargs -n 1 -P {} -I{} "
                 "python3 bert/create_pretraining_data.py "
                 "--input_file=./shards/{} "
                 "--output_file={}/{}.tfrecord "
                 "--vocab_file={} "
                 "--do_lower_case={} "
                 "--max_predictions_per_seq={} "
                 "--max_seq_length={} "
                 "--masked_lm_prob={} "
                 "--random_seed=34 "
                 "--dupe_factor=5")
    
    XARGS_CMD = XARGS_CMD.format(PROCESSES, '{}', '{}', PRETRAINING_DIR, '{}', 
                                 VOC_FNAME, DO_LOWER_CASE, 
                                 MAX_PREDICTIONS, MAX_SEQ_LENGTH, MASKED_LM_PROB)
    
    tf.gfile.MkDir(PRETRAINING_DIR)
    !$XARGS_CMD
    # console result
    ...중략
    INFO:tensorflow:tokens: [CLS] 신경쓰 ##지말고 앞으로도 너의 [MASK] ##길 쭉 가 ##길 b ##t [MASK] 개념 ##돌 제 ##이 ##홉 의 선 ##한 영향 ##력 💚 ##💚 ##💚 [MASK] [MASK] 개념 ##돌 방 ##탄 ##소 ##년 ##단 제 ##이 ##홉 세월호 . 518 . . [MASK] 이제는 종교 ##수준이 되어 버 [MASK] . . [MASK] 하 . . . 이게 나라냐 . . . 세계 ##적인 [MASK] ##퍼 ##스타 [MASK] 될 ##만한 의식 [MASK] 갖 ##춘 제 ##이 ##홉 ! 방 ##탄 제 [MASK] ##홉 응원 ##하고 그리고 너무나 자랑 ##스럽 ##습니다 ##💜 ##💜 대중 ##문화 속 ##에서 사라 ##져 ##가는 6 . [MASK] [SEP] [MASK] ##새기 ##는 [MASK] ##끼 ##빠 ##빠 ##를 모르 [MASK] 진단서를 . . . 그러니까 욕 ##쳐먹고 ##다니는 ##거지 [MASK] . [MASK] . 쯧 [SEP]
    I0416 02:46:13.989120 139952755574656 create_pretraining_data.py:151] tokens: [CLS] 신경쓰 ##지말고 앞으로도 너의 [MASK] ##길 쭉 가 ##길 b ##t [MASK] 개념 ##돌 제 ##이 ##홉 의 선 ##한 영향 ##력 💚 ##💚 ##💚 [MASK] [MASK] 개념 ##돌 방 ##탄 ##소 ##년 ##단 제 ##이 ##홉 세월호 . 518 . . [MASK] 이제는 종교 ##수준이 되어 버 [MASK] . . [MASK] 하 . . . 이게 나라냐 . . . 세계 ##적인 [MASK] ##퍼 ##스타 [MASK] 될 ##만한 의식 [MASK] 갖 ##춘 제 ##이 ##홉 ! 방 ##탄 제 [MASK] ##홉 응원 ##하고 그리고 너무나 자랑 ##스럽 ##습니다 ##💜 ##💜 대중 ##문화 속 ##에서 사라 ##져 ##가는 6 . [MASK] [SEP] [MASK] ##새기 ##는 [MASK] ##끼 ##빠 ##빠 ##를 모르 [MASK] 진단서를 . . . 그러니까 욕 ##쳐먹고 ##다니는 ##거지 [MASK] . [MASK] . 쯧 [SEP]
    ....중략

    XARGS 설정 설정시 대략 15-20분정도 소요됬음

     

    BUCKET_NAME = "자신의 버킷명 입력" #@param {type:"string"}
    MODEL_DIR = "bert_model" #@param {type:"string"}
    tf.gfile.MkDir(MODEL_DIR)
    
    assert BUCKET_NAME != ''

    BUCKET_NAME에 GCS에서 생성한 버킷의 이름을 적어주고,

     

     

    # Token size, Max Length를 제외한 나머지는 Bert Base 모델과 동일한 파라미터
    bert_base_config = {
      "attention_probs_dropout_prob": 0.1, 
      "directionality": "bidi", 
      "hidden_act": "gelu", 
      "hidden_dropout_prob": 0.1, 
      "hidden_size": 768, 
      "initializer_range": 0.02, 
      "intermediate_size": 3072, 
      "max_position_embeddings": 512, 
      "num_attention_heads": 12, 
      "num_hidden_layers": 12, 
      "pooler_fc_size": 768, 
      "pooler_num_attention_heads": 12, 
      "pooler_num_fc_layers": 3, 
      "pooler_size_per_head": 128, 
      "pooler_type": "first_token_transform", 
      "type_vocab_size": 2, 
      "vocab_size": 13004, # <- 원래는 3만개+
    }
    
    with open("{}/bert_config.json".format(MODEL_DIR), "w") as fo:
      json.dump(bert_base_config, fo, indent=2)
      
    !cp vocab.txt $MODEL_DIR

    BERT model의 파라미터를 설정해 줍니다. 원래 bert base 모델은 단어 사이즈가 3만개였고, kcbert 트레인셋의 100만개 데이터에는 원본 저자가 13004개로 설정하셨고 일단 똑같이 설정해주었습니다.

     

    !ls $MODEL_DIR
    # console result
    bert_config.json  vocab.txt

    bert_model/ 디렉토리에 bert 설정파일과, 단어사전이 저장되어있는 것을 확인

     

    # 학습데이터, Bert Config json, Vocab를 GCS 버킷에 업로드
    if BUCKET_NAME:
        !gsutil -m cp -r $MODEL_DIR $PRETRAINING_DIR gs://$BUCKET_NAME

    bert설정파일(bert_config.json)과 단어사전(vocab.txt)를 GCS의 버킷에 업로드합니다.

     

     

     

    # Input data pipeline config
    TRAIN_BATCH_SIZE = 128 #@param {type:"integer"}
    MAX_PREDICTIONS = 20 #@param {type:"integer"}
    MAX_SEQ_LENGTH = 128 #@param {type:"integer"}
    MASKED_LM_PROB = 0.15 #@param
    
    # Training procedure config
    EVAL_BATCH_SIZE = 64
    LEARNING_RATE = 2e-5
    TRAIN_STEPS = 1000000 #@param {type:"integer"}
    SAVE_CHECKPOINTS_STEPS = 2500 #@param {type:"integer"}
    NUM_TPU_CORES = 8
    
    if BUCKET_NAME != '.':
      BUCKET_PATH = "gs://{}".format(BUCKET_NAME)
    else:
      BUCKET_PATH = "."
    
    BERT_GCS_DIR = "{}/{}".format(BUCKET_PATH, MODEL_DIR)
    DATA_GCS_DIR = "{}/{}".format(BUCKET_PATH, PRETRAINING_DIR)
    
    VOCAB_FILE = os.path.join(BERT_GCS_DIR, VOC_FNAME)
    CONFIG_FILE = os.path.join(BERT_GCS_DIR, "bert_config.json")
    
    INIT_CHECKPOINT = tf.train.latest_checkpoint(BERT_GCS_DIR)
    
    bert_config = modeling.BertConfig.from_json_file(CONFIG_FILE)
    input_files = tf.gfile.Glob(os.path.join(DATA_GCS_DIR,'*tfrecord'))
    
    logger.info("Using checkpoint: {}".format(INIT_CHECKPOINT))
    logger.info("Using {} data shards".format(len(input_files)))

    그리고 train을 위한 파라미터를 설정합니다.

    Train step을 100만으로 주었을 때 1epoch 학습이 됩니다.

    2500 스텝별로 GCS에 결과를 저장하고 이어서 학습하도록 설정한 것입니다.

    colab의 tpu는 v3-8로 tpu코어는 최대 8개 입니다.

    시퀀스 길이에 상응하는 적절한 배치사이즈

     

    model_fn = model_fn_builder(
          bert_config=bert_config,
          init_checkpoint=INIT_CHECKPOINT,
          learning_rate=LEARNING_RATE,
          num_train_steps=TRAIN_STEPS,
          num_warmup_steps=10000,
          use_tpu=USE_TPU,
          use_one_hot_embeddings=True)
    
    tpu_cluster_resolver = tf.contrib.cluster_resolver.TPUClusterResolver(TPU_ADDRESS)
    
    run_config = tf.contrib.tpu.RunConfig(
        cluster=tpu_cluster_resolver,
        model_dir=BERT_GCS_DIR,
        save_checkpoints_steps=SAVE_CHECKPOINTS_STEPS,
        tpu_config=tf.contrib.tpu.TPUConfig(
            iterations_per_loop=SAVE_CHECKPOINTS_STEPS,
            num_shards=NUM_TPU_CORES,
            per_host_input_for_training=tf.contrib.tpu.InputPipelineConfig.PER_HOST_V2))
    
    estimator = tf.contrib.tpu.TPUEstimator(
        use_tpu=USE_TPU,
        model_fn=model_fn,
        config=run_config,
        train_batch_size=TRAIN_BATCH_SIZE,
        eval_batch_size=EVAL_BATCH_SIZE)
      
    train_input_fn = input_fn_builder(
            input_files=input_files,
            max_seq_length=MAX_SEQ_LENGTH,
            max_predictions_per_seq=MAX_PREDICTIONS,
            is_training=True)

    tpu위치와 gcs 위치를 tensorflow가 가져와서 gcs에 있는 데이터를 학습합니다.

    model_df는 딥러민 모델 설정객체이고, tpu와 연결하고 checkpoint 저장 경로를 지정합니다.

    tpu estimator를 통해 모델 객체, 설정 객체를 전달하고 estimator.train()을 통해 학습을 진행합니다.

     

     

     

    5. BERT Pretrain

    estimator.train(input_fn=train_input_fn, max_steps=TRAIN_STEPS)

    estimator.train을 통해 bert pretrain을 시작합니다. 

    (저의 경우는 에러가 나지 않았는데 에러가 나는 경우는 google colab 버그로 tpu 에러가 날시 bucket 권한을 allUser R/W로 변경합니다.)

     

     

     

    글을 작성하고 있는 중에도 학습이 끝나지 않았습니다...

    이어서 작성하도록 하겠습니다....

     

     

    학습이 완료되면, SAVE_CHECKPOINTS_STEP으로 지정한 체크포인트들은 GCS 버킷 bert_model/ 폴더에 저장된다.

    여기서 생성된 사전훈련 .ckpt모델로 전이학습을 하면 됩니다.

     

     

     

    BERT 시리즈

    BERT는 무엇인가, 동작 구조

    2020/02/12 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기1 - BERT는 무엇인가, 동작 구조

    BERT 사전훈련시키기

    2020/03/26 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기2 - BERT 사전훈련시키기(텐서플로우)

    BERT tf-hub이용, 캐글 분류 문제

    2020/03/27 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기3 - tf-hub BERT layer를 이용한 캐글 분류문제

    BERT 파인튜닝

    2020/03/30 - [SW개발/AI Development] - [BERT] BERT에 대해 쉽게 알아보기4 - BERT 파인튜닝

     


     

     

     

     

    [References]

     

    Naver-Movie-Review Hugging Face BERT(파이토치 트랜스포머사용)

    Fine-tuning BERT with Keras and tf.Module

    Predicting Movie Reviews with BERT on TF Hub.ipynb

    Simplte Text Classification using BERT TensorFlow Keras 2.0

    BERT fine-tuning for Tensorflow 2.0 with Keras API

    Korpora

    KcBERT

    댓글

Designed by Tistory.