Transformers documentation

MusicGen

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

该模型于 2023-06-08 在 HF papers 上发布,并于 2023-06-29 贡献至 Hugging Face Transformers。

MusicGen

FlashAttention SDPA

概述

MusicGen 模型由 Jade Copet、Felix Kreuk、Itai Gat、Tal Remez、David Kant、Gabriel Synnaeve、Yossi Adi 和 Alexandre Défossez 在论文 Simple and Controllable Music Generation 中提出。

MusicGen 是一个单阶段自回归 Transformer 模型,能够根据文本描述或音频提示生成高质量的音乐样本。文本描述会经过一个冻结的文本编码器模型,以获取隐藏状态表示序列。随后,MusicGen 在这些隐藏状态的条件约束下,被训练以预测离散音频 token,即 audio codes。接着,这些音频 token 会通过音频压缩模型(例如 EnCodec)进行解码,从而恢复出音频波形。

通过高效的 token 交错模式,MusicGen 无需对文本/音频提示进行自监督语义表示,从而消除了级联多个模型以预测一组 codebook(例如分层或上采样)的需求。相反,它能够在单次前向传播中生成所有 codebook。

该论文的摘要如下:

我们致力于解决条件音乐生成任务。我们提出了 MusicGen,这是一个在多个压缩离散音乐表示流(即 token)上运行的单一语言模型(LM)。与以往的工作不同,MusicGen 由一个单阶段 Transformer LM 和高效的 token 交错模式组成,从而消除了级联多个模型(例如分层或上采样)的需求。采用这种方法,我们展示了 MusicGen 如何生成高质量样本,同时以文本描述或旋律特征作为条件,从而更好地控制生成输出。我们进行了广泛的实证评估,结合自动评估和人工研究,表明所提出的方法在标准的文本到音乐基准上优于所评估的基线方法。通过消融研究,我们阐明了构成 MusicGen 的各个组件的重要性。

该模型由 sanchit-gandhi 贡献。原始代码可在 此处 找到。预训练检查点可在 Hugging Face Hub 上找到。

使用技巧

  • 从此处下载原始检查点后,您可以使用位于src/transformers/models/musicgen/convert_musicgen_transformers.py的转换脚本,通过以下命令进行转换:
python src/transformers/models/musicgen/convert_musicgen_transformers.py \
    --checkpoint small --pytorch_dump_folder /output/path

生成

MusicGen 支持两种生成模式:贪心(greedy)和采样(sampling)。在实际使用中,采样模式的效果显著优于贪心模式,因此我们建议在可能的情况下使用采样模式。采样模式默认启用,也可以在调用 MusicgenForConditionalGeneration.generate() 时通过设置 do_sample=True 来显式指定,或者通过覆盖模型的生成配置(见下文)来实现。

生成过程受正弦位置嵌入的限制,输入长度上限为 30 秒。也就是说,MusicGen 无法生成超过 30 秒的音频(1503 个 token),而通过 Audio-Prompted Generation 传入的输入音频会计入该限制。因此,如果输入为 20 秒的音频,MusicGen 最多只能再生成 10 秒的额外音频。

Transformers 同时支持 MusicGen 的单声道(1 通道)和立体声(2 通道)变体。单声道版本生成一组 codebook。立体声版本生成两组 codebook,分别对应每个通道(左/右),每组 codebook 通过音频压缩模型独立解码。随后,将每个通道的音频流合并,以生成最终的立体声输出。

无条件生成

无条件(或“空”)生成的输入可以通过方法 MusicgenForConditionalGeneration.get_unconditional_inputs() 获取:

from transformers import MusicgenForConditionalGeneration


model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", device_map="auto")
unconditional_inputs = model.get_unconditional_inputs(num_samples=1)

audio_values = model.generate(**unconditional_inputs, do_sample=True, max_new_tokens=256)

音频输出是一个形状为 (batch_size, num_channels, sequence_length) 的三维 Torch 张量。要收听生成的音频样本,您可以在 ipynb 笔记本中播放它们:

from IPython.display import Audio


sampling_rate = model.config.audio_encoder.sampling_rate
Audio(audio_values[0].numpy(), rate=sampling_rate)

或者使用第三方库(例如 scipy)将它们保存为 .wav 文件:

