Transformers 文件

Mamba 2

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

PyTorch

Mamba 2

Mamba 2 基於狀態空間對偶 (SSD) 框架,該框架連線了結構化狀態空間模型 (SSM) 和注意力變體。它使用更高效的 SSD 演算法,比 Mamba 快 2-8 倍,並修改了架構以支援張量並行和分組值注意力 (GVA) 頭結構。

你可以在 State Space Models 組織下找到所有原始的 Mamba 2 checkpoint,但下面顯示的示例使用了 mistralai/Mamba-Codestral-7B-v0.1,因為原始 checkpoint 尚不支援 Hugging Face 實現。

點選右側邊欄中的 Mamba 模型,檢視更多如何將 Mamba 應用於不同語言任務的示例。

下面的示例演示瞭如何使用 PipelineAutoModel 以及從命令列生成文字。

hfoptions id=“usage”>

<hfoption id="Pipeline">
import torch
from transformers import pipeline

pipeline = pipeline(
    task="text-generation",
    model="mistralai/Mamba-Codestral-7B-v0.1",
    torch_dtype=torch.bfloat16,
    device=0
)
pipeline("Plants create energy through a process known as")
</hfoption> <hfoption id="AutoModel">
import torch  
from transformers import AutoModelForCausalLM, AutoTokenizer  

tokenizer = AutoTokenizer.from_pretrained("mistralai/Mamba-Codestral-7B-v0.1")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mamba-Codestral-7B-v0.1", torch_dtype=torch.bfloat16, device_map="auto")  
input_ids = tokenizer("Plants create energy through a process known as", return_tensors="pt").to("cuda")  

output = model.generate(**input_ids)  
print(tokenizer.decode(output[0], skip_special_tokens=True))
</hfoption> <hfoption id="transformers CLI">
echo -e "Plants create energy through a process known as" | transformers-cli run --task text-generation --model mistralai/Mamba-Codestral-7B-v0.1 --device 0
</hfoption> </hfoptions>

量化透過以較低精度表示權重來減少大型模型的記憶體負擔。有關更多可用量化後端,請參閱量化概述。

下面的示例使用 torchao 僅將權重量子化為 4 位整數。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, TorchAoConfig

quantization_config = TorchAoConfig("int4_weight_only", group_size=128)
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mamba-Codestral-7B-v0.1")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mamba-Codestral-7B-v0.1", torch_dtype=torch.bfloat16, quantization_config=quantization_config, device_map="auto")
input_ids = tokenizer("Plants create energy through a process known as", return_tensors="pt").to("cuda")

output = model.generate(**input_ids)
print(tokenizer.decode(output[0], skip_special_tokens=True))

說明

  • Codestral Mamba 有 groups=8,這類似於基於注意力的模型中的 kv 頭的數量。

  • Codestral Mamba 有兩個不同的前向傳播過程,torch_forwardcuda_kernels_forward,它們的結果預計會略有不同。

    • 未編譯的 torch_forwardcuda_kernels_forward 快 3-4 倍。
    • cuda_kernels_forward 在環境中可用時會使用原始的 CUDA 核心。它在預填充(prefill)階段較慢,因為它需要一次“預熱執行”,這是由於較高的 CPU 開銷(更多細節請參見這些評論)。
  • 此模型中沒有位置嵌入,但在兩個地方有一個 attention_mask 和特定的邏輯來掩碼隱藏狀態,用於批處理生成(更多細節請參見此評論)。這(以及重新實現的 Mamba 2 核心的增加)導致批處理和快取生成之間存在輕微差異。

  • SSM 演算法嚴重依賴張量收縮,它有等效的矩陣乘法,但操作順序略有不同。這使得在較小精度下的差異更大。

  • 與填充標記相對應的隱藏狀態在兩個地方被關閉,並且主要使用左填充進行測試。右填充會向下傳播噪聲,不能保證產生滿意的結果。tokenizer.padding_side = "left" 確保你使用正確的填充側。

  • 以下示例演示瞭如何使用 PEFT 對 Mamba 2 進行微調。

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

class transformers.Mamba2Config

< >

