Transformers 文档
Moshi
并获得增强的文档体验
开始使用
Moshi
概述
Moshi 模型由 Alexandre Défossez, Laurent Mazaré, Manu Orsini, Amélie Royer, Patrick Pérez, Hervé Jégou, Edouard Grave 和 Neil Zeghidour 在 Moshi: a speech-text foundation model for real-time dialogue 中提出。
Moshi 是一个语音-文本基础模型,它将口语对话视为语音到语音的生成。Moshi 从一个文本语言模型主干开始,将语音生成为神经音频编解码器的残差量化器的令牌,同时将自己的语音和用户的语音分别建模为并行流。这允许消除显式说话人轮次,并建模任意对话动态。Moshi 还将时间对齐的文本令牌预测为音频令牌的前缀。这种“内心独白”方法显著提高了生成语音的语言质量,并提供了流式语音识别和文本到语音功能。因此,Moshi 是第一个实时全双工口语大型语言模型,理论延迟为 160 毫秒,实际延迟为 200 毫秒。

论文摘要如下:
我们引入 Moshi,一个语音-文本基础模型和全双工口语对话框架。当前的口语对话系统依赖于独立组件的管道,即语音活动检测、语音识别、文本对话和文本到语音。这样的框架无法模拟真实对话的体验。首先,它们的复杂性导致交互之间存在几秒的延迟。其次,文本是对话的中间模态,修改意义的非语言信息(例如情感或非语音声音)在交互中丢失。最后,它们依赖于说话人轮次的分割,这不考虑重叠语音、中断和插话。Moshi 通过将口语对话视为语音到语音的生成,解决了这些独立问题。Moshi 从一个文本语言模型主干开始,将语音生成为神经音频编解码器的残差量化器的令牌,同时将自己的语音和用户的语音分别建模为并行流。这允许消除显式说话人轮次,并建模任意对话动态。此外,我们将先前工作的分层语义到声学令牌生成扩展为首先预测时间对齐的文本令牌作为音频令牌的前缀。这种“内心独白”方法不仅显著提高了生成语音的语言质量,而且我们还说明了它如何提供流式语音识别和文本到语音功能。我们得到的模型是第一个实时全双工口语大型语言模型,理论延迟为 160 毫秒,实际延迟为 200 毫秒,并可在 github.com/kyutai-labs/moshi 获取。
Moshi 处理 3 种信息流
- 用户的音频
- Moshi 的音频
- Moshi 的文本输出
与 ~MusicgenModel 类似,音频用音频码本表示,可以像令牌一样解释。文本令牌和音频码本之间的主要区别在于音频码本引入了一个额外的信息维度。文本令牌的维度通常是 (batch_size, sequence_length)
,但音频令牌的维度是 (batch_size, num_codebooks, sequence_length)
。
Moshi 由 3 个组件组成
1. 主要解码器(论文中的 Helium)
它对应于 MoshiForCausalLM。它严格来说是一个经典的文本 LLM,使用与 ~GemmaForCausalLM
相似的架构。换句话说,它接收文本令牌,对其进行嵌入,通过解码器和语言头,获得文本 logits。
2. 深度解码器
就其本身而言,它也是一个经典的 LLM,但这次,它不是在时间维度上生成,而是在码本维度上生成。
这也意味着它的上下文长度是 num_codebooks
,因此它不能生成超过 num_codebooks
的内容。
请注意,每个时间戳(即每个码本)都有自己的一组线性层和嵌入。
3. MimiModel
它是 Kyutai 的音频编码器,最近已集成到 transformers 中,用于“分词”音频。它的用途与 ~MusicgenModel 中 ~EncodecModel 的用途相同。
提示:
原始检查点可以使用转换脚本 src/transformers/models/moshi/convert_moshi_transformers.py
进行转换
如何使用模型:
此实现有两个主要目标
- 通过简化原始 API 快速测试模型生成
- 简化训练。训练指南即将发布,但欢迎用户贡献!
它专为中间使用而设计。我们强烈建议使用原始 实现 来实时流式推断模型。
1. 模型生成
Moshi 是一个流式自回归模型,具有两个音频流。换句话说,一个音频流对应于模型所说/将说的内容,另一个音频流对应于用户所说/将说的内容。
MoshiForConditionalGeneration.generate() 因此需要 3 个输入
input_ids
- 对应于文本令牌历史moshi_input_values
或moshi_audio_codes
- 对应于模型音频历史user_input_values
或user_audio_codes
- 对应于用户音频历史
这三个输入必须同步。这意味着它们的长度必须对应相同数量的令牌。
您可以根据要测试的内容动态使用这 3 个输入
- 只需检查模型对用户提示的响应 - 在这种情况下,
input_ids
可以填充填充令牌,user_input_values
可以是与用户提示相同形状的零张量。 - 测试更复杂的行为 - 在这种情况下,您必须小心输入令牌与音频的同步方式。
原始模型通过在每个令牌发音之间填充文本来同步文本和音频。
为了遵循下图的示例,"Hello, I'm Moshi"
可以转换为 "Hello,<pad><unk>I'm Moshi"
。

