Transformers documentation
Moshi
该模型于 2024-09-17 在 HF papers 上发布,并于 2024-10-16 贡献至 Hugging Face Transformers。
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 以文本语言模型骨干网络为基础,从神经音频编解码器的残差量化器中生成语音 token,同时将自身的语音和用户的语音分别建模为并行的流。这使得可以移除显式的说话人轮次,并对任意的对话动态进行建模。Moshi 还预测与时间对齐的文本 token,作为音频 token 的前缀。这种“内心独白”方法显著提升了生成语音的语言质量,并提供了流式语音识别和文本转语音功能。因此,Moshi 是首个实时全双工口语大语言模型,其理论延迟为 160ms,实际延迟为 200ms。

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

随后,MoshiForConditionalGeneration.generate() 会以自回归的方式将自身的音频流反馈给自己,但由于在使用 transformers 时无法访问用户输入流,因此它会假设用户正在输出空白音频。
import math
import torch
from datasets import Audio, load_dataset
from transformers import 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")
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_sequences2. 模型训练
由于需要对流进行对齐/同步,大部分工作必须在数据创建/预处理阶段完成。
完成后,只需将 text_labels 和 audio_labels 与常规输入一起传入 MoshiForConditionalGeneration.forward(),即可获取模型损失。
训练指南即将发布,但欢迎用户贡献!
模型如何前向传播输入 / 生成
输入流被嵌入并合并到
inputs_embeds中。inputs_embeds会被传入主解码器,该解码器会像普通 LLM 一样对其进行处理。主解码器输出
text logits,同时也输出其last hidden state,在论文中被称为temporal context。深度解码器会切换我们进行前向传播 / 生成的维度(从时间维度切换到码本维度)。它利用由
text logits生成的 token 以及temporal context,以自回归的方式生成音频码本。
该模型由 Yoach Lacombe (ylacombe) 贡献。
原始代码可以在此处找到。
MoshiConfig
类 transformers.MoshiConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonevocab_size: int = 32000hidden_size: int = 4096num_hidden_layers: int = 32num_attention_heads: int = 32num_key_value_heads: int | None = Noneaudio_vocab_size: int | None = Nonemax_position_embeddings: int = 3000rope_parameters: transformers.modeling_rope_utils.RopeParameters | dict | None = Nonehidden_act: str = 'silu'head_dim: int | None = Noneinitializer_range: float = 0.02use_cache: bool = Truesliding_window: int = 3000attention_dropout: float | int = 0.0ffn_dim: int = 22528rms_norm_eps: float = 1e-08num_codebooks: int = 8tie_word_embeddings: bool = Falsepad_token_id: int | None = Nonebos_token_id: int | None = Noneeos_token_id: int | list[int] | None = Noneaudio_encoder_config: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonedepth_decoder_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None )
参数
- vocab_size (
int,可选,默认为32000) — 模型的词汇表大小。定义了input_ids可以表示的不同 token 数量。 - hidden_size (
int,可选,默认为4096) — 隐藏表示的维度。 - num_hidden_layers (
int,可选,默认为32) — Transformer 解码器中的隐藏层数量。 - num_attention_heads (
int,可选,默认为32) — Transformer 解码器中每个注意力层的注意力头数量。 - num_key_value_heads (
int, 可选) — 这是用于实现 Grouped Query Attention 的 key_value 头数。如果num_key_value_heads=num_attention_heads,模型将使用 Multi Head Attention (MHA);如果num_key_value_heads=1,模型将使用 Multi Query Attention (MQA);否则使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内所有原始头进行平均池化来构建。更多详情请参阅 这篇论文。如果未指定,则默认为num_attention_heads。 - audio_vocab_size (
int, 可选) — 模型音频部分的词表大小。定义了调用 Moshi 模型时传入的audio_codes所能表示的不同 token 数量。 - max_position_embeddings (
int,可选,默认为3000) — 该模型可能使用的最大序列长度。 - rope_parameters (
Union[~modeling_rope_utils.RopeParameters, dict], 可选) — 包含 RoPE 嵌入配置参数的字典。该字典应包含rope_theta的值,并且如果希望使用 RoPE 处理更长的max_position_embeddings,则可选地包含用于缩放的参数。 - hidden_act (
str,可选,默认为silu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - head_dim (
int,可选) — 注意力头维度。如果为 None,则默认为 hidden_size // num_attention_heads - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - use_cache (
bool,可选,默认为True) — 模型是否应返回最后一次键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True或模型为仅解码器生成式模型时相关。 - sliding_window (
int,可选,默认为3000) — 滑动窗口注意力的窗口大小。如果为None,则不应用滑动窗口。 - attention_dropout (
Union[float, int],可选,默认为0.0) — 注意力概率的 dropout 比率。 - ffn_dim (
int,可选,默认值为 22528) — 主解码器块中“中间”(通常称为前馈)层的维度。必须为偶数。 - rms_norm_eps (
float,可选,默认值为1e-08) — RMS 归一化层所使用的 epsilon 值。 - num_codebooks (
int,可选,默认为8) — 模型使用的并行码本数量。 - tie_word_embeddings (
bool,可选,默认为False) — 是否根据模型的tied_weights_keys映射来绑定权重嵌入。 - pad_token_id (
int, 可选) — 词表中用于填充的 token id。 - bos_token_id (
int, 可选) — 词汇表中用于表示流起始的 Token id。 - eos_token_id (
Union[int, list[int]], 可选) — 词汇表中用于表示流结束(end-of-stream)的 token id。 - audio_encoder_config (
PreTrainedConfig | dict,可选) — 音频编码器的配置。 - depth_decoder_config (
PreTrainedConfig | dict,可选) — 深度解码器的配置。
这是用于存储 MoshiModel 配置的类。它根据指定的参数实例化 Moshi 模型,并定义模型架构。使用默认值实例化配置将生成与 kmhf/hf-moshika 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
示例:
>>> from transformers import (
... MoshiConfig,
... MoshiForConditionalGeneration,
... )
>>> configuration = MoshiConfig()
>>> # Initializing a MoshiForConditionalGeneration (with random weights) from the kmhf/hf-moshika style configuration
>>> model = MoshiForConditionalGeneration(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
>>> # Saving the model, including its configuration
>>> model.save_pretrained("kmhf/hf-moshika")
>>> # loading model and config from pretrained folder
>>> moshi_config = MoshiConfig.from_pretrained("kmhf/hf-moshika")
>>> model = MoshiForConditionalGeneration.from_pretrained("kmhf/hf-moshika", config=moshi_config)from_audio_encoder_config
< source >( audio_encoder_config: PreTrainedConfig**kwargs ) → MoshiConfig
返回值
配置对象的实例
从音频编码器配置实例化一个 MoshiConfig(或其派生类)。
MoshiDepthConfig
类 transformers.MoshiDepthConfig
< source >( transformers_version: str | None = Nonearchitectures: list[str] | None = Noneoutput_hidden_states: bool | None = Falsereturn_dict: bool | None = Truedtype: str | torch.dtype | None = Nonechunk_size_feed_forward: int = 0is_encoder_decoder: bool = Falseid2label: dict[int, str] | dict[str, str] | None = Nonelabel2id: dict[str, int] | dict[str, str] | None = Noneproblem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = Nonevocab_size: int = 32000hidden_size: int = 1024input_size: int = 4096num_hidden_layers: int = 6num_attention_heads: int = 16num_key_value_heads: int | None = Noneaudio_vocab_size: int = 2048max_position_embeddings: int = 9hidden_act: str = 'silu'head_dim: int | None = Noneinitializer_range: float = 0.02use_cache: bool = Truesliding_window: int = 8attention_dropout: float | int = 0.0ffn_dim: int = 5632rms_norm_eps: float = 1e-08num_codebooks: int = 8tie_word_embeddings: bool = Falsepad_token_id: int | None = Nonebos_token_id: int | None = Noneeos_token_id: int | list[int] | None = None )
参数
- vocab_size (
int,可选,默认为32000) — 模型的词汇表大小。定义了input_ids可以表示的不同 token 数量。 - hidden_size (
int,可选,默认为1024) — 隐藏表示的维度。 - input_size (
int,可选,默认为 4096) — 输入隐藏状态的维度。用于连接主解码器和深度解码器。 - num_hidden_layers (
int,可选,默认为6) — Transformer 解码器中的隐藏层数量。 - num_attention_heads (
int,可选,默认为16) — Transformer 解码器中每个注意力层的注意力头数量。 - num_key_value_heads (
int, 可选) — 这是用于实现 Grouped Query Attention 的 key_value 头数。如果num_key_value_heads=num_attention_heads,模型将使用 Multi Head Attention (MHA);如果num_key_value_heads=1,模型将使用 Multi Query Attention (MQA);否则使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内所有原始头进行平均池化来构建。更多详情请参阅 这篇论文。如果未指定,则默认为num_attention_heads。 - audio_vocab_size (
int,可选,默认值为 2048) — 模型音频部分的词表大小。定义了调用 Moshi 模型时传入的audio_codes所能表示的不同 token 数量。 - max_position_embeddings (
int,可选,默认为9) — 该模型可能使用的最大序列长度。 - hidden_act (
str,可选,默认为silu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu"等。 - head_dim (
int,可选) — 注意力头维度。如果为 None,则默认为 hidden_size // num_attention_heads - initializer_range (
float,可选,默认为0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - use_cache (
bool,可选,默认为True) — 模型是否应返回最后一次键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True或模型为仅解码器生成式模型时相关。 - sliding_window (
int,可选,默认为8) — 滑动窗口注意力的窗口大小。如果为None,则不应用滑动窗口。 - attention_dropout (
Union[float, int],可选,默认为0.0) — 注意力概率的 dropout 比率。 - ffn_dim (
int,可选,默认为 5632) — 深度解码器块中“中间”(通常称为前馈)层的维度。必须为偶数。 - rms_norm_eps (
float,可选,默认值为1e-08) — RMS 归一化层所使用的 epsilon 值。 - num_codebooks (
int,可选,默认为8) — 模型使用的并行码本数量。 - tie_word_embeddings (
bool,可选,默认为False) — 是否根据模型的tied_weights_keys映射来绑定权重嵌入。 - pad_token_id (
int, 可选) — 词表中用于填充的 token id。 - bos_token_id (
int, 可选) — 词汇表中用于表示流起始的 Token id。 - eos_token_id (
Union[int, list[int]], 可选) — 词汇表中用于表示流结束(end-of-stream)的 token id。
这是用于存储 MoshiModel 配置的类。它根据指定的参数实例化 Moshi 模型,并定义模型架构。使用默认值实例化配置将生成与 kmhf/hf-moshika 类似的配置。
配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。
示例:
>>> from transformers import (
... MoshiDepthConfig,
... MoshiDepthDecoder,
... )
>>> configuration = MoshiDepthConfig()
>>> # Initializing a MoshiDepthDecoder (with random weights) from the kmhf/hf-moshika style configuration
>>> model = MoshiDepthDecoder(configuration)
>>> # Accessing the model configuration
>>> configuration = model.configMoshiModel
class transformers.MoshiModel
< source >( config: MoshiConfig )
参数
- config (MoshiConfig) — 模型的配置类,包含模型的所有参数。通过配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
未添加任何特定头部的裸 Moshi 模型,直接输出原始隐藏状态。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → BaseModelOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。
返回值
BaseModelOutputWithPast 或 tuple(torch.Tensor)
一个 BaseModelOutputWithPast 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(MoshiConfig)和输入。
MoshiModel 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor)— 模型最后一层输出的隐藏状态序列。如果使用了
past_key_values,则仅输出形状为(batch_size, 1, hidden_size)的序列的最后一个隐藏状态。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值,以及如果
config.is_encoder_decoder=True则还包括交叉注意力块中的键和值),可用于(参见past_key_values输入)加速顺序解码。hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层的输出,以及每一层的输出),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
MoshiForCausalLM
class transformers.MoshiForCausalLM
< source >( config: MoshiConfig )
参数
- config (MoshiConfig) — 模型的配置类,包含模型的所有参数。通过配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
带有文本语言建模头的 Moshi 解码器模型。仅可用于文本。
该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。
该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneposition_ids: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Noneuse_cache: bool | None = Nonelabels: typing.Optional[torch.LongTensor] = Nonelogits_to_keep: typing.Union[int, torch.Tensor] = 0**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → MoshiCausalLMOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- position_ids (
torch.LongTensor形状为(batch_size, sequence_length), 可选) — 输入序列中每个 token 在位置嵌入中的位置索引。取值范围为[0, config.n_positions - 1]. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选) — 可选地,您可以选择直接传入嵌入表示,而不是传入input_ids。如果您希望对input_ids索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - use_cache (
bool,可选) — 如果设置为True,则会返回past_key_values键值状态,可用于加速解码(参见past_key_values)。 - labels (
torch.LongTensor,形状为(batch_size, sequence_length),可选) — 用于计算掩码语言建模损失的标签。索引值应在[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,则必须是一维张量,对应于序列长度维度中需要保留的索引。 这在使用打包张量格式(将批次和序列长度合并为单一维度)时非常有用。
返回值
MoshiCausalLMOutputWithPast 或 tuple(torch.Tensor)
MoshiCausalLMOutputWithPast 或 torch.Tensor 元组(当传入 return_dict=False 或 config.return_dict=False 时),其包含的元素取决于配置(MoshiConfig)和输入。
MoshiForCausalLM 的 forward 方法会重写 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.Tensor,形状为(1,),可选,当提供labels时返回) — 语言建模损失(用于下一个 token 预测)。logits(形状为
(batch_size, sequence_length, config.vocab_size)的torch.Tensor)— 语言建模头的预测分数(SoftMax 之前每个词汇表 token 的分数)。last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选)— 模型最后一层输出的隐藏状态序列。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values输入)加速顺序解码。hidden_states (
tuple[torch.Tensor, ...],可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple[torch.Tensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
示例:
>>> from transformers import AutoTokenizer, MoshiForCausalLM
>>> model = MoshiForCausalLM.from_pretrained("kmhf/hf-moshika")
>>> tokenizer = AutoTokenizer.from_pretrained("kmhf/hf-moshika")
>>> 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 Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.BoolTensor] = Noneuser_input_values: typing.Optional[torch.Tensor] = Noneuser_audio_codes: typing.Optional[torch.Tensor] = Nonemoshi_input_values: typing.Optional[torch.Tensor] = Nonemoshi_audio_codes: typing.Optional[torch.Tensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonetext_labels: typing.Optional[torch.LongTensor] = Noneaudio_labels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = None**kwargs ) → MoshiConditionalGenerationOutputWithPast or tuple(torch.Tensor)
参数
- input_ids (
torch.LongTensor形状为(batch_size, sequence_length), ,可选) — 输入序列中各 token 在词汇表中的索引。默认情况下,填充(padding)将被忽略。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.BoolTensor形状为(batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力的掩码。掩码值取自[0, 1]:- 1 表示未被屏蔽的 token,
- 对于被掩码的 token,值为 0。
- user_input_values(形状为 `(batch_size, 1, audio_sequence_length)` 的
torch.Tensor,可选) — 用作生成过程中音频用户提示的音频波形。 - user_audio_codes (
torch.Tensorof shape(batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio user prompt for the generation. Has priority overuser_input_valuesand represents the audio "tokens" ofuser_input_values` once passed through the audio encoder. - moshi_input_values(形状为 `(batch_size, 1, audio_sequence_length)` 的
torch.Tensor,可选)— 用作生成过程中音频 Moshi 提示的音频波形。 - moshi_audio_codes (
torch.Tensorof shape(batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio Moshi prompt for the generation. Has priority overmoshi_input_valuesand represents the audio "tokens" ofmoshi_input_values` once passed through the audio encoder. - past_key_values (
~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常由past_key_values在解码的先前阶段返回,当use_cache=True或config.use_cache=True.仅允许将 Cache 实例作为输入,请参阅我们的 kv cache 指南。 如果未传入
past_key_values,则默认会初始化 DynamicCache。模型将输出与输入相同的缓存格式。
如果使用了
past_key_values,用户应仅输入未处理的input_ids(即未向该模型提供其过去键值状态的那些),其形状为(batch_size, unprocessed_length),而不是形状为(batch_size, sequence_length)的全部input_ids。 - inputs_embeds (
torch.Tensor形状为(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(形状为
(batch_size, sequence_length)的torch.LongTensor,可选) — 用于文本语言建模的标签。请注意,模型内部会对标签进行移位,因此您可以设置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)。
返回值
MoshiConditionalGenerationOutputWithPast 或 tuple(torch.Tensor)
MoshiConditionalGenerationOutputWithPast 或 torch.Tensor 元组(当传入 return_dict=False 或 config.return_dict=False 时),其包含的元素取决于配置(MoshiConfig)和输入。
MoshiForConditionalGeneration 的 forward 方法重写了 __call__ 特殊方法。
尽管前向传播的实现需要在此函数中定义,但之后应调用
Module实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。
loss (
torch.Tensor,形状为(1,),可选,当提供text_labels时返回) — 文本语言建模损失(用于下一个 token 预测)。logits(形状为
(batch_size, sequence_length, config.vocab_size)的torch.Tensor)— 文本语言建模头的预测分数(SoftMax 之前每个词汇表 token 的分数)。last_hidden_state(形状为
(batch_size, sequence_length, hidden_size)的torch.Tensor,可选)— 模型最后一层输出的隐藏状态序列。past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见
past_key_values输入)加速顺序解码。hidden_states (
tuple[torch.Tensor, ...],可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 一个torch.Tensor元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为(batch_size, sequence_length, hidden_size)。模型在每一层输出处的隐藏状态,以及可选的初始嵌入输出。
attentions (
tuple[torch.Tensor, ...],可选,当传入output_attentions=True或config.output_attentions=True时返回) — 一个torch.Tensor元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)。注意力权重,即经过注意力 softmax 之后的权重,用于在自注意力头中计算加权平均值。
depth_loss(形状为
(1,)的torch.Tensor,可选,在提供audio_labels时返回) — 音频语言建模损失(用于下一个 token 预测)。audio_logits(形状为
(batch_size, sequence_length, config.vocab_size)的torch.Tensor)— 音频语言建模头的预测分数。depth_past_key_values(
Cache,可选,在传入use_cache=True或config.use_cache=True时返回)—— 深度解码器的过去键值。depth_hidden_states (
tuple(torch.Tensor),可选,当传入output_hidden_states=True或config.output_hidden_states=True时返回) — 深度解码器的隐藏状态depth_attentions (
tuple(torch.Tensor),可选,当传入output_attentions=True或config.output_attentions=True时返回) — 深度解码器在注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
示例:
>>> from transformers import MoshiForConditionalGeneration
>>> import torch
>>> model = MoshiForConditionalGeneration.from_pretrained("kmhf/hf-moshika")
>>> inputs = moshi.get_unconditional_inputs()
>>> logits = model(**inputs, ).logits
>>> logits.shape # (bsz, seq_len, text_vocab_size)
torch.Size([1, 1, 32000])generate
< source >( input_ids: typing.Optional[torch.LongTensor] = Noneuser_input_values: typing.Optional[torch.Tensor] = Noneuser_audio_codes: typing.Optional[torch.Tensor] = Nonemoshi_input_values: typing.Optional[torch.Tensor] = Nonemoshi_audio_codes: typing.Optional[torch.Tensor] = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonereturn_audio_waveforms: bool | None = Truereturn_audio_codes: bool | None = Noneconcat_unconditional_inputs: bool | None = True**kwargs )
参数
- input_ids(形状为 `(batch_size, sequence_length)` 的
torch.Tensor,可选) — 用作生成文本提示的序列。 - user_input_values(形状为 `(batch_size, 1, audio_sequence_length)` 的
torch.Tensor,可选) — 用作生成过程中音频用户提示的音频波形。 - user_audio_codes (
torch.Tensorof shape(batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio user prompt for the generation. Has priority overuser_input_valuesand represents the audio "tokens" ofuser_input_values` once passed through the audio encoder. - moshi_input_values(形状为 `(batch_size, 1, audio_sequence_length)` 的
torch.Tensor,可选)— 用作生成过程中音频 Moshi 提示的音频波形。 - moshi_audio_codes (
torch.Tensorof shape(batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio Moshi prompt for the generation. Has priority overmoshi_input_valuesand represents the audio "tokens" ofmoshi_input_values` once passed through the audio encoder. - inputs_embeds (
torch.Tensor,形状为(batch_size, sequence_length, hidden_size),可选) — 可选地,除了传递input_ids和音频输入外,您还可以选择直接传递嵌入表示。如果您希望对如何将输入转换为相关向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。 - return_audio_waveforms (
bool,可选,默认为True) — 如果为False,则不会生成音频波形。 - return_audio_codes (
bool, 可选) — 如果为True,还将返回生成的音频代码,即中间音频“token”,这些 token 经过音频解码器转换后得到audio_sequences。 - 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-moshika")
>>> # 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)