跳到主要内容

音乐生成模型

跑通 OpenAI Jukebox,一张 Tesla V100 32GB 就够

5b_lyrics 顶层 prior 吃 11.5GB 显存,上采样才是时间大头。原版代码写在 PyTorch 1.4 + CUDA 10.0 上,V100 是它出生时的那张卡——也是 NexGPU 上最便宜的一张。

Jukebox 是 OpenAI 在 2020 年放出的原始音频音乐生成模型,论文《Jukebox: A Generative Model for Music》由 Dhariwal、Jun、Payne、Kim、Radford、Sutskever 六人署名。它不写 MIDI,也不预测频谱图,而是用一个三级 VQ-VAE 把 44.1kHz 的波形压成离散码(hop 分别是 8、32、128,每级码本 2048),再拿稀疏 Transformer 对码序列做自回归。训练集是 120 万首歌,其中 60 万首英文歌配有 LyricWiki 抓来的歌词,所以它是极少数能直接把歌词条件喂进去、让模型「唱」出来的开源模型。

官方仓库 github.com/openai/jukebox 顶上第一行就写着 Status: Archive,代码 as-is、不再更新。这不是坏消息,是选型前必须知道的前提:你拿到的是一份 2020 年的快照,环境要求 Python 3.7.5、mpi4py 3.0.3、PyTorch 1.4 配 cudatoolkit 10.0;HuggingFace 那份移植实现在 transformers 里一路降级,从 models/jukebox 挪进 models/deprecated/jukebox,最后一个带它的版本是 v4.57.0,v5.0.0 起彻底删除。想用 HF 那条路,就得把 transformers 钉死在 4.x。

那今天还有谁在跑它?三类人。一是要复现或改造原始音频自回归建模的研究者;二是把 Jukebox 当特征提取器的 MIR 人——jukemirlib 抽第 36 层表征做音乐标注、和弦识别这些下游任务,官方明说至少要 13GB 显存;三是把那套 VQ-VAE 当编解码器、在它的隐空间上训扩散模型的人,jukebox-diffusion 就是这么干的。三类用法的共同点是:都要先把 16GB 左右的权重拉下来,都要一张显存够大、架构对得上的卡,而且都不该为了这点活儿去买硬件。

01 —

三档模型与两个上采样器

顶层 prior 换,VQ-VAE 和上采样器三套共用

版本参数量显存上下文说明
5b_lyrics(prior_5b_lyrics)5B 顶层 prior + 1280 宽 / 18 层歌词编码器fp16 权重常驻约 11.5GB,KV cache 另加约 1GB/条n_ctx 8192 ≈ 23.8 秒原始音频唯一带歌词条件的 5B 档,权重文件 11.46GB。用 v2 标签集:4,111 位艺人、120 种风格。官方在 16GB V100 上把 max_batch_size 卡死在 3。
5b(prior_5b)5B 顶层 prior,无歌词编码器fp16 权重常驻约 10.3GBn_ctx 8192 ≈ 23.8 秒原始音频只吃艺人 / 风格 / 时长条件,不吃歌词,适合纯器乐。权重 10.29GB,比 5b_lyrics 省 1.2GB 显存。
1b_lyrics(prior_1b_lyrics)约 1B,single_enc_dec 结构fp32 加载约 3.8GB,KV cache 约 400MB/条n_ctx 6144 ≈ 17.84 秒原始音频先跑通它再谈 5B。权重仅 1.96GB,max_batch_size 可以直接开到 16,用的是 v3 标签集:7,898 位艺人、604 种风格。
upsampler_level_1 / upsampler_level_0各约 1B(宽 1920、深 72、单头)各 2.33GB 权重,采样时 max_batch_size 16n_ctx 8192,分别对应约 5.9 秒 / 1.5 秒原始音频三档模型共用同一对上采样器,都从 5b/ 目录下载。绝大部分采样时间花在这两级上,不是花在顶层。
VQ-VAE(5b/vqvae.pth.tar)约 2M 参数权重仅 7.73MB,显存占用可忽略44.1kHz 波形,三级压缩 8× / 32× / 128×整个体系里最小也最耐用的一块。jukemirlib、jukebox-diffusion 都是把它当现成的音频编解码器直接调用。

02 —

四种跑法,四张卡

