Transformers 文档
MusicGen
并获得增强的文档体验
开始使用
MusicGen
概述
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 被训练来预测离散的音频标记,即*音频码*,这些音频码以这些隐藏状态为条件。然后使用音频压缩模型(如 EnCodec)对这些音频标记进行解码,以恢复音频波形。
通过高效的标记交错模式,MusicGen 不需要文本/音频提示的自监督语义表示,从而无需级联多个模型来预测一组码本(例如,分层或上采样)。相反,它能够在一个前向传播中生成所有码本。
论文摘要如下:
我们解决了条件音乐生成的任务。我们介绍了 MusicGen,这是一个单一语言模型(LM),它对多个压缩的离散音乐表示流(即标记)进行操作。与以往的工作不同,MusicGen 由一个单阶段 Transformer LM 和高效的标记交错模式组成,这消除了级联多个模型(例如,分层或上采样)的需要。通过这种方法,我们展示了 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 --safe_serialization
[!NOTE] 当使用除“eager”之外的所有注意力实现时,`head_mask` 参数会被忽略。如果您有一个 `head_mask` 并希望它生效,请使用 `XXXModel.from_pretrained(model_id, attn_implementation="eager")` 加载模型。
生成
MusicGen 兼容两种生成模式:贪婪模式和采样模式。在实践中,采样模式的结果明显优于贪婪模式,因此我们鼓励尽可能使用采样模式。采样模式默认启用,也可以在调用 MusicgenForConditionalGeneration.generate()
时通过设置 do_sample=True
来明确指定,或者通过覆盖模型的生成配置(见下文)。
生成受限于正弦位置嵌入,最多只能处理30秒的输入。这意味着,MusicGen 不能生成超过30秒的音频(1503个标记),并且通过音频提示生成的输入音频也计入此限制。因此,如果输入了20秒的音频,MusicGen 最多只能再生成10秒的音频。
Transformers 支持 MusicGen 的单声道(1通道)和立体声(2通道)版本。单声道版本生成一组码本。立体声版本生成两组码本,每个声道(左/右)一组,每组码本通过音频压缩模型独立解码。每个声道的音频流合并后得到最终的立体声输出。
无条件生成
无条件(或“空”)生成的输入可以通过 MusicgenForConditionalGeneration.get_unconditional_inputs()
方法获取。
>>> from transformers import MusicgenForConditionalGeneration
>>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
>>> 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 notebook 中播放它们。
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")
>>> 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 transformers import AutoProcessor, MusicgenForConditionalGeneration
>>> from datasets import load_dataset
>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
>>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
>>> 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 transformers import AutoProcessor, MusicgenForConditionalGeneration
>>> from datasets import load_dataset
>>> processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
>>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
>>> 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)
生成配置
控制生成过程的默认参数,如采样、指导比例和生成标记数,可以在模型的生成配置中找到,并可以根据需要进行更新。
>>> from transformers import MusicgenForConditionalGeneration
>>> model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
>>> # 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 模型可以分解为三个不同的阶段:
- 文本编码器:将文本输入映射到一系列隐藏状态表示。预训练的 MusicGen 模型使用来自 T5 或 Flan-T5 的固定文本编码器。
- MusicGen 解码器:一个语言模型(LM),根据编码器的隐藏状态表示自回归地生成音频标记(或代码)。
- 音频编码器/解码器:用于将音频提示编码为提示标记,并从解码器预测的音频标记中恢复音频波形。
因此,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)
>>> # Option 2: load the entire composite model, but only return the decoder
>>> decoder = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small").decoder
由于文本编码器和音频编码器/解码器模型在训练期间是固定的,因此 MusicGen 解码器 MusicgenForCausalLM 可以在编码器隐藏状态和音频码的数据集上独立训练。对于推理,训练好的解码器可以与固定的文本编码器和音频编码器/解码器结合,以恢复复合的 MusicgenForConditionalGeneration 模型。
技巧
- MusicGen 是在 Encodec 的 32kHz 检查点上训练的。您应确保使用兼容版本的 Encodec 模型。
- 采样模式通常比贪婪模式效果更好——您可以在调用
MusicgenForConditionalGeneration.generate()
时使用变量do_sample
来切换采样模式。
MusicgenDecoderConfig
class transformers.MusicgenDecoderConfig
< 源 >( vocab_size = 2048 max_position_embeddings = 2048 num_hidden_layers = 24 ffn_dim = 4096 num_attention_heads = 16 layerdrop = 0.0 use_cache = True activation_function = 'gelu' hidden_size = 1024 dropout = 0.1 attention_dropout = 0.0 activation_dropout = 0.0 initializer_factor = 0.02 scale_embedding = False num_codebooks = 4 audio_channels = 1 pad_token_id = 2048 bos_token_id = 2048 eos_token_id = None tie_word_embeddings = False **kwargs )
参数
- vocab_size (
int
, 可选, 默认为 2048) — MusicgenDecoder 模型的词汇表大小。定义了调用MusicgenDecoder
时传递的inputs_ids
可以表示的不同标记的数量。 - hidden_size (
int
, 可选, 默认为 1024) — 层和池化层的维度。 - num_hidden_layers (
int
, 可选, 默认为 24) — 解码器层的数量。 - num_attention_heads (
int
, 可选, 默认为 16) — Transformer 块中每个注意力层的注意力头数量。 - ffn_dim (
int
, 可选, 默认为 4096) — Transformer 块中“中间”(通常称为前馈)层的维度。 - activation_function (
str
或function
, 可选, 默认为"gelu"
) — 解码器和池化层中的非线性激活函数(函数或字符串)。如果为字符串,支持"gelu"
、"relu"
、"silu"
和"gelu_new"
。 - dropout (
float
, 可选, 默认为 0.1) — 嵌入、text_encoder 和池化层中所有全连接层的 dropout 概率。 - attention_dropout (
float
, 可选, 默认为 0.0) — 注意力概率的 dropout 比例。 - activation_dropout (
float
, 可选, 默认为 0.0) — 全连接层内激活函数的 dropout 比例。 - max_position_embeddings (
int
, 可选, 默认为 2048) — 该模型可能使用的最大序列长度。通常,将其设置为一个较大的值以备不时之需(例如,512、1024 或 2048)。 - initializer_factor (
float
, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - layerdrop (
float
, 可选, 默认为 0.0) — 解码器的 LayerDrop 概率。更多细节请参阅 [LayerDrop 论文](https://huggingface.co/papers/1909.11556)。 - scale_embedding (
bool
, 可选, 默认为False
) — 通过除以 sqrt(hidden_size) 来缩放嵌入。 - use_cache (
bool
, 可选, 默认为True
) — 模型是否应返回最后一个键/值注意力(并非所有模型都使用)。 - num_codebooks (
int
, 可选, 默认为 4) — 传递给模型的并行码本数量。 - tie_word_embeddings(
bool
, 可选, 默认为False
) — 是否应绑定输入和输出词嵌入。 - audio_channels (
int
, 可选, 默认为 1) — 音频数据中的通道数。对于单声道为 1,对于立体声为 2。立体声模型为左/右输出声道生成独立的音频流。单声道模型生成单个音频流输出。
这是用于存储 `MusicgenDecoder` 配置的配置类。它用于根据指定的参数实例化一个 MusicGen 解码器,定义模型架构。使用默认值实例化配置将产生与 MusicGen facebook/musicgen-small 架构类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
MusicgenConfig
class transformers.MusicgenConfig
< 源 >( **kwargs )
参数
- kwargs (可选) — 关键字参数字典。主要包括:
- text_encoder (PretrainedConfig, 可选) — 定义文本编码器配置的配置对象实例。
- audio_encoder (PretrainedConfig, 可选) — 定义音频编码器配置的配置对象实例。
- decoder (PretrainedConfig, 可选) — 定义解码器配置的配置对象实例。
这是用于存储 MusicgenModel 配置的配置类。它用于根据指定的参数实例化一个 MusicGen 模型,定义文本编码器、音频编码器和 MusicGen 解码器的配置。
配置对象继承自 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.from_sub_models_config(
... text_encoder_config, audio_encoder_config, 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)
from_sub_models_config
< 源 >( text_encoder_config: PretrainedConfig audio_encoder_config: PretrainedConfig decoder_config: MusicgenDecoderConfig **kwargs ) → MusicgenConfig
从文本编码器、音频编码器和解码器配置实例化一个 MusicgenConfig(或其派生类)。
MusicgenProcessor
class transformers.MusicgenProcessor
< 源 >( feature_extractor tokenizer )
参数
- feature_extractor (
EncodecFeatureExtractor
) — EncodecFeatureExtractor 的实例。特征提取器是必需的输入。 - tokenizer (
T5Tokenizer
) — T5Tokenizer 的实例。分词器是必需的输入。
构造一个 MusicGen 处理器,它将一个 EnCodec 特征提取器和一个 T5 分词器包装成一个单独的处理器类。
MusicgenProcessor 提供 EncodecFeatureExtractor 和 TTokenizer
的所有功能。有关更多信息,请参阅 __call__()
和 decode()。
此方法用于解码 MusicGen 模型的批量音频输出,或分词器的批量标记 ID。在解码标记 ID 的情况下,此方法将其所有参数转发给 T5Tokenizer 的 batch_decode()。有关更多信息,请参阅该方法的文档字符串。
MusicgenModel
class transformers.MusicgenModel
< 源 >( config: MusicgenDecoderConfig )
参数
- config (MusicgenDecoderConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。
基础的 Musicgen 模型,输出原始的隐藏状态,顶部没有任何特定的头部。
该模型继承自 PreTrainedModel。请查看超类的文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是一个 PyTorch torch.nn.Module 的子类。可以像常规的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解所有与通用用法和行为相关的事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None encoder_hidden_states: typing.Optional[torch.FloatTensor] = None encoder_attention_mask: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.Tensor] = None cross_attn_head_mask: typing.Optional[torch.Tensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = 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 ) → transformers.modeling_outputs.BaseModelOutputWithPastAndCrossAttentions 或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
,形状为(batch_size * num_codebooks, sequence_length)
) — 词汇表中输入序列标记的索引,对应于音频码序列。可以通过使用音频编码器模型(如 EncodecModel)对音频提示进行编码来预测音频码,从而获得索引。详情请参阅 EncodecModel.encode()。
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)
,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值的选择范围是[0, 1]
:- 1 表示标记未被遮盖,
- 0 表示标记已被遮盖。
- encoder_hidden_states (
torch.FloatTensor
,形状为(batch_size, encoder_sequence_length, hidden_size)
,可选) — 编码器最后一层输出的隐藏状态序列。用于解码器的交叉注意力机制。 - encoder_attention_mask (
torch.LongTensor
,形状为(batch_size, encoder_sequence_length)
,可选) — 用于避免在编码器 input_ids 的填充标记索引上执行交叉注意力的掩码。掩码值的选择范围是[0, 1]
:- 1 表示标记未被遮盖,
- 0 表示标记已被遮盖。
- head_mask (
torch.Tensor
,形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于使自注意力模块中选定头无效的掩码。掩码值的选择范围是[0, 1]
:- 1 表示头未被遮盖,
- 0 表示头已被遮盖。
- cross_attn_head_mask (
torch.Tensor
,形状为(decoder_layers, decoder_attention_heads)
,可选) — 用于使解码器中交叉注意力模块的选定头无效的掩码,以避免对隐藏头执行交叉注意力。掩码值的选择范围是[0, 1]
:- 1 表示头未被遮盖,
- 0 表示头已被遮盖。
- past_key_values (
tuple[tuple[torch.FloatTensor]]
,可选) — 预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常是在解码的先前阶段,当use_cache=True
或config.use_cache=True
时,由模型返回的past_key_values
。允许两种格式:
- Cache 实例,请参阅我们的 kv cache 指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
的元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。这也被称为传统缓存格式。
模型将输出与输入相同的缓存格式。如果未传递
past_key_values
,则将返回传统缓存格式。如果使用
past_key_values
,用户可以选择只输入最后一个input_ids
(那些没有为其提供过去键值状态的input_ids
),形状为(batch_size, 1)
,而不是所有形状为(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
,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
,可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。
返回
transformers.modeling_outputs.BaseModelOutputWithPastAndCrossAttentions 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.BaseModelOutputWithPastAndCrossAttentions 或一个 torch.FloatTensor
的元组(如果传递了 return_dict=False
或 config.return_dict=False
),包含根据配置 (MusicgenConfig) 和输入而定的各种元素。
-
last_hidden_state (
torch.FloatTensor
, 形状为(batch_size, sequence_length, hidden_size)
) — 模型最后一层输出的隐藏状态序列。如果使用了
past_key_values
,则只输出形状为(batch_size, 1, hidden_size)
的序列的最后一个隐藏状态。 -
past_key_values (
Cache
,可选,在传递use_cache=True
或config.use_cache=True
时返回) — 这是一个 Cache 实例。更多详情,请参阅我们的 kv cache 指南。包含预先计算的隐藏状态(自注意力块中的键和值,如果
config.is_encoder_decoder=True
,则还包括交叉注意力块中的键和值),可用于(参见past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple(torch.FloatTensor)
,可选,在传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 每个层一个输出),形状为(batch_size, sequence_length, hidden_size)
。模型在每个层输出的隐藏状态以及可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。
-
cross_attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
且config.add_cross_attention=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头中的加权平均。
MusicgenModel 的前向方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者会负责运行预处理和后处理步骤,而后者会静默地忽略它们。
MusicgenForCausalLM
class transformers.MusicgenForCausalLM
< source >( config: MusicgenDecoderConfig )
参数
- config (MusicgenDecoderConfig) — 包含模型所有参数的模型配置类。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。请查看 from_pretrained() 方法以加载模型权重。
带有语言建模头的 MusicGen 解码器模型。
该模型继承自 PreTrainedModel。请查看超类的文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是一个 PyTorch torch.nn.Module 的子类。可以像常规的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解所有与通用用法和行为相关的事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None encoder_hidden_states: typing.Optional[torch.FloatTensor] = None encoder_attention_mask: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.Tensor] = None cross_attn_head_mask: typing.Optional[torch.Tensor] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None 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.CausalLMOutputWithCrossAttentions 或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
,形状为(batch_size * num_codebooks, sequence_length)
) — 词汇表中输入序列标记的索引,对应于音频码序列。可以通过使用音频编码器模型(如 EncodecModel)对音频提示进行编码来预测音频码,从而获得索引。详情请参阅 EncodecModel.encode()。
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)
,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值的选择范围是[0, 1]
:- 1 表示标记未被遮盖,
- 0 表示标记已被遮盖。
- encoder_hidden_states (
torch.FloatTensor
,形状为(batch_size, encoder_sequence_length, hidden_size)
,可选) — 编码器最后一层输出的隐藏状态序列。用于解码器的交叉注意力机制。 - encoder_attention_mask (
torch.LongTensor
,形状为(batch_size, encoder_sequence_length)
,可选) — 用于避免在编码器 input_ids 的填充标记索引上执行交叉注意力的掩码。掩码值的选择范围是[0, 1]
:- 1 表示标记未被遮盖,
- 0 表示标记已被遮盖。
- head_mask (
torch.Tensor
,形状为(num_heads,)
或(num_layers, num_heads)
,可选) — 用于使自注意力模块中选定头无效的掩码。掩码值的选择范围是[0, 1]
:- 1 表示头未被遮盖,
- 0 表示头已被遮盖。
- cross_attn_head_mask (
torch.Tensor
,形状为(decoder_layers, decoder_attention_heads)
,可选) — 用于使解码器中交叉注意力模块的选定头无效的掩码,以避免对隐藏头执行交叉注意力。掩码值的选择范围是[0, 1]
:- 1 表示头未被遮盖,
- 0 表示头已被遮盖。
- past_key_values (
tuple[tuple[torch.FloatTensor]]
,可选) — 预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常是在解码的先前阶段,当use_cache=True
或config.use_cache=True
时,由模型返回的past_key_values
。允许两种格式:
- Cache 实例,请参阅我们的 kv cache 指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
的元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。这也被称为传统缓存格式。
模型将输出与输入相同的缓存格式。如果未传递
past_key_values
,则将返回传统缓存格式。如果使用
past_key_values
,用户可以选择只输入最后一个input_ids
(那些没有为其提供过去键值状态的input_ids
),形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的input_ids
。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递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
)。 - output_attentions (
bool
,可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
,可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。
返回
transformers.modeling_outputs.CausalLMOutputWithCrossAttentions 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.CausalLMOutputWithCrossAttentions 或一个 torch.FloatTensor
的元组(如果传递了 return_dict=False
或 config.return_dict=False
),包含根据配置 (MusicgenConfig) 和输入而定的各种元素。
-
loss (
torch.FloatTensor
形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失(用于下一个 token 预测)。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
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 后的注意力权重,用于计算自注意力头中的加权平均值。
-
cross_attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每层一个),形状为(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
输入)加速顺序解码。
MusicgenForCausalLM 的前向方法,重写了 __call__
特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者会负责运行预处理和后处理步骤,而后者会静默地忽略它们。
MusicgenForConditionalGeneration
class transformers.MusicgenForConditionalGeneration
< source >( config: typing.Optional[transformers.models.musicgen.configuration_musicgen.MusicgenConfig] = None text_encoder: typing.Optional[transformers.modeling_utils.PreTrainedModel] = None audio_encoder: typing.Optional[transformers.modeling_utils.PreTrainedModel] = None decoder: typing.Optional[transformers.models.musicgen.modeling_musicgen.MusicgenForCausalLM] = None )
参数
- config (MusicgenConfig,可选) — 包含模型所有参数的模型配置类。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。请查看 from_pretrained() 方法以加载模型权重。
- text_encoder (
PreTrainedModel
,可选) — 将文本编码为隐藏状态以进行条件生成的文本编码器模型。 - audio_encoder (
PreTrainedModel
,可选) — 将音频编码为隐藏状态以进行条件生成的音频编码器模型。 - decoder (
MusicgenForCausalLM
,可选) — 基于条件信号生成音频标记的解码器模型。
包含文本编码器、音频编码器和 Musicgen 解码器的复合 MusicGen 模型。
该模型继承自 PreTrainedModel。请查看超类的文档,了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。
该模型也是一个 PyTorch torch.nn.Module 的子类。可以像常规的 PyTorch Module 一样使用它,并参考 PyTorch 文档了解所有与通用用法和行为相关的事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.BoolTensor] = None input_values: typing.Optional[torch.FloatTensor] = None padding_mask: typing.Optional[torch.BoolTensor] = None decoder_input_ids: typing.Optional[torch.LongTensor] = None decoder_attention_mask: typing.Optional[torch.BoolTensor] = None encoder_outputs: typing.Optional[tuple[torch.FloatTensor]] = None past_key_values: typing.Optional[tuple[tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None decoder_inputs_embeds: typing.Optional[torch.FloatTensor] = None 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
,形状为(batch_size, sequence_length)
,可选) — 词汇表中输入序列标记的索引。默认情况下将忽略填充。可以使用 AutoTokenizer 获得索引。详情请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.BoolTensor
,形状为(batch_size, sequence_length)
,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值的选择范围是[0, 1]
:- 1 表示标记未被遮盖,
- 0 表示标记已被遮盖。
- input_values (
torch.FloatTensor
,形状为(batch_size, sequence_length)
,可选) — 输入原始语音波形的浮点值。可以通过将.flac
或.wav
音频文件加载到list[float]
类型的数组或numpy.ndarray
中获得值,例如通过 soundfile 库(pip install soundfile
)。为了将数组准备成input_values
,应使用 AutoProcessor 进行填充并转换为torch.FloatTensor
类型的张量。详情请参阅{processor_class}.__call__
。 - padding_mask (
torch.BoolTensor
,形状为(batch_size, sequence_length)
,可选) — 用于避免在填充标记索引上执行注意力的掩码。掩码值的选择范围是[0, 1]
:- 1 表示标记未被遮盖,
- 0 表示标记已被遮盖。
- decoder_input_ids (
torch.LongTensor
,形状为(batch_size * num_codebooks, target_sequence_length)
,可选) — 词汇表中解码器输入序列标记的索引,对应于音频码序列。可以通过使用音频编码器模型(如 EncodecModel)对音频提示进行编码来预测音频码,从而获得索引。详情请参阅 EncodecModel.encode()。
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 (
torch.LongTensor
,形状为(batch_size, target_sequence_length)
,可选) — 默认行为:生成一个忽略decoder_input_ids
中填充标记(pad tokens)的张量。默认情况下也会使用因果掩码(Causal mask)。 - encoder_outputs (
tuple[torch.FloatTensor]
,可选) — 元组包含 (last_hidden_state
, 可选:hidden_states
, 可选:attentions
)。last_hidden_state
的形状为(batch_size, sequence_length, hidden_size)
,可选) 是编码器最后一层输出的隐藏状态序列。用于解码器的交叉注意力机制。 - past_key_values (
tuple[tuple[torch.FloatTensor]]
, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速序列解码。这通常包含在解码的前一个阶段,当 `use_cache=True` 或 `config.use_cache=True` 时由模型返回的 `past_key_values`。允许两种格式:
- 一个 Cache 实例,请参阅我们的 kv 缓存指南;
- 一个长度为 `config.n_layers` 的 `tuple(torch.FloatTensor)` 元组,其中每个元组包含 2 个形状为 `(batch_size, num_heads, sequence_length, embed_size_per_head)` 的张量。这也称为旧版缓存格式。
模型将输出与输入相同的缓存格式。如果没有传递 `past_key_values`,将返回旧版缓存格式。
如果使用 `past_key_values`,用户可以选择只输入最后的 `input_ids`(那些没有将其过去的键值状态提供给此模型的 `input_ids`),形状为 `(batch_size, 1)`,而不是所有形状为 `(batch_size, sequence_length)` 的 `input_ids`。
- inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,你可以选择直接传递嵌入表示,而不是传递input_ids
。如果你想比模型内部的嵌入查找矩阵更好地控制如何将input_ids
索引转换为相关向量,这会非常有用。 - decoder_inputs_embeds (
torch.FloatTensor
,形状为(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
)。 - output_attentions (
bool
,可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 `attentions`。 - output_hidden_states (
bool
,可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 `hidden_states`。 - return_dict (
bool
,可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。
返回
transformers.modeling_outputs.Seq2SeqLMOutput 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.Seq2SeqLMOutput 或一个 `torch.FloatTensor` 的元组(如果传递了 `return_dict=False` 或 `config.return_dict=False`),包含的各种元素取决于配置(MusicgenConfig)和输入。
-
loss (
torch.FloatTensor
,形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失。 -
logits (形状为
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。 -
past_key_values (
EncoderDecoderCache
,可选,当传递 `use_cache=True` 或 `config.use_cache=True` 时返回) — 这是一个 EncoderDecoderCache 实例。更多详情,请参阅我们的 kv 缓存指南。包含预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于(参见
past_key_values
输入)加速顺序解码。 -
decoder_hidden_states (`tuple(torch.FloatTensor)`,可选,当传递 `output_hidden_states=True` 或 `config.output_hidden_states=True` 时返回) — `torch.FloatTensor` 的元组(如果模型有嵌入层,则一个用于嵌入层的输出,加上每个层的一个输出),形状为 `(batch_size, sequence_length, hidden_size)`。
解码器在每一层输出时的隐藏状态以及初始嵌入输出。
-
decoder_attentions (`tuple(torch.FloatTensor)`,可选,当传递 `output_attentions=True` 或 `config.output_attentions=True` 时返回) — `torch.FloatTensor` 的元组(每层一个),形状为 `(batch_size, num_heads, sequence_length, sequence_length)`。
解码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头中的加权平均。
-
cross_attentions (
tuple(torch.FloatTensor)
,可选,在传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头中的加权平均。
-
encoder_last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层输出的隐藏状态序列。 -
encoder_hidden_states (`tuple(torch.FloatTensor)`,可选,当传递 `output_hidden_states=True` 或 `config.output_hidden_states=True` 时返回) — `torch.FloatTensor` 的元组(如果模型有嵌入层,则一个用于嵌入层的输出,加上每个层的一个输出),形状为 `(batch_size, sequence_length, hidden_size)`。
编码器在每一层输出时的隐藏状态以及初始嵌入输出。
-
encoder_attentions (`tuple(torch.FloatTensor)`,可选,当传递 `output_attentions=True` 或 `config.output_attentions=True` 时返回) — `torch.FloatTensor` 的元组(每层一个),形状为 `(batch_size, num_heads, sequence_length, sequence_length)`。
编码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头中的加权平均。
MusicgenForConditionalGeneration 的 forward 方法覆盖了 `__call__` 特殊方法。
尽管前向传递的配方需要在此函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者会负责运行预处理和后处理步骤,而后者会静默地忽略它们。
示例
>>> 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])