[NLP]Polyglot finetuning 방법 / 토크나이저 정리 / huggingface 업로드관련

2024. 6. 11. 16:36공부/딥러닝

반응형

Polyglot finetuning 12.6b-8bit Test


Polyglot finetuning 방법엔 여러가지가 존재

Koalphaca, OSLO를 이용한 예제 등

Finetuning를 진행할 시 대부분의 학습된 모델들이 깃헙에 같이 업로드 되어 있는

finetune.py 를 이용하여 진행

 


Transfer learning 와 Fine Tuning 차이점

전이학습(Transfer learning)

  • 데이터의 수가 많지 않거나 데이터를 확보하는데 많은 비용이 드는 경우 사용
  • 학습된 신경망의 일부 능력을 유사하거나 전혀 새로운 분야에서 사용되는 신경망의 학습에 이용하는 방법
  • 학습된 신경망을 pretrained model이라 부르며, 이 모델을 가지고 적용하려는 상황에 맞게 모델의 가중치를 약간씩 변화하여 사용
  • CNN을 이용하는 경우 처음부터 가중치를 초기화 하는것 보단 pretrained model을 이용하여 합당한 값을 가진 가중치를 이용함
  • 사전 학습된 모델을 재정의 후, pretrained model의 classifier 삭제하고 새로운 목적의 classifier 정의
  • 새롭게 만들어진 모델에 Fine tuning 진행

미세조정(Fine Tuning)

  • 기존에 학습되어져 있는 모델 기반 아키텍쳐를 새로운 목적에 맞게 변형
  • 학습된 모델의 가중치를 미세하게 조정하여 학습시키는 방법
  • 모델 전체를 새로 학습하거나 Classifier을 새로 학습하거나 Conv base 계층과 Classifier을 새로학습
  • 간단히 말해, 전체를 새로 학습하거나, 일부만 학습을 하거나, 학습과정 없이 Classifier을 변경하여 사용하는 경우 세가지로 볼 수 있다
  • learning rate를 매우 작게 설정하는 것(통상 1/10 수준)이 좋고 안정성 있는 SGD같은 optimizer를 이용하는 것이 좋음
  • 모든 layer는 꼭 1번 이상 학습이 완료된 상태여야 함

OSLO로 Polyglot 분산 학습

참고 : https://github.com/jason9693/polyglot-finetuning-oslo 

 

대규모 분산학습라이브러리인 OSLO의 TensorParallel을 사용하여 모델을 쪼개서 학습하는 예제

모델 : EleutherAI Polyglot-ko 1.3B 데이터셋 사용

 - 사용에 문제가 있음

 


koalphaca_12.8b : 8bit 학습 테스트 진행

LORA를 이용한 4bit 예제를 8bit로 변환하여 학습 진행 중

 

 - bnb_config 변수의 BitsAndBytesConfig 함수 내 기존 4bit로 되어있던 것을 8로 변경

 - 변환 후 config 파일을 올바르게 불러 오는 것이 확인됨

 - 추후 16bit 로 수정하여 테스트 예정

 - BitsAndBytesConfig 함수 내 인자들을 확인할 필요가 있음

 

 

총 학습량은 2000

4bit 모델과는 다르게 옵티마이저를 "paged_adamw_8bit" 를 설정하여 학습 진행

learning rate : 2e-4

batch size : 2

accmulation_steps : 1

max_steps(학습량) : 2000

optim : paged_adamw_8bit

 

약 51분 학습 소요시간 예상

 - Training Loss가 0까지 수렴하였다가, 갑자기 튀는 현상을 보임

 - 후반까지 Training Loss를 봐야할 듯 함

 

 - Training Loss가 계속해서 너무 높아 learning rate와 batch size를 수정 후 다시 체크해보기로 함

 - learning rate를 1e-4 수정 / batch size를 4로 수정

 - batch size를 늘리니 학습에 소요되는 시간은 1시간 30분 가량으로 늘어남

 - 또한 초기 Training Loss값이 7.4부터 시작됨. 일정량 학습 후 Training Loss가 떨어지는지 확인

 - batch size를 늘림으로 인해 사용되는 GPU RAM이 크게 증가함 : 전 학습에 비해 약 1.5~2배 가량 증가함(32.9GB 사용중)

 - Training Loss가 너무 높게 잡히는듯 한 과정을 보임

 - 떨어졋다가 다시 올라가는 등 문제가 발생. learning rate와 다른 값들을 수정할 필요가 있음

 - learning rate : 1e-4 / batch size : 2 / accumulation_steps : 1 / optim 주석처리

 - 계속해서 Training Loss가 7 대를 보여주어 현재까지 beomi/polyglot-ko-12.8b-safetensors 모델을 사용한 것을 polyglot 12.8b 모델로 수정하여 해보고자 함

 - Out of memory 발생. 런타임 초기화 하고 다시 시작

 - 현재 data는 koalphaca 데이터를 기반으로 사용하고 polyglot 모델을 사용하여 학습 테스트

 