先看架构对不对得上,再看显存够不够

  • 复现原版环境,1b_lyrics 单卡出 demo

    Tesla V100 32GB$0.188/卡·时

    CUDA 10.0 只覆盖到 sm_75,V100 的 sm_70 正在范围内,官方那套 hps 本来就是照着 V100 调的——而它恰好是 NexGPU 上最便宜的一张卡。

  • 5b_lyrics 大批量采样,把 max_batch_size 从 3 往上抬

    Tesla V100 32GB(可 mpiexec 多卡并行)$0.188/卡·时

    11.5GB 权重加每条约 1GB 的 KV cache,32GB 比官方参考的 16GB 多出整整 20GB 余量,顶层能一次过十几条而不是分五组跑三条。

  • 重建现代 PyTorch 环境,或走 transformers 4.57 的移植实现

    A100 PCIE 80GB$0.824/卡·时

    sample.py 默认在每一级之间把 prior 搬上搬下(prior.cuda() / prior.cpu()),80GB 可以让四个模型全程常驻,省掉来回搬运的开销。

  • jukemirlib 抽第 36 层表征做 MIR 下游任务

    RTX 4090 24GB$0.540/卡·时

    官方门槛是至少 13GB 显存,24GB 绰绰有余;抽特征是吞吐型短任务,按秒计费下更快的卡反而总价更低。

03 —

从空机器到第一段 wav

四步,第一次跑主要时间花在拉权重上

  1. 01

    开机并建出 Python 3.7.5 环境

    在 NexGPU 控制台选一台 Tesla V100 32GB,挂 Ubuntu CLI 或 PyTorch 镜像,SSH 进去装 conda。注意 PyTorch 一定要 1.4 配 cudatoolkit 10.0,装新版会在采样时踩到一堆算子改名。

    conda create -y --name jukebox python=3.7.5 && conda activate jukebox && conda install -y mpi4py=3.0.3 && conda install -y pytorch=1.4 torchvision=0.5 cudatoolkit=10.0 -c pytorch
  2. 02

    装 jukebox 本体

    requirements.txt 只有六个包,但 numba 钉在 0.48.0、librosa 钉在 0.7.2,别顺手升级。装完先确认 nvidia-smi 认得出卡,再动采样。

    git clone https://github.com/openai/jukebox.git && cd jukebox && pip install -r requirements.txt && pip install -e .
  3. 03

    先用 1b_lyrics 跑通链路

    第一次执行会自动从 openaipublic.azureedge.net 拉权重,缓存在 ~/.cache/jukebox/models/ 下:1b_lyrics 这条链路是 VQ-VAE 7.73MB + 两个上采样器各 2.33GB + 顶层 1.96GB,约 6.6GB。跑完在 sample_1b/level_0/ 下看 wav,index.html 还能看歌词对齐动画。

    python jukebox/sample.py --model=1b_lyrics --name=sample_1b --levels=3 --sample_length_in_seconds=20 --total_sample_length_in_seconds=180 --sr=44100 --n_samples=16 --hop_fraction=0.5,0.5,0.125
  4. 04

    换 5b_lyrics,并把 batch 调到配得上 32GB

    顶层权重换成 11.46GB 那份,总下载量涨到约 16.1GB。官方 max_batch_size=3 是给 16GB 卡定的;32GB 上按 11.5GB + 1GB/条 算,调到 12~15 仍有余量,顶层就能一次过。改完盯一眼 nvidia-smi 再放长采样。想拿自己的音频起头就换 --mode=primed --audio_file=xxx.wav --prompt_length_in_seconds=12。

    python jukebox/sample.py --model=5b_lyrics --name=sample_5b --levels=3 --sample_length_in_seconds=20 --total_sample_length_in_seconds=180 --sr=44100 --n_samples=15 --hop_fraction=0.5,0.5,0.125

一晚上三条一分钟成品,花多少

按官方给的速度算实账。拉权重:VQ-VAE 7.73MB + 两个上采样器各 2.33GB + 5b_lyrics 顶层 11.46GB ≈ 16.1GB,入站流量不计费。采样按 README 的口径,V100 上完整三级跑完 20 秒约 3 小时,一批 3 条:3 × $0.188 = $0.564,摊到每条 20 秒 demo 约 $0.19。要 1 分钟成品约 9 小时:9 × $0.188 = $1.692,一批 3 条即每条约 $0.56。导出 3GB 的 44.1kHz wav:3 × $0.0081 = $0.024。整晚账单 $1.692 + $0.024 ≈ $1.72,比一杯咖啡便宜。权重想留着下次接着用:16.1GB × $0.414/GB·月 = $6.66/月;不想留就把存储卷销毁,下次重下也就十几分钟——计算在实例停止那一秒停止计费,存储则要销毁才停。同样这笔活儿如果放到 A100 SXM4 80GB($1.088/卡·时)跑 9 小时是 $9.79,Jukebox 的瓶颈是自回归串行、不是算力,这钱多花得没意义。