( num_heads = 128 head_dim = 64 vocab_size = 32768 hidden_size = 4096 state_size = 128 num_hidden_layers = 64 layer_norm_epsilon = 1e-05 pad_token_id = 1 bos_token_id = 0 eos_token_id = 2 expand = 2 conv_kernel = 4 n_groups = 8 use_bias = False use_conv_bias = True hidden_act = 'silu' initializer_range = 0.1 residual_in_fp32 = True time_step_rank = 'auto' time_step_min = 0.001 time_step_max = 0.1 time_step_floor = 0.0001 time_step_limit = (0.0, inf) rescale_prenorm_residual = False use_cache = True rms_norm = True chunk_size = 256 tie_word_embeddings = False **kwargs )

引數

  • num_heads (int,可選,預設為 128) — Mamba 2 演化矩陣的頭數。
  • head_dim (int,可選,預設為 64) — 每個頭的維度。
  • vocab_size (int,可選,預設為 32768) — MAMBA2 模型的詞彙表大小。定義了在呼叫 Mamba2Model 時,可以透過 inputs_ids 表示的不同標記的數量。
  • hidden_size (int,可選,預設為 4096) — 嵌入和隱藏狀態的維度。
  • state_size (int,可選,預設為 128) — 狀態空間潛變數的形狀。
  • num_hidden_layers (int,可選,預設為 64) — 模型中的隱藏層數量。
  • layer_norm_epsilon (float,可選,預設為 1e-05) — 層歸一化層中使用的 epsilon 值。
  • pad_token_id (int,可選,預設為 1) — 填充標記的 ID。
  • bos_token_id (int,可選,預設為 0) — 詞彙表中句子開頭標記的 ID。
  • eos_token_id (int,可選,預設為 2) — 詞彙表中句子結尾標記的 ID。
  • expand (int,可選,預設為 2) — 用於確定中間大小的擴充套件因子。
  • conv_kernel (int,可選,預設為 4) — 卷積核的大小。
  • n_groups (int,可選,預設為 8) — Mamba 2 演化矩陣的組數。
  • use_bias (bool,可選,預設為 False) — 是否在混合器塊的 [“in_proj”, “out_proj”] 中使用偏置。
  • use_conv_bias (bool,可選,預設為 True) — 是否在混合器塊的卷積層中使用偏置。
  • hidden_act (str,可選,預設為 "silu") — 解碼器中的非線性啟用函式(函式或字串)。
  • initializer_range (float,可選,預設為 0.1) — 用於初始化所有權重矩陣的 truncated_normal_initializer 的標準差。
  • residual_in_fp32 (bool,可選,預設為 True) — 殘差是否應為 float32。如果設定為 False,殘差將保持與模型其餘部分相同的 dtype
  • time_step_rank (Union[int,str],可選,預設為 "auto") — 離散化投影矩陣的秩。"auto" 表示它將預設為 math.ceil(self.hidden_size / 16)
  • time_step_min (float,可選,預設為 0.001) — 用於限制 dt_proj.bias 的最小 time_step
  • time_step_max (float,可選,預設為 0.1) — 用於限制 dt_proj.bias 的最大 time_step
  • time_step_floor (float,可選,預設為 0.0001) — dt_proj.bias 層初始化的最小鉗位值。
  • time_step_limit (tuple,可選,預設為 (0.0, inf)) — 接受的時間步值範圍。
  • rescale_prenorm_residual (bool,可選,預設為 False) — 初始化時是否重新縮放 out_proj 權重。
  • use_cache (bool,可選,預設為 True) — 是否應使用快取。
  • rms_norm (bool, 可選, 預設為 True) — 是否使用 RMS 歸一化。
  • chunk_size (int, 可選, 預設為 256) — 構成序列的塊的大小。
  • tie_word_embeddings (bool, 可選, 預設為 False) — 是否繫結詞嵌入。

這是一個用於儲存 Mamba2Model 配置的配置類。它根據指定的引數例項化一個 MAMBA2 模型,定義了模型的架構。使用預設值例項化配置將產生與 MAMBA2 state-spaces/mamba2-2.8b 架構類似的配置。

配置物件繼承自 PretrainedConfig,可用於控制模型輸出。有關更多資訊,請閱讀 PretrainedConfig 的文件。

示例

>>> from transformers import Mamba2Config, Mamba2Model

>>> # Initializing a Mamba2 configuration
>>> configuration = Mamba2Config()

>>> # Initializing a model (with random weights) from the configuration
>>> model = Mamba2Model(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config

Mamba2Model

class transformers.Mamba2Model

< >

( config )

引數

  • config (Mamba2Model) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型相關的權重,只會載入配置。請檢視 from_pretrained() 方法來載入模型權重。

裸 Mamba2 模型,輸出原始的隱藏狀態,頂部沒有任何特定的頭。

該模型繼承自 PreTrainedModel。請檢視超類的文件,瞭解該庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭等)。

