跳到主要内容

音乐生成模型

MusicGen 本地部署:从 300M 到 3.3B,一张 24GB 卡就够

audiocraft 官方文档给的门槛是「medium(约 1.5B)推理需要至少 16GB 显存」。但 musicgen-large 的 audiocraft 原生权重只有 6.51GB,一张 RTX 4090 24GB($0.540/卡·时)装完模型还剩十几 GB,全部可以拿去堆 batch。

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-small300M(解码器 LM)audiocraft state_dict 0.84GB / transformers fp32 2.36GB30 秒 / 1500 token(50Hz)打通流水线、批量粗筛、写 prompt 模板时用它,出片质量明显弱于 medium。
facebook/musicgen-medium1.5Baudiocraft 3.68GB / transformers fp32 8.04GB;官方文档要求 ≥16GB 显存30 秒 / 1500 tokenaudiocraft 文档明说 medium 是质量与算力的最佳折中,绝大多数生产任务应该从这里起步。
facebook/musicgen-large3.3Baudiocraft fp16 6.51GB / transformers fp32 13.72GB(分两个 shard)30 秒 / 1500 token质量上限。注意 transformers 版是 fp32 存的,13.7GB 权重直接扔上 16GB 卡会 OOM,务必 torch_dtype=float16。
facebook/musicgen-melody / -melody-large1.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.3Bstereo-large fp16 safetensors 6.93GB30 秒 ×2 声道生成两套 codebook(左/右各一套),各自独立过 EnCodec 解码再合成立体声。显存和步数都要按双份算。
facebook/musicgen-style / musicgen-stem-6cb·7cb1.5Bstem 变体 state_dict 3.72GB + 三个分轨 codec 约 0.70GB30 秒;风格片段 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 版本很挑,这一节的坑基本都在第二步

  1. 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))"
  2. 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
  3. 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")'
  4. 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 —

常见问题

MusicGen 本地部署到底需要多大显存?

看你用哪条路径。audiocraft 原生权重:small 0.84GB、medium 3.68GB、large 6.51GB(fp16 存的)。transformers 转换版是 fp32:small 2.36GB、medium 8.04GB、large 13.72GB。再加上 236MB 的 EnCodec 32kHz 解码器、T5 文本编码器,以及 CFG 带来的双份前向激活。audiocraft 文档给的官方口径是「medium 推理至少 16GB 显存」。落到实际选卡:small/medium 一张 Tesla V100 32GB($0.188/卡·时)绰绰有余,large 走 fp16 上 RTX 4090 24GB($0.540/卡·时)最舒服,两张卡在 NexGPU 上都是按秒计费、开机就能用。

为什么 MusicGen 只能生成 30 秒?怎么做更长的曲子?

正弦位置编码把单次生成限死在 30 秒,也就是 1503 个 token;而且如果你用音频续写,输入音频本身也占这个额度——喂 20 秒进去就只剩 10 秒可生成。audiocraft 的解法是滑动窗口续写:把 duration 设成大于 30,它会用 extend_stride(默认 18 秒)一段段往后接。代价是接缝处容易听出转折,长曲子更适合分段生成再在 DAW 里手动拼。这类活儿要反复试参数,NexGPU 按秒计费、随停随走,试错成本比包月低得多。

MusicGen 能生成人声或者唱歌吗?

不能,而且这是设计上的选择不是 bug。模型卡里写得很清楚:训练用的 20K 小时数据(Meta Music Initiative Sound Collection、Shutterstock、Pond5)里的人声是先按标签筛、再用源分离主动剥掉的,所以它只出器乐。要带唱的歌,方向是 YuE 7B(Apache-2.0,歌词到整首歌,HKUST + M-A-P)或者 ACE-Step 3.5B(Apache-2.0)。这两个都比 MusicGen 更吃显存,NexGPU 上从 RTX A6000 48GB($0.817/卡·时)到 H200 141GB($6.660/卡·时)都能直接开。

MusicGen 生成的音乐可以商用吗?

权重不行。audiocraft 的代码是 MIT,但所有 MusicGen 权重都是 CC-BY-NC 4.0——非商业授权。这是它在生产环境里最大的一道门槛,比显存难跨得多。如果你的用途必须商用,要么走 Apache-2.0 的 ACE-Step,要么拿 MusicGen 的训练代码在自有版权曲库上重训(audiocraft 仓库提供 MusicGen 的完整训练代码)。重训是实打实的多卡任务,NexGPU 单节点最多 14 卡、整机显存 2,152GB,A100 SXM4 80GB $1.088/卡·时起,不用提前申请配额。

audiocraft 装不上,或者在 RTX 5090 上跑不起来怎么办?

绝大多数安装失败都来自那个硬钉的 torch==2.1.0:必须先单独装 torch 再装 audiocraft,Python 版本压在 3.9–3.11,ffmpeg 要系统级装好。RTX 5090 是 Blackwell(sm_120),torch 2.1.0 的编译目标里根本没有这一档,所以官方 audiocraft 路径在 5090 上是跑不通的——要么改走 transformers 的 MusicgenForConditionalGeneration 配新版 torch,要么直接选一张老老实实支持的卡。NexGPU 上 RTX 4090 24GB $0.540、RTX 3090 24GB $0.193、A10 24GB $0.414、Tesla V100 32GB $0.188 都在 torch 2.1 的支持范围内,2000+ 预置镜像里选好 PyTorch 那一档就少踩一半坑。

2026 年了,MusicGen 还值得用吗,是不是已经被取代了?

仓库确实冷了:PyPI 停在 1.3.0(2024-06-03),GitHub main 的 CHANGELOG 到 1.4.0a2,最后一次提交是 2025-03-13。纯文生音乐的速度和授权它都不占优——ACE-Step 3.5B 是 Apache-2.0,官方称 A100 上 20 秒出 4 分钟。但 MusicGen 有两件事至今少有等价替代:melody 变体的 chroma 旋律条件(拿哼唱直接约束生成),以及 musicgen-stem 的 bass/drums/other 分轨生成与单轨重写。加上它是纯自回归、没有采样器要调,作为基线和作为可微调的起点都很省心。真正的判断方式是把候选模型放同一张卡上跑同一批 prompt——NexGPU 覆盖 51 个国家/地区、1,175 个已验证可租节点、2,498 张 GPU、75 种卡型,按秒计费,横评一下午的花费不到一杯咖啡。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。