import scipy


sampling_rate = model.config.audio_encoder.sampling_rate
scipy.io.wavfile.write("musicgen_out.wav", rate=sampling_rate, data=audio_values[0, 0].numpy())

基于文本的条件生成

该模型可以通过使用 MusicgenProcessor 对输入进行预处理,根据文本提示生成音频样本:

from transformers import AutoProcessor, MusicgenForConditionalGeneration


processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", device_map="auto")

inputs = processor(
    text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
    padding=True,
    return_tensors="pt",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

guidance_scale 用于无分类器引导(CFG),用于设置条件 logits(由文本提示预测)与无条件 logits(由无条件或“空”提示预测)之间的权重。较高的 guidance scale 会促使模型生成与输入提示更紧密相关的样本,但通常以牺牲音频质量为代价。通过设置 guidance_scale > 1 即可启用 CFG。为获得最佳效果,请使用 guidance_scale=3(默认值)。

音频提示生成

可以使用相同的 MusicgenProcessor 来预处理用于音频续写的音频提示。在下面的示例中,我们使用 🤗 Datasets 库加载音频文件,该库可以通过以下命令通过 pip 安装:

pip install --upgrade pip
pip install datasets[audio]
from datasets import load_dataset

from transformers import AutoProcessor, MusicgenForConditionalGeneration


processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", device_map="auto")

dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]

