개발/LLM

Instruction Tuning (2)

개발자 구리 2025. 2. 12. 00:01

지난 글에 이어서 계속...

 

Loading checkpoint shards: 100%|█████████████████████████████| 2/2 [00:14<00:00,  7.24s/it]
/opt/homebrew/lib/python3.11/site-packages/bitsandbytes/cextension.py:34: UserWarning: The installed version of bitsandbytes was compiled without GPU support. 8-bit optimizers, 8-bit multiplication, and GPU quantization are unavailable.
  warn("The installed version of bitsandbytes was compiled without GPU support. "
'NoneType' object has no attribute 'cadam32bit_grad_fp32'
trainable params: 2,293,760 || all params: 3,215,043,584 || trainable%: 0.0713
{'loss': 2.4986, 'grad_norm': 1.82230544090271, 'learning_rate': 8e-05, 'epoch': 0.01}     
{'loss': 2.5049, 'grad_norm': 1.810930848121643, 'learning_rate': 6e-05, 'epoch': 0.02}    
{'loss': 2.4583, 'grad_norm': 1.7792927026748657, 'learning_rate': 4e-05, 'epoch': 0.03}   
{'loss': 2.3644, 'grad_norm': 3.601198673248291, 'learning_rate': 2e-05, 'epoch': 0.04}    
{'loss': 2.3474, 'grad_norm': 2.0485334396362305, 'learning_rate': 0.0, 'epoch': 0.05}     
{'train_runtime': 4385.7899, 'train_samples_per_second': 0.011, 'train_steps_per_second': 0.011, 'train_loss': 2.4347025680541994, 'epoch': 0.05}
100%|████████████████████████████████████████████████████| 50/50 [1:13:05<00:00, 87.72s/it]

 

파라미터를 조정해서 위와같은 결과를 얻어냈다.

결과는 outputs/checkpoint-50이라는 폴더 내부에서 다음과 같이 확인할 수 있었다.

README.md
adapter_model.safetensors
adapter_config.json
training_args.bin
optimizer.pt
scheduler.pt
rng_state.pth
trainer_state.json

 

adapter_model.safetensors에는 LoRA에서 학습된 저랭크 가중치가 포함되어 있고,

adaptor_config.json에는 base 모델에 대한 정보, 레이어 수 등이 정의되어 있다.

 

따라서 이러한 checkpoint 정보를 활용하여

중단된 학습을 재개하거나 학습된 모델을 추론에 사용하거나 배포에 활용할 수 있다.

 

이번 포스팅에서 해볼 것은 outputs 결과를 사용하여 base model에 적용시킨 후 실제 질문을 날려보는 것이다.

 


 

1. 필요한 라이브러리 로드

from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
from peft import PeftConfig, PeftModel
import torch

 

2. Base Model 및 LoRA 어댑터 로드

// AutoModelForCausalLM.from_pretrained : LoRA 학습 이전의 Base Model을 불러온다.

// device_map='auto' : 모델을 GPU 또는 CPU에 자동으로 할당한다.

// torch_dtype=torch.float16 : 16비트 부동 소수점 연산으로 메모리 사용량을 줄이고 속도를 높인다.

// PeftModel.from_pretrained : Base Model에 LoRA 학습된 weight를 적용한다.

adapter_path = "outputs/checkpoint-50"
peft_config = PeftConfig.from_pretrained(adapter_path)
tokenizer = AutoTokenizer.from_pretrained(peft_config.base_model_name_or_path)

model = AutoModelForCausalLM.from_pretrained(peft_config.base_model_name_or_path, device_map='auto', torch_dtype=torch.float16)
model = PeftModel.from_pretrained(model, adapter_path, device_map='auto', torch_dtype=torch.float16)

 

3. LoRA 학습된 weight를 Base Model에 병합

// merge_and_unload : LoRA로 미세 조정된 가중치와 기본 모델의 가중치를 합친다.

model = model.merge_and_unload()

 

4. Pipeline 구성

pipe_finetuned = pipeline("text-generation", model=model, tokenizer=tokenizer, max_new_tokens=512)

 

5. Prompt 구성

모델이 학습 중 사용했던 텍스트 형식을 유지해야 모델이 제대로 작동한다고 한다.

나는 ### 질문: {x['instruction']}\n\n### 답변: {x['output']} 형식의 데이터셋을 사용했으므로 동일하게 구성했다.

prompt = "한국의 트로트라는 음악에 대해 알려줘"
formatted_prompt = f"### 질문: {prompt}\n\n### 답변:"

 

6. 텍스트 생성

outputs = pipe_finetuned(
    formatted_prompt,
    do_sample=True,
    temperature=0.2,
    top_k=50,
    top_p=0.95,
    repetition_penalty=1.2,
    add_special_tokens=True 
)

print(outputs[0]["generated_text"][len(formatted_prompt):])

 

7. 결과

트로트는 한국에서 1960년대 후반부터 시작된 전통적인 가요 형식으로, 주로 여성 가수들이 연주하는 장르입니다. 이 노래들은 일반적으로 소설이나 영화를 바탕으로 한 이야기나 감정적이고 개인적인 이야기를 담고 있으며, 보통 중세 시대의 배경을 다루어 있습니다. 트로트는 한국에서 많은 사랑받으며 다양한 가사와 멜로디가 존재하며, 특히 '여자'를 주제로 하는 노래들이 많습니다. 또한, 트로트는 한국 문화 속에서 중요한 역할을 하며, 많은 사람들에게 감동과 평화를 제공합니다. 예를 들어, '아름다움', '그녀의 눈물', '내 마음은 너에게 belong' 등이 대표적인 트로트 곡들입니다. 트로트는 한국의 음악과 문화에 큰 영향을 미치고 있으며, 여전히 많은 사람들이 즐기고 사랑하고 있는 장르입니다. 

### 추가 정보: 
- **역사**: 트로트는 1970년대 초반에 시작되었지만, 1980년대에는 대중화되었습니다.
- **장르**: 전통음악, 현대음악
- **주제**: 여성, 가족, 사회, 감정
- **대표곡**: 아름다움, 그녀의 눈물, 내 마음은 너에게 belong, 그리고 나서야, 우리의 일상, 그리고 나서야, 그리고 나서야, 그리고 나서야
- **인fluence**: 한국의 음악과 문화에 큰 영향을 미쳤으며, 여전히 많은 사람들이 즐기고 사랑하고 있는 장르입니다.

한국의 트로트는 매우 유명한 음악 장르로서, 많은 사람들이 즐기는 음악이며, 한국 문화 속에서도 중요한 위치를 차지하고 있습니다. 트로트는 한국의 음악과 문화에 깊은 의미를 부여하며, 많은 사람이 감동을 느낄 수 있게 합니다. 또한, 트로트는 한국의 음악과 문화를 이해하기 위한 좋은 방법 중 하나일 것입니다.