該模型也是一個 PyTorch torch.nn.Module 的子類。可以像常規的 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.LongTensor] = None cache_params: typing.Optional[transformers.models.mamba2.modeling_mamba2.Mamba2Cache] = None use_cache: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None **kwargs ) transformers.models.mamba2.modeling_mamba2.Mamba2Outputtuple(torch.FloatTensor)

引數

  • input_ids (torch.LongTensor,形狀為 (batch_size, sequence_length)可選) — 詞彙表中輸入序列標記的索引。預設情況下,填充將被忽略。

    可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參閱 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什麼是輸入 ID?

  • inputs_embeds (torch.LongTensor,形狀為 (batch_size, sequence_length, hidden_size)可選) — 可選地,你可以不傳遞 input_ids,而是直接傳遞嵌入表示。如果你想比模型內部的嵌入查詢矩陣更能控制如何將 input_ids 索引轉換為關聯向量,這會非常有用。
  • cache_params (Mamba2Cache, 可選) — 如果傳遞該引數,模型將在所有塊中使用先前的狀態(這將給出所提供 input_ids 的輸出,就好像模型將 state_input_ids + input_ids 作為上下文一樣)。
  • use_cache (bool, 可選) — 如果設定為 True,將返回 cache_params,可用於快速生成下一個 logits。
  • output_hidden_states (bool, 可選) — 是否返回所有層的隱藏狀態。有關更多詳細資訊,請參閱返回的張量下的 hidden_states
  • return_dict (bool, 可選) — 是返回一個 ModelOutput 而不是一個普通的元組。
  • cache_position (torch.LongTensor,形狀為 (batch_size,)可選) — 當前輸入在快取中的位置。這用於確保快取被正確更新。如果傳遞了 cache_params,也應傳遞 cache_position
  • attention_mask (torch.Tensor,形狀為 (batch_size, sequence_length)可選) — 用於避免在填充標記索引上執行注意力的掩碼。掩碼值在 [0, 1] 中選擇:

    • 1 表示標記未被遮蓋
    • 0 表示標記被遮蓋

    什麼是注意力掩碼?

返回

transformers.models.mamba2.modeling_mamba2.Mamba2Outputtuple(torch.FloatTensor)

一個 transformers.models.mamba2.modeling_mamba2.Mamba2Output 或一個 torch.FloatTensor 的元組(如果傳遞了 return_dict=False 或當 config.return_dict=False 時),根據配置(Mamba2Config)和輸入,包含各種元素。

  • last_hidden_state (形狀為 (batch_size, sequence_length, hidden_size)torch.FloatTensor, 可選,預設為 None) — 模型最後一層輸出的隱藏狀態序列。

  • cache_params (~models.mamba2.modeling_mamba2.Mamba2Cache, 可選, 預設為 None) — 模型在最後一個時間步的狀態。可以在前向方法中使用下一個 input_ids,以避擴音供舊的 input_ids

    包括選擇性掃描後的狀態空間模型狀態矩陣和卷積狀態

  • hidden_states (tuple[torch.FloatTensor], 可選, 當傳遞 output_hidden_states=Trueconfig.output_hidden_states=True 時返回) — torch.FloatTensor 的元組(如果模型有嵌入層,則一個用於嵌入層的輸出,另外每個層一個輸出),形狀為 (batch_size, sequence_length, hidden_size)

    模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。

Mamba2Model 的 forward 方法,重寫了 __call__ 特殊方法。

儘管前向傳遞的邏輯需要在此函式內定義,但之後應該呼叫 `Module` 例項而不是這個函式,因為前者會處理前處理和後處理步驟,而後者會靜默地忽略它們。

Mamba2LMHeadModel

class transformers.Mamba2ForCausalLM

< >

( config )

引數

  • config (Mamba2ForCausalLM) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型相關的權重,只會載入配置。請檢視 from_pretrained() 方法來載入模型權重。

MAMBA2 模型,其頂部帶有一個語言建模頭(線性層,權重與輸入嵌入不繫結)。

該模型繼承自 PreTrainedModel。請檢視超類的文件,瞭解該庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭等)。