※ 현재 Lemon 내용 참고하여 기준(Training Loss)으로 테스트 진행 중 : Training Loss 거의 1

 

train-remon

Run, share, and edit Python notebooks

colab.research.google.com

 

 - safetensor 모델이 아닌 polyglot12.8b 모델을 사용하여 학습을 진행하니 Training Loss가 현재까지 학습진행해본 것 보다 많이 낮은 수치를 보임

 - Polyglot12.8b 모델과 Polyglot12.8b/safetensors 모델의 차이를 알아볼 필요가 있음

 - 현재까지 학습(~150)에서 Training Loss가 계속해서 줄어드는 것을 확인할 수 있음

 - 최종적으로 Training Loss 1.88 정도를 보임

 - 학습에 소요시간 약 58분 걸림

 - 학습이 GPU A100 40G 를 거의 Full로 사용하는 결과를 보임

 - 8bit 이상의 경우 Colab으로 학습 진행하기가 어려울 수 있을 것으로 사료됨

 

 - 학습결과 테스트 진행하였음.

### 질문: 주식 시장에서 안정적으로 수익을 얻기 위한 방법은?
### 답변: 주식 시장에서 안정적인 수익을 얻기 위한 방법은 2가지이다. 하나는 '자기자본수익률'을 최대화하는 것이고, 다른 하나는 '시장위험'을 최소화하는 것이다. 대부분의 사람들이 잘 알고 있는 저 PBR주나, 저 PER주의 투자도 이 중 하나에 속한다. 이러한 기업들은 회사의 영업이익이나, 배당이 매력적이고, 시장에서 낮은 가격에 거래되고 있다. 즉, 투자자들이 기업의 펀더멘털과 재무 상황은 좋은데, 시장 상황 때문에 가격이 떨어져서 낮은 가격에서 살 수 있는 경우다. 이에 반해, '시장 위험'을 최소화하기 위해서는 포트폴리오를 구성 시, 투자 지역과 산업을 다양화하여야 한다. 즉, 시장 상황에 따라 다른 산업과 지역에서 투자하는 것이다. 이러한 방법을 위해서는 분산 투자가 중요하다. 투자 방식은 주식과 채권을 골고루 투자하는 것을 추천한다. 이러한 투자 방법은 안정적인 수익을 제공하고, 시장의 영향을 덜 받는 '절대수익'을 제공하는 펀드로도 가능하다.

### 질문: 위의 답변을 영어로 답변해줘
### 답변: "Safety is no guaranteed. Still, we must to respond to market disarray and the net effect can show the decision. We can have alternative approach for white-led speculation in case the stock is too level or not level above the simultaneous crisis level." 이것이 해석하기 어렵다면, "안정성이 보장되지 않는다. 그럼에도 불구하고 시장의 혼란에 대응해야 하며, 결정에 영향을 미칠 수 있다."로 번역할 수 있다. 주식이 너무 높거나, 너무 낮은 것으로 인해 발생하는 '시장의 혼란'을 반영하여, 기존의 투자 방식에 따른 결정과 다른 방식으로 주식 투자를 할 수 있다. 이러한 투자 방식은 위험을 줄이고, 안정적인 수익을 제공해 '절대수익'을 낼 수 있게 한다. 또한 이러한 투자 방식은 분산 투자와 병행될 때, '절대수익'과 '

