KoSimCSE Training on Amazon SageMaker
Usage
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import Tensor
from transformers import AutoConfig, PretrainedConfig, PreTrainedModel
from transformers import AutoModel, AutoTokenizer, logging
class SimCSEConfig(PretrainedConfig):
def __init__(self, version=1.0, **kwargs):
self.version = version
super().__init__(**kwargs)
class SimCSEModel(PreTrainedModel):
config_class = SimCSEConfig
def __init__(self, config):
super().__init__(config)
self.backbone = AutoModel.from_pretrained(config.base_model)
self.hidden_size: int = self.backbone.config.hidden_size
self.dense = nn.Linear(self.hidden_size, self.hidden_size)
self.activation = nn.Tanh()
def forward(
self,
input_ids: Tensor,
attention_mask: Tensor = None,
# RoBERTa variants don't have token_type_ids, so this argument is optional
token_type_ids: Tensor = None,
) -> Tensor:
# shape of input_ids: (batch_size, seq_len)
# shape of attention_mask: (batch_size, seq_len)
outputs: BaseModelOutputWithPoolingAndCrossAttentions = self.backbone(
input_ids=input_ids,
attention_mask=attention_mask,
token_type_ids=token_type_ids,
)
emb = outputs.last_hidden_state[:, 0]
if self.training:
emb = self.dense(emb)
emb = self.activation(emb)
return emb
def show_embedding_score(tokenizer, model, sentences):
inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
embeddings = model(**inputs)
score01 = cal_score(embeddings[0,:], embeddings[1,:])
score02 = cal_score(embeddings[0,:], embeddings[2,:])
print(score01, score02)
def cal_score(a, b):
if len(a.shape) == 1: a = a.unsqueeze(0)
if len(b.shape) == 1: b = b.unsqueeze(0)
a_norm = a / a.norm(dim=1)[:, None]
b_norm = b / b.norm(dim=1)[:, None]
return torch.mm(a_norm, b_norm.transpose(0, 1)) * 100
# Load pre-trained model
model = SimCSEModel.from_pretrained("daekeun-ml/KoSimCSE-supervised-kobigbird-roberta-large")
tokenizer = AutoTokenizer.from_pretrained("daekeun-ml/KoSimCSE-supervised-kobigbird-roberta-large")
# Inference example
s1 = """
๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM; Large Language Models)์ ํ์ธํ๋(Fine-tuning) ํ๋ฉด ์คํ ์์ค ํ์ด๋ฐ์ด์
๋ชจ๋ธ(Foundation model)์ ๊ฐ์ ํ์ฌ ๋๋ฉ์ธ๋ณ ์์
์์ ๋์ฑ ํฅ์๋ ์ฑ๋ฅ์ ๋์ด๋ผ ์ ์์ต๋๋ค.
์ด ๊ฒ์๋ฌผ์์๋ ์ต์ ์คํ ์์ค ๋ชจ๋ธ์ ํ์ธํ๋ ํ๊ธฐ ์ํด Amazon SageMaker ๋
ธํธ๋ถ์ ์ฌ์ฉํ ๋์ ์ด์ ์ ๊ดํด ์ค๋ช
ํฉ๋๋ค.
๋จ์ผ ๋
ธํธ๋ถ ์ธ์คํด์ค์์ ๋๊ท๋ชจ ๋ชจ๋ธ์ ๋ํํ ํ์ธํ๋ ์์
์ ํ๊ธฐ ์ํ์ฌ ํ๊น
ํ์ด์ค(Hugging Face)์ ํจ์จ์ ์ธ ํ๋ผ๋ฏธํฐ ํ์ธํ๋(PEFT; Parameter-efficient Fine-tuning) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ bitsandbytes ํจํค์ง๋ฅผ ํตํ ์์ํ ๊ธฐ๋ฒ์ ํ์ฉํฉ๋๋ค.
๋ณธ ๊ฒ์๋ฌผ์์๋ NVIDIA A10G GPU 4์ฅ์ด ํ์ฌ๋ ๋จ์ผ ml.g5.12xlarge ์ธ์คํด์ค๋ก Falcon-40B ๋ชจ๋ธ์ ํ์ธํ๋ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ๋๋ฆฌ์ง๋ง, ๊ฐ์ ์ ๋ต์ผ๋ก p4d/p4de ๋
ธํธ๋ถ ์ธ์คํด์ค์์ ํจ์ฌ ๋ ํฐ ๋ชจ๋ธ์ ํ์ธํ๋ ํ ์ ์์ต๋๋ค.
๋ณดํต ์ด๋ฌํ ๋๊ท๋ชจ ๋ชจ๋ธ์ ์ ์ฒด ์ ๋ฐ๋ ํํ์ ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ ํ ์ฅ์ GPU๋ ์ฌ๋ฌ ์ฅ์ GPU์ ๋ฉ๋ชจ๋ฆฌ์ ๋ชจ๋ ๋ค์ด๊ฐ์ง ์์ต๋๋ค.
์ด๋ฌํ ํฌ๊ธฐ์ ๋ชจ๋ธ์ ๋ํ ํ์ธํ๋ํ๊ณ ์ถ๋ก ์ ์ํํ๋ ๋ํํ ๋
ธํธ๋ถ ํ๊ฒฝ์ ์ํด ์ ํฌ๋ Quantized LLMs with Low-Rank Adapters (QLoRA) ๋ผ๋ ์ ๊ท ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค.
QLoRA๋ LLM์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ฉด์๋ ๊ฒฌ๊ณ ํ ์ฑ๋ฅ์ ์ ์งํ๋ ํจ์จ์ ์ธ ํ์ธํ๋ ๋ฐฉ์์
๋๋ค.
ํ๊น
ํ์ด์ค์ ์์ ์ธ๊ธ๋ ๋
ผ๋ฌธ์ ์ ์๋ค์ ๊ธฐ๋ณธ ๊ฐ๋
๊ณผ ํธ๋์คํฌ๋จธ ๋ฐ PEFT ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฐ๋ ๋ด์ฉ์ ๋ค๋ฃจ๋ ์์ธํ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๊ฒ์ํ์ต๋๋ค.
"""
s2 = """
๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM; Large Language Models) ๋ถ์ผ์ ๋ฐ์ ๊ณผ LLM์ด ๊ฐ์น ์๋ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ ๋ฌธ์ ์ธํธ ์๊ฐ ๊ณ์ ์ฆ๊ฐํ๊ณ ์๋ค๋ ์์์ ๋ค์ด๋ณด์
จ์ ๊ฒ๋๋ค.
๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ์ ์ฌ๋ฌ ์์
์ ํตํด ํ๋ จ๋ ๋๊ท๋ชจ ๋ชจ๋ธ์ ํ๋ จ๋์ง ์์ ํน์ ์์
์๋ ์ ์ผ๋ฐํ๋ฉ๋๋ค.
์ด๋ฌํ ๋ชจ๋ธ์ ํ์ด๋ฐ์ด์
๋ชจ๋ธ(foundation model)์ด๋ผ๊ณ ํ๋ฉฐ, ์คํ ํฌ๋ HAI ์ฐ๊ตฌ์(Stanford Institute for Human-Centered Artificial Intelligence)์์ ์ฒ์ ๋์คํํ ์ฉ์ด์
๋๋ค.
์ด๋ฌํ ํ์ด๋ฐ์ด์
๋ชจ๋ธ์ ํ๋กฌํํธ ์์ง๋์ด๋ง(prompt engineering) ๊ธฐ๋ฒ์ ๋์์ผ๋ก ์ ํ์ฉํ ์ ์์ง๋ง, ์ ์ค์ผ์ด์ค๊ฐ ๋๋ฉ์ธ์ ๋งค์ฐ ํนํ๋์ด ์๊ฑฐ๋ ์์
์ ์ข
๋ฅ๊ฐ ๋งค์ฐ ๋ค์ํ์ฌ ๋ชจ๋ธ์ ์ถ๊ฐ๋ก ์ปค์คํฐ๋ง์ด์งํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
ํน์ ๋๋ฉ์ธ์ด๋ ์์
์ ๋ํ ๋๊ท๋ชจ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํ ํ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ ์์ ์์
๋ณ ๋ฐ์ดํฐ ์ธํธ๋ก ๋ชจ๋ธ์ ์ถ๊ฐ๋ก ํ๋ จํ๋ ๊ฒ์
๋๋ค.
ํ์ธ ํ๋(fine-tuning)์ผ๋ก ์๋ ค์ง ์ด ์ ๊ทผ ๋ฐฉ์์ LLM์ ์ ํ๋๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๊ฐ์ ํ์ง๋ง, ๋ชจ๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
ํ์ธ ํ๋ ๋ฐ์ดํฐ ์ธํธ ํฌ๊ธฐ๊ฐ ํจ์ฌ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ๋ จ(pre-training)ํ๋ ๊ฒ ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด์ง๋ง ์ฌ์ ํ ์๋นํ ์ปดํจํ
์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
ํ์ธ ํ๋์ ์๋ณธ ๋ชจ๋ธ์ ๋ชจ๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ค์น๋ฅผ ์์ ํ๋ฏ๋ก ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ์๋ณธ ๋ชจ๋ธ๊ณผ ๋์ผํ ํฌ๊ธฐ์ ๋ชจ๋ธ์ ์์ฑํ๋ฏ๋ก ์คํ ๋ฆฌ์ง ์ฉ๋์๋ ๋ถ๋ด์ด ๋ฉ๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ๊น
ํ์ด์ค๋ ํจ์จ์ ์ธ ํ๋ผ๋ฏธํฐ ํ์ธ ํ๋(PEFT; Parameter-Efficient Fine-Tuning) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์
ํ์ต๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ถ๋ถ์ ์๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ๋๊ฒฐํ๊ณ ํจ์ฌ ์์ ์ถ๊ฐ ํ๋ผ๋ฏธํฐ ์ธํธ๋ง ํ๋ จํ์ฌ ๋ชจ๋ธ ๋ ์ด์ด๋ฅผ ๊ต์ฒดํ๊ฑฐ๋ ํ์ฅํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ํ์ํ ์ปดํจํ
๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ํจ์ฌ ์ ์ ๋น์ฉ์ผ๋ก ํ๋ จ์ ์ํํฉ๋๋ค.
"""
s3 = """
2023๋
6์๋ถํฐ AWS ์์ธ ๋ฆฌ์ ์์ EC2 G5์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ฌ๊ธฐ์๋ Falcon Foundation Model์ Amazon SageMaker JumpStart๋ฅผ ์ด์ฉํด AWS ์์ธ ๋ฆฌ์ ์ EC2 G5์ ์ค์นํ๊ณ , ์น ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ Chatbot์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
Falcon FM์ HuggingFace์ Open LLM Leaderboard์์ ์์๊ถ(2023๋
7์ ๊ธฐ์ค)์ ์์นํ ๋งํผ ์ฐ์ํ ์ฑ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด์๋, ์ํ์น 2.0 ๋ผ์ด์ ์ค ์ ์ฑ
์ ๋ฐ๋ผ ์์ฉ์ ํฌํจํ์ฌ ๋๊ตฌ๋ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Falcon FM์ SageMaker JumpStart๋ฅผ ์ด์ฉํ์ฌ ํธ๋ฆฌํ๊ฒ ์ค์นํ๊ณ , EC2 G5 ์ธ์คํด์ค์ ๊ฐ์ ์ฐ์ํ ์ธ์คํด์ค๋ฅผ ํตํด AWS ์์ธ ๋ฆฌ์ ์์ ๊ฐ๋ฐ ๋ฐ ์์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
EC2 G5์ธ์คํด์ค๋ EC2 G4dn ์ธ์คํด์ค๋ณด๋ค ๊ทธ๋ํฝ ์ง์ฝ์ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ ๊ธฐ๊ณ ํ์ต ์ถ๋ก ์ ๋ํด ์ต๋ 3๋ฐฐ ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ด์,
๊ณ ์ฑ๋ฅ์ ์๊ตฌํ๋ ์์ฐ์ด ์ฒ๋ฆฌ, ์ปดํจํฐ ๋น์ ๋ฐ ์ถ์ฒ ์์ง๊ณผ ๊ฐ์ ๋ถ์ผ์ ์ ํฉํฉ๋๋ค. ๋ํ, LLM (Large Language Models) ๊ธฐ๋ฐ์ Chatbot์ ๊ธฐ์กด Rule-based์ Chatbot์ ๋นํ์ฌ ํจ์ฌ ์ฐ์ํ ๋ํ๋ฅ๋ ฅ์ ๋ณด์ฌ์ฃผ๋ฉฐ,
AWS Lambda, Amazon CloudFront, AWS API Gateway, Amazon S3์ ๊ฐ์ AWS ์ธํ๋ผ๋ฅผ ์ด์ฉํ์ฌ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ณธ ๊ฒ์๊ธ์์๋ SageMaker JumpStart๋ฅผ ํตํด Falcon FM ๊ธฐ๋ฐ์ Endpoint๋ฅผ ์ค์นํ๊ณ , AWS CDK๋ฅผ ์ด์ฉํ์ฌ Chatbot๋ฅผ ์ํ ์ ๊ณตํ๊ธฐ ์ํ ์ธํ๋ผ๋ฅผ ์ค๋นํฉ๋๋ค.
์์ฑ๋ Chatbot์ REST API๋ฅผ ํตํ์ฌ ํ
์คํธ๋ก ์์ฒญ์ ํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ํ์ํ ์ ์์ต๋๋ค. ์์ธํ Architecture๋ ์๋์ ๊ฐ์ต๋๋ค.
"""
sentences = [s1, s2, s3]
show_embedding_score(tokenizer, model.cpu(), sentences)
Introduction
SimCSE is a highly efficient and innovative embedding technique based on the concept of contrastive learning. Unsupervised learning can be performed without the need to prepare ground-truth labels, and high-performance supervised learning can be performed if a good NLI (Natural Language Inference) dataset is prepared. The concept is very simple and the psudeo-code is intuitive, so the implementation is not difficult, but I have seen many people still struggle to train this model.
The official implementation code from the authors of the paper is publicly available, but it is not suitable for a step-by-step implementation. Therefore, we have reorganized the code based on Simple-SIMCSE's GitHub so that even ML beginners can train the model from the scratch with a step-by-step implementation. It's minimalist code for beginners, but data scientists and ML engineers can also make good use of it.
Added over Simple-SimCSE
- Added the Supervised Learning part, which shows you step-by-step how to construct the training dataset.
- Added Distributed Learning Logic. If you have a multi-GPU setup, you can train faster.
- Added SageMaker Training.
ml.g4dn.xlarge
trains well, but we recommendml.g4dn.12xlarge
orml.g5.12xlarge
for faster training.
Requirements
We recommend preparing an Amazon SageMaker instance with the specifications below to perform this hands-on.
SageMaker Notebook instance
ml.g4dn.xlarge
SageMaker Training instance
ml.g4dn.xlarge
(Minimum)ml.g5.12xlarge
(Recommended)
Datasets
For supervised learning, you need an NLI dataset that specifies the relationship between the two sentences. For unsupervised learning, we recommend using wikipedia raw data separated into sentences. This hands-on uses the dataset registered with huggingface, but you can also configure your own dataset.
The datasets used in this hands-on are as follows
Supervised
Unsupervised
- kowiki-sentences: Data from 20221001 Korean wiki split into sentences using kss (backend=mecab) morphological analyzer.
How to train
Performance
We trained with parameters similar to those in the paper and did not perform any parameter tuning. Higher max sequence length does not guarantee higher performance; building a good NLI dataset is more important
{
"batch_size": 64,
"num_epochs": 1 (for unsupervised training), 3 (for supervised training)
"lr": 3e-05,
"num_warmup_steps": 0,
"temperature": 0.05,
"lr_scheduler_type": "linear",
"max_seq_len": 64,
"use_fp16": "True",
}
KLUE-STS
Model | Avg | Cosine Pearson | Cosine Spearman | Euclidean Pearson | Euclidean Spearman | Manhattan Pearson | Manhattan Spearman | Dot Pearson | Dot Spearman |
---|---|---|---|---|---|---|---|---|---|
KoSimCSE-KoBigBird-RoBERTa-large (Supervised) | 85.23 | 84.55 | 85.66 | 85.82 | 85.34 | 85.87 | 85.41 | 84.22 | 84.94 |
Kor-STS
Model | Avg | Cosine Pearson | Cosine Spearman | Euclidean Pearson | Euclidean Spearman | Manhattan Pearson | Manhattan Spearman | Dot Pearson | Dot Spearman |
---|---|---|---|---|---|---|---|---|---|
KoSimCSE-KoBigBird-RoBERTa-large (Supervised) | 85.30 | 85.02 | 85.69 | 84.95 | 85.31 | 84.94 | 85.34 | 85.37 | 85.77 |
References
- Simple-SimCSE: https://github.com/hppRC/simple-simcse
- KoSimCSE: https://github.com/BM-K/KoSimCSE-SKT
- SimCSE (official): https://github.com/princeton-nlp/SimCSE
- SimCSE paper: https://aclanthology.org/2021.emnlp-main.552
- Downloads last month
- 12