XLNet: 언어 이해를 위한 범용 자동 회귀 사전 학습(TF 2.x)

이 가이드에서는 Cloud TPU에서 Bidirectional Encoder Representations from Transformers(BERT) 모델을 학습시키는 방법을 보여줍니다.

XLNet은 분해 순서의 모든 순열에 대한 예상 가능성을 최대화하여 양방향 컨텍스트를 학습할 수 있는 일반화된 자동 회귀 BERT와 유사한 사전 학습 언어 모델입니다. Transformer-XL에 도입된 세그먼트 레벨 반복 메커니즘 및 상대 위치 인코딩 방식을 사용하여 시간적 일관성을 방해하지 않고 고정 길이를 초과하는 종속 항목을 학습할 수 있습니다. XLNet은 20개의 NLP 벤치마크 작업에서 BERT를 능가하며 질의응답, 자연어 추론, 감정 분석, 문서 순위를 포함한 18개 작업에서 최고의 결과를 달성합니다.

자세한 내용은 XLNet을 자세히 설명하고 여러 작업에 대한 전체 결과를 제공하는 학술 논문을 참조하세요.

목표

  • 데이터 세트와 모델 출력을 저장할 Cloud Storage 버킷을 만듭니다.
  • 데이터 세트를 처리합니다.
  • XLNet으로 미세 조정합니다.
  • 출력 결과를 확인합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

가격 계산기를 사용하면 예상 사용량을 기준으로 예상 비용을 산출할 수 있습니다. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

이 섹션에서는 Cloud Storage 버킷 및 Compute Engine VM 설정에 대한 정보를 제공합니다.

  1. Cloud Shell 창을 엽니다.

    Cloud Shell 열기

  2. 프로젝트 ID의 변수를 만듭니다.

    export PROJECT_ID=project-id
    
  3. Cloud TPU를 만들려는 프로젝트를 사용하도록 gcloud 명령줄 도구를 구성합니다.

    gcloud config set project ${PROJECT_ID}
    

    새 Cloud Shell VM에서 이 명령어를 처음 실행하면 Cloud Shell 승인 페이지가 표시됩니다. 페이지 하단에서 '승인'을 클릭하여 gcloud가 사용자 인증 정보로 Google Cloud Platform(GCP) API 호출을 수행하도록 허용합니다.

  4. Cloud TPU 프로젝트의 서비스 계정을 만듭니다.

    gcloud beta services identity create --service tpu.googleapis.com --project ${PROJECT_ID}
    

    이 명령어는 다음 형식의 Cloud TPU 서비스 계정을 반환합니다.

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  5. Cloud Storage 버킷을 만듭니다.

    이 Cloud Storage 버킷은 사용자가 모델 및 학습 결과를 학습시키기 위해 사용하는 데이터를 저장합니다. 버킷 위치는 Compute Engine(VM) 및 Cloud TPU 노드와 동일한 리전에 있어야 합니다.

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
    
  6. 스토리지 버킷을 사용하기 전에 Cloud Storage 버킷에 대한 Cloud TPU 서비스 계정 액세스를 승인해야 합니다. Cloud TPU 서비스 계정에 세분화된 ACL을 설정합니다.

  7. Compute Engine VM 및 Cloud TPU를 실행합니다.

    $ gcloud compute tpus execution-groups create \
      --name=xlnet-tutorial \
      --machine-type=n1-standard-8 \
      --zone=europe-west4-a \
      --tf-version=2.5.0 \
      --disk-size=500GB \
      --accelerator-type=v3-8
    

    명령어 플래그 설명

    name
    생성할 Cloud TPU의 이름입니다.
    machine-type
    생성할 Compute Engine VM의 머신 유형입니다.
    zone
    Cloud TPU를 생성하려는 영역입니다.
    tf-version
    VM에서 사용할 TensorFlow 버전입니다.
    accelerator-type
    생성할 Cloud TPU의 유형입니다.
  8. gcloud create 명령어 실행이 끝나면 셸 프롬프트가 username@projectname에서 username@vm-name으로 변경되었는지 확인합니다. 변경되었다면 Compute Engine VM에 로그인되었다는 의미입니다.

    gcloud compute ssh xlnet-tutorial --zone=europe-west4-a
    

    안내를 계속 따르면서 (vm)$으로 시작하는 각 명령어를 VM 세션 창에서 실행합니다.

  9. Python 디렉터리와 Cloud Storage 버킷 이름을 내보냅니다.

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    

데이터 세트 처리