### 질문: 한국어 학습을 위해 어떻게 하면 좋을까?
### 답변: 한국어를 학습하기 위해서는 몇 가지 방법이 있다. 첫 번째는 한국어를 잘 구사하는 원어민과 대화를 하거나, 한국어를 잘 구사하는 외국인과 이야기 해보는 것이다. 이러한 방법을 통해 한국어의 구조와, 발음에 대해 파악할 수 있도록 할 수 있다. 또한 글을 읽는 것도 중요하다. 한국어로 된 글을 많이 읽으면서, 한국어의 어휘와 문법 구조에 대해 정확하게 파악할 수 있다. 한국어를 학습할 때는 '소리 내어 읽기'가 상당히 중요하다. 이것은 한국어의 발음, 억양, 목소리 톤 등을 자연스럽게 익히는 방법이다. 한국어를 소리 내어 읽으면서, 한국어의 구조와 표현에 대한 이해가 높아지는 것이 중요하다. 한국어를 잘 구사하는 한국인과 대화하는 것도 좋은 방법이다. 한국어를 학습할 때 '한국어 능력시험'을 보면 도움이 된다. 한국어 능력시험에서 한국어의 문법이나, 쓰기, 듣기, 어휘, 말하기, 읽기, 문제 해결, 사고력, 표현력, 이해력 등이 종합적으로 평가된다. 한국어 학습에 도움 

 - 위와같은 답변 생성. 현재 코드 구현은 그전 데이터를 계속해서 저장되는 형태로 바꿔놓았음

 - 그 전 질문에 대해 답변의 연계가 이루어지는지 확인 필요

### 질문: 외국인들이 한국어를 배우기 위해서는 어떻게 해야할까? 그 전 질문과 연계해서 방법을 설명해줘
### 답변: 외국인들이 한국어를 배우기 위해서는 한국어를 잘 구사하는 사람이나, 기관에서 한국어 수업을 들어야 한다. 한국어 능력 시험을 보거나, 한국어 수업을 듣는 방법도 있다. 한국어 수업을 듣는 것은 한국의 학원이나, 학교, 학교 부설 한국어 학원 등에서 이용할 수 있다. 또한, 한국어 능력 시험의 일정에 맞춰서 준비를 하게 되면, 한국어 학습에 큰 도움이 된다. 한국어 능력 시험에 대해 자세히 살펴보면, 한국어 학습은 다음과 같은 절차를 겪는다. 1. 기본적으로 한국어 능력 평가가 이루어지며, 이는 한국어 교육용 프로그램과 평가 방식을 사용하여 한국어 문법 능력, 어휘 사용 능력, 의사소통 능력, 쓰기 능력 평가를 중심으로 이루어진다. 한국어 능력 평가는 매년 3번 1/3/8월로 나누어 진행되며, 총 3등급(고급/중급/초급, 3년에 한번씩 시험 시행)으로 나뉜다. 합격/불합격 기준은 아래와 같다. 2. 한국어 능력 시험이 끝나면, 바로 한국어 교육 및 평가가 이루어진다. 한국어 능력 평가는 한국어 문법, 어휘, 표현, 어문규정, 한국어교육론, 의사소통 능력, 쓰기 능력 등을 중심으로

### 질문: 한국어는 영어랑 비교해서 어떤점이 다른것인가요?
### 답변: 한국어와 영어의 문법적 차이점은 한국어는 명사를 수식하고, 영어는 명사를 수식하지 않는다는 점이다. 한국어는 수식어가 있고 없고의 차이가 크기 때문에, 영어와는 다른 느낌을 받을 수 있다. 하지만 한국어와 영어는 표현상의 차이가 있으므로, 문장을 구성을 할 때 한국어는 영어와는 다른 방식을 사용한다. 한국어와 영어의 차이점과 유사성에 대해 자세히 알아보면 다음과 같다. 한국어는 영어와는 다르게 관형어, 부사어, 목적어가 있어, 문장을 구성할 때 사용하는데, 이는 영어와 비교할 때, 문장 구조를 만드는 것에 있어 큰 차이가 있다. 한국어는 문장내에서 주 술 목적어 관계가 매우 중요한데, 영어에서는 주 술 목적어 관계가 문장 내에서 중요한 비중을 차지하지 않는다. 또한 한국어는 문법적 구성이 매우 복잡하고, 예외가 많아 문장 문법이 다양하다. 한국어를 사용할 때 자주 사용되는 문법 표현은 다양한 품사를 활용하여, 구문을 구성한다. 영어와는 다르게 한국어는 '주어+서술어+목적어

 - 그 전 질문과 연계해서 답변이 이루어지는지는 정확히 확인이 되지 않으나, 제일 처음 질문인 주식에 대한 질문을 영어로 해석해 달라는 결과에서 주식과 관련되어 영어로 설명해 준 것을 확인하였을때, 그 전 질문에 대한 연계성이 이루어지는 것이 예상됨

 

 

 


