KerasNLP로 모델 업로드

KerasNLP로 모델 업로드

저자 : Samaneh Saadat, Matthew Watson
생성일 : 2024/04/29
최종 편집일 : 2024/04/29
설명 : 미세 조정된 KerasNLP 모델을 모델 허브에 업로드하는 방법에 대한 소개.

소개

머신 러닝 모델을 특정 작업에 맞게 파인 튜닝하면 인상적인 결과를 얻을 수 있습니다. 파인 튜닝된 모델을 모델 허브에 업로드하면 더 넓은 커뮤니티와 공유할 수 있으며, 이를 통해 다른 연구자들과 개발자들이 접근성을 높일 수 있습니다. 또한, 이를 통해 실세계 애플리케이션에 모델을 통합하는 과정이 간소화될 수 있습니다.

이 가이드에서는 파인 튜닝된 모델을 Kaggle ModelsHugging Face Hub와 같은 인기 있는 모델 허브에 업로드하는 방법을 설명합니다.

셋업

우선 필요한 라이브러리를 설치하고 import 합니다. 이 가이드에서는 KerasNLP를 사용합니다.

!pip install -q --upgrade keras-nlp huggingface-hub kagglehub
import os

os.environ["KERAS_BACKEND"] = "jax"

import keras_nlp

데이터

이 가이드에서는 IMDB 리뷰 데이터셋을 사용합니다. tensorflow_dataset에서 데이터셋을 불러옵니다.

import tensorflow_datasets as tfds

imdb_train, imdb_test = tfds.load(
    "imdb_reviews",
    split=["train", "test"],
    as_supervised=True,
    batch_size=4,
)

가이드 실행 속도를 높이기 위해 트레이닝 샘플 중 일부만 사용합니다. 하지만, 더 높은 품질의 모델이 필요하다면, 더 많은 트레이닝 샘플을 사용하는 것이 좋습니다.

imdb_train = imdb_train.take(100)

작업 업로드

keras_nlp.models.Taskkeras_nlp.models.Backbonekeras_nlp.models.Preprocessor를 결합하여, 텍스트 문제에 대해 직접 트레이닝, 파인 튜닝 및 예측에 사용할 수 있는 모델을 생성합니다. 이 섹션에서는, Task를 생성하고, 파인 튜닝하여 모델 허브에 업로드하는 방법을 설명합니다.

모델 로드

베이스 모델을 기반으로 Causal LM을 구축하려면, keras_nlp.models.CausalLM.from_preset를 호출하고, 미리 설정된 식별자(built-in preset identifier)를 전달하면 됩니다.

causal_lm = keras_nlp.models.CausalLM.from_preset("gpt2_base_en")
결과
Downloading from https://www.kaggle.com/api/v1/models/keras/gpt2/keras/gpt2_base_en/2/download/task.json...

Downloading from https://www.kaggle.com/api/v1/models/keras/gpt2/keras/gpt2_base_en/2/download/preprocessor.json...

모델 미세 조정

모델을 불러온 후, .fit()을 호출하여 파인 튜닝할 수 있습니다. 여기에서는 IMDB 리뷰에 모델을 파인 튜닝하여 모델을 영화 도메인에 맞게 최적화합니다.

# Causal LM을 위해 레이블을 제거하고 리뷰 텍스트만 유지합니다.
imdb_train_reviews = imdb_train.map(lambda x, y: x)

# Causal LM을 파인 튜닝합니다.
causal_lm.fit(imdb_train_reviews)
결과
100/100 ━━━━━━━━━━━━━━━━━━━━ 151s 1s/step - loss: 1.0198 - sparse_categorical_accuracy: 0.3271

모델을 로컬에 저장하기

모델을 업로드하려면, 먼저 save_to_preset을 사용하여 모델을 로컬에 저장해야 합니다.

preset_dir = "./gpt2_imdb"
causal_lm.save_to_preset(preset_dir)

저장된 파일을 확인해 봅시다.

os.listdir(preset_dir)
결과
['preprocessor.json',
 'tokenizer.json',
 'task.json',
 'model.weights.h5',
 'config.json',
 'metadata.json',
 'assets']

로컬에 저장된 모델 불러오기

로컬에 저장된 프리셋 모델은 from_preset을 사용하여 불러올 수 있습니다. 저장된 그대로 불러올 수 있습니다.

causal_lm = keras_nlp.models.CausalLM.from_preset(preset_dir)

또한 keras_nlp.models.Backbonekeras_nlp.models.Tokenizer 객체를 프리셋 디렉토리에서 불러올 수 있습니다. 이 객체들은 위에서 사용한 causal_lm.backbonecausal_lm.preprocessor.tokenizer와 동일합니다.

backbone = keras_nlp.models.Backbone.from_preset(preset_dir)
tokenizer = keras_nlp.models.Tokenizer.from_preset(preset_dir)

모델 허브에 모델 업로드

프리셋을 디렉토리에 저장한 후, 이 디렉토리는 KerasNLP 라이브러리를 통해 Kaggle 또는 Hugging Face와 같은 모델 허브에 직접 업로드할 수 있습니다. Kaggle에 모델을 업로드하려면 URI가 kaggle://로 시작해야 하고, Hugging Face에 업로드하려면 hf://로 시작해야 합니다.

