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
위 페이지에서 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()
반응형