Spaces:
Sleeping
Sleeping
Anvita Pandit commited on
Commit ·
749ffd8
1
Parent(s): c10222e
Fix ZeroGPU pickling error by extracting plain values before GPU boundary
Browse files_vamp previously received the raw Gradio data dict (with unpicklable
component-object keys), causing PicklingError on lambdas. Now _vamp
accepts explicit plain-value params, and a wrapper extracts values from
the Gradio dict before the call crosses the ZeroGPU process boundary.
Made-with: Cursor
- vampnet/app.py +113 -60
vampnet/app.py
CHANGED
|
@@ -99,111 +99,134 @@ def load_example_audio():
|
|
| 99 |
|
| 100 |
|
| 101 |
@gpu
|
| 102 |
-
def _vamp(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
interface.to("cuda")
|
| 104 |
|
| 105 |
out_dir = OUT_DIR / str(uuid.uuid4())
|
| 106 |
out_dir.mkdir()
|
| 107 |
-
sig = at.AudioSignal(
|
| 108 |
sig = interface.preprocess(sig)
|
| 109 |
|
| 110 |
loudness = sig.loudness()
|
| 111 |
print(f"input loudness is {loudness}")
|
| 112 |
|
| 113 |
-
if
|
| 114 |
-
sig = shift_pitch(sig,
|
| 115 |
|
| 116 |
z = interface.encode(sig)
|
| 117 |
|
| 118 |
-
ncc =
|
| 119 |
|
| 120 |
# build the mask
|
| 121 |
-
mask = pmask.linear_random(z,
|
| 122 |
mask = pmask.mask_and(
|
| 123 |
mask, pmask.inpaint(
|
| 124 |
z,
|
| 125 |
-
interface.s2t(
|
| 126 |
-
interface.s2t(
|
| 127 |
)
|
| 128 |
)
|
| 129 |
mask = pmask.mask_and(
|
| 130 |
mask, pmask.periodic_mask(
|
| 131 |
z,
|
| 132 |
-
|
| 133 |
-
|
| 134 |
random_roll=True
|
| 135 |
)
|
| 136 |
)
|
| 137 |
-
if
|
| 138 |
mask = pmask.mask_or(
|
| 139 |
-
mask, pmask.onset_mask(sig, z, interface, width=
|
| 140 |
)
|
| 141 |
-
if
|
| 142 |
beat_mask = interface.make_beat_mask(
|
| 143 |
sig,
|
| 144 |
-
after_beat_s=(
|
| 145 |
-
mask_upbeats=not
|
| 146 |
)
|
| 147 |
mask = pmask.mask_and(mask, beat_mask)
|
| 148 |
|
| 149 |
# these should be the last two mask ops
|
| 150 |
-
mask = pmask.dropout(mask,
|
| 151 |
mask = pmask.codebook_unmask(mask, ncc)
|
| 152 |
-
mask = pmask.codebook_mask(mask, int(
|
| 153 |
-
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
print(f"
|
| 157 |
-
print(f"
|
| 158 |
-
print(f"
|
| 159 |
-
print(f"
|
| 160 |
-
print(f"
|
| 161 |
-
print(f"
|
| 162 |
-
print(f"
|
| 163 |
-
print(f"
|
| 164 |
-
print(f"
|
| 165 |
-
print(f"
|
| 166 |
-
print(f"
|
| 167 |
-
print(f"
|
| 168 |
-
print(f"
|
| 169 |
-
print(f"
|
| 170 |
-
print(f"
|
| 171 |
-
print(f"
|
| 172 |
-
print(f"
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
_top_p = data[top_p] if data[top_p] > 0 else None
|
| 178 |
# save the mask as a txt file
|
| 179 |
np.savetxt(out_dir / "mask.txt", mask[:,0,:].long().cpu().numpy())
|
| 180 |
|
| 181 |
-
|
| 182 |
zv, mask_z = interface.coarse_vamp(
|
| 183 |
z,
|
| 184 |
mask=mask,
|
| 185 |
-
sampling_steps=
|
| 186 |
-
mask_temperature=
|
| 187 |
-
sampling_temperature=
|
| 188 |
return_mask=True,
|
| 189 |
-
typical_filtering=
|
| 190 |
-
typical_mass=
|
| 191 |
-
typical_min_tokens=
|
| 192 |
-
top_p=
|
| 193 |
gen_fn=interface.coarse.generate,
|
| 194 |
-
seed=
|
| 195 |
-
sample_cutoff=
|
| 196 |
)
|
| 197 |
|
| 198 |
-
if
|
| 199 |
zv = interface.coarse_to_fine(
|
| 200 |
zv,
|
| 201 |
-
mask_temperature=
|
| 202 |
-
sampling_temperature=
|
| 203 |
mask=mask,
|
| 204 |
-
sampling_steps=
|
| 205 |
-
sample_cutoff=
|
| 206 |
-
seed=
|
| 207 |
)
|
| 208 |
|
| 209 |
sig = interface.to_signal(zv).cpu()
|
|
@@ -222,11 +245,41 @@ def _vamp(data, return_mask=False):
|
|
| 222 |
else:
|
| 223 |
return sig.path_to_file
|
| 224 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 225 |
def vamp(data):
|
| 226 |
-
return
|
| 227 |
|
| 228 |
def api_vamp(data):
|
| 229 |
-
return
|
| 230 |
|
| 231 |
def save_vamp(data):
|
| 232 |
out_dir = OUT_DIR / "saved" / str(uuid.uuid4())
|
|
|
|
| 99 |
|
| 100 |
|
| 101 |
@gpu
|
| 102 |
+
def _vamp(
|
| 103 |
+
_input_audio,
|
| 104 |
+
_num_steps,
|
| 105 |
+
_masktemp,
|
| 106 |
+
_sampletemp,
|
| 107 |
+
_top_p,
|
| 108 |
+
_prefix_s,
|
| 109 |
+
_suffix_s,
|
| 110 |
+
_rand_mask_intensity,
|
| 111 |
+
_periodic_p,
|
| 112 |
+
_periodic_w,
|
| 113 |
+
_n_conditioning_codebooks,
|
| 114 |
+
_dropout,
|
| 115 |
+
_use_coarse2fine,
|
| 116 |
+
_stretch_factor,
|
| 117 |
+
_onset_mask_width,
|
| 118 |
+
_typical_filtering,
|
| 119 |
+
_typical_mass,
|
| 120 |
+
_typical_min_tokens,
|
| 121 |
+
_beat_mask_width,
|
| 122 |
+
_beat_mask_downbeats,
|
| 123 |
+
_seed,
|
| 124 |
+
_n_mask_codebooks,
|
| 125 |
+
_pitch_shift_amt,
|
| 126 |
+
_sample_cutoff,
|
| 127 |
+
return_mask=False,
|
| 128 |
+
):
|
| 129 |
interface.to("cuda")
|
| 130 |
|
| 131 |
out_dir = OUT_DIR / str(uuid.uuid4())
|
| 132 |
out_dir.mkdir()
|
| 133 |
+
sig = at.AudioSignal(_input_audio)
|
| 134 |
sig = interface.preprocess(sig)
|
| 135 |
|
| 136 |
loudness = sig.loudness()
|
| 137 |
print(f"input loudness is {loudness}")
|
| 138 |
|
| 139 |
+
if _pitch_shift_amt != 0:
|
| 140 |
+
sig = shift_pitch(sig, _pitch_shift_amt)
|
| 141 |
|
| 142 |
z = interface.encode(sig)
|
| 143 |
|
| 144 |
+
ncc = _n_conditioning_codebooks
|
| 145 |
|
| 146 |
# build the mask
|
| 147 |
+
mask = pmask.linear_random(z, _rand_mask_intensity)
|
| 148 |
mask = pmask.mask_and(
|
| 149 |
mask, pmask.inpaint(
|
| 150 |
z,
|
| 151 |
+
interface.s2t(_prefix_s),
|
| 152 |
+
interface.s2t(_suffix_s)
|
| 153 |
)
|
| 154 |
)
|
| 155 |
mask = pmask.mask_and(
|
| 156 |
mask, pmask.periodic_mask(
|
| 157 |
z,
|
| 158 |
+
_periodic_p,
|
| 159 |
+
_periodic_w,
|
| 160 |
random_roll=True
|
| 161 |
)
|
| 162 |
)
|
| 163 |
+
if _onset_mask_width > 0:
|
| 164 |
mask = pmask.mask_or(
|
| 165 |
+
mask, pmask.onset_mask(sig, z, interface, width=_onset_mask_width)
|
| 166 |
)
|
| 167 |
+
if _beat_mask_width > 0:
|
| 168 |
beat_mask = interface.make_beat_mask(
|
| 169 |
sig,
|
| 170 |
+
after_beat_s=(_beat_mask_width/1000),
|
| 171 |
+
mask_upbeats=not _beat_mask_downbeats,
|
| 172 |
)
|
| 173 |
mask = pmask.mask_and(mask, beat_mask)
|
| 174 |
|
| 175 |
# these should be the last two mask ops
|
| 176 |
+
mask = pmask.dropout(mask, _dropout)
|
| 177 |
mask = pmask.codebook_unmask(mask, ncc)
|
| 178 |
+
mask = pmask.codebook_mask(mask, int(_n_mask_codebooks))
|
| 179 |
+
|
| 180 |
+
print(f"dropout {_dropout}")
|
| 181 |
+
print(f"masktemp {_masktemp}")
|
| 182 |
+
print(f"sampletemp {_sampletemp}")
|
| 183 |
+
print(f"top_p {_top_p}")
|
| 184 |
+
print(f"prefix_s {_prefix_s}")
|
| 185 |
+
print(f"suffix_s {_suffix_s}")
|
| 186 |
+
print(f"rand_mask_intensity {_rand_mask_intensity}")
|
| 187 |
+
print(f"num_steps {_num_steps}")
|
| 188 |
+
print(f"periodic_p {_periodic_p}")
|
| 189 |
+
print(f"periodic_w {_periodic_w}")
|
| 190 |
+
print(f"n_conditioning_codebooks {_n_conditioning_codebooks}")
|
| 191 |
+
print(f"use_coarse2fine {_use_coarse2fine}")
|
| 192 |
+
print(f"onset_mask_width {_onset_mask_width}")
|
| 193 |
+
print(f"beat_mask_width {_beat_mask_width}")
|
| 194 |
+
print(f"beat_mask_downbeats {_beat_mask_downbeats}")
|
| 195 |
+
print(f"stretch_factor {_stretch_factor}")
|
| 196 |
+
print(f"seed {_seed}")
|
| 197 |
+
print(f"pitch_shift_amt {_pitch_shift_amt}")
|
| 198 |
+
print(f"sample_cutoff {_sample_cutoff}")
|
| 199 |
+
|
| 200 |
+
_top_p_val = _top_p if _top_p > 0 else None
|
|
|
|
|
|
|
|
|
|
| 201 |
# save the mask as a txt file
|
| 202 |
np.savetxt(out_dir / "mask.txt", mask[:,0,:].long().cpu().numpy())
|
| 203 |
|
| 204 |
+
_seed_val = _seed if _seed > 0 else None
|
| 205 |
zv, mask_z = interface.coarse_vamp(
|
| 206 |
z,
|
| 207 |
mask=mask,
|
| 208 |
+
sampling_steps=_num_steps,
|
| 209 |
+
mask_temperature=_masktemp*10,
|
| 210 |
+
sampling_temperature=_sampletemp,
|
| 211 |
return_mask=True,
|
| 212 |
+
typical_filtering=_typical_filtering,
|
| 213 |
+
typical_mass=_typical_mass,
|
| 214 |
+
typical_min_tokens=_typical_min_tokens,
|
| 215 |
+
top_p=_top_p_val,
|
| 216 |
gen_fn=interface.coarse.generate,
|
| 217 |
+
seed=_seed_val,
|
| 218 |
+
sample_cutoff=_sample_cutoff,
|
| 219 |
)
|
| 220 |
|
| 221 |
+
if _use_coarse2fine:
|
| 222 |
zv = interface.coarse_to_fine(
|
| 223 |
zv,
|
| 224 |
+
mask_temperature=_masktemp*10,
|
| 225 |
+
sampling_temperature=_sampletemp,
|
| 226 |
mask=mask,
|
| 227 |
+
sampling_steps=_num_steps,
|
| 228 |
+
sample_cutoff=_sample_cutoff,
|
| 229 |
+
seed=_seed_val,
|
| 230 |
)
|
| 231 |
|
| 232 |
sig = interface.to_signal(zv).cpu()
|
|
|
|
| 245 |
else:
|
| 246 |
return sig.path_to_file
|
| 247 |
|
| 248 |
+
def _extract_and_call_vamp(data, return_mask):
|
| 249 |
+
"""Extract plain values from Gradio data dict so only picklable args cross the ZeroGPU boundary."""
|
| 250 |
+
return _vamp(
|
| 251 |
+
_input_audio=data[input_audio],
|
| 252 |
+
_num_steps=data[num_steps],
|
| 253 |
+
_masktemp=data[masktemp],
|
| 254 |
+
_sampletemp=data[sampletemp],
|
| 255 |
+
_top_p=data[top_p],
|
| 256 |
+
_prefix_s=data[prefix_s],
|
| 257 |
+
_suffix_s=data[suffix_s],
|
| 258 |
+
_rand_mask_intensity=data[rand_mask_intensity],
|
| 259 |
+
_periodic_p=data[periodic_p],
|
| 260 |
+
_periodic_w=data[periodic_w],
|
| 261 |
+
_n_conditioning_codebooks=data[n_conditioning_codebooks],
|
| 262 |
+
_dropout=data[dropout],
|
| 263 |
+
_use_coarse2fine=data[use_coarse2fine],
|
| 264 |
+
_stretch_factor=data[stretch_factor],
|
| 265 |
+
_onset_mask_width=data[onset_mask_width],
|
| 266 |
+
_typical_filtering=data[typical_filtering],
|
| 267 |
+
_typical_mass=data[typical_mass],
|
| 268 |
+
_typical_min_tokens=data[typical_min_tokens],
|
| 269 |
+
_beat_mask_width=data[beat_mask_width],
|
| 270 |
+
_beat_mask_downbeats=data[beat_mask_downbeats],
|
| 271 |
+
_seed=data[seed],
|
| 272 |
+
_n_mask_codebooks=data[n_mask_codebooks],
|
| 273 |
+
_pitch_shift_amt=data[pitch_shift_amt],
|
| 274 |
+
_sample_cutoff=data[sample_cutoff],
|
| 275 |
+
return_mask=return_mask,
|
| 276 |
+
)
|
| 277 |
+
|
| 278 |
def vamp(data):
|
| 279 |
+
return _extract_and_call_vamp(data, return_mask=True)
|
| 280 |
|
| 281 |
def api_vamp(data):
|
| 282 |
+
return _extract_and_call_vamp(data, return_mask=False)
|
| 283 |
|
| 284 |
def save_vamp(data):
|
| 285 |
out_dir = OUT_DIR / "saved" / str(uuid.uuid4())
|