Kaggle에 업로드

Kaggle에 모델을 업로드하려면 먼저 Kaggle에 인증해야 합니다. 다음 중 하나의 방법을 사용할 수 있습니다:

  1. 환경 변수 KAGGLE_USERNAMEKAGGLE_KEY를 설정합니다.
  2. 로컬에 ~/.kaggle/kaggle.json 파일을 제공합니다.
  3. kagglehub.login()을 호출합니다.

계속하기 전에 로그인 상태를 확인해 봅시다.

import kagglehub

if "KAGGLE_USERNAME" not in os.environ or "KAGGLE_KEY" not in os.environ:
    kagglehub.login()

모델을 업로드하려면 keras_nlp.upload_preset(uri, preset_dir) API를 사용할 수 있으며, Kaggle에 업로드할 경우 uri의 형식은 kaggle://<KAGGLE_USERNAME>/<MODEL>/Keras/<VARIATION>입니다. preset_dir은 모델이 저장된 디렉토리입니다.

다음 명령을 실행하면 preset_dir에 저장된 모델을 Kaggle에 업로드할 수 있습니다:

kaggle_username = kagglehub.whoami()["username"]
kaggle_uri = f"kaggle://{kaggle_username}/gpt2/keras/gpt2_imdb"
keras_nlp.upload_preset(kaggle_uri, preset_dir)
결과
Upload successful: preprocessor.json (834B)
Upload successful: tokenizer.json (322B)
Upload successful: task.json (2KB)
Upload successful: model.weights.h5 (475MB)
Upload successful: config.json (431B)
Upload successful: metadata.json (142B)
Upload successful: merges.txt (446KB)
Upload successful: vocabulary.json (1018KB)

Your model instance version has been created.

Hugging Face에 업로드

Hugging Face에 모델을 업로드하려면 먼저 Hugging Face에 인증해야 합니다. 다음 중 하나의 방법을 사용할 수 있습니다:

  1. 환경 변수 HF_USERNAMEHF_TOKEN을 설정합니다.
  2. huggingface_hub.notebook_login()을 호출합니다.

계속하기 전에 로그인 상태를 확인해 봅시다.

import huggingface_hub

if "HF_USERNAME" not in os.environ or "HF_TOKEN" not in os.environ:
    huggingface_hub.notebook_login()

keras_nlp.upload_preset(uri, preset_dir)는 Hugging Face에 모델을 업로드할 때 사용할 수 있으며, 이 경우 uri 형식은 hf://<HF_USERNAME>/<MODEL>입니다.

다음 명령을 실행하면 preset_dir에 저장된 모델을 Hugging Face에 업로드할 수 있습니다:

hf_username = huggingface_hub.whoami()["name"]
hf_uri = f"hf://{hf_username}/gpt2_imdb"
keras_nlp.upload_preset(hf_uri, preset_dir)

사용자가 업로드한 모델 불러오기

Kaggle에 모델이 업로드된 것을 확인한 후, from_preset을 호출하여 모델을 불러올 수 있습니다.

causal_lm = keras_nlp.models.CausalLM.from_preset(
    f"kaggle://{kaggle_username}/gpt2/keras/gpt2_imdb"
)

Hugging Face에 업로드된 모델도 from_preset을 호출하여 불러올 수 있습니다.

causal_lm = keras_nlp.models.CausalLM.from_preset(f"hf://{hf_username}/gpt2_imdb")

분류기 업로드

분류기 모델 업로드는 Causal LM 업로드와 유사합니다. 미세 조정된 모델을 업로드하려면, 먼저 save_to_preset API를 사용하여 모델을 로컬 디렉토리에 저장한 후, keras_nlp.upload_preset를 통해 업로드할 수 있습니다.

# 베이스 모델 로드.
classifier = keras_nlp.models.Classifier.from_preset(
    "bert_tiny_en_uncased", num_classes=2
)

# 분류기 미세 조정.
classifier.fit(imdb_train)

# 로컬 프리셋 디렉토리에 모델 저장.
preset_dir = "./bert_tiny_imdb"
classifier.save_to_preset(preset_dir)

# Kaggle에 업로드.
keras_nlp.upload_preset(
    f"kaggle://{kaggle_username}/bert/keras/bert_tiny_imdb", preset_dir
)
결과
100/100 ━━━━━━━━━━━━━━━━━━━━ 7s 31ms/step - loss: 0.6975 - sparse_categorical_accuracy: 0.5164
Upload successful: preprocessor.json (947B)
Upload successful: tokenizer.json (461B)
Upload successful: task.json (2KB)
Upload successful: task.weights.h5 (50MB)
Upload successful: model.weights.h5 (17MB)
Upload successful: config.json (454B)
Upload successful: metadata.json (140B)
Upload successful: vocabulary.txt (226KB)

Your model instance version has been created.

모델이 Kaggle에 업로드된 것을 확인한 후, from_preset을 호출하여 모델을 불러올 수 있습니다.

classifier = keras_nlp.models.Classifier.from_preset(
    f"kaggle://{kaggle_username}/bert/keras/bert_tiny_imdb"
)