Transformers documentation

Moshi

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

该模型于 2024-09-17 在 HF papers 上发布,并于 2024-10-16 贡献至 Hugging Face Transformers。

Moshi

FlashAttention SDPA

概述

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 个信息流:

  1. 用户的音频
  2. Moshi 的音频
  3. 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 将原始检查点进行转换。

如何使用该模型

此实现有两个主要目标:

  1. 通过简化原始 API 来快速测试模型生成
  2. 简化训练流程。训练指南即将发布,但欢迎用户贡献!

该实现专为中间用途而设计。我们强烈建议使用原始的 implementation 来进行模型的实时流式推理。

1. 模型生成

Moshi 是一个双流音频的流式自回归模型。换句话说,一个音频流对应模型已说/将说的内容,另一个音频流对应用户已说/将说的内容。

因此,MoshiForConditionalGeneration.generate() 需要 3 个输入:

  1. input_ids - 对应于文本标记历史
  2. moshi_input_values 或 moshi_audio_codes——对应模型的音频历史
  3. user_input_values 或 user_audio_codes - 对应用户的音频历史

这三个输入必须保持同步。也就是说,它们的长度必须对应相同数量的 token。

您可以根据需要测试的内容,动态使用这 3 个输入:

  1. 只需检查模型对用户提示的响应——在这种情况下,input_ids 可以填充为 pad token,而 user_input_values 可以是与用户提示形状相同的零张量。
  2. 测试更复杂的行为——在这种情况下,您必须注意输入 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_sequences

2. 模型训练

由于需要对流进行对齐/同步,大部分工作必须在数据创建/预处理阶段完成。

完成后,只需将 text_labels 和 audio_labels 与常规输入一起传入 MoshiForConditionalGeneration.forward(),即可获取模型损失。

训练指南即将发布,但欢迎用户贡献!

模型如何前向传播输入 / 生成

  1. 输入流被嵌入并合并到 inputs_embeds 中。

  2. inputs_embeds 会被传入主解码器,该解码器会像普通 LLM 一样对其进行处理。

  3. 主解码器输出 text logits,同时也输出其 last hidden state,在论文中被称为 temporal context。

  4. 深度解码器会切换我们进行前向传播 / 生成的维度(从时间维度切换到码本维度)。它利用由 text logits 生成的 token 以及 temporal context,以自回归的方式生成音频码本。

该模型由 Yoach Lacombe (ylacombe) 贡献。

原始代码可以在此处找到。

MoshiConfig

类 transformers.MoshiConfig

< >

( 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

< >

( audio_encoder_config: PreTrainedConfig**kwargs ) → MoshiConfig

返回值

MoshiConfig

配置对象的实例

从音频编码器配置实例化一个 MoshiConfig(或其派生类)。

MoshiDepthConfig

类 transformers.MoshiDepthConfig

< >

( 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.config

MoshiModel

class transformers.MoshiModel

< >

( config: MoshiConfig )

参数

  • config (MoshiConfig) — 模型的配置类,包含模型的所有参数。通过配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。

未添加任何特定头部的裸 Moshi 模型,直接输出原始隐藏状态。

该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。

该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。

forward

< >

( 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()。

    什么是输入 ID?

  • 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].

    什么是位置 ID?

  • 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

< >

( config: MoshiConfig )

参数

  • config (MoshiConfig) — 模型的配置类,包含模型的所有参数。通过配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。

带有文本语言建模头的 Moshi 解码器模型。仅可用于文本。

该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。

该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。

forward

< >

( 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()。

    什么是输入 ID?

  • 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].

    什么是位置 ID?

  • 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

< >

( config: MoshiConfig )

参数

  • config (MoshiConfig) — 模型的配置类,包含模型的所有参数。通过配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。

用于语音到语音转换的原始 Moshi 模型,包含一个音频编码器、一个 Moshi 深度解码器和一个 Moshi 解码器。

该模型继承自 PreTrainedModel。请查阅父类文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝头等)。

该模型也是 PyTorch torch.nn.Module 的子类。 请将其作为常规的 PyTorch Module 使用,有关通用用法和行为的所有事项,请参阅 PyTorch 文档。

forward

< >

( 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()。

    什么是输入 ID?

  • 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.Tensor of shape (batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio user prompt for the generation. Has priority over user_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.Tensor of shape (batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio Moshi prompt for the generation. Has priority over moshi_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

< >

( 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.Tensor of shape (batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio user prompt for the generation. Has priority over user_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.Tensor of shape (batch_size, num_codebooks, sequence_length), *optional*) -- The audio codes used as audio Moshi prompt for the generation. Has priority over moshi_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

< >

( num_samples = 1 )

参数

  • num_samples (int, 可选) — 要无条件生成的音频采样数量。
  • max_new_tokens (int, 可选) — 每个样本要生成的 token 数量。token 数量越多,生成的音频样本越长,但推理时间也会相应增加(因为每个样本需要生成更多的音频 token)。

用于获取无条件生成所需空输入的辅助函数,使模型可以在不使用特征提取器或分词器的情况下运行。

示例:

>>> 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)
Update on GitHub