- author: Minseok Kim
- created: 2023-09-13
테스트 환경
Environment
하드웨어 구성
- _CPU: AMD EPYC 7302 16-Core Processor x 2
- CPU RAM: 256G
- GPU: Tesla A100 40G x 3, CUDA 11.8
- OS: Ubuntu 22.04 LTS
Python 환경
- Python: Anaconda - Python 3.8
- LIbs: transformers, xformers, torch 2.0.1+cu118, accelerate
- _Local jupyter server: http://192.168.100.249:8888
Base Model
Polyglot-ko-12.8b
polyglot-ko-12.8b
- EleutherAI polyglot 팀에서 만든 대규모 한국어 회귀모델
- 40개의 트렌스포머 레이어로 약 128억개 파마리터로 구성
- 864GB 의 한국어 데이터셋으로 학습 (682GB가 한국 블로그 게시물 내용)
- GPT-NeoX 프레임워크를 사용하여 256개의 A100 GPU에서 301,000단계에 걸쳐 1,670억 개의 토큰 학습
- cross-entropy loss 사용
- KOBEST 데이터셋을 이용하여 검증
추론 (Inference)
샘플 코드
- import library
import datasets
import transformers
from transformers import AutoTokenizer, AutoModelForCausalLM
- load model
model_path = "./base_models/polyglot-ko-12.8b"
model = AutoModelForCausalLM.from_pretrained(
model_path,
torch_dtype=torch.float16, # 기본: float32
low_cpu_mem_usage=True, # gpu에 바로 올림
device_map="auto" # multi gpu 사용
)
print("model.dtype: ", model.dtype)
# 토크나이저 로드
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 추론모드
model.eval()
torch_dtype = torch.float16
: 해당 옵션이 빠지면 model의 config 파일에서 dtpye을 불러와 지정하는 줄 알았으나, 기본 옵션인 float32로 모델을 불러오므로 해당 옵션을 사용해주어야함
low_cpu_mem_usage = True
: 기본 세팅은 False 이며, 모델을 CPU Ram에 올리고 → GPU로 복사함. True일 경우 모델의 weight를 곧바로 GPU로 업로드함 (Huggingface의 Accelerator가 필요)
device_map="auto"
: 멀티 GPU 환경에서 자동으로 분배low_cpu_mem_usage=True
옵션과 같이 곧바로 GPU에 업로드됨
- 추론 함수 정의
- 허깅페이스 파이프라인을 이용한 추론함수 생성법 (xformer를 사용하면 더욱 빠르게 추론 가능)
pipe = pipeline(
'text-generation',
model=model,
tokenizer=tokenizer,
)
def ask(x, context='', is_input_full=False):
ans = pipe(
f"### 질문: {x}\n\n### 맥락: {context}\n\n### 답변:" if context else f"### 질문: {x}\n\n### 답변:",
do_sample=True, #샘플링 방법(False일 경우 그리디서치 = 대답동일)
temperature=0.7, #템퍼러처 스케일링
top_k=50,
top_p=0.92,
repetition_penalty=1.5,
no_repeat_ngram_size=3,
return_full_text=True,
early_stopping=True,
max_new_tokens=512,
eos_token_id=2,
)
print(ans[0]['generated_text'])
- 추론 함수 사용
gen1("딥러닝에 대해 설명해줘")
>> 딥 러닝은 인공 신경망의 일종으로, 사람이 사물을 인식하는 방법과 비슷한 형태로 컴퓨터가 학습할 수 있도록 하기 위해 고안된 기계학습 알고리즘입니다.
추론 함수 파라미터 튜닝
주요 파라미터
max_new_tokens
: 생성되는 문장 토큰의 길이do_sample
: (True/False) 샘플링방법 사용 유무. False일 경우 그리디 서치 적용 = 같은 질문에 대한 답이 매번 같음temperature
: sampling 을 할 때 무작위성을 얼마나 조정할 것인지 결정 (값이 0에 가까울 수록 덜 랜덤해진다). 템퍼러처 스케일링은 탑k 샘플링, 탑p 샘플링과 같이 적용해야 의미가 있음top_k
: top k 샘플링 계수top_p
: top p 샘플링 계수, 0에 가까울수록 후보 단어 수가 줄어들어 그리디 서치와 비슷해짐repetition_penalty
: 반복에 대한 패널티early_stopping
: EOS(End of Squence) 토큰이 나오면 생성 중단
파라미터 튜닝
- KoAlpaca 샘플을 참고한 파라미터
max_new_tokens=512,
early_stopping=True,
do_sample=True,
eos_token_id=2
- 커스텀 파라미터
do_sample=True,
temperature=0.7,
top_k=50,
top_p=0.92,
repetition_penalty=1.5,
no_repeat_ngram_size=3,
early_stopping=True,
max_new_tokens=512,
eos_token_id=2
추론 결과 비교
파라미터에 따른 결과 비교
- Polyglot-ko-12.8B
- KoAlpaca 샘플(gen1) vs 커스텀 파라미터(gen2) (max_token=512, 추론시간 약 30~ 40초)
“딥러닝에 대해 설명해줘”
“넌 누구야?”
사전학습 모델에 대한 결과 비교
- KoAlpaca-Polyglot-12.8B (max_token=512, 추론시간 약 10초 내외)
“넌 누구야?”
“딥러닝에 대해 설명해줘”
“만나서 반가워”
“데이터셋이 뭐야?”
참고
- EleutherAI/polyglot-ko-12.8b · Hugging Face
- GitHub - Beomi/KoAlpaca: KoAlpaca: 한국어 명령어를 이해하는 오픈소스 언어모델
polyglot-ko 모델 기반 학습 사례
- 최종 프로젝트 - 내 마음을 들여다보는 챗봇, 내마리(MyMary)
- GitHub - HeegyuKim/open-korean-instructions: 언어모델을 학습하기 위한 공개 한국어 instruction dataset들을 모아두었습니다.
- polyglot-ko GGML 우바부가에서 실행하도록 만들어왔습니다 - Ai 언어모델 로컬 채널
- polyglot-ko-1.3b QLoRA 감정 분석 (긍정 / 중립 / 부정) - Ai 언어모델 로컬 채널
- GitHub - jwj7140/Gugugo: Gugugo: 한국어 오픈소스 번역 모델 프로젝트
- Polyglot 12.8B finetuning. 공개된 한글 언어모델이 별로 없는 와중에 EleutherAI의… | by Chang | Medium
model.gen() 파라미터 관련