AI

[AI] Gemma 사용해보기

MarrRang 2024. 3. 16. 17:28

Gemma

Google에서 공개한 경량 오픈 모델(sLLM), 경량 모델로서 온디바이스 모델로 활용하기 적합

현재는 Parameter 20억개, 70억개 모델로 gemma-2b, gemma-7b가 공개 상태

  • Apache-2.0 라이센스

HuggingFace Gemma

아래는 HuggingFace를 이용한 방법으로 설명

환경 세팅

HuggingFace Gemma 라이센스 승인하기

https://huggingface.co/google/gemma-2b

 

google/gemma-2b · Hugging Face

This repository is publicly accessible, but you have to accept the conditions to access its files and content. To access Gemma on Hugging Face, you’re required to review and agree to Google’s usage license. To do this, please ensure you’re logged-in

huggingface.co

위 페이지에서 Acknowledge license 클릭 후 진행

사용할 Token 발급

우측 상단의 Setting > Access Tokens > read token 생성

HuggingFace-cli 설치 및 로그인

 //HuggingFace-cli 설치
 pip install -U "huggingface_hub[cli]"
 
 //로그인
 huggingface-cli login --token [Your Token]

Gemma 모델 로컬에 설치

코드에 토큰 넣어서 모델 직접 로드

# Load model directly
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b", token="Your Token")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2b", token="Your Token")

cli로 설치

# Install model with cli
huggingface-cli download --local-dir . google/gemma-2b

Library 설치

//사용하기에 필요한 라이브러리
pip install -U transformers

//fine-tuning을 원한다면 아래도 설치
//CPU, GPU 버전에서 사용하는 라이브러리 전부 설치
pip install -U bitsandbytes
pip install -U peft
pip install -U accelerate
pip install -U datasets
  • transformers : Gemma를 사용하기 위한 자연어 처리를 위한 딥러닝 모델 및 관련 도구를 제공하는 라이브러리
  • bitsandbytes : 8-bit optimizers, matrix multiplication (LLM.int8()), and 8 + 4-bit quantization 같은 CUDA 커스텀 함수에 대한 Python wrapper를 담은 라이브러리
  • peft : HuggingFace의 peft 라이브러리. PEFT(Parameter-Efficient Fine-Tuning)는 대규모 언어 모델(LLM)들이 등장하면서 모든 파라미터를 fine-tuning 하기에는 엄청난 비용이 들어서 소수의 파라미터만을 수정하면서 비슷한 성능을 내게해주는 방법
  • accelerate : pytorch로 여러줄 작성해야하는 작업을 단순화 시켜주는 라이브러리
  • datasets : huggingface에 등록된 dataset을 불러오거나 원하는 dataset을 모델에 맞게 로딩해주는 기능을 담은 라이브러리

Gemma 사용하기

CPU 버전

from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2b")

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt")

outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))

GPU 버전

# pip install accelerate
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2b", device_map="auto")

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt").to("cuda")

outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))

Gemma 튜닝하기(CPU 사용)

# 사용할 라이브러리 전체 import

import json
import transformers
from peft import LoraConfig
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import SFTTrainer
from datasets import load_dataset
# 아래에서는 train에 사용할 데이터는 json list형태로 준비합니다.
# 이외에도 다양한 형태가 가능합니다.

train_dataset = Train에 사용할 데이터 준비

with open("./train_data.json", 'w') as json_file:
  json.dump(train_dataset, json_file)
# Lora(Low-Rank Adaptation of Large Language Models)는
  PEFT 기법 중 하나로 pre-trained weight는 고정하고 dense layer만 rank decomposition matrices를 최적화하는 방식
# row-rank decomposition matrices : 저차원 행렬 분해
# Lora 논문 : https://arxiv.org/pdf/2106.09685.pdf

lora_config = LoraConfig(
        r=8,
        target_modules=["q_proj", "o_proj", "k_proj", "v_proj", "gate_proj", "up_proj", "down_proj"],
        task_type="CAUSAL_LM"
    )
    
model_id = "google/gemma-2b"
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="auto", device_map="cpu")
tokenizer = AutoTokenizer.from_pretrained(model_id)

data_files = {"train": "./train_data.json", "test": "./test_data.json"}
data = load_dataset("json", data_files=data_files)
# formatting_func은 Gemma에게 instruction으로 제공할 형태로 만드는 함수

def formatting_func(example):
    # 예시로 작성
    text = f"Quote: {example['quote'][0]}\nAuthor: {example['author'][0]}"
    return [text]
    
trainer = SFTTrainer(
    model=model,
    train_dataset=data["train"],
    args=transformers.TrainingArguments(
        per_device_train_batch_size=1,
        gradient_accumulation_steps=2,
        warmup_steps=1,
        max_steps=3,
        learning_rate=2e-4,
        logging_steps=2,
        save_strategy="steps",
        output_dir="outputs",
        optim="adamw_torch",
        use_cpu=True
    ),
    tokenizer=tokenizer,
    peft_config=lora_config,
    formatting_func=formatting_func
)

trainer.train()

Gemma 튜닝하기(GPU 사용)

# 사용할 라이브러리 전체 import

import json
import transformers
from peft import LoraConfig
from transformers import AutoTokenizer, AutoModelForCausalLM
from trl import SFTTrainer
from datasets import load_dataset
# 아래에서는 train에 사용할 데이터는 json list형태로 준비합니다.
# 이외에도 다양한 형태가 가능합니다.

train_dataset = Train에 사용할 데이터 준비

with open("./train_data.json", 'w') as json_file:
  json.dump(train_dataset, json_file)
# Lora(Low-Rank Adaptation of Large Language Models)는
  PEFT 기법 중 하나로 pre-trained weight는 고정하고 dense layer만 rank decomposition matrices를 최적화하는 방식
# row-rank decomposition matrices : 저차원 행렬 분해
# Lora 논문 : https://arxiv.org/pdf/2106.09685.pdf

lora_config = LoraConfig(
        r=8,
        target_modules=["q_proj", "o_proj", "k_proj", "v_proj", "gate_proj", "up_proj", "down_proj"],
        task_type="CAUSAL_LM"
    )
    
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)
    
model_id = "google/gemma-2b"
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype="auto", device_map="auto", quantization_config=bnb_config)
tokenizer = AutoTokenizer.from_pretrained(model_id)

data_files = {"train": "./train_data.json", "test": "./test_data.json"}
data = load_dataset("json", data_files=data_files)
# formatting_func은 Gemma에게 instruction으로 제공할 형태로 만드는 함수

def formatting_func(example):
    # 예시로 작성
    text = f"Quote: {example['quote'][0]}\nAuthor: {example['author'][0]}"
    return [text]
    
trainer = SFTTrainer(
    model=model,
    train_dataset=data["train"],
    args=transformers.TrainingArguments(
        per_device_train_batch_size=1,
        gradient_accumulation_steps=2,
        warmup_steps=1,
        max_steps=3,
        learning_rate=2e-4,
        fp16=True,
        logging_steps=2,
        save_strategy="steps",
        output_dir="outputs",
        optim="paged_adamw_8bit"
    ),
    tokenizer=tokenizer,
    peft_config=lora_config,
    formatting_func=formatting_func
)

trainer.train()
반응형