데이터 세트를 처리하려면 Sentence Piece 모델이 필요합니다. 하나는 공개적으로 사용 가능한 Cloud Storage 버킷에서 찾을 수 있습니다. gs://cloud-tpu-checkpoints/xlnet/cased_spiece.model

  1. Compute Engine 가상 머신(VM)에서 다음 변수를 설정합니다.

    (vm)$ export SPIECE_DIR=~/cased_spiece
    (vm)$ export SPIECE_MODEL=${SPIECE_DIR}/cased_spiece.model
    (vm)$ export DATASETS_DIR=${STORAGE_BUCKET}/datasets
    
    (vm)$ mkdir -p ${SPIECE_DIR}
    
    (vm)$ gsutil cp gs://cloud-tpu-checkpoints/xlnet/cased_spiece.model ${SPIECE_DIR}
    

분류 데이터 세트 준비

IMDB 데이터 세트에서 분류 데이터 TFRecord를 준비하려면 다음 명령어를 사용하여 IMDB 데이터 세트를 다운로드하고 압축을 해제합니다.

(vm)$ export IMDB_DIR=~/imdb
(vm)$ mkdir -p ${IMDB_DIR}
(vm)$ cd ${IMDB_DIR}
(vm)$ wget http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz
(vm)$ tar zxvf aclImdb_v1.tar.gz -C ${IMDB_DIR}
(vm)$ rm aclImdb_v1.tar.gz

그러면 다음 명령어를 사용하여 데이터 세트를 TFRecord로 변환할 수 있습니다.

(vm)$ export TASK_NAME=imdb
(vm)$ python3 /usr/share/models/official/nlp/xlnet/preprocess_classification_data.py \
    --max_seq_length=512 \
    --spiece_model_file=${SPIECE_MODEL} \
    --output_dir=${DATASETS_DIR}/${TASK_NAME} \
    --data_dir=${IMDB_DIR}/aclImdb \
    --task_name=${TASK_NAME}

XLNet으로 세부 조정

압축을 푼 선행 학습된 모델 파일은 Cloud Storage 폴더 gs://cloud-tpu-checkpoints/xlnet/keras_xlnet에서 찾을 수 있습니다.

  1. 선행 학습된 모델과 출력 Cloud Storage 버킷의 변수를 내보냅니다.

    (vm)$ export XLNET_DIR=gs://cloud-tpu-checkpoints/xlnet/keras_xlnet
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/xlnet-output
    

모델 학습

이 코드 예시에서는 IMDB 데이터 세트에서 XLNet을 미세 조정합니다. 이 작업의 경우 처음 500단계를 수행하는 데 약 11분이 소요되며 v3-8에서 완료하는 데 약 1시간 정도 걸립니다. 정확도는 96.15에서 96.33 사이여야 합니다.

(vm)$ export TPU_NAME=xlnet-tutorial
(vm)$ python3 /usr/share/models/official/nlp/xlnet/run_classifier.py \
  --strategy_type=tpu \
  --tpu=${TPU_NAME} \
  --init_checkpoint=${XLNET_DIR}/xlnet_model.ckpt \
  --model_dir=${MODEL_DIR} \
  --test_data_size=25024 \
  --train_tfrecord_path=${DATASETS_DIR}/imdb/cased_spiece.model.len-512.train.tf_record \
  --test_tfrecord_path=${DATASETS_DIR}/imdb/cased_spiece.model.len-512.dev.eval.tf_record \
  --train_batch_size=32 \
  --seq_len=512 \
  --n_layer=24 \
  --d_model=1024 \
  --d_embed=1024 \
  --n_head=16 \
  --d_head=64 \
  --d_inner=4096 \
  --untie_r=true \
  --n_class=2 \
  --ff_activation=gelu \
  --learning_rate=2e-5 \
  --train_steps=4000 \
  --warmup_steps=500 \
  --iterations=500 \
  --bi_data=false \
  --summary_type=last

명령어 플래그 설명

