MusicGen 是 Meta FAIR 在论文《Simple and Controllable Music Generation》(arXiv:2306.05284)里提出的单阶段自回归 Transformer。它不做级联、不做上采样,而是直接在 EnCodec 压缩出的离散音频 token 上建模——32kHz 采样率、4 个 codebook、50Hz 帧率,也就是每秒音频只需要 50 个自回归步。文本一侧是冻结的 T5 编码器,通过一种 codebook 交错(delay pattern)在一次前向里预测全部 codebook。这套设计是它到今天仍然好部署的根本原因:没有扩散采样器要调,没有第二阶段声码器要单独加载,`generate()` 出来就是波形。
整个家族在 Hugging Face 上是 facebook/musicgen-{small,medium,large}(300M / 1.5B / 3.3B)、musicgen-melody 与 musicgen-melody-large(chroma 旋律条件)、五个 musicgen-stereo-* 立体声变体,外加后来补上的 musicgen-style(1.5B,用 1.5–4.5 秒音频片段做风格条件)和 musicgen-stem-6cb / -7cb(bass / drums / other 分轨生成与编辑,arXiv:2501.01757)。要先说清楚它做不到什么:训练数据里的人声是按标签加源分离主动去掉的,所以它不唱歌;提示词只吃英文;位置编码把单次生成钉死在 30 秒;权重是 CC-BY-NC 4.0,不能商用。
还有一个部署时必须知道的现状:audiocraft 在 PyPI 上停在 1.3.0(2024-06-03),而 GitHub main 分支的 CHANGELOG 已经到 1.4.0a2,最后一次提交是 2025-03-13。这意味着 `pip install audiocraft` 装到的版本里有 MusicGen、MAGNeT、AudioSeal,但没有 MusicGen-Style 和 JASCO——要用后两个必须装 git main。仓库虽然不再高频更新,MusicGen 依然是纯器乐配乐、旋律条件生成和分轨编辑这几件事上最稳的开源基线:ACE-Step 3.5B(Apache-2.0)快得多,YuE 7B 能唱歌,但 chroma 条件和 stem 编辑这两条路上还没有等价替代。NexGPU 上从 $0.188/卡·时 起租,按秒计费,跑完就停。
01 —
MusicGen 全变体:参数量、权重体积与用途
权重体积取自 Hugging Face 仓库的实际文件大小;audiocraft 原生权重与 transformers 转换版精度不同,别拿错数字估显存
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| facebook/musicgen-small | 300M(解码器 LM) | audiocraft state_dict 0.84GB / transformers fp32 2.36GB | 30 秒 / 1500 token(50Hz) | 打通流水线、批量粗筛、写 prompt 模板时用它,出片质量明显弱于 medium。 |
| facebook/musicgen-medium | 1.5B | audiocraft 3.68GB / transformers fp32 8.04GB;官方文档要求 ≥16GB 显存 | 30 秒 / 1500 token | audiocraft 文档明说 medium 是质量与算力的最佳折中,绝大多数生产任务应该从这里起步。 |
| facebook/musicgen-large | 3.3B | audiocraft fp16 6.51GB / transformers fp32 13.72GB(分两个 shard) | 30 秒 / 1500 token | 质量上限。注意 transformers 版是 fp32 存的,13.7GB 权重直接扔上 16GB 卡会 OOM,务必 torch_dtype=float16。 |
| facebook/musicgen-melody / -melody-large | 1.5B / 3.3B | 与 medium / large 同级 | 30 秒 + 旋律 chroma 条件 | 拿一段哼唱或参考旋律做 chromagram 条件。audiocraft 里是 generate_with_chroma(),transformers 里是另一个类 MusicgenMelodyForConditionalGeneration,不能用普通 Musicgen 类加载。 |
| facebook/musicgen-stereo-{small,medium,large,melody,melody-large} | 300M – 3.3B | stereo-large fp16 safetensors 6.93GB | 30 秒 ×2 声道 | 生成两套 codebook(左/右各一套),各自独立过 EnCodec 解码再合成立体声。显存和步数都要按双份算。 |
| facebook/musicgen-style / musicgen-stem-6cb·7cb | 1.5B | stem 变体 state_dict 3.72GB + 三个分轨 codec 约 0.70GB | 30 秒;风格片段 1.5–4.5 秒 | style 版用音频片段做风格条件,双重 CFG(cfg_coef=3 配 cfg_coef_2=5);stem 版把 bass / drums / other 拆成三条独立轨,可以只重生成其中一条。两者都只在 git main 分支里,PyPI 的 1.3.0 没有。 |
02 —
按任务挑卡:从跑通到全参微调
MusicGen 单条生成是 batch=1 的 1500 步自回归解码,瓶颈在访存延迟而不是算力——先把 batch 堆满,再考虑换更贵的卡
先跑通 small / medium,起 Gradio 试听 demo
Tesla V100 32GB$0.188/卡·时
全队列最便宜的卡,32GB 把 medium 的 8.04GB fp32 权重和 large 的 fp16 权重都装得下,Volta 有 fp16 张量核心,且 audiocraft 硬钉的 torch 2.1.0 完整支持 sm_70。
musicgen-large / stereo-large fp16 批量出片
RTX 4090 24GB$0.540/卡·时
6.9GB fp16 权重加载完还剩 17GB 全给 batch,Ada 的 fp16/bf16 解码吞吐正是 1500 步自回归最吃的那一项;同样 24GB 想再省,RTX 3090 24GB 只要 $0.193/卡·时。
musicgen-medium 1.5B 全参微调,做风格域适配
RTX A6000 48GB$0.817/卡·时
按 AdamW 每参数约 16 字节(权重+梯度+一阶二阶动量)估,1.5B 约 24GB,48GB 留足 EnCodec 在线编码和 batch 的余量,单卡搞定不用碰 FSDP。
musicgen-large 3.3B 全参微调 / 多路并发服务
A100 SXM4 80GB$1.088/卡·时
3.3B 按同样口径约 53GB,80GB 单卡放得下;真要上 FSDP,单节点最多 14 卡、整机显存 2,152GB,不用换平台。
03 —
四步把 MusicGen 跑起来
audiocraft 对 Python 和 PyTorch 版本很挑,这一节的坑基本都在第二步
- 01
开实例,选 PyTorch 预置镜像
控制台挑一张卡(先跑通选 Tesla V100 32GB,要出片选 RTX 4090 24GB),从 2000+ 预置镜像里选 PyTorch 那一档,SSH、Jupyter、Web 终端三种入口都开着。开机第一件事是确认驱动和卡型对得上。
nvidia-smi && python -c "import torch; print(torch.__version__, torch.cuda.get_device_name(0))" - 02
装 audiocraft,注意 torch 版本被钉死
官方要求 Python 3.9+ 和 PyTorch 2.1.0,必须先单独装 torch 再装 audiocraft,否则依赖解析会把 torch 顶到新版本然后在编译扩展时炸掉。ffmpeg 是音频 I/O 的硬依赖。要用 MusicGen-Style 或 JASCO,把最后一行换成 git main——PyPI 上的 1.3.0(2024-06-03)里没有它们。
apt-get update && apt-get install -y ffmpeg && python -m pip install 'torch==2.1.0' setuptools wheel && python -m pip install -U audiocraft # 要 style/JASCO 换成: pip install -U git+https://github.com/facebookresearch/audiocraft - 03
生成第一段 30 秒
set_generation_params 的默认值是 duration=30.0、cfg_coef=3.0、top_k=250、temperature=1.0。CFG 大于 1 意味着每一步都要跑条件和无条件两次前向,所以 30 秒片段实际是 1500 步 ×2 次前向——估算显存和时间时别漏掉这个双份。audio_write 直接落 32kHz WAV。
python -c 'from audiocraft.models import MusicGen; from audiocraft.data.audio import audio_write; m = MusicGen.get_pretrained("facebook/musicgen-large"); m.set_generation_params(duration=30, cfg_coef=3.0, top_k=250); w = m.generate(["warm lo-fi hip hop, dusty vinyl crackle, mellow rhodes chords"]); audio_write("out", w[0].cpu(), m.sample_rate, strategy="loudness")' - 04
起 Gradio 面板,或者挂上批量脚本
仓库自带 demos/musicgen_app.py,下拉框里已经列好了十个 checkpoint(含全部 stereo 变体)。用 AUDIOCRAFT_CACHE_DIR 把权重缓存指到数据卷上,实例重建时不用重新下 6.5GB。要长跑批量任务就直接写循环,实例停了计费就停。
AUDIOCRAFT_CACHE_DIR=/workspace/ac_cache python -m demos.musicgen_app --listen 0.0.0.0 --server_port 7860
一批 30 秒 BGM 到底要花多少钱
假设用 musicgen-large 出一批 30 秒单声道 demo。选 RTX 4090 24GB,$0.540/卡·时:fp16 权重约 6.9GB,剩下 17GB 全拿去堆 batch。租 3 小时 = 3 × $0.540 = $1.62。产出侧的体积是可以精确算的——MusicGen 固定输出 32kHz,16-bit WAV 一条 30 秒就是 32000 × 2 × 30 = 1,920,000 字节 ≈ 1.92MB;假设这 3 小时你跑出 1000 条,合计 1.92GB,拉回本地的出网费是 1.92 × $0.0081 ≈ $0.016。权重加成品占 10GB,实例停了但卷留着的话是 10 × $0.414 = $4.14/月,用完销毁卷就是 $0。一轮下来 ≈ $1.64。换更贵的卡呢:同样 3 小时,A100 SXM4 80GB 是 3 × $1.088 = $3.26,H100 SXM 80GB 是 3 × $3.582 = $10.75。但 MusicGen 的单条生成是 batch=1 的 1500 步自回归解码,卡在访存延迟上,从 4090 换到 H100 拿不到 6.6 倍的加速——真正省钱的做法是在 24GB 卡上把 batch 堆到显存打满。再想压一档,Tesla V100 32GB $0.188/卡·时,3 小时只要 $0.564,32GB 装 large 的 fp16 权重还有富余。全程按秒计费,没有最低消费、没有开通费、不用申请配额。
04 —
