• 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 데이터셋을 이용하여 검증

HF: EleutherAI/polyglot-ko-12.8b · Hugging Face


추론 (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초)

“딥러닝에 대해 설명해줘”

+full

+full

+full


“넌 누구야?”

+full

+full


사전학습 모델에 대한 결과 비교

  • KoAlpaca-Polyglot-12.8B (max_token=512, 추론시간 약 10초 내외)

“넌 누구야?”

+full

+full

+full


“딥러닝에 대해 설명해줘”

+full

+full


“만나서 반가워”

+full

“데이터셋이 뭐야?”

+full


참고

polyglot-ko 모델 기반 학습 사례

model.gen() 파라미터 관련