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毫秒。
![](https://huggingface.co/datasets/ylacombe/benchmark-comparison/resolve/main/moshi_architecture.png)
论文的摘要如下:
我们介绍了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
的架构。换句话说,它接收文本标记,将其嵌入,通过解码器和语言头传递,以获得文本逻辑。
2. 深度解码器
它本身也是一个经典的LLM,但这次,它不是在时间维度上生成,而是在代码本维度上生成。
这也意味着它的上下文长度是num_codebooks
,因此它不能生成超过num_codebooks
的内容。
请注意,每个时间戳 - 即每个代码簿 - 都有其自己的一组线性层和嵌入。
3. MimiModel
这是来自Kyutai的音频编码器,最近已集成到transformers中,用于“标记化”音频。它的用途与~EncodecModel在~MusicgenModel中的用途相同。
提示:
原始检查点可以使用转换脚本 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,
。
![](https://huggingface.co/datasets/ylacombe/benchmark-comparison/resolve/main/moshi_text_sync.png)
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")
>>> # 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
类 transformers.MoshiConfig
< source >( 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
, optional, 默认为 4096) — 主解码器的层和池化层的维度。 - num_hidden_layers (
int
, optional, 默认为 32) — 解码器层数. - num_attention_heads (
int
, 可选, 默认为 32) — 主解码器块中每个注意力层的注意力头数。 - num_key_value_heads (
int
, optional) — 这是用于实现分组查询注意力(Grouped Query Attention)的键值头数量。如果num_key_value_heads=num_attention_heads
,模型将使用多头注意力(MHA),如果num_key_value_heads=1
,模型将使用多查询注意力(MQA),否则将使用GQA。当 将多头检查点转换为GQA检查点时,每个组的键和值头应通过平均池化该组中的所有原始头来构建。 更多详细信息请查看这篇论文。如果未指定,将默认为num_attention_heads
. - audio_vocab_size (
int
, optional) — 模型音频部分的词汇量大小。定义了调用Moshi模型时传递的audio_codes
可以表示的不同令牌的数量。 - max_position_embeddings (
int
, optional, 默认为 3000) — 此模型可能使用的最大序列长度。通常,将此设置为较大的值以防万一(例如,512 或 1024 或 2048)。 - rope_theta (
float
, optional, 默认为 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
, optional, defaults to 0.0) — 注意力概率的丢弃比率。 - ffn_dim (
int
, optional, defaults to 22528) — 主解码器块中“中间”(通常称为前馈)层的维度。必须是偶数。 - rms_norm_eps (
float
, optional, defaults to 1e-08) — rms归一化层使用的epsilon值。 - num_codebooks (
int
, 可选, 默认为 8) — 每个音频通道的音频码本数量。 - tie_word_embeddings (
bool
, optional, defaults toFalse
) — 是否绑定权重嵌入 - 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
< source >( audio_encoder_config: PretrainedConfig **kwargs ) → MoshiConfig
从音频编码器配置实例化一个MoshiConfig(或派生类)。
Moshi深度配置
类 transformers.MoshiDepthConfig
< source >( 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
, optional, 默认为 1024) — 深度解码器的层和池化层的维度。 - input_size (
int
, optional, 默认为 4096) — 输入隐藏状态的维度。用于将主解码器连接到深度解码器。 - num_hidden_layers (
int
, optional, 默认为 6) — 解码器层的深度数量。 - num_attention_heads (
int
, optional, defaults to 16) — 深度解码器块中每个注意力层的注意力头数。 - num_key_value_heads (
int
, 可选) — 这是用于实现分组查询注意力(Grouped Query Attention)的键值头数量。如果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
, optional, 默认为 9) — 此模型可能使用的最大序列长度。通常,将此设置为较大的值以防万一(例如,512 或 1024 或 2048)。 - hidden_act (
str
或function
, 可选, 默认为"silu"
) — 深度解码器中的非线性激活函数(函数或字符串)。 - head_dim (
int
, optional, 默认为hidden_size // num_attention_heads
) — 注意力头的维度。 - initializer_range (
float
, optional, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - use_cache (
bool
, 可选, 默认为True
) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。仅在config.is_decoder=True
时相关。 - sliding_window (
int
, 可选, 默认为 8) — 滑动窗口注意力窗口大小。如果未指定,将默认为8
. - attention_dropout (
float
, optional, defaults to 0.0) — 注意力概率的dropout比率. - ffn_dim (
int
, optional, 默认为 5632) — 深度解码器块中“中间”(通常称为前馈)层的维度。必须为偶数。 - rms_norm_eps (
float
, optional, defaults to 1e-08) — rms归一化层使用的epsilon值。 - num_codebooks (
int
, 可选, 默认为 8) — 每个音频通道的音频码本数量。 - tie_word_embeddings (
bool
, optional, defaults toFalse
) — 是否绑定权重嵌入 - 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
类 transformers.MoshiModel
< source >( config: MoshiConfig )
参数
- config (MoshiConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
- config — MoshiConfig
原始的Moshi模型输出原始的隐藏状态,没有任何特定的头部。 该模型继承自PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入的大小、修剪头部等)。
该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
Transformer解码器由config.num_hidden_layers层组成。每一层都是一个MoshiDecoderLayer
前进
< source >( input_ids: 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, typing.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 )
参数
- input_ids (
torch.LongTensor
of shape(batch_size, sequence_length)
) — Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide it.可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
of shape(batch_size, sequence_length)
, optional) — Mask to avoid performing attention on padding token indices. Mask values selected in[0, 1]
:- 1 for tokens that are not masked,
- 0 for tokens that are masked.
可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()和 PreTrainedTokenizer.call()。
如果使用了
past_key_values
,可以选择只输入最后的input_ids
(参见past_key_values
)。如果你想改变填充行为,你应该阅读
modeling_opt._prepare_decoder_attention_mask
并根据你的需求进行修改。有关默认策略的更多信息,请参见论文中的图1。- 1 indicates the head is not masked,
- 0 indicates the head is masked.
- position_ids (
torch.LongTensor
of shape(batch_size, sequence_length)
, optional) — Indices of positions of each input sequence tokens in the position embeddings. Selected in the range[0, config.n_positions - 1]
. - past_key_values (
Cache
ortuple(tuple(torch.FloatTensor))
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention blocks) that can be used to speed up sequential decoding. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.允许两种格式:
- a Cache instance, see our kv cache guide;
- Tuple of
tuple(torch.FloatTensor)
of lengthconfig.n_layers
, with each tuple having 2 tensors of shape(batch_size, num_heads, sequence_length, embed_size_per_head)
). This is also known as the legacy cache format.
模型将输出与输入相同的缓存格式。如果没有传递
past_key_values
,将返回旧的缓存格式。如果使用了
past_key_values
,用户可以选择只输入形状为(batch_size, 1)
的最后input_ids
(那些没有将其过去键值状态提供给此模型的input_ids
),而不是形状为(batch_size, sequence_length)
的所有input_ids
。 - inputs_embeds (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
, 可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
。如果您希望对如何将input_ids
索引转换为相关向量有更多控制,而不是使用模型的内部嵌入查找矩阵,这将非常有用。 - use_cache (
bool
, 可选) — 如果设置为True
,past_key_values
键值状态将被返回,并可用于加速解码(参见past_key_values
)。 - output_attentions (
bool
, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参见返回张量下的attentions
。 - output_hidden_states (
bool
, optional) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
, 可选) — 是否返回一个ModelOutput而不是一个普通的元组。 - cache_position (
torch.LongTensor
of shape(sequence_length)
, optional) — 表示输入序列标记在序列中的位置的索引。与position_ids
相反, 这个张量不受填充的影响。它用于在正确的位置更新缓存并推断 完整的序列长度。
MoshiModel 的 forward 方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用Module
实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
MoshiForCausalLM
类 transformers.MoshiForCausalLM
< source >( config )
参数
- config (MoshiConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
Moshi解码器模型,顶部带有文本语言建模头。仅适用于文本。 此模型继承自PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入大小、修剪头等)。
该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
前进
< source >( input_ids: 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, typing.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 num_logits_to_keep: int = 0 ) → transformers.models.moshi.modeling_moshi.MoshiCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
of shape(batch_size, sequence_length)
) — Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide it.可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
of shape(batch_size, sequence_length)
, optional) — Mask to avoid performing attention on padding token indices. Mask values selected in[0, 1]
:- 1 for tokens that are not masked,
- 0 for tokens that are masked.
可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()和 PreTrainedTokenizer.call()。
如果使用了
past_key_values
,可以选择只输入最后的input_ids
(参见past_key_values
)。如果你想改变填充行为,你应该阅读
modeling_opt._prepare_decoder_attention_mask
并根据你的需求进行修改。有关默认策略的更多信息,请参见论文中的图1。- 1 indicates the head is not masked,
- 0 indicates the head is masked.
- position_ids (
torch.LongTensor
of shape(batch_size, sequence_length)
, optional) — Indices of positions of each input sequence tokens in the position embeddings. Selected in the range[0, config.n_positions - 1]
. - past_key_values (
Cache
ortuple(tuple(torch.FloatTensor))
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention blocks) that can be used to speed up sequential decoding. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.允许两种格式:
- a Cache instance, see our kv cache guide;
- Tuple of
tuple(torch.FloatTensor)
of lengthconfig.n_layers
, with each tuple having 2 tensors of shape(batch_size, num_heads, sequence_length, embed_size_per_head)
). This is also known as the legacy cache format.
模型将输出与输入相同的缓存格式。如果没有传递
past_key_values
,将返回旧的缓存格式。如果使用了
past_key_values
,用户可以选择只输入形状为(batch_size, 1)
的最后input_ids
(那些没有将其过去键值状态提供给此模型的input_ids
),而不是形状为(batch_size, sequence_length)
的所有input_ids
。 - inputs_embeds (
torch.FloatTensor
of shape(batch_size, sequence_length, hidden_size)
, optional) — 可选地,您可以选择直接传递嵌入表示,而不是传递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 (
torch.LongTensor
of shape(sequence_length)
, optional) — 表示输入序列标记在序列中的位置的索引。与position_ids
相反, 这个张量不受填充的影响。它用于在正确的位置更新缓存并推断 完整的序列长度。 - Args —
labels (
torch.LongTensor
of shape(batch_size, sequence_length)
, optional): Labels for computing the masked language modeling loss. Indices should either be in[0, ..., config.vocab_size]
or -100 (seeinput_ids
docstring). Tokens with indices set to-100
are ignored (masked), the loss is only computed for the tokens with labels in[0, ..., config.vocab_size]
.num_logits_to_keep (
int
, 可选): 计算最后num_logits_to_keep
个token的logits。如果为0
,则计算所有input_ids
的logits(特殊情况)。生成时只需要最后一个token的logits,仅计算该token的logits可以节省内存,这对于长序列或大词汇量来说非常重要。
返回
transformers.models.moshi.modeling_moshi.MoshiCausalLMOutputWithPast
或 tuple(torch.FloatTensor)
一个 transformers.models.moshi.modeling_moshi.MoshiCausalLMOutputWithPast
或一个由
torch.FloatTensor
组成的元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含各种
元素,具体取决于配置(MoshiConfig)和输入。
-
loss (
torch.FloatTensor
形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失(用于下一个标记预测)。 -
logits (
torch.FloatTensor
形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(在 SoftMax 之前的每个词汇标记的分数)。 -
last_hidden_state (
torch.FloatTensor
形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层的隐藏状态序列。 -
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 的前向方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用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
类 transformers.MoshiForConditionalGeneration
< source >( config: MoshiConfig )
参数
- config (MoshiConfig) — 包含模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型相关的权重,只会加载配置。查看 from_pretrained() 方法以加载模型权重。
原始的Moshi模型,包含一个音频编码器、一个Moshi深度解码器和一个Moshi解码器,用于语音到语音的转换。 该模型继承自PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入的大小、修剪头等)。
该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。
前进
< 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.Tuple[typing.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 (
torch.LongTensor
of shape(batch_size, sequence_length)
) — Indices of input sequence text tokens in the vocabulary. Padding will be ignored by default should you provide it.可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
of shape(batch_size, sequence_length)
, optional) — Mask to avoid performing attention on padding token indices. Mask values selected in[0, 1]
:- 1 for tokens that are not masked,
- 0 for tokens that are masked.
- user_input_values (
torch.Tensor
of shape `(batch_size, 1, audio_sequence_length), optional) — 用于生成的音频用户提示的音频波形。 - user_audio_codes (
torch.Tensor
形状为(batch_size, num_codebooks, sequence_length), *可选*) -- 用作生成音频用户提示的音频代码。优先于
user_input_values,并且表示通过音频编码器后的
user_input_values` 的音频“令牌”。 - moshi_input_values (
torch.Tensor
of shape `(batch_size, 1, audio_sequence_length), optional) — 用于生成音频Moshi提示的音频波形。 - moshi_audio_codes (
torch.Tensor
形状为(batch_size, num_codebooks, sequence_length), *optional*) -- 用作音频Moshi提示的音频代码,用于生成。优先于
moshi_input_values,并且表示通过音频编码器后的
moshi_input_values` 的音频“令牌”。 - inputs_embeds (
torch.FloatTensor
of shape(batch_size, sequence_length, hidden_size)
, optional) — Optionally, instead of passinginput_ids
you can choose to directly pass an embedded representation. Ifpast_key_values
is used, optionally only the lastinputs_embeds
have to be input (seepast_key_values
). This is useful if you want more control over how to convertinput_ids
indices into associated vectors than the model’s internal embedding lookup matrix.如果
input_ids
和inputs_embeds
都未设置,inputs_embeds
将取inputs_embeds
的值。 - past_key_values (
Cache
ortuple(tuple(torch.FloatTensor))
, optional) — Pre-computed hidden-states (key and values in the self-attention blocks) that can be used to speed up sequential decoding. This typically consists in thepast_key_values
returned by the model at a previous stage of decoding, whenuse_cache=True
orconfig.use_cache=True
.允许两种格式:
- a Cache instance;
- Tuple of
tuple(torch.FloatTensor)
of lengthconfig.n_layers
, with each tuple having 2 tensors of shape(batch_size, num_heads, sequence_length, embed_size_per_head)
). This is also known as the legacy cache format.
模型将输出与输入相同的缓存格式。如果没有传递
past_key_values
,将返回旧的缓存格式。 - text_labels (
torch.LongTensor
of shape(batch_size, sequence_length)
, optional) — 用于文本语言建模的标签。请注意,标签在模型内部被移位,即你可以设置labels = input_ids
索引在[-100, 0, ..., config.vocab_size]
中选择。所有设置为-100
的标签 将被忽略(掩码),损失仅针对[0, ..., config.vocab_size]
中的标签计算 - audio_labels (
torch.LongTensor
of shape(batch_size, num_codebooks, sequence_length)
, optional) — 用于语言建模的标签。请注意,标签在模型内部被移位,即你可以设置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
, optional) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的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 (
torch.FloatTensor
形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
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)
的张量和 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的额外张量。包含预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于(参见
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__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用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
of shape `(batch_size, sequence_length), optional) — 用于生成文本提示的序列。 - user_input_values (
torch.Tensor
of shape `(batch_size, 1, audio_sequence_length), optional) — 用于生成的音频波形作为音频用户提示。 - user_audio_codes (
torch.Tensor
形状为(batch_size, num_codebooks, sequence_length), *可选*) -- 用作生成音频用户提示的音频代码。优先于
user_input_values,并且表示通过音频编码器后的
user_input_values` 的音频“令牌”。 - moshi_input_values (
torch.Tensor
of shape `(batch_size, 1, audio_sequence_length), optional) — 用于生成音频Moshi提示的音频波形。 - moshi_audio_codes (
torch.Tensor
形状为(batch_size, num_codebooks, sequence_length), *optional*) -- 用作音频Moshi提示的音频代码,用于生成。优先于
moshi_input_values,并且表示通过音频编码器后的
moshi_input_values` 的音频“令牌”。 - inputs_embeds (
torch.FloatTensor
of shape(batch_size, sequence_length, hidden_size)
, optional) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
和音频输入。如果您希望对如何将输入转换为相关向量有更多控制,而不是使用模型的内部嵌入查找矩阵,这将非常有用。 - return_audio_waveforms (
bool
, 可选, 默认为True
) — 如果为False
,则不会生成音频波形。 - return_audio_codes (
bool
, optional) — 如果为True
,还将返回生成的音频代码,即中间音频“标记”,一旦通过音频解码器传递,这些标记将转换为audio_sequences
。 - concat_unconditional_inputs (
bool
, 可选, 默认为True
) — 如果为False
,则不会连接初始音频和文本标记。 - kwargs (
Dict[str, Any]
, 可选) — 传递给generate
方法的剩余关键字参数字典。参考 原始generate
文档字符串 以获取更多关于如何使用它们的信息。 请注意,带有 depth_ 前缀的关键字将作为深度解码器的generate
方法的输入。否则,后者将使用其默认的生成配置。
生成文本标记ID和音频标记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)