04 —

常见问题

Jukebox 已经归档了,2020 年的模型现在还值得本地部署吗?

如果目标只是「生成一首好听的歌」,它确实被后来者甩开了——采样慢、输出单声道、保真度也不占优。但它至今仍是极少数把 5B 级顶层 prior 权重完整放出来、能直接吃歌词条件唱出来的原始音频自回归模型,做研究复现、做音乐表征、做隐空间扩散,替代品并不多。判断值不值,最便宜的方式就是在 NexGPU 上开一台 Tesla V100 32GB,$0.188/卡·时按秒计费,跑一晚上有结论,不满意停机就不再计费。

Jukebox 需要多大显存?我手上是 24GB 的 RTX 4090,够不够?

显存肯定够:官方在 16GB V100 上测得三档顶层 prior 分别占 3.8GB、10.3GB、11.5GB,加上每条约 400MB(1b)到 1GB(5b_lyrics)的 KV cache,24GB 完全塞得下。真正的坎是架构不是容量——原版环境锁在 CUDA 10.0,编译目标最高只到 sm_75,而 4090 是 sm_89,装不上就是装不上。要么自己把整套依赖迁到新版 PyTorch,要么直接用架构对得上的卡。NexGPU 上 Tesla V100 32GB(sm_70)$0.188/卡·时、Tesla T4 16GB(sm_75)$0.298/卡·时,都在 CUDA 10.0 的射程内。

生成一分钟音乐要多久?为什么慢成这样?

官方 README 写得很直白:V100 上完整采样 20 秒约 3 小时。论文拆得更细——顶层 token 生成一分钟约 1 小时,把这一分钟上采样回 44.1kHz 波形要约 8 小时。瓶颈在两级上采样,不在顶层。所以正确姿势是把 n_samples 开大、一次并行出多条,而不是一条条排队;官方就建议 5b_lyrics 用 --n_samples 15。慢意味着按小时租比买卡划算得多:NexGPU 按秒计费、没有起租量、没有开通费,任务跑完实例一停,计算费用当场停止。

Jukebox 生成的音乐能商用吗?

不能。仓库用的是 Noncommercial Use License,而且这份许可明确同时覆盖代码和权重,原文写得很死:软件的任何部分、以及用该软件创作的任何内容,都不得用于商业目的。它同时要求你在发布内容时注明是用 OpenAI 的 Jukebox 创作的。所以商业音乐项目请另找模型,Jukebox 适合研究、评测、个人创作和内部技术验证。这类算完就走的短期实验,正是 NexGPU 按秒计费最省钱的场景。

我填的艺人和风格好像没生效,输出跟指定的完全不搭?

多半是名字没命中标签表,Jukebox 会静默退回 (id, name) = (0, unknown) 并在日志里打一行提醒——很容易被刷屏冲掉。两套标签表还不一样:5b 和 5b_lyrics 用 v2,共 4,111 位艺人、120 种风格,匹配前会把字符串小写化并把非字母数字换成下划线,风格还会被拆成词袋;1b_lyrics 用 v3,共 7,898 位艺人、604 种风格,只做小写化、要求带空格的原样匹配(比如 pop rock)。跑之前先去 jukebox/data/ids/ 里 grep 一下自己要的名字。想快速试几十组艺人风格组合,在 NexGPU 上并行开几台 V100 比串行等一晚上快得多。

用 HuggingFace transformers 那份实现是不是更省事?

省事一半。openai/jukebox-1b-lyrics 和 openai/jukebox-5b-lyrics 在 Hub 上都在,由 Arthur Zucker 移植,配 accelerate 能自动分配设备。但要注意三件事:这份移植只支持推理不支持训练;官方文档自己写了 5B 顶层在 V100 上生成一分钟音频要 8 小时;更关键的是它已经被挪进 models/deprecated/jukebox,最后一个带它的版本是 transformers v4.57.0,v5.0.0 起整个模块被删除,所以必须把 transformers 钉在 4.x。想同时试原版仓库和 HF 那条路,在 NexGPU 上开两台机器各配一套环境即可,A100 PCIE 80GB $0.824/卡·时,两套互不干扰。

开始使用 NexGPU

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

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