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.3GB | n_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 16 | n_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
四步,第一次跑主要时间花在拉权重上
- 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 - 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 . - 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 - 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 —
