1.前言
第六课内容是介绍香橙派开发板上部署推理模型并用gradio构建对话窗口的方法,由于暂时没办法做到人均一块开发板,布置的作业换成了另一个颇有挑战性的项目:
基于MindNLP套件迁移mimi模型
参考资料• 参 考 代 码 仓 :http://githu b.com/huggingface/transformers/tree/main/src/transformers/models/mimi• MindNLP 仓库:https://github.com/mindspore-lab/mindnlp验收标准提交内容: Configuration , Model , Unit tests提交 PR 至 MindNLP 代码仓 https://github.com/mindspore-lab/mindnlp要求通过门禁测试huggingface 全量 ut 测试通过
课程直播链接:
【第六课】直播 | 玩转香橙派开发板--基于MindSpore的AI开发实战(模型训练+LLM推理应用)_哔哩哔哩_bilibili
迁移教程:
Transformers模型迁移_哔哩哔哩_bilibili
迁移文档:
为了从零开始完成这项作业,我认为扒一扒这个模型的各种代码,全面认识模型是十分重要的。这套博文准备分上中下,上篇介绍模型、调用代码;中篇扒一扒训练代码;下篇介绍迁移方法。
2.Mimi模型
2.1介绍
Mimi 编解码器 是由 Kyutai 开发的一个语义-声学神经音频编解码器,其主要作用是将音频编码为适合语言模型处理的离散单元(mimi模型就是moshi音频llm的音频分词器),同时提供在低比特率下运行时的高质量音频表现,并且具有与实时生成兼容的低帧率。具体来说:
- 音频到文本的转换:Mimi能够将24kHz的音频波形编码成每秒12.5帧、维度为512的潜在表示形式(latent representation)。
- 支持流式处理:该模型的所有卷积都是因果的(causal),这意味着它可以以流的形式运行。这使得Mimi可以在编码和解码时都用于流式处理,特别适用于需要实时处理的应用场景。
- 高质量音频重建:通过在瓶颈处添加Transformer模块来改进Mimi编码语音到紧凑表示的能力,同时重建高质量音频。这些Transformer有助于提高感知到的音频质量,并改善语义信息的提取。
- 多层次量化:采用残差向量量化(Residual Vector Quantizer, RVQ)对潜在空间进行离散化,这种方法通过对前一个量化器的残差迭代应用向量量化(VQ)来实现。
- 实时对话系统的组成部分:作为Moshi系统的一部分,Mimi支持实现首个实时、全双工口语对话系统。Moshi结合了文本大模型Helium和Mimi音频编解码器,通过一种新的层次多流架构支持生成任意对话。
模型大小:96.2M参数 数据类型:F32
开发者: Kyutai
模型类型: 音频编解码器
音频类型: 语音
许可证: CC-BY
乍一看只是一个应用了transformer架构的音频处理模型,其实这个模型颇有来头。以下就要介绍它的本体:moshi。
Moshi是由法国的的人工智能研究实验室Kyutai推出的一款端到端实时音频多模态AI模型,作为平替GPT-4o的开源模型,Moshi在普通笔记本上即可运行,具有低延迟特性,支持本地设备使用,保护用户隐私。
Moshi 由三个主要组件组成:Helium,一个 7B 语言模型;Mimi,一个神经音频编解码器;以及一个新的多流架构。该系统可以对具有重叠和中断的实时对话进行建模。Kyutai Labs 提供了两个带有人工生成声音的 Moshi 模型。更多详细信息可在发表的论文和GitHub 存储库中找到。
这个开源模型来自法国一个仅有 8 人的非营利性 AI 研究机构 ——Kyutai,模型名为 Moshi,具备听、说、看的多模态功能。图灵奖得主 Yann LeCun 转发说道:「Moshi 能听懂带有法国口音的英语。」据悉,该团队开发这个模型仅用了 6 个月。
kyutai-labs/moshihttps://github.com/kyutai-labs/moshi
https://github.com/kyutai-labs/moshi8人小团队单挑OpenAI,半年仿出GPT-4o,还开源了
mimi模型作为moshi模型中的语音编码器,具有 300 倍的压缩系数,可捕捉语义和声音信息。这个编解码器可以快速处理声音,几乎没有延迟(大约80毫秒)。这意味着你说话后,机器几乎立刻就能理解并回应你。
理论上,Moshi可以实现160毫秒的延迟(Mimi的80毫秒帧大小加上80毫秒的声学延迟)。在实际应用中,使用L4 GPU可以将整体延迟降低到200毫秒左右。
2.2架构
图片来自hf代码仓库
Moshi的核心是Mimi音频编解码器。它在之前的神经音频编解码器(如SoundStream和EnCodec)基础上进行了改进:
1. **神经编码器(Neural Encoder)**:
- 输入是24kHz采样率的原始音频信号。
- 首先通过一个卷积网络(Convnet),将原始音频信号转换为特征表示。
- 然后通过Transformer层进一步处理这些特征,以捕捉更复杂的模式和依赖关系。
2. **量化与潜在空间(Quantization and Latent Space)**:
- 经过Transformer处理后的特征被送入量化模块(VQ, Vector Quantization),这里使用了向量量化技术来压缩特征表示。
- 量化后的特征被分解为多个残差向量量化(RVQ)部分,每个部分都对应于不同的频率带或时间尺度。
- 这些量化后的特征在潜在空间中进行存储和传输,从而实现了高效的音频编码。
3. **流式编码器-解码器架构(Streaming Encoder-Decoder Architecture)**:
- 量化后的特征被送入解码器部分,首先通过一系列线性变换(Lin.)和残差向量量化重建(RVQ Reconstruction)模块,逐步恢复原始音频信号的细节。
- 解码器同样包含Transformer层,用于进一步优化和细化重建的音频信号。
4. **神经解码器(Neural Decoder)**:
- 最终,经过解码器处理后的特征再次通过卷积网络(Convnet),生成最终的音频信号输出。
- 输出的音频信号具有12Hz的采样率和1.1kbps的比特率,保持了较高的音频质量。
5. **损失函数与训练(Loss Functions and Training)**:
- 模型采用端到端的方式进行训练,通过最小化重构误差(Reconstruction Loss)来优化模型参数。
- 此外,还引入了对抗损失(Adversarial Losses)和蒸馏损失(Distillation Loss),以提高模型的鲁棒性和泛化能力。
- 蒸馏损失通过WavLM模型进行计算,确保模型能够学习到高质量的语音特征。
6. **余弦相似度(Cosine Similarity)**:
- 在训练过程中,模型还利用余弦相似度作为评估指标,确保生成的音频信号与原始信号在语义上保持一致。
总的来说,Mimi模型通过结合卷积网络、Transformer和向量量化等技术,实现了高效且高质量的音频编解码,特别适用于语音语言模型和文本转语音系统。
2.3作者
Moshi背后的团队是Kyutai,一家位于巴黎的人工智能研究实验室(非营利)。
Kyutai成立于2023年11月,致力于研究通用AI,投资主要来自欧洲实业资本。
公开资料显示,Kyutai由Xavier Niel(法国亿万富翁、法国电信集团Iliad首席执行官)、Rodolphe Saadé (法国物流巨头达飞集团CEO)和Eric Schmidt (前谷歌CEO)各出资1亿欧元共同创立。
首席执行官Patrick Pérez,曾在微软担任研究员,谷歌学术主页显示其文章被引用4w+,研究领域包括计算机视觉、图像处理、机器学习和人工智能。
CEO Patrick Pérez 硕士毕业于巴黎中央理工学院,博士在雷恩大学攻读信号处理专业。在创办 Kyutai 之前,他是法资世界 500 强企业法雷奥(valeo)公司人工智能副总裁兼 valeo.ai 的科学总监,valeo.ai 是一个专注于法雷奥汽车应用尤其是自动驾驶汽车的人工智能研究实验室。在加入法雷奥之前,他还曾在 Technicolor (2009-2018)、Inria (1993-2000、2004-2009) 和微软剑桥研究院 (2000-2004) 担任研究员。他的研究范围包括多模态场景理解和计算成像。
Kyutai 组建了一支由具有杰出学术和商业背景的优秀研究人员组成的团队,在巴黎设有办事处。其创始团队包括:
-
首席执行官 Patrick Pérez:在计算机视觉和机器学习领域拥有三十多年经验的专业人士;
-
首席扩展(scaling)官 Edouard Grave:在大语言模型和自然语言处理方面拥有专业知识;
-
首席科学官 Hervé Jégou:因对计算机视觉和压缩域搜索算法的贡献而闻名;
-
首席技术官 Laurent Mazaré:在应用数学、密码学和机器学习方面经验丰富;
-
首席建模官 Neil Zeghidour:前 Google DeepMind 研究员,专门研究生成音频;
-
创始科学家 Alexandre Défossez:专门研究机器学习应用数学。
2.4调用
Use the following code to get started with the Mimi model using a dummy example from the LibriSpeech dataset (~9MB). First, install the required Python packages:
#Terminal
pip install --upgrade pip
pip install --upgrade datasets[audio]
pip install git+https://github.com/huggingface/transformers.git@main
#python
!pip install --upgrade pip
!pip install --upgrade datasets[audio]
!pip install git+https://github.com/huggingface/transformers.git@main
Then load an audio sample, and run a forward pass of the model:
from datasets import load_dataset, Audio
from transformers import MimiModel, AutoFeatureExtractor
# load a demonstration datasets
librispeech_dummy = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation")
# load the model + feature extractor (for pre-processing the audio)
model = MimiModel.from_pretrained("kyutai/mimi")
feature_extractor = AutoFeatureExtractor.from_pretrained("kyutai/mimi")
# cast the audio data to the correct sampling rate for the model
librispeech_dummy = librispeech_dummy.cast_column("audio", Audio(sampling_rate=feature_extractor.sampling_rate))
audio_sample = librispeech_dummy[0]["audio"]["array"]
# pre-process the inputs
inputs = feature_extractor(raw_audio=audio_sample, sampling_rate=feature_extractor.sampling_rate, return_tensors="pt")
# explicitly encode then decode the audio inputs
encoder_outputs = model.encode(inputs["input_values"])
audio_values = model.decode(encoder_outputs.audio_codes)[0]
# or the equivalent with a forward pass
audio_values = model(inputs["input_values"]).audio_values
处理过程:
加载数据集:
加载了一个名为 librispeech_asr_dummy
的数据集,这是一个用于语音识别的示例数据集。
加载模型和特征提取器:
加载了一个预训练的 MimiModel 模型和一个 AutoFeatureExtractor 特征提取器。
调整音频数据的采样率:
将数据集中的音频数据转换为模型所需的采样率( 12Hz 和 1.1kbps 比特率),并提取第一个音频样本。
预处理输入:
使用特征提取器对音频样本进行预处理,将其转换为模型可以接受的张量格式。
编码和解码音频输入:
首先对预处理后的音频输入进行编码,然后对编码后的音频进行解码,得到解码后的音频值。
通过前向传播获取音频值:
通过模型的前向传播直接获取音频值。
2.5训练方法
Mimi模型的训练方法包括几个关键方面:
1. **优化策略**:
- 由于在架构中引入了Transformer,因此使用AdamW优化器进行训练,并且对Transformer的参数应用权重衰减(weight decay),权重衰减值为5e-2。
- 学习率为8e-4,动量衰减为0.5,平方梯度的衰减为0.9,并使用一个衰减值为0.99的指数移动平均权重。
- 训练过程中使用的批量大小为128,在随机选择的12秒音频窗口上进行训练,总共进行了4百万步。Transformer的上下文限制为10秒。
2. **量化策略**:
- 使用Q=8个量化器,每个量化器的码本大小为NA=2048。这在12.5Hz的帧率下代表了一个1.1kbps的比特率。
- 在应用RVQ之前,将嵌入维度从512投影到256维,然后再返回512维。
- 使用量化器dropout来提供编解码器的比特率可扩展性,即在训练期间仅以50%的概率对序列进行量化处理,而不是每次都量化。
3. **损失函数**:
- 基线模型使用重构损失和对抗损失的组合进行训练