MoshiForConditionalGeneration.generate() 然后自回归地将自身的音频流馈送给自身,但由于在使用 transformers
时无法访问用户输入流,因此它将假定用户正在生成空白音频。
>>> from datasets import load_dataset, Audio
>>> import torch, math
>>> from transformers import MoshiForConditionalGeneration, AutoFeatureExtractor, AutoTokenizer
>>> librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
>>> feature_extractor = AutoFeatureExtractor.from_pretrained("kyutai/moshiko-pytorch-bf16")
>>> tokenizer = AutoTokenizer.from_pretrained("kyutai/moshiko-pytorch-bf16")
>>> device = "cuda"
>>> dtype = torch.bfloat16
>>> # prepare user input audio
>>> librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
>>> audio_sample = librispeech_dummy[-1]["audio"]["array"]
>>> user_input_values = feature_extractor(raw_audio=audio_sample, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt").to(device=device, dtype=dtype)
>>> # prepare moshi input values - we suppose moshi didn't say anything while the user spoke
>>> moshi_input_values = torch.zeros_like(user_input_values.input_values)
>>> # prepare moshi input ids - we suppose moshi didn't say anything while the user spoke
>>> num_tokens = math.ceil(moshi_input_values.shape[-1] * waveform_to_token_ratio)
>>> input_ids = torch.ones((1, num_tokens), device=device, dtype=torch.int64) * tokenizer.encode("<pad>")[0]
>>> # generate 25 new tokens (around 2s of audio)
>>> output = model.generate(input_ids=input_ids, user_input_values=user_input_values.input_values, moshi_input_values=moshi_input_values, max_new_tokens=25)
>>> text_tokens = output.sequences
>>> audio_waveforms = output.audio_sequences
2. 模型训练
由于需要对流进行对齐/同步,大部分工作必须在数据创建/预处理期间完成。
完成后,您可以简单地将 text_labels
和 audio_labels
以及常规输入传递给 MoshiForConditionalGeneration.forward(),以获取模型损失。
训练指南即将发布,但欢迎用户贡献!
模型如何转发输入/生成:
输入流被嵌入并组合到
inputs_embeds
中。inputs_embeds
通过主解码器,主解码器像普通 LLM 一样处理它。主解码器输出
text logits
,同时输出其last hidden state
,在论文中称为temporal context
。深度解码器切换了我们转发/生成的维度(码本而不是时间)。它使用从
text logits
和temporal context
生成的令牌自回归地生成音频码本。
此模型由 Yoach Lacombe (ylacombe) 贡献。
原始代码可在此处找到。
MoshiConfig
class transformers.MoshiConfig
< 来源 >( vocab_size = 32000 hidden_size = 4096 num_hidden_layers = 32 num_attention_heads = 32 num_key_value_heads = None audio_vocab_size = None max_position_embeddings = 3000 rope_theta = 10000.0 hidden_act = 'silu' head_dim = None initializer_range = 0.02 use_cache = True sliding_window = 3000 attention_dropout = 0.0 ffn_dim = 22528 rms_norm_eps = 1e-08 num_codebooks = 8 tie_word_embeddings = False **kwargs )
参数
- vocab_size (
int
, 可选, 默认为 32000) — MoshiDecoder 模型的词汇表大小。定义了调用MoshiDecoder
时传入的inputs_ids
可以表示的不同令牌的数量。 - hidden_size (
int
, 可选, 默认为 4096) — 主解码器的层和池化层的维度。 - num_hidden_layers (
int
, 可选, 默认为 32) — 解码器层数。 - num_attention_heads (
int
, 可选, 默认为 32) — 主解码器块中每个注意力层的注意力头数量。 - num_key_value_heads (
int
, 可选) — 用于实现分组查询注意力的键值头数量。如果num_key_value_heads=num_attention_heads
,模型将使用多头注意力 (MHA);如果num_key_value_heads=1
,模型将使用多查询注意力 (MQA);否则使用 GQA。将多头检查点转换为 GQA 检查点时,每个分组键和值头应通过对该组内的所有原始头进行均值池化来构建。有关更多详细信息,请查看此论文。如果未指定,将默认为num_attention_heads
。 - audio_vocab_size (
int
, 可选) — 模型音频部分的词汇表大小。定义了调用 Moshi 模型时传入的audio_codes
可以表示的不同令牌的数量。 - max_position_embeddings (
int
, 可选, 默认为 3000) — 此模型可能使用的最大序列长度。通常,为以防万一设置一个较大的值(例如 512 或 1024 或 2048)。 - rope_theta (
float
, 可选, 默认为 10000.0) — RoPE 嵌入的基本周期。 - hidden_act (
str
或function
, 可选, 默认为"silu"
) — 解码器中的非线性激活函数(函数或字符串)。 - head_dim (
int
, 可选, 默认为hidden_size // num_attention_heads
) — 注意力头维度。 - initializer_range (
float
, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的截断正态分布初始化器的标准差。 - use_cache (
bool
, 可选, 默认为True
) — 模型是否应返回最后一个键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True
时相关。 - sliding_window (
int
, 可选, 默认为 3000) — 滑动窗口注意力窗口大小。如果未指定,将默认为3000
。 - attention_dropout (
float
, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。 - ffn_dim (
int
, 可选, 默认为 22528) — 主解码器块中“中间”(通常称为前馈)层的维度。必须为偶数。 - rms_norm_eps (
float
, 可选, 默认为 1e-08) — rms 归一化层使用的 epsilon。 - num_codebooks (
int
, 可选, 默认为 8) — 每个音频通道的音频码本数量。 - tie_word_embeddings (
bool
, 可选, 默认为False
) — 是否绑定权重嵌入。 - kwargs (可选) — 关键字参数字典。值得注意的是:
- audio_encoder_config (PretrainedConfig, 可选) — 定义音频编码器配置的配置对象实例。
- depth__config (PretrainedConfig, 可选) — 定义深度解码器配置的配置对象实例。
这是用于存储 MoshiModel 配置的配置类。它用于根据指定参数实例化 Moshi 模型,定义音频编码器、Moshi 深度解码器和 Moshi 解码器配置。使用默认值实例化配置将生成与 Moshiko 模型类似的配置,例如 kmhf/hf-moshiko
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
示例
>>> from transformers import (
... MoshiConfig,
... MoshiForConditionalGeneration,
... )
>>> configuration = MoshiConfig()
>>> # Initializing a MoshiForConditionalGeneration (with random weights) from the kmhf/hf-moshiko style configuration
>>> model = MoshiForConditionalGeneration(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
>>> # Saving the model, including its configuration
>>> model.save_pretrained("kmhf/hf-moshiko")
>>> # loading model and config from pretrained folder
>>> moshi_config = MoshiConfig.from_pretrained("kmhf/hf-moshiko")
>>> model = MoshiForConditionalGeneration.from_pretrained("kmhf/hf-moshiko", config=moshi_config)
from_audio_encoder_config
< 来源 >( audio_encoder_config: PretrainedConfig **kwargs ) → MoshiConfig
从音频编码器配置实例化 MoshiConfig(或派生类)。
MoshiDepthConfig
class transformers.MoshiDepthConfig
< 来源 >( vocab_size = 32000 hidden_size = 1024 input_size = 4096 num_hidden_layers = 6 num_attention_heads = 16 num_key_value_heads = None audio_vocab_size = 2048 max_position_embeddings = 9 hidden_act = 'silu' head_dim = None initializer_range = 0.02 use_cache = True sliding_window = 8 attention_dropout = 0.0 ffn_dim = 5632 rms_norm_eps = 1e-08 num_codebooks = 8 tie_word_embeddings = False **kwargs )
参数
- vocab_size (
int
, 可选, 默认为 32000) — MoshiDepthDecoder 模型的词汇表大小。定义了调用MoshiDepthDecoder
时传入的inputs_ids
可以表示的不同令牌的数量。 - hidden_size (
int
, 可选, 默认为 1024) — 深度解码器的层和池化层的维度。 - input_size (
int
, 可选, 默认为 4096) — 输入隐藏状态的维度。用于连接主解码器到深度解码器。 - num_hidden_layers (
int
, 可选, 默认为 6) — 深度解码器层数。 - num_attention_heads (
int
, 可选, 默认为 16) — 深度解码器块中每个注意力层的注意力头数量。 - num_key_value_heads (
int
, 可选) — 用于实现分组查询注意力的键值头数量。如果num_key_value_heads=num_attention_heads
,模型将使用多头注意力 (MHA);如果num_key_value_heads=1
,模型将使用多查询注意力 (MQA);否则使用 GQA。将多头检查点转换为 GQA 检查点时,每个分组键和值头应通过对该组内的所有原始头进行均值池化来构建。有关更多详细信息,请查看此论文。如果未指定,将默认为num_attention_heads
。 - audio_vocab_size (
int
, 可选, 默认为 2048) — 模型音频部分的词汇表大小。定义了调用 Moshi 模型时传入的audio_codes
可以表示的不同令牌的数量。 - max_position_embeddings (
int
, 可选, 默认为 9) — 此模型可能使用的最大序列长度。通常,为以防万一设置一个较大的值(例如 512 或 1024 或 2048)。 - hidden_act (
str
或function
, 可选, 默认为"silu"
) — 深度解码器中的非线性激活函数(函数或字符串)。 - head_dim (
int
, optional, 默认为hidden_size // num_attention_heads
) — 注意力头维度。 - initializer_range (
float
, optional, 默认为 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。 - use_cache (
bool
, optional, 默认为True
) — 模型是否应返回最后一个键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True
时相关。 - sliding_window (
int
, optional, 默认为 8) — 滑动窗口注意力窗口大小。如果未指定,默认为8
。 - attention_dropout (
float
, optional, 默认为 0.0) — 注意力概率的 dropout 比率。 - ffn_dim (
int
, optional, 默认为 5632) — 深度解码器块中“中间”(通常称为前馈)层的维度。必须为偶数。 - rms_norm_eps (
float
, optional, 默认为 1e-08) — rms 归一化层使用的 epsilon。 - num_codebooks (
int
, optional, 默认为 8) — 每个音频通道的音频码本数量。 - tie_word_embeddings (
bool
, optional, 默认为False
) — 是否绑定权重嵌入。 - kwargs (可选) — 关键字参数字典。值得注意的是:
- audio_encoder_config (PretrainedConfig, 可选) — 定义音频编码器配置的配置对象实例。
这是存储 MoshiDepthDecoder
配置的配置类。它用于根据指定参数实例化 Moshi 深度解码器模型,定义 Moshi 深度解码器配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
示例
>>> from transformers import (
... MoshiDepthConfig,
... MoshiDepthDecoder,
... )
>>> configuration = MoshiDepthConfig()
>>> # Initializing a MoshiDepthDecoder (with random weights) from the kmhf/hf-moshiko style configuration
>>> model = MoshiDepthDecoder(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
MoshiModel
class transformers.MoshiModel
< source >( config: MoshiConfig )
参数
- config (MoshiConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
输出原始隐藏状态的裸 Moshi 模型,顶部没有任何特定头部。
该模型继承自 PreTrainedModel。请查看超类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是 PyTorch torch.nn.Module 的子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档中所有与通用用法和行为相关的内容。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Union[transformers.cache_utils.Cache, list[torch.FloatTensor], NoneType] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None ) → transformers.modeling_outputs.BaseModelOutputWithPast 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 词汇表中输入序列 token 的索引。默认情况下会忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (形状为
(batch_size, sequence_length)
的torch.Tensor
, 可选) — 用于避免对填充 token 索引执行注意力的掩码。掩码值选择在[0, 1]
之间:- 对于未掩码的 token 为 1,
- 对于已掩码的 token 为 0。
- position_ids (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 每个输入序列 token 在位置嵌入中的位置索引。选择范围在[0, config.n_positions - 1]
之间。 - past_key_values (
Union[~cache_utils.Cache, list[torch.FloatTensor], NoneType]
) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码前一阶段返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。允许两种格式:
- Cache 实例,请参阅我们的 kv cache 指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量)。这也被称为旧版缓存格式。
模型将输出与输入相同的缓存格式。如果未传递
past_key_values
,则将返回旧版缓存格式。如果使用
past_key_values
,用户可以选择仅输入最后一个input_ids
(那些没有将其过去键值状态提供给此模型的)形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的input_ids
。 - inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
, 可选) — 可选地,您可以直接传递嵌入表示,而不是传递input_ids
。如果您想对如何将input_ids
索引转换为相关向量拥有更多控制权,而不是模型内部的嵌入查找矩阵,这将很有用。 - use_cache (
bool
, 可选) — 如果设置为True
,则返回past_key_values
键值状态,可用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量中的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (形状为
(sequence_length)
的torch.LongTensor
, 可选) — 表示输入序列 token 在序列中位置的索引。与position_ids
不同,此张量不受填充影响。它用于在正确位置更新缓存并推断完整的序列长度。
返回
transformers.modeling_outputs.BaseModelOutputWithPast 或 tuple(torch.FloatTensor)
transformers.modeling_outputs.BaseModelOutputWithPast 或 torch.FloatTensor
的元组(如果传递 return_dict=False
或 config.return_dict=False
)包含根据配置(MoshiConfig)和输入的不同元素。
-
last_hidden_state (
torch.FloatTensor
, 形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层输出的隐藏状态序列。如果使用了
past_key_values
,则只输出形状为(batch_size, 1, hidden_size)
的序列的最后一个隐藏状态。 -
past_key_values (
Cache
, 可选, 当传递use_cache=True
或config.use_cache=True
时返回) — 这是一个 Cache 实例。有关更多详细信息,请参阅我们的 kv 缓存指南。包含预计算的隐藏状态(自注意力块中的键和值,如果
config.is_encoder_decoder=True
,则可选地在交叉注意力块中),可用于(参阅past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple(torch.FloatTensor)
, 可选, 当传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(一个用于嵌入层输出,如果模型有嵌入层,+一个用于每个层输出),形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
, 可选, 当传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
MoshiModel forward 方法,覆盖了 __call__
特殊方法。
尽管 forward pass 的配方需要在此函数中定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则悄悄地忽略它们。
MoshiForCausalLM
class transformers.MoshiForCausalLM
< source >( config )
参数
- config (MoshiForCausalLM) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
带有文本语言建模头部的 Moshi 解码器模型。仅适用于文本。
该模型继承自 PreTrainedModel。请查看超类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是 PyTorch torch.nn.Module 的子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档中所有与通用用法和行为相关的内容。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Union[transformers.cache_utils.Cache, list[torch.FloatTensor], NoneType] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None labels: typing.Optional[torch.LongTensor] = None logits_to_keep: typing.Union[int, torch.Tensor] = 0 **kwargs ) → transformers.models.moshi.modeling_moshi.MoshiCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 词汇表中输入序列 token 的索引。默认情况下会忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (形状为
(batch_size, sequence_length)
的torch.Tensor
, 可选) — 用于避免对填充 token 索引执行注意力的掩码。掩码值选择在[0, 1]
之间:- 对于未掩码的 token 为 1,
- 对于已掩码的 token 为 0。
- position_ids (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 每个输入序列 token 在位置嵌入中的位置索引。选择范围在[0, config.n_positions - 1]
之间。 - past_key_values (
Union[~cache_utils.Cache, list[torch.FloatTensor], NoneType]
) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码前一阶段返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。允许两种格式:
- 一个 Cache 实例,请参阅我们的 kv 缓存指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量)。这也被称为旧版缓存格式。
模型将输出与输入相同的缓存格式。如果未传递
past_key_values
,则将返回旧版缓存格式。如果使用
past_key_values
,用户可以选择仅输入最后一个input_ids
(那些没有将其过去键值状态提供给此模型的)形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的input_ids
。 - inputs_embeds (形状为
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
, 可选) — 可选地,您可以直接传递嵌入表示,而不是传递input_ids
。如果您想对如何将input_ids
索引转换为相关向量拥有更多控制权,而不是模型内部的嵌入查找矩阵,这将很有用。 - use_cache (
bool
, 可选) — 如果设置为True
,则返回past_key_values
键值状态,可用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量中的attentions
。 - output_hidden_states (
bool
, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量中的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (形状为
(sequence_length)
的torch.LongTensor
, 可选) — 表示输入序列 token 在序列中位置的索引。与position_ids
不同,此张量不受填充影响。它用于在正确位置更新缓存并推断完整的序列长度。 - labels (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 用于计算掩码语言建模损失的标签。索引应在[0, ..., config.vocab_size]
或 -100 之间(请参阅input_ids
文档字符串)。索引设置为-100
的 token 将被忽略(掩码),损失仅针对标签在[0, ..., config.vocab_size]
中的 token 计算。 - logits_to_keep (
Union[int, torch.Tensor]
, 默认为0
) — 如果是int
,则计算最后logits_to_keep
个 token 的 logits。如果是0
,则计算所有input_ids
的 logits(特殊情况)。生成时只需要最后一个 token 的 logits,只计算该 token 可以节省内存,这对于长序列或大词汇量来说非常重要。如果是torch.Tensor
,则必须是与序列长度维度中要保留的索引相对应的 1D 张量。当使用打包张量格式(批次和序列长度的单维度)时,这很有用。
返回
transformers.models.moshi.modeling_moshi.MoshiCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
MoshiConfig 和输入决定的 transformers.models.moshi.modeling_moshi.MoshiCausalLMOutputWithPast
或 torch.FloatTensor
的元组(如果传递 return_dict=False
或 config.return_dict=False
)包含各种元素。
-
loss (
torch.FloatTensor
形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失(用于下一个 token 预测)。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
last_hidden_state (形状为
(batch_size, sequence_length, hidden_size)
的torch.FloatTensor
, 可选,默认为None
) — 模型最后一层输出的隐藏状态序列。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
, 可选, 当传递use_cache=True
或config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量)。包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple[torch.FloatTensor, ...]
, 可选, 当传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(一个用于嵌入层输出,如果模型有嵌入层,+一个用于每个层输出),形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple[torch.FloatTensor, ...]
, 可选, 当传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每个层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
MoshiForCausalLM forward 方法,覆盖了 __call__
特殊方法。
尽管 forward pass 的配方需要在此函数中定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则悄悄地忽略它们。
示例
>>> from transformers import AutoTokenizer, MoshiForCausalLM
>>> model = MoshiForCausalLM.from_pretrained("kmhf/hf-moshiko")
>>> tokenizer = AutoTokenizer.from_pretrained("kmhf/hf-moshiko")
>>> prompt = "What is your favorite condiment?"
>>> inputs = tokenizer(prompt, return_tensors="pt")
>>> # Generate
>>> generate_ids = model.generate(inputs.input_ids, max_length=30)
>>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"What is your favorite condiment?"
MoshiForConditionalGeneration
class transformers.MoshiForConditionalGeneration
< source >( config: MoshiConfig )
参数
- config (MoshiConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型相关的权重,只加载配置。请查看 from_pretrained() 方法来加载模型权重。
原始 Moshi 模型,带有一个音频编码器、一个 Moshi 深度解码器和一个 Moshi 解码器,用于语音到语音的转换。
该模型继承自 PreTrainedModel。请查看超类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是 PyTorch torch.nn.Module 的子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档中所有与通用用法和行为相关的内容。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.BoolTensor] = None user_input_values: typing.Optional[torch.FloatTensor] = None user_audio_codes: typing.Optional[torch.Tensor] = None moshi_input_values: typing.Optional[torch.FloatTensor] = None moshi_audio_codes: typing.Optional[torch.Tensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None text_labels: typing.Optional[torch.LongTensor] = None audio_labels: typing.Optional[torch.LongTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None **kwargs ) → transformers.modeling_outputs.Seq2SeqLMOutput 或 tuple(torch.FloatTensor)
参数
- input_ids (形状为
(batch_size, sequence_length)
的torch.LongTensor
, 可选) — 词汇表中输入序列 token 的索引。默认情况下会忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (形状为
(batch_size, sequence_length)
的torch.BoolTensor
, 可选) — 用于避免对填充 token 索引执行注意力的掩码。掩码值选择在[0, 1]
之间:- 对于未掩码的 token 为 1,
- 对于已掩码的 token 为 0。
- user_input_values (`torch.Tensor`,形状为`(batch_size, 1, audio_sequence_length)`,可选) — 用作生成的用户音频提示的音频波形。
- user_audio_codes (`torch.Tensor`,形状为`(batch_size, num_codebooks, sequence_length)`,可选) — 用作生成的用户音频提示的音频代码。优先级高于`user_input_values`,表示通过音频编码器后`user_input_values`的音频“token”。
- moshi_input_values (`torch.Tensor`,形状为`(batch_size, 1, audio_sequence_length)`,可选) — 用作生成Moshi提示的音频波形。
- moshi_audio_codes (`torch.Tensor`,形状为`(batch_size, num_codebooks, sequence_length)`,可选) — 用作生成Moshi提示的音频代码。优先级高于`moshi_input_values`,表示通过音频编码器后`moshi_input_values`的音频“token”。
- past_key_values (`tuple[tuple[torch.FloatTensor]]`,可选) — 预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码上一阶段返回的`past_key_values`,当`use_cache=True`或`config.use_cache=True`时。
允许两种格式:
- 一个Cache实例,参见我们的kv缓存指南;
- 长度为`config.n_layers`的`tuple(torch.FloatTensor)`元组,每个元组包含2个形状为`(batch_size, num_heads, sequence_length, embed_size_per_head)`的张量)。这也被称为传统缓存格式。
模型将输出与输入相同的缓存格式。如果没有传入`past_key_values`,将返回传统缓存格式。
如果使用`past_key_values`,用户可以选择只输入形状为`(batch_size, 1)`的最后一个`input_ids`(那些没有将其过去的键值状态提供给此模型的输入),而不是形状为`(batch_size, sequence_length)`的所有`input_ids`。
- inputs_embeds (`torch.FloatTensor`,形状为`(batch_size, sequence_length, hidden_size)`,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入`input_ids`。如果使用了`past_key_values`,可选地只需输入最后一个`inputs_embeds`(参见`past_key_values`)。如果您希望对`input_ids`索引如何转换为关联向量有比模型内部嵌入查找矩阵更多的控制,这会很有用。
如果`input_ids`和`inputs_embeds`都未设置,`inputs_embeds`将采用`inputs_embeds`的值。
- text_labels (`torch.LongTensor`,形状为`(batch_size, sequence_length)`,可选) — 用于文本语言建模的标签。请注意,标签在模型内部会移位,即您可以设置`labels = input_ids`。索引在`[-100, 0, ..., config.vocab_size]`中选择。所有设置为`-100`的标签都将被忽略(遮蔽),损失只计算`[0, ..., config.vocab_size]`中的标签。
- audio_labels (`torch.LongTensor`,形状为`(batch_size, num_codebooks, sequence_length)`,可选) — 用于语言建模的标签。请注意,标签在模型内部会移位,即您可以设置`labels = input_ids`。索引在`[-100, 0, ..., config.vocab_size]`中选择。所有设置为`-100`的标签都将被忽略(遮蔽),损失只计算`[0, ..., config.audio_vocab_size]`中的标签。
- use_cache (`bool`,可选) — 如果设置为`True`,则返回`past_key_values`键值状态,可用于加速解码(参见`past_key_values`)。
- output_attentions (`bool`,可选) — 是否返回所有注意力层的注意力张量。更多详细信息请参见返回张量下的`attentions`。
- output_hidden_states (`bool`,可选) — 是否返回所有层的隐藏状态。更多详细信息请参见返回张量下的`hidden_states`。
- return_dict (`bool`,可选) — 是否返回ModelOutput而不是普通元组。
返回
transformers.modeling_outputs.Seq2SeqLMOutput 或 tuple(torch.FloatTensor)
一个transformers.modeling_outputs.Seq2SeqLMOutput或一个`torch.FloatTensor`元组(如果传入了`return_dict=False`或`config.return_dict=False`),包含根据配置(MoshiConfig)和输入而定的各种元素。
-
loss (
torch.FloatTensor
,形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
past_key_values (`EncoderDecoderCache`,可选,当传入`use_cache=True`或`config.use_cache=True`时返回) — 这是一个EncoderDecoderCache实例。更多详细信息请参见我们的kv缓存指南。
包含预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于(参见
past_key_values
输入)加速顺序解码。 -
decoder_hidden_states (`tuple(torch.FloatTensor)`,可选,当传入`output_hidden_states=True`或`config.output_hidden_states=True`时返回) — `torch.FloatTensor`元组(如果模型有嵌入层,则包括嵌入层的输出,加上每个层的输出),形状为`(batch_size, sequence_length, hidden_size)`。
解码器在每一层输出时的隐藏状态以及初始嵌入输出。
-
decoder_attentions (`tuple(torch.FloatTensor)`,可选,当传入`output_attentions=True`或`config.output_attentions=True`时返回) — `torch.FloatTensor`元组(每个层一个),形状为`(batch_size, num_heads, sequence_length, sequence_length)`。
解码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头中的加权平均。
-
cross_attentions (`tuple(torch.FloatTensor)`,可选,当传入`output_attentions=True`或`config.output_attentions=True`时返回) — `torch.FloatTensor`元组(每个层一个),形状为`(batch_size, num_heads, sequence_length, sequence_length)`。
解码器交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头中的加权平均。
-
encoder_last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层输出的隐藏状态序列。 -
encoder_hidden_states (`tuple(torch.FloatTensor)`,可选,当传入`output_hidden_states=True`或`config.output_hidden_states=True`时返回) — `torch.FloatTensor`元组(如果模型有嵌入层,则包括嵌入层的输出,加上每个层的输出),形状为`(batch_size, sequence_length, hidden_size)`。
编码器在每一层输出时的隐藏状态以及初始嵌入输出。
-
encoder_attentions (`tuple(torch.FloatTensor)`,可选,当传入`output_attentions=True`或`config.output_attentions=True`时返回) — `torch.FloatTensor`元组(每个层一个),形状为`(batch_size, num_heads, sequence_length, sequence_length)`。
编码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头中的加权平均。
MoshiForConditionalGeneration的forward方法,重写了`__call__`特殊方法。
尽管 forward pass 的配方需要在此函数中定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则悄悄地忽略它们。
示例
>>> from transformers import MoshiForConditionalGeneration
>>> import torch
>>> model = MoshiForConditionalGeneration.from_pretrained("kmhf/hf-moshiko")
>>> inputs = moshi.get_unconditional_inputs()
>>> logits = model(**inputs, ).logits
>>> logits.shape # (bsz, seq_len, text_vocab_size)
torch.Size([1, 1, 32000])
生成
< source >( input_ids: typing.Optional[torch.LongTensor] = None user_input_values: typing.Optional[torch.FloatTensor] = None user_audio_codes: typing.Optional[torch.Tensor] = None moshi_input_values: typing.Optional[torch.FloatTensor] = None moshi_audio_codes: typing.Optional[torch.Tensor] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None return_audio_waveforms: typing.Optional[bool] = True return_audio_codes: typing.Optional[bool] = None concat_unconditional_inputs: typing.Optional[bool] = True **kwargs )
参数
- input_ids (`torch.Tensor`,形状为`(batch_size, sequence_length)`,可选) — 用作文本提示的序列,用于生成。
- user_input_values (`torch.Tensor`,形状为`(batch_size, 1, audio_sequence_length)`,可选) — 用作生成的用户音频提示的音频波形。
- user_audio_codes (`torch.Tensor`,形状为`(batch_size, num_codebooks, sequence_length)`,可选) — 用作生成的用户音频提示的音频代码。优先级高于`user_input_values`,表示通过音频编码器后`user_input_values`的音频“token”。
- moshi_input_values (`torch.Tensor`,形状为`(batch_size, 1, audio_sequence_length)`,可选) — 用作生成Moshi提示的音频波形。
- moshi_audio_codes (`torch.Tensor`,形状为`(batch_size, num_codebooks, sequence_length)`,可选) — 用作生成Moshi提示的音频代码。优先级高于`moshi_input_values`,表示通过音频编码器后`moshi_input_values`的音频“token”。
- inputs_embeds (`torch.FloatTensor`,形状为`(batch_size, sequence_length, hidden_size)`,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入`input_ids`和音频输入。如果您希望对输入如何转换为关联向量有比模型内部嵌入查找矩阵更多的控制,这会很有用。
- return_audio_waveforms (`bool`,可选,默认为`True`) — 如果为`False`,则不会生成音频波形。
- return_audio_codes (`bool`,可选) — 如果为`True`,还将返回生成的音频代码,即通过音频解码器后转换为`audio_sequences`的中间音频“token”。
- concat_unconditional_inputs (`bool`,可选,默认为`True`) — 如果为`False`,则不会连接初始音频和文本token。
- kwargs (`dict[str, Any]`,可选) — 传递给`generate`方法的剩余关键字参数字典。有关如何使用它们的更多信息,请参阅原始`generate`文档字符串。请注意,带有depth_前缀的关键字将作为深度解码器`generate`方法的输入。否则,后者将使用其默认的生成配置。
生成文本token ID和音频token ID序列。
get_unconditional_inputs
< source >( num_samples = 1 )
用于无条件生成的获取空输入的辅助函数,使模型能够在没有特征提取器或分词器的情况下使用。
示例
>>> from transformers import MoshiForConditionalGeneration
>>> model = MoshiForConditionalGeneration.from_pretrained("kmhf/hf-moshiko-pytorch-bf16")
>>> # get the unconditional (or 'null') inputs for the model
>>> unconditional_inputs = model.get_unconditional_inputs(num_samples=1)
>>> audio_samples = model.generate(**unconditional_inputs, max_new_tokens=256)