Views
No views yet
1import torch
2import torch.nn as nn
3import torch.nn.functional as F
4from torch import Tensor
5from transformers import AutoConfig, PretrainedConfig, PreTrainedModel
6from transformers import AutoModel, AutoTokenizer, logging
7
8class SimCSEConfig(PretrainedConfig):
9 def __init__(self, version=1.0, **kwargs):
10 self.version = version
11 super().__init__(**kwargs)
12
13class SimCSEModel(PreTrainedModel):
14 config_class = SimCSEConfig
15
16 def __init__(self, config):
17 super().__init__(config)
18 self.backbone = AutoModel.from_pretrained(config.base_model)
19 self.hidden_size: int = self.backbone.config.hidden_size
20 self.dense = nn.Linear(self.hidden_size, self.hidden_size)
21 self.activation = nn.Tanh()
22
23 def forward(
24 self,
25 input_ids: Tensor,
26 attention_mask: Tensor = None,
27 # RoBERTa variants don't have token_type_ids, so this argument is optional
28 token_type_ids: Tensor = None,
29 ) -> Tensor:
30 # shape of input_ids: (batch_size, seq_len)
31 # shape of attention_mask: (batch_size, seq_len)
32 outputs: BaseModelOutputWithPoolingAndCrossAttentions = self.backbone(
33 input_ids=input_ids,
34 attention_mask=attention_mask,
35 token_type_ids=token_type_ids,
36 )
37
38 emb = outputs.last_hidden_state[:, 0]
39
40 if self.training:
41 emb = self.dense(emb)
42 emb = self.activation(emb)
43
44 return emb
45
46def show_embedding_score(tokenizer, model, sentences):
47 inputs = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
48 embeddings = model(**inputs)
49 score01 = cal_score(embeddings[0,:], embeddings[1,:])
50 score02 = cal_score(embeddings[0,:], embeddings[2,:])
51 print(score01, score02)
52
53def cal_score(a, b):
54 if len(a.shape) == 1: a = a.unsqueeze(0)
55 if len(b.shape) == 1: b = b.unsqueeze(0)
56 a_norm = a / a.norm(dim=1)[:, None]
57 b_norm = b / b.norm(dim=1)[:, None]
58 return torch.mm(a_norm, b_norm.transpose(0, 1)) * 100
59
60# Load pre-trained model
61model = SimCSEModel.from_pretrained("daekeun-ml/KoSimCSE-supervised-kobigbird-roberta-large")
62tokenizer = AutoTokenizer.from_pretrained("daekeun-ml/KoSimCSE-supervised-kobigbird-roberta-large")
63
64# Inference example
65
66s1 = """
67대규모 언어 모델(LLM; Large Language Models)을 파인튜닝(Fine-tuning) 하면 오픈 소스 파운데이션 모델(Foundation model)을 개선하여 도메인별 작업에서 더욱 향상된 성능을 끌어낼 수 있습니다.
68이 게시물에서는 최신 오픈 소스 모델을 파인튜닝 하기 위해 Amazon SageMaker 노트북을 사용할 때의 이점에 관해 설명합니다.
69단일 노트북 인스턴스에서 대규모 모델의 대화형 파인튜닝 작업을 하기 위하여 허깅페이스(Hugging Face)의 효율적인 파라미터 파인튜닝(PEFT; Parameter-efficient Fine-tuning) 라이브러리와 bitsandbytes 패키지를 통한 양자화 기법을 활용합니다.
70본 게시물에서는 NVIDIA A10G GPU 4장이 탑재된 단일 ml.g5.12xlarge 인스턴스로 Falcon-40B 모델을 파인튜닝 하는 방법을 보여드리지만, 같은 전략으로 p4d/p4de 노트북 인스턴스에서 훨씬 더 큰 모델을 파인튜닝 할 수 있습니다.
71
72보통 이러한 대규모 모델의 전체 정밀도 표현의 모델 파라미터는 한 장의 GPU나 여러 장의 GPU의 메모리에 모두 들어가지 않습니다.
73이러한 크기의 모델에 대한 파인튜닝하고 추론을 수행하는 대화형 노트북 환경을 위해 저희는 Quantized LLMs with Low-Rank Adapters (QLoRA) 라는 신규 기법을 사용합니다.
74QLoRA는 LLM의 메모리 사용량을 줄이면서도 견고한 성능을 유지하는 효율적인 파인튜닝 방식입니다.
75허깅페이스와 앞서 언급된 논문의 저자들은 기본 개념과 트랜스포머 및 PEFT 라이브러리와의 연동 내용을 다루는 자세한 블로그 게시물을 게시했습니다.
76"""
77
78s2 = """
79대규모 언어 모델(LLM; Large Language Models) 분야의 발전과 LLM이 가치 있는 인사이트를 제공하는 문제 세트 수가 계속 증가하고 있다는 소식을 들어보셨을 겁니다.
80대규모 데이터 세트와 여러 작업을 통해 훈련된 대규모 모델은 훈련되지 않은 특정 작업에도 잘 일반화됩니다.
81이러한 모델을 파운데이션 모델(foundation model)이라고 하며, 스탠포드 HAI 연구소(Stanford Institute for Human-Centered Artificial Intelligence)에서 처음 대중화한 용어입니다.
82이러한 파운데이션 모델은 프롬프트 엔지니어링(prompt engineering) 기법의 도움으로 잘 활용할 수 있지만, 유스케이스가 도메인에 매우 특화되어 있거나 작업의 종류가 매우 다양하여 모델을 추가로 커스터마이징해야 하는 경우가 많습니다.
83특정 도메인이나 작업에 대한 대규모 모델의 성능을 개선하기 위한 한 가지 접근 방식은 더 작은 작업별 데이터 세트로 모델을 추가로 훈련하는 것입니다.
84파인 튜닝(fine-tuning)으로 알려진 이 접근 방식은 LLM의 정확도를 성공적으로 개선하지만, 모든 모델 가중치를 수정해야 합니다.
85파인 튜닝 데이터 세트 크기가 훨씬 작기 때문에 사전 훈련(pre-training)하는 것 보다 훨씬 빠르지만 여전히 상당한 컴퓨팅 성능과 메모리가 필요합니다.
86파인 튜닝은 원본 모델의 모든 파라미터 가중치를 수정하므로 비용이 많이 들고 원본 모델과 동일한 크기의 모델을 생성하므로 스토리지 용량에도 부담이 됩니다.
87
88이러한 문제를 해결하기 위해 허깅페이스는 효율적인 파라미터 파인 튜닝(PEFT; Parameter-Efficient Fine-Tuning) 라이브러리를 도입했습니다.
89이 라이브러리를 사용하면 대부분의 원래 모델 가중치를 동결하고 훨씬 작은 추가 파라미터 세트만 훈련하여 모델 레이어를 교체하거나 확장할 수 있습니다.
90따라서 필요한 컴퓨팅 및 메모리 측면에서 훨씬 적은 비용으로 훈련을 수행합니다.
91"""
92
93s3 = """
942023년 6월부터 AWS 서울 리전에서 EC2 G5인스턴스를 사용할 수 있게 되었습니다.
95여기서는 Falcon Foundation Model을 Amazon SageMaker JumpStart를 이용해 AWS 서울 리전의 EC2 G5에 설치하고, 웹 브라우저 기반의 Chatbot을 생성하는 방법에 대해 설명합니다.
96Falcon FM은 HuggingFace의 Open LLM Leaderboard에서 상위권(2023년 7월 기준)에 위치할 만큼 우수한 성능을 가지고 있으면서도, 아파치 2.0 라이선스 정책에 따라 상용을 포함하여 누구나 자유롭게 사용할 수 있습니다.
97
98Falcon FM은 SageMaker JumpStart를 이용하여 편리하게 설치하고, EC2 G5 인스턴스와 같은 우수한 인스턴스를 통해 AWS 서울 리전에서 개발 및 상용이 가능합니다.
99EC2 G5인스턴스는 EC2 G4dn 인스턴스보다 그래픽 집약적 애플리케이션 및 기계 학습 추론에 대해 최대 3배 더 높은 성능을 제공할 수 있어서,
100고성능을 요구하는 자연어 처리, 컴퓨터 비전 및 추천 엔진과 같은 분야에 적합합니다. 또한, LLM (Large Language Models) 기반의 Chatbot은 기존 Rule-based의 Chatbot에 비하여 훨씬 우수한 대화능력을 보여주며,
101AWS Lambda, Amazon CloudFront, AWS API Gateway, Amazon S3와 같은 AWS 인프라를 이용하여 쉽게 구현할 수 있습니다.
102
103본 게시글에서는 SageMaker JumpStart를 통해 Falcon FM 기반의 Endpoint를 설치하고, AWS CDK를 이용하여 Chatbot를 위한 제공하기 위한 인프라를 준비합니다.
104생성된 Chatbot은 REST API를 통하여 텍스트로 요청을 하고 결과를 화면에 표시할 수 있습니다. 상세한 Architecture는 아래와 같습니다.
105"""
106
107sentences = [s1, s2, s3]
108show_embedding_score(tokenizer, model.cpu(), sentences)ml.g4dn.xlarge trains well, but we recommend ml.g4dn.12xlarge or ml.g5.12xlarge for faster training.ml.g4dn.xlargeml.g4dn.xlarge (Minimum)ml.g5.12xlarge (Recommended)1{
2 "batch_size": 64,
3 "num_epochs": 1 (for unsupervised training), 3 (for supervised training)
4 "lr": 3e-05,
5 "num_warmup_steps": 0,
6 "temperature": 0.05,
7 "lr_scheduler_type": "linear",
8 "max_seq_len": 64,
9 "use_fp16": "True",
10}| 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 |
| 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 |