้กน็›ฎๆ–‡ไปถๅคน

ๆ–‡ไปถ
wehub-resource-sync e06fe8e8c6
Secret Leaks / trufflehog (push) Failing after 1s
Build documentation / build (push) Failing after 1s
Build documentation / build_other_lang (push) Failing after 0s
CodeQL Security Analysis / CodeQL Analysis (push) Failing after 0s
PR CI / pr-ci (push) Failing after 1s
Slow tests on important models (on Push - A10) / Get all modified files (push) Failing after 1s
Slow tests on important models (on Push - A10) / Model CI (push) Has been skipped
Self-hosted runner (benchmark) / Benchmark (aws-g5-4xlarge-cache) (push) Has been cancelled
New model PR merged notification / Notify new model (push) Has been cancelled
Update Transformers metadata / build_and_package (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 11:57:37 +08:00

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