# take the first half of the audio sample
sample["array"] = sample["array"][: len(sample["array"]) // 2]

inputs = processor(
    audio=sample["array"],
    sampling_rate=sample["sampling_rate"],
    text=["80s blues track with groovy saxophone"],
    padding=True,
    return_tensors="pt",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

对于批量音频提示生成,可以使用 MusicgenProcessor 类对生成的 audio_values 进行后处理,以去除填充:

from datasets import load_dataset

from transformers import AutoProcessor, MusicgenForConditionalGeneration


processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", device_map="auto")

dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]

# take the first quarter of the audio sample
sample_1 = sample["array"][: len(sample["array"]) // 4]

# take the first half of the audio sample
sample_2 = sample["array"][: len(sample["array"]) // 2]

inputs = processor(
    audio=[sample_1, sample_2],
    sampling_rate=sample["sampling_rate"],
    text=["80s blues track with groovy saxophone", "90s rock song with loud guitars and heavy drums"],
    padding=True,
    return_tensors="pt",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

# post-process to remove padding from the batched audio
audio_values = processor.batch_decode(audio_values, padding_mask=inputs.padding_mask)

生成配置

控制生成过程的默认参数(例如采样、guidance scale 以及生成的 token 数量)可以在模型的 generation config 中找到,并按需更新:

from transformers import MusicgenForConditionalGeneration


model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", device_map="auto")

# inspect the default generation config
model.generation_config

# increase the guidance scale to 4.0
model.generation_config.guidance_scale = 4.0

# decrease the max length to 256 tokens
model.generation_config.max_length = 256

请注意,传递给 generate 方法的任何参数都会覆盖生成配置中的对应设置,因此在调用 generate 时设置 do_sample=False 将覆盖生成配置中 model.generation_config.do_sample 的设置。

模型结构

MusicGen 模型可以分解为三个不同的阶段:

  1. 文本编码器:将文本输入映射为隐藏状态表示序列。预训练的 MusicGen 模型使用来自 T5 或 Flan-T5 的冻结文本编码器
  2. MusicGen 解码器:一种语言模型(LM),它基于编码器的隐藏状态表示,自回归地生成音频 token(或代码)。
  3. 音频编码器/解码器:用于将音频提示编码为提示词元(prompt tokens),并从解码器预测的音频词元中恢复音频波形

因此,MusicGen 模型既可以作为独立的解码器模型使用,对应类 MusicgenForCausalLM;也可以作为包含文本编码器和音频编码器/解码器的复合模型使用,对应类 MusicgenForConditionalGeneration。如果只需要从预训练检查点加载解码器,可以先指定正确的配置进行加载,也可以通过复合模型的 .decoder 属性进行访问:

from transformers import AutoConfig, MusicgenForCausalLM, MusicgenForConditionalGeneration


# Option 1: get decoder config and pass to `.from_pretrained`
decoder_config = AutoConfig.from_pretrained("facebook/musicgen-small").decoder
decoder = MusicgenForCausalLM.from_pretrained("facebook/musicgen-small", **decoder_config, device_map="auto")

# Option 2: load the entire composite model, but only return the decoder
decoder = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small", device_map="auto").decoder

由于文本编码器和音频编码器/解码器模型在训练过程中保持冻结,MusicGen 解码器 MusicgenForCausalLM 可以基于编码器隐藏状态和音频码数据集进行独立训练。在推理阶段,可以将训练好的解码器与冻结的文本编码器及音频编码器/解码器组合,以恢复完整的 MusicgenForConditionalGeneration 模型。

提示:

  • MusicGen 是在 Encodec 的 32kHz 检查点上训练的。您应确保使用兼容版本的 Encodec 模型。
  • 采样模式通常比贪心模式能产生更好的效果 - 您可以在调用 MusicgenForConditionalGeneration.generate() 时通过变量 do_sample 来切换采样。

MusicgenDecoderConfig

class transformers.MusicgenDecoderConfig

< >

( 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 = 2048max_position_embeddings: int = 2048num_hidden_layers: int = 24ffn_dim: int = 4096num_attention_heads: int = 16layerdrop: float | int = 0.0use_cache: bool = Trueactivation_function: str = 'gelu'hidden_size: int = 1024dropout: float | int = 0.1attention_dropout: float | int = 0.0activation_dropout: float | int = 0.0initializer_factor: float = 0.02scale_embedding: bool = Falsenum_codebooks: int = 4audio_channels: int = 1pad_token_id: int | None = 2048bos_token_id: int | None = 2048eos_token_id: int | list[int] | None = Nonetie_word_embeddings: bool = Falseis_decoder: bool = Falseadd_cross_attention: bool = Falsecross_attention_hidden_size: int | None = None )

参数

  • vocab_size (int,可选,默认为 2048) — 模型的词汇表大小。定义了 input_ids 可以表示的不同 token 数量。
  • max_position_embeddings (int,可选,默认为 2048) — 该模型可能使用的最大序列长度。
  • num_hidden_layers (int,可选,默认为 24) — Transformer 解码器中的隐藏层数量。
  • ffn_dim (int,可选,默认为 4096) — MLP 表示的维度。
  • num_attention_heads (int,可选,默认为 16) — Transformer 解码器中每个注意力层的注意力头数量。
  • layerdrop (Union[float, int],可选,默认为 0.0) — LayerDrop 概率。有关更多详细信息,请参阅 [LayerDrop 论文](见 https://huggingface.co/papers/1909.11556)。
  • use_cache (bool,可选,默认为 True) — 模型是否应返回最后一次键/值注意力(并非所有模型都使用)。仅当 config.is_decoder=True 或模型为仅解码器生成式模型时相关。
  • activation_function (str,可选,默认为 gelu) — 解码器中的非线性激活函数(函数或字符串)。例如,"gelu"、"relu"、"silu" 等。
  • hidden_size (int,可选,默认为 1024) — 隐藏表示的维度。
  • dropout (Union[float, int],可选,默认为 0.1) — 所有 dropout 层的比率。
  • attention_dropout (Union[float, int],可选,默认为 0.0) — 注意力概率的 dropout 比率。
  • activation_dropout (Union[float, int],可选,默认为 0.0) — 全连接层中激活值的 dropout 比率。
  • initializer_factor (float,可选,默认为 0.02) — 用于初始化所有权重矩阵的系数(应保持为 1,内部用于初始化测试)。
  • scale_embedding (bool,可选,默认为 False) — 是否通过将嵌入除以 sqrt(d_model) 来对嵌入进行缩放。
  • num_codebooks (int,可选,默认为 4) — 模型使用的并行码本数量。
  • audio_channels (int,可选,默认为 1) — 输入通道的数量。
  • pad_token_id (int,可选,默认为 2048) — 词表中用于填充的 Token ID。
  • bos_token_id (int,可选,默认为 2048) — 词汇表中用于表示流起始的 Token id。
  • eos_token_id (Union[int, list[int]], 可选) — 词汇表中用于表示流结束(end-of-stream)的 token id。
  • tie_word_embeddings (bool,可选,默认为 False) — 是否根据模型的 tied_weights_keys 映射来绑定权重嵌入。
  • is_decoder (bool,可选,默认为 False) — 指示该模型是否用作解码器。如果为 False,则模型用作编码器。
  • add_cross_attention (bool,可选,默认为 False) — 是否应在模型中添加交叉注意力层。
  • cross_attention_hidden_size (int, 可选) — 编码器输出投影到解码器交叉注意力键/值空间的隐藏层大小。当编码器和解码器的隐藏层大小不同时使用。

这是用于存储 MusicgenModel 配置的类。它根据指定的参数实例化 Musicgen 模型,并定义模型架构。使用默认值实例化配置将得到与 facebook/musicgen-small 类似的配置。

配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。

MusicgenConfig

class transformers.MusicgenConfig

< >

( 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 = Nonetext_encoder: dict | transformers.configuration_utils.PreTrainedConfig | None = Noneaudio_encoder: dict | transformers.configuration_utils.PreTrainedConfig | None = Nonedecoder: dict | transformers.configuration_utils.PreTrainedConfig | None = Noneinitializer_factor: float = 0.02 )

参数

  • text_encoder (Union[dict, PretrainedConfig]) — 一个配置对象实例,用于定义文本编码器的配置。
  • audio_encoder (Union[dict, PretrainedConfig]) — 一个配置对象实例,用于定义音频编码器的配置。
  • decoder (Union[dict, PretrainedConfig]) — 一个配置对象的实例,用于定义解码器配置。
  • initializer_factor (float,可选,默认为 0.02) — 用于初始化所有权重矩阵的系数(应保持为 1,内部用于初始化测试)。

这是用于存储 MusicgenModel 配置的类。它根据指定的参数实例化 Musicgen 模型,并定义模型架构。使用默认值实例化配置将得到与 facebook/musicgen-small 类似的配置。

配置对象继承自 PreTrainedConfig,可用于控制模型输出。有关更多信息,请参阅 PreTrainedConfig 的文档。

示例:

>>> from transformers import (
...     MusicgenConfig,
...     MusicgenDecoderConfig,
...     T5Config,
...     EncodecConfig,
...     MusicgenForConditionalGeneration,
... )

>>> # Initializing text encoder, audio encoder, and decoder model configurations
>>> text_encoder_config = T5Config()
>>> audio_encoder_config = EncodecConfig()
>>> decoder_config = MusicgenDecoderConfig()

>>> configuration = MusicgenConfig(
...     text_encoder=text_encoder_config,
...     audio_encoder=audio_encoder_config,
...     decoder=decoder_config,
... )

>>> # Initializing a MusicgenForConditionalGeneration (with random weights) from the facebook/musicgen-small style configuration
>>> model = MusicgenForConditionalGeneration(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
>>> config_text_encoder = model.config.text_encoder
>>> config_audio_encoder = model.config.audio_encoder
>>> config_decoder = model.config.decoder

>>> # Saving the model, including its configuration
>>> model.save_pretrained("musicgen-model")

>>> # loading model and config from pretrained folder
>>> musicgen_config = MusicgenConfig.from_pretrained("musicgen-model")
>>> model = MusicgenForConditionalGeneration.from_pretrained("musicgen-model", config=musicgen_config)

MusicgenProcessor

class transformers.MusicgenProcessor

< >

( feature_extractortokenizer )

参数

  • feature_extractor(EncodecFeatureExtractor)— 特征提取器是必需的输入。
  • tokenizer (T5Tokenizer) — 分词器是必需的输入。

构建一个 MusicgenProcessor,它将特征提取器和分词器封装为单个处理器。

MusicgenProcessor 提供了 EncodecFeatureExtractor 和 T5Tokenizer 的所有功能。有关更多信息,请参阅 ~EncodecFeatureExtractor 和 ~T5Tokenizer。

__call__

< >

( *args**kwargs )

参数

  • return_tensors (str 或 TensorType, 可选) — 如果设置,将返回特定框架的张量。可接受的值为:
    • 'pt':返回 PyTorch torch.Tensor 对象。
    • 'np':返回 NumPy np.ndarray 对象。

MusicgenModel

class transformers.MusicgenModel

< >

( config: MusicgenDecoderConfig )

参数

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

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

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

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

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneencoder_hidden_states: typing.Optional[torch.Tensor] = Noneencoder_attention_mask: 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'> ) → BaseModelOutputWithPastAndCrossAttentions or tuple(torch.Tensor)

参数

  • input_ids (torch.LongTensor 形状为 (batch_size * num_codebooks, sequence_length)) — 输入序列中 token 在词表中的索引,对应音频编码序列。可通过音频编码器模型(如 EncodecModel)对音频提示进行编码以预测音频编码,从而获取这些索引。详情请参阅 EncodecModel.encode()。什么是 input IDs?在 forward 过程中,input_ids 会自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果从音频编码模型(如 EncodecModel)获取音频编码,请确保帧数等于 1,并在将其作为 input_ids 传入之前,将音频编码的形状从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)。

    可以通过使用音频编码器模型对音频提示进行编码来预测音频码,从而获取索引,例如使用 EncodecModel。有关详细信息,请参阅 EncodecModel.encode()。

    什么是输入 ID?

    input_ids 在前向传播过程中会自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果您从音频编码模型(例如 EncodecModel)获取音频代码,请确保帧数等于 1,并在将其作为 input_ids 传入之前,将音频代码的形状从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)。

  • attention_mask (torch.Tensor 形状为 (batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自 [0, 1]:
    • 1 表示未被屏蔽的 token,
    • 对于被掩码的 token,值为 0。

    什么是注意力掩码?

  • encoder_hidden_states (torch.Tensor,形状为 (batch_size, encoder_sequence_length, hidden_size),可选) — 编码器最后一层输出的隐藏状态序列。用于解码器的交叉注意力机制。
  • encoder_attention_mask (torch.LongTensor 形状为 (batch_size, encoder_sequence_length), 可选) — 用于避免对 encoder input_ids 中填充 token 的索引执行交叉注意力的掩码。掩码值在 [0, 1]:
    • 1 表示未被屏蔽的 token,
    • 对于被掩码的 token,值为 0。

    什么是注意力掩码?

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

返回值

BaseModelOutputWithPastAndCrossAttentions 或 tuple(torch.Tensor)

一个 BaseModelOutputWithPastAndCrossAttentions 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(MusicgenConfig)和输入。

MusicgenModel 的 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 之后的权重,用于在自注意力头中计算加权平均值。

  • cross_attentions (tuple(torch.Tensor),可选,当传入 output_attentions=True 且 config.add_cross_attention=True,或当 config.output_attentions=True 时返回) — 一个 torch.Tensor 元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。

    解码器交叉注意力层在注意力 softmax 之后的注意力权重,用于在交叉注意力头中计算加权平均值。

MusicgenForCausalLM

class transformers.MusicgenForCausalLM

< >

( config: MusicgenDecoderConfig )

参数

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

在 MusicGen 解码器模型之上添加了一个语言建模头。

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

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

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.Tensor] = Noneencoder_hidden_states: typing.Optional[torch.Tensor] = Noneencoder_attention_mask: typing.Optional[torch.LongTensor] = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → CausalLMOutputWithCrossAttentions or tuple(torch.Tensor)

参数

  • input_ids (torch.LongTensor 形状为 (batch_size * num_codebooks, sequence_length)) — 输入序列中 token 在词表中的索引,对应音频编码序列。可通过音频编码器模型(如 EncodecModel)对音频提示进行编码以预测音频编码,从而获取这些索引。详情请参阅 EncodecModel.encode()。什么是 input IDs?在 forward 过程中,input_ids 会自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果从音频编码模型(如 EncodecModel)获取音频编码,请确保帧数等于 1,并在将其作为 input_ids 传入之前,将音频编码的形状从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)。

    可以通过使用音频编码器模型对音频提示进行编码来预测音频码,从而获取索引,例如使用 EncodecModel。有关详细信息,请参阅 EncodecModel.encode()。

    什么是输入 ID?

    input_ids 在前向传播过程中会自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果您从音频编码模型(例如 EncodecModel)获取音频代码,请确保帧数等于 1,并在将其作为 input_ids 传入之前,将音频代码的形状从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)。

  • attention_mask (torch.Tensor 形状为 (batch_size, sequence_length), ,可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自 [0, 1]:
    • 1 表示未被屏蔽的 token,
    • 对于被掩码的 token,值为 0。

    什么是注意力掩码?

  • encoder_hidden_states (torch.Tensor,形状为 (batch_size, encoder_sequence_length, hidden_size),可选) — 编码器最后一层输出的隐藏状态序列。用于解码器的交叉注意力机制。
  • encoder_attention_mask (torch.LongTensor 形状为 (batch_size, encoder_sequence_length), 可选) — 用于避免对 encoder input_ids 中填充 token 的索引执行交叉注意力的掩码。掩码值在 [0, 1]:
    • 1 表示未被屏蔽的 token,
    • 对于被掩码的 token,值为 0。

    什么是注意力掩码?

  • 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 索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。
  • labels (torch.LongTensor,形状为 (batch_size, sequence_length, num_codebooks),可选) — 用于语言建模的标签。请注意,模型内部会对标签进行移位,因此您可以设置 labels = input_ids 索引的取值范围为 [-100, 0, ..., config.vocab_size] 所有设置为 -100 的标签都会被忽略(即被掩码),损失仅针对 [0, ..., config.vocab_size] 范围内的标签进行计算。
  • use_cache (bool,可选) — 如果设置为 True,则会返回 past_key_values 键值状态,可用于加速解码(参见 past_key_values)。

返回值

CausalLMOutputWithCrossAttentions 或 tuple(torch.Tensor)

一个 CausalLMOutputWithCrossAttentions 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(MusicgenConfig)和输入。

MusicgenForCausalLM 的 forward 方法重写了 __call__ 特殊方法。

尽管前向传播的实现需要在此函数中定义,但之后应调用 Module 实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。

  • loss (torch.Tensor,形状为 (1,),可选,当提供 labels 时返回) — 语言建模损失(用于下一个 token 预测)。

  • logits(形状为 (batch_size, sequence_length, config.vocab_size) 的 torch.Tensor)— 语言建模头的预测分数(SoftMax 之前每个词汇表 token 的分数)。

  • 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 之后的权重,用于在自注意力头中计算加权平均值。

  • cross_attentions (tuple(torch.Tensor),可选,在传入 output_attentions=True 或 config.output_attentions=True 时返回) — 一个 torch.Tensor 元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。

    注意力 softmax 之后的交叉注意力权重,用于在交叉注意力头中计算加权平均值。

  • past_key_values(Cache,可选,在传入 use_cache=True 或 config.use_cache=True 时返回)—— 它是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。

    包含预计算的隐藏状态(注意力块中的键和值),可用于(参见 past_key_values 输入)加速顺序解码。

示例:

MusicgenForConditionalGeneration

class transformers.MusicgenForConditionalGeneration

< >

( config: transformers.models.musicgen.configuration_musicgen.MusicgenConfig | None = Nonetext_encoder: transformers.modeling_utils.PreTrainedModel | None = Noneaudio_encoder: transformers.modeling_utils.PreTrainedModel | None = Nonedecoder: transformers.models.musicgen.modeling_musicgen.MusicgenForCausalLM | None = None )

参数

  • config (MusicgenConfig,可选) — 包含模型所有参数的模型配置类。使用配置文件进行初始化时,不会加载与模型关联的权重,仅加载配置。请查看 from_pretrained() 方法以加载模型权重。
  • text_encoder (PreTrainedModel, 可选) — 用于将文本编码为隐藏状态以进行条件控制的文本编码器模型。
  • audio_encoder (PreTrainedModel,可选) — 用于将音频编码为隐藏状态以进行条件化的音频编码器模型。
  • decoder (MusicgenForCausalLM, 可选) — 根据条件信号生成音频 token 的解码器模型。

包含文本编码器、音频编码器和 Musicgen 解码器的复合 MusicGen 模型,

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

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

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = Noneattention_mask: typing.Optional[torch.BoolTensor] = Noneinput_values: typing.Optional[torch.Tensor] = Nonepadding_mask: typing.Optional[torch.BoolTensor] = Nonedecoder_input_ids: typing.Optional[torch.LongTensor] = Nonedecoder_attention_mask: typing.Optional[torch.BoolTensor] = Noneencoder_outputs: tuple[torch.Tensor] | None = Nonepast_key_values: transformers.cache_utils.Cache | None = Noneinputs_embeds: typing.Optional[torch.Tensor] = Nonedecoder_inputs_embeds: typing.Optional[torch.Tensor] = Nonelabels: typing.Optional[torch.LongTensor] = Noneuse_cache: bool | None = None**kwargs: *<class 'transformers.utils.generic.TransformersKwargs'> ) → Seq2SeqLMOutput 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。

    什么是注意力掩码?

  • input_values (torch.Tensor,形状为 (batch_size, sequence_length),可选) — 输入原始语音波形的浮点值。可以通过将 .flac 或 .wav 音频文件加载为 list[float]、numpy.ndarray 或 torch.Tensor 类型的数组来获取这些值,例如 使用 torchcodec 库(pip install torchcodec)或 soundfile 库(pip install soundfile)。要将该数组准备为 input_values,应使用 AutoProcessor 进行填充并转换为 torch.Tensor 类型的张量。详情请参见 MusicgenProcessor.call()。
  • padding_mask (torch.BoolTensor 形状为 (batch_size, sequence_length), 可选) — 用于避免对填充 token 索引执行注意力机制的掩码。掩码值取自 [0, 1]:1 表示未掩码的 token,0 表示被掩码的 token。什么是注意力掩码? [0, 1]:
    • 1 表示未被屏蔽的 token,
    • 对于被掩码的 token,值为 0。

    什么是注意力掩码?

  • decoder_input_ids (torch.LongTensor 形状为 (batch_size * num_codebooks, target_sequence_length), 可选) — 解码器输入序列中 token 在词表中的索引,对应音频编码序列。可通过音频编码器模型对音频提示进行编码来预测音频编码,从而获得这些索引,例如使用 EncodecModel。详情请参阅 EncodecModel.encode()。什么是解码器输入 ID?在 forward 过程中,decoder_input_ids 会自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果从音频编码模型(如 EncodecModel)获取音频编码,请确保帧数等于 1,并在将其作为 decoder_input_ids 传入之前,将音频编码的形状从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)。

    可以通过使用音频编码器模型对音频提示进行编码来预测音频码,从而获取索引,例如使用 EncodecModel。有关详细信息,请参阅 EncodecModel.encode()。

    什么是解码器输入 ID?

    decoder_input_ids 将在前向传播过程中自动从形状 (batch_size * num_codebooks, target_sequence_length) 转换为 (batch_size, num_codebooks, target_sequence_length)。如果您从音频编码模型(例如 EncodecModel)获取音频代码,请确保帧数等于 1,并在将其作为 decoder_input_ids 传入之前,将音频代码的形状从 (frames, batch_size, num_codebooks, target_sequence_length) 重塑为 (batch_size * num_codebooks, target_sequence_length)。

  • decoder_attention_mask(形状为 (batch_size, target_sequence_length) 的 torch.LongTensor,可选) — 默认行为:生成一个忽略 decoder_input_ids 中填充标记的张量。默认情况下也会使用因果掩码。
  • encoder_outputs (tuple[torch.Tensor],可选) — 元组由 (last_hidden_state,可选:hidden_states,可选:attentions) last_hidden_state 的形状为 (batch_size, sequence_length, hidden_size),可选),是编码器最后一层输出的隐藏状态序列。用于解码器的交叉注意力。
  • 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 索引如何转换为相应向量拥有比模型内部嵌入查找矩阵更多的控制权,这将非常有用。
  • decoder_inputs_embeds (torch.Tensor 形状为 (batch_size, target_sequence_length, hidden_size), ,可选) — 可选地,除了传递 decoder_input_ids ,还可以选择直接传递嵌入表示。如果使用了 past_key_values ,则只需输入最后一个 decoder_inputs_embeds (参见 past_key_values). 。这在希望比模型内部的嵌入查找矩阵更精细地控制如何将 decoder_input_ids 索引转换为对应向量时非常有用。

    如果 decoder_input_ids 和 decoder_inputs_embeds 均未设置,decoder_inputs_embeds 将取 inputs_embeds 的值。

  • labels (torch.LongTensor,形状为 (batch_size, sequence_length, num_codebooks),可选) — 用于语言建模的标签。请注意,模型内部会对标签进行移位,因此您可以设置 labels = input_ids 索引的取值范围为 [-100, 0, ..., config.vocab_size] 所有设置为 -100 的标签都会被忽略(即被掩码),损失仅针对 [0, ..., config.vocab_size] 范围内的标签进行计算。
  • use_cache (bool,可选) — 如果设置为 True,则会返回 past_key_values 键值状态,可用于加速解码(参见 past_key_values)。

返回值

Seq2SeqLMOutput 或 tuple(torch.Tensor)

一个 Seq2SeqLMOutput 或 torch.Tensor 元组(如果传入了 return_dict=False 或 config.return_dict=False),其包含的元素取决于配置(MusicgenConfig)和输入。

MusicgenForConditionalGeneration 的 forward 方法重写了 __call__ 特殊方法。

尽管前向传播的实现需要在此函数中定义,但之后应调用 Module 实例,而不是直接调用此函数,因为前者会负责执行预处理和后处理步骤,而后者则会静默地忽略这些步骤。

  • loss(形状为 (1,) 的 torch.Tensor,可选,在提供 labels 时返回)— 语言建模损失。

  • logits(形状为 (batch_size, sequence_length, config.vocab_size) 的 torch.Tensor)— 语言建模头的预测分数(SoftMax 之前每个词汇表 token 的分数)。

  • past_key_values(EncoderDecoderCache,可选,在传入 use_cache=True 或 config.use_cache=True 时返回)—— 它是一个 EncoderDecoderCache 实例。更多详情,请参阅我们的 kv cache 指南。

    包含预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于(参见 past_key_values 输入)加速顺序解码。

  • decoder_hidden_states (tuple(torch.Tensor),可选,在传入 output_hidden_states=True 或 config.output_hidden_states=True 时返回) — 一个 torch.Tensor 元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为 (batch_size, sequence_length, hidden_size)。

    解码器在每一层输出处的隐藏状态,以及初始嵌入输出。

  • decoder_attentions (tuple(torch.Tensor),可选,在传入 output_attentions=True 或 config.output_attentions=True 时返回) — 一个 torch.Tensor 元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。

    解码器在注意力 softmax 之后的注意力权重,用于在自注意力头中计算加权平均值。

  • cross_attentions (tuple(torch.Tensor),可选,在传入 output_attentions=True 或 config.output_attentions=True 时返回) — 一个 torch.Tensor 元组(每层一个),形状为 (batch_size, num_heads, sequence_length, sequence_length)。

    解码器交叉注意力层在注意力 softmax 之后的注意力权重,用于在交叉注意力头中计算加权平均值。

  • encoder_last_hidden_state(形状为 (batch_size, sequence_length, hidden_size) 的 torch.Tensor,可选)— 模型编码器最后一层输出的隐藏状态序列。

  • encoder_hidden_states (tuple(torch.Tensor),可选,在传入 output_hidden_states=True 或 config.output_hidden_states=True 时返回) — 一个 torch.Tensor 元组(如果模型具有嵌入层,则包含嵌入层输出的一个张量,以及每个层输出的一个张量),形状为 (batch_size, sequence_length, hidden_size)。

    编码器在每一层输出处的隐藏状态,以及初始嵌入输出。

  • encoder_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 AutoProcessor, MusicgenForConditionalGeneration
>>> import torch

>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
>>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")

>>> inputs = processor(
...     text=["80s pop track with bassy drums and synth", "90s rock song with loud guitars and heavy drums"],
...     padding=True,
...     return_tensors="pt",
... )

>>> pad_token_id = model.generation_config.pad_token_id
>>> decoder_input_ids = (
...     torch.ones((inputs.input_ids.shape[0] * model.decoder.num_codebooks, 1), dtype=torch.long)
...     * pad_token_id
... )

>>> logits = model(**inputs, decoder_input_ids=decoder_input_ids).logits
>>> logits.shape  # (bsz * num_codebooks, tgt_len, vocab_size)
torch.Size([8, 1, 2048])
Update on GitHub