mode
train_and_eval로 설정하면 이 스크립트는 모델을 학습시키고 평가합니다. `export_only`로 설정하면 이 스크립트가 저장된 모델을 내보냅니다.
input_meta_data_path
학습 및 평가에 사용할 데이터 세트에 대한 메타데이터가 포함된 파일의 경로입니다.
train_data_path
학습 입력을 위한 Cloud Storage 경로입니다. 이 예시에서는 fake_imagenet 데이터 세트로 설정됩니다.
eval_data_path
평가 입력을 위한 Cloud Storage 경로입니다. 이 예시에서는 fake_imagenet 데이터 세트로 설정됩니다.
init_checkpoint
선행 학습된 BERT 모델의 초기 체크포인트가 포함된 json 파일의 경로입니다.
train_batch_size
학습 배치 크기입니다.
eval_batch_size
평가 배치 크기입니다.
learning_rate
학습률입니다.
num_train_epochs
전체 데이터 세트를 사용하여 모델을 학습시키는 횟수입니다.
model_dir
모델 학습 중에 체크포인트와 요약이 저장되는 디렉터리를 지정합니다. 폴더가 없는 경우에는 프로그램이 폴더를 만듭니다. Cloud TPU를 사용할 때 model_dir는 Cloud Storage 경로(`gs://...`)여야 합니다. 이전 체크포인트가 동일한 크기 및 TensorFlow 버전의 TPU를 사용하여 생성되어 있는 한 기존 폴더를 다시 사용하여 현재 체크포인트 데이터를 로드하고 추가 체크포인트를 저장할 수 있습니다.
distribution_strategy
TPU에서 ResNet 모델을 학습시키려면 distribution_strategytpu로 설정해야 합니다.
tpu
Cloud TPU의 이름입니다. 환경 변수(TPU_NAME)를 지정하면 설정됩니다.

결과 확인

학습은 v3-8 TPU에서 약 1시간 정도 걸립니다. 스크립트가 완료되면 다음과 비슷한 결과가 표시됩니다.

Training Summary:
{'total_training_steps': 4000, 'train_loss': 0.00868087075650692,
'last_train_metrics': 0.9983749985694885, 'eval_metrics': 0.96148}

정리

  1. Compute Engine 인스턴스에서 연결을 해제합니다.

    (vm)$ exit
    

    프롬프트가 username@projectname으로 바뀌면 Cloud Shell에 있는 것입니다.

  2. Cloud Shell에서 다음 gcloud 명령어를 실행하여 VM과 Cloud TPU를 모두 삭제합니다.

    $ gcloud compute tpus execution-groups delete xlnet-tutorial \
      --zone=europe-west4-a
    
  3. 불필요한 TPU 사용 요금 청구를 방지하기 위해 gcloud compute tpus list를 실행하여 할당된 Cloud TPU 인스턴스가 없는지 확인합니다. 삭제하는 데 몇 분 정도 걸릴 수 있습니다.

    $ gcloud compute tpus list --zone=europe-west4-a
    

    사용 중인 Cloud TPU는 다음 명령어 뒤에 나오는 출력 목록에 나타나지 않아야 합니다.

    NAME            ZONE            ACCELERATOR_TYPE  NETWORK_ENDPOINTS   NETWORK  RANGE            STATUS  API_VERSION
    xyz-tutorial    europe-west4-a  v3-8              10.119.91.74:8470   default  10.119.91.72/29  READY   V1_ALPHA1
    
  4. 아래와 같이 gsutil을 실행하여 bucket-name을 이 가이드에서 만든 Cloud Storage 버킷 이름으로 바꿉니다.

    $ gsutil rm -r gs://bucket-name
    

다음 단계

이 가이드에서는 샘플 데이터 세트를 사용하여 XLNet 모델을 학습시켰습니다. 이 학습 결과는 (대부분의 경우) 추론에 사용할 수 없습니다. 추론에 모델을 사용하려면 일반에 공개된 데이터 세트 또는 자체 데이터 세트에서 데이터를 학습시킵니다. Cloud TPU에서 학습된 모델은 데이터 세트가 TFRecord 형식이어야 합니다.

데이터 세트 변환 도구 샘플을 사용하여 이미지 분류 데이터 세트를 TFRecord 형식으로 변환할 수 있습니다. 이미지 분류 모델을 사용하지 않는 경우 데이터 세트를 직접 TFRecord 형식으로 변환해야 합니다. 자세한 내용은 TFRecord 및 tf.Example을 참조하세요.

초매개변수 조정

데이터 세트로 모델의 성능을 개선하려면 모델의 초매개변수를 조정하면 됩니다. GitHub에서 모든 TPU 지원 모델에 공통된 초매개변수에 대한 정보를 확인할 수 있습니다. 모델별 초매개변수에 대한 정보는 각 모델의 소스 코드에서 확인할 수 있습니다. 초매개변수 조정에 대한 자세한 내용은 초매개변수 조정 개요, 초매개변수 조정 서비스 사용, 초매개변수 조정을 참조하세요.

추론

일단 모델을 학습시키면 추론(예측이라고도 함)에 사용할 수 있습니다. AI Platform은 머신러닝 모델을 개발, 학습, 배포하기 위한 클라우드 기반 솔루션입니다. 모델이 배포되면 AI Platform Prediction 서비스를 사용할 수 있습니다.