5.6 KiB
๋ง๋ฐ2mamba-2
๊ฐ์overview
๋ง๋ฐ2 ๋ชจ๋ธ์ Tri Dao, Albert Gu๊ฐ ์ ์ํ ํธ๋์คํฌ๋จธ๋ SSM์ด๋ค: ๊ตฌ์กฐํ๋ ์ํ ๊ณต๊ฐ ์ด์ค์ฑ์ ํตํ ์ผ๋ฐํ๋ ๋ชจ๋ธ๊ณผ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ๋ผ๋ ๋ ผ๋ฌธ์์ ์๊ฐ๋์์ต๋๋ค. ๋ง๋ฐ2๋ ๋ง๋ฐ1๊ณผ ์ ์ฌํ ์ํ ๊ณต๊ฐ ๋ชจ๋ธ๋ก, ๋จ์ํ๋ ์ํคํ ์ฒ์์ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
ํด๋น ๋ ผ๋ฌธ์ ์ด๋ก์ ๋๋ค:
ํธ๋์คํฌ๋จธ๋ ์ธ์ด ๋ชจ๋ธ๋ง์์ ๋ฅ๋ฌ๋ ์ฑ๊ณต์ ์ฃผ์ ์ํคํ ์ฒ์์ง๋ง, ๋ง๋ฐ์ ๊ฐ์ ์ํ ๊ณต๊ฐ ๋ชจ๋ธ(SSM)์ด ์ต๊ทผ ์๊ท๋ชจ ํน์ ์ค๊ฐ ๊ท๋ชจ์์ ํธ๋์คํฌ๋จธ์ ๋๋ฑํ๊ฑฐ๋ ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฌํ ๋ชจ๋ธ ๊ณ์ด๋ค์ด ์ค์ ๋ก ๋งค์ฐ ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋์ด ์์์ ํ์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ตฌ์กฐํ๋ ์ค๋ถ๋ฆฌ(semiseparable) ํ๋ ฌ ์ค ์ฐ๊ตฌ๊ฐ ์ ์ด๋ฃจ์ด์ง ํด๋์ค์ ๋ค์ํ ๋ถํด๋ฅผ ํตํด ์ฐ๊ฒฐ๋ SSM๊ณผ ์ดํ ์ ๋ณํ ์ฌ์ด์ ํ๋ถํ ์ด๋ก ์ ์ฐ๊ฒฐ ํ๋ ์์ํฌ๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค. ์ํ ๊ณต๊ฐ ์ด์ค์ฑ(SSD) ํ๋ ์์ํฌ๋ฅผ ํตํด ๋ง๋ฐ1์ ์ ํ์ SSM์ ๊ฐ์ ํ ์๋ก์ด ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ ์ ์์๊ณ , ํธ๋์คํฌ๋จธ์ ๊ฒฝ์๋ ฅ์ ์ ์งํ๋ฉด์๋ ์๋๋ 2~8๋ฐฐ ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ ๋๋ค.
ํ:
์ด ๋ฒ์ ์ ๋ง๋ฐ2 ๊ตฌํ์ ์ง์ํด์ผ ํ๋ฉฐ, ํนํ Mistral AI์ Mamba-2 codestral์ ์ง์ํฉ๋๋ค. ํนํ, mamba 2 codestral์ 8๊ฐ์ groups๋ก ์ถ์๋์๋๋ฐ, ์ด๋ ์ดํ
์
๊ธฐ๋ฐ ๋ชจ๋ธ์ KV ํค๋ ์์ ์ ์ฌํ๋ค๊ณ ํ๋จ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ชจ๋ธ์ torch_forward์ cuda_kernels_forward๋ผ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ์ ๋ฐฉ ํจ์ค๋ฅผ ๊ฐ์ง๋๋ค. cuda_kernels_forward๋ ํ๊ฒฝ์์ cuda ์ปค๋์ ์ฐพ์ผ๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ฉฐ, prefill์์๋ ๋ ๋๋ฆฝ๋๋ค. ์ฆ, ๋์ CPU ์ค๋ฒํค๋๋ก ์ธํด "์์
์คํ"์ด ํ์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ด๋ จ ๋ด์ฉ์ ์ด๊ณณ๊ณผ ์ด๊ณณ์ ์ฐธ๊ณ ํ์ธ์.
์ปดํ์ผ ์์ด๋ torch_forward ๊ตฌํ์ด 3~4๋ฐฐ ๋น ๋ฆ
๋๋ค. ๋ํ, ์ด ๋ชจ๋ธ์๋ ์์น ์๋ฒ ๋ฉ์ด ์์ง๋ง attention_mask์ ๋ฐฐ์น ์์ฑ์ ๊ฒฝ์ฐ ๋ ๊ณณ์์ ์๋ ์ํ(hidden state)๋ฅผ ๋ง์คํนํ๋ ํน์ ๋ก์ง์ด ์์ต๋๋ค. ๊ด๋ จ ๋ด์ฉ์ ์ด๊ณณ์ ์ฐธ๊ณ ํ์ธ์.
์ด๋ก์ธํด ๋ง๋ฐ2 ์ปค๋์ ์ฌ๊ตฌํ๊ณผ ํจ๊ป ๋ฐฐ์น ์์ฑ ๋ฐ ์บ์๋ ์์ฑ์์ ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์๋ฉ๋๋ค. ๋ํ cuda ์ปค๋ ๋๋ torch forward๊ฐ ์ ๊ณตํ๋ ๊ฒฐ๊ณผ๊ฐ ์ฝ๊ฐ ๋ค๋ฅผ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. SSM ์๊ณ ๋ฆฌ์ฆ์ ํ ์ ์์ถ์ ํฌ๊ฒ ์์กดํ๋๋ฐ, ์ด๋ matmul๊ณผ ๋๋ฑํ์ง๋ง ์ฐ์ฐ ์์๊ฐ ์ฝ๊ฐ ๋ค๋ฅด๋ฉฐ, ์ด๋ก ์ธํด ๋ ์์ ์ ๋ฐ๋์์ ์ฐจ์ด๊ฐ ๋ ์ปค์ง๋๋ค.
๋ ๋ค๋ฅธ ์ฐธ๊ณ ์ฌํญ์ผ๋ก, ํจ๋ฉ ํ ํฐ์ ํด๋นํ๋ ์๋ ์ํ(hidden state)์ ์ข
๋ฃ๋ ๋ ๊ณณ์์ ์ด๋ฃจ์ด์ง๋ฉฐ ์ฃผ๋ก ์ผ์ชฝ ํจ๋ฉ์ผ๋ก ํ
์คํธ๋์์ต๋๋ค. ์ค๋ฅธ์ชฝ ํจ๋ฉ์ ๋
ธ์ด์ฆ๋ฅผ ์ ํํ๋ฏ๋ก ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ์ง ์์ต๋๋ค. tokenizer.padding_side = "left"๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฐ๋ฅธ ํจ๋ฉ ๋ฐฉํฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ๋ชจ๋ธ์ Molbap์ด ๊ธฐ์ฌํ์ผ๋ฉฐ, Anton Vlasjuk์ ํฐ ๋์์ ๋ฐ์์ต๋๋ค. ์๋ณธ ์ฝ๋๋ ์ด๊ณณ์์ ํ์ธํ ์ ์์ต๋๋ค.
์ฌ์ฉ
๊ฐ๋จํ ์์ฑ ์:
from transformers import Mamba2Config, Mamba2ForCausalLM, AutoTokenizer
import torch
model_id = 'mistralai/Mamba-Codestral-7B-v0.1'
tokenizer = AutoTokenizer.from_pretrained(model_id, revision='refs/pr/9', from_slow=True, legacy=False)
model = Mamba2ForCausalLM.from_pretrained(model_id, revision='refs/pr/9')
input_ids = tokenizer("Hey how are you doing?", return_tensors= "pt")["input_ids"]
out = model.generate(input_ids, max_new_tokens=10)
print(tokenizer.batch_decode(out))
์ด๊ณณ์ ๋ฏธ์ธ์กฐ์ ์ ์ํ ์ด์ ์คํฌ๋ฆฝํธ์ ๋๋ค:
from datasets import load_dataset
from peft import LoraConfig
from trl import SFTConfig, SFTTrainer
model_id = "mistralai/Mamba-Codestral-7B-v0.1"
dataset = load_dataset("Abirate/english_quotes", split="train")
training_args = SFTConfig(dataset_text_field="quote", gradient_checkpointing=True, per_device_train_batch_size=4)
lora_config = LoraConfig(target_modules=["x_proj", "embeddings", "in_proj", "out_proj"])
trainer = SFTTrainer(
model=model_id,
args=training_args,
train_dataset=dataset,
peft_config=lora_config,
)
trainer.train()
Mamba2Config
autodoc Mamba2Config
Mamba2Model
autodoc Mamba2Model - forward
Mamba2LMHeadModel
autodoc Mamba2ForCausalLM - forward