該模型也是一個 PyTorch torch.nn.Module 的子類。可以像常規的 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None cache_params: typing.Optional[transformers.models.mamba2.modeling_mamba2.Mamba2Cache] = None labels: typing.Optional[torch.LongTensor] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None use_cache: typing.Optional[bool] = None cache_position: typing.Optional[torch.Tensor] = None attention_mask: typing.Optional[torch.Tensor] = None **kwargs ) transformers.models.mamba2.modeling_mamba2.Mamba2CausalLMOutputtuple(torch.FloatTensor)

引數

  • input_ids (torch.LongTensor,形狀為 (batch_size, sequence_length)可選) — 詞彙表中輸入序列標記的索引。預設情況下,填充將被忽略。

    可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參閱 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什麼是輸入 ID?

  • inputs_embeds (torch.FloatTensor,形狀為 (batch_size, sequence_length, hidden_size)可選) — 可選地,你可以不傳遞 input_ids,而是直接傳遞嵌入表示。如果你想比模型內部的嵌入查詢矩陣更能控制如何將 input_ids 索引轉換為關聯向量,這會非常有用。
  • cache_params (Mamba2Cache, 可選) — 如果傳遞該引數,模型將在所有塊中使用先前的狀態(這將給出所提供 input_ids 的輸出,就好像模型將 state_input_ids + input_ids 作為上下文一樣)。
  • labels (torch.LongTensor,形狀為 (batch_size, sequence_length)可選) — 用於語言建模的標籤。請注意,標籤在模型內部會進行移位,即你可以設定 labels = input_ids。索引在 [-100, 0, ..., config.vocab_size] 中選擇。所有設定為 -100 的標籤都會被忽略(遮蓋),損失僅對 [0, ..., config.vocab_size] 中的標籤進行計算。
  • output_hidden_states (bool, 可選) — 是否返回所有層的隱藏狀態。有關更多詳細資訊,請參閱返回的張量下的 hidden_states
  • return_dict (bool, 可選) — 是返回一個 ModelOutput 而不是一個普通的元組。
  • use_cache (bool, 可選) — 如果設定為 True,將返回 cache_params,可用於快速生成下一個 logits。
  • cache_position (torch.LongTensor,形狀為 (batch_size,)可選) — 當前輸入在快取中的位置。這用於確保快取被正確更新。如果傳遞了 cache_params,也應傳遞 cache_position
  • attention_mask (torch.Tensor,形狀為 (batch_size, sequence_length)可選) — 用於避免在填充標記索引上執行注意力的掩碼。掩碼值在 [0, 1] 中選擇:

    • 1 表示標記未被遮蓋
    • 0 表示標記被遮蓋

    什麼是注意力掩碼?

返回

transformers.models.mamba2.modeling_mamba2.Mamba2CausalLMOutputtuple(torch.FloatTensor)

一個 transformers.models.mamba2.modeling_mamba2.Mamba2CausalLMOutput 或一個 torch.FloatTensor 的元組(如果傳遞了 return_dict=False 或當 config.return_dict=False 時),根據配置(Mamba2Config)和輸入,包含各種元素。

  • loss (torch.FloatTensor 形狀為 (1,)可選,當提供 labels 時返回) — 語言建模損失(用於下一個 token 預測)。

  • logits (形狀為 (batch_size, sequence_length, config.vocab_size)torch.FloatTensor) — 語言建模頭部的預測分數(SoftMax 之前的每個詞彙標記的分數)。

  • cache_params (~models.mamba2.modeling_mamba2.Mamba2Cache, 可選, 預設為 None) — 模型在最後一個時間步的狀態。可以在前向方法中使用下一個 input_ids,以避擴音供舊的 input_ids

    包括選擇性掃描後的狀態空間模型狀態矩陣和卷積狀態

  • hidden_states (tuple[torch.FloatTensor], 可選, 當傳遞 output_hidden_states=Trueconfig.output_hidden_states=True 時返回) — torch.FloatTensor 的元組(如果模型有嵌入層,則一個用於嵌入層的輸出,另外每個層一個輸出),形狀為 (batch_size, sequence_length, hidden_size)

    模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。

Mamba2ForCausalLM 的 forward 方法,重寫了 __call__ 特殊方法。

儘管前向傳遞的邏輯需要在此函式內定義,但之後應該呼叫 `Module` 例項而不是這個函式,因為前者會處理前處理和後處理步驟,而後者會靜默地忽略它們。

示例

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.