※ huggingface 토큰 업로드 관련 (https://beausty23.tistory.com/225)

https://huggingface.co/settings/tokens

 

Hugging Face – The AI community building the future.

 

huggingface.co

 - 위에서 업로드 가능

 - 계정 발급 후 토큰 업로드

  # Repository 생성 & model upload
REPO_NAME = "polyglot-12.8b_8bit-DYtest_2000" # ex) 'my-bert-fine-tuned'
AUTH_TOKEN = " " # <https://huggingface.co/settings/token>

## Upload to Huggingface Hub
model.push_to_hub(
    REPO_NAME,
    use_temp_dir=True,
    use_auth_token=AUTH_TOKEN
)
tokenizer.push_to_hub(
    REPO_NAME,
    use_temp_dir=True,
    use_auth_token=AUTH_TOKEN
)

 - 위와같이 업로드 된것이 확인됨.

 


토크나이저(Tokenizer)

NLP 파이프라인 핵심 구성요소 중 하나인 토크나이저는 텍스트를 모델에서 처리할 수 있는 데이터로 변환하는 것임.

Deeplearning을 위해 원시 텍스트를 숫자화가 가능한 토큰으로 치환시켜 가장 적합하면서 최대한 간결한 표현화

토크나이저에는 다양한 방법이 존재하며 토크나이저의 목표는 가장 의미있는 표현(meaning representation)으로 바꿔줌

  • 단어기반 토큰화(Word-based Tokenization)
  • 문자기반 토큰화(Character-based Tokenization)
  • 하위단어 토큰화(Subword Tokenization)
  • 세부 기법들
    • Byte-level BPE
    • WordPiece
    • SentencePiece, Unigram

 - 단어 기반 토큰화 (Word-based Tokenization)

단어를 기반으로 토큰화를 하여 나눔. Python에서는 split() 함수를 통해 공백을 제거하여 단어별로 나눌 수 있음.

각 단어에는 0에서부터 시작하여 어휘집 개수 사이의 ID(식별자)가 할당됨. 모델은 ID를 사용하여 각 단어를 식별

단어 기반의 토크나이저로 특정 언어를 완전해 대체하려면 해당 언어에 대한 모든 단어의 식별자가 필요함. 이는 엄청난 양의 토큰을 생성하게됨.

예를 들어 영어에서는 많은 양의 단어에 대해 'dog', 'dogs' 등 단수와 복수 형태 의 단어들이 존재함. 이 단어들은 모델이 단수인지 복수인지 처음에는 알 수 없기 때문에 다른 단어로 인식함. 이러한 많은 양의 규칙들에 대해 개별 단어에 대한 입력 식별자로 매핑을 구성하기 위해 그만큼의 식별자들을 감당해야함. 

유사한 'run', 'running', 'ran' 등 다 해당됨

그래서 어휘집(vocabulary)에 없는 단퍼를 표현하기 위한 사용자 정의 토큰이 필요. "unknown"토큰을 줄이는 것이 목표임.

토크나이저가 "unknown"토큰을 많이 생성한다는 것은 토크나이저가 해당 단어의 합당한 표현을 찾을 수 없고 그 과정에서 정보를 잃어 버린다는 뜻임.

"unknown"토큰의 양을 줄이는 방법은 문자기반(character-based)토크나이저를 사용하여 한단계 깊이 들어가는 것


 - 문자 기반 토큰화 (Character-based Tokenization)

단어형태가 아닌 문자(Character)로 나누어 진행. 어휘집(vocabulary)의 크기가 매우작고 모든 단어들은 문자를 만들 수 있어 Out-of-Vocabulary) 토큰이 훨씬 작은 장점을 가짐. 

분리된 토큰이 단어가 아닌 문자 기반이므로 각 토큰의 의미파악이 어려움. 또한, 매우 많은 양의 토큰이 발생함

 

 - 하위 단어 토큰화 (Subword Tokenization)

빈번하게 사용되는 단어는 더 작은 하위 단어로 분할하지 않고 희귀 단어를 의미 있는 하위 단어로 분할해야 한다는 원칙에 기반함

예를 들어 "recently" 는 희귀 단어로 간주하여 "recent"와 "ly"로 분해할 수 있음. 둘다 독립적인 하위단어로 출현할 가능성이 높으며 "recently"의 의미는 "recent"와 "ly"의 합성 의미로 유지 된다. 

 

 

반응형