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

Files changed (1) hide show
  1. vampnet/app.py +113 -60
vampnet/app.py CHANGED
@@ -99,111 +99,134 @@ def load_example_audio():
99
 
100
 
101
  @gpu
102
- def _vamp(data, return_mask=False):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
103
  interface.to("cuda")
104
 
105
  out_dir = OUT_DIR / str(uuid.uuid4())
106
  out_dir.mkdir()
107
- sig = at.AudioSignal(data[input_audio])
108
  sig = interface.preprocess(sig)
109
 
110
  loudness = sig.loudness()
111
  print(f"input loudness is {loudness}")
112
 
113
- if data[pitch_shift_amt] != 0:
114
- sig = shift_pitch(sig, data[pitch_shift_amt])
115
 
116
  z = interface.encode(sig)
117
 
118
- ncc = data[n_conditioning_codebooks]
119
 
120
  # build the mask
121
- mask = pmask.linear_random(z, data[rand_mask_intensity])
122
  mask = pmask.mask_and(
123
  mask, pmask.inpaint(
124
  z,
125
- interface.s2t(data[prefix_s]),
126
- interface.s2t(data[suffix_s])
127
  )
128
  )
129
  mask = pmask.mask_and(
130
  mask, pmask.periodic_mask(
131
  z,
132
- data[periodic_p],
133
- data[periodic_w],
134
  random_roll=True
135
  )
136
  )
137
- if data[onset_mask_width] > 0:
138
  mask = pmask.mask_or(
139
- mask, pmask.onset_mask(sig, z, interface, width=data[onset_mask_width])
140
  )
141
- if data[beat_mask_width] > 0:
142
  beat_mask = interface.make_beat_mask(
143
  sig,
144
- after_beat_s=(data[beat_mask_width]/1000),
145
- mask_upbeats=not data[beat_mask_downbeats],
146
  )
147
  mask = pmask.mask_and(mask, beat_mask)
148
 
149
  # these should be the last two mask ops
150
- mask = pmask.dropout(mask, data[dropout])
151
  mask = pmask.codebook_unmask(mask, ncc)
152
- mask = pmask.codebook_mask(mask, int(data[n_mask_codebooks]))
153
-
154
-
155
-
156
- print(f"dropout {data[dropout]}")
157
- print(f"masktemp {data[masktemp]}")
158
- print(f"sampletemp {data[sampletemp]}")
159
- print(f"top_p {data[top_p]}")
160
- print(f"prefix_s {data[prefix_s]}")
161
- print(f"suffix_s {data[suffix_s]}")
162
- print(f"rand_mask_intensity {data[rand_mask_intensity]}")
163
- print(f"num_steps {data[num_steps]}")
164
- print(f"periodic_p {data[periodic_p]}")
165
- print(f"periodic_w {data[periodic_w]}")
166
- print(f"n_conditioning_codebooks {data[n_conditioning_codebooks]}")
167
- print(f"use_coarse2fine {data[use_coarse2fine]}")
168
- print(f"onset_mask_width {data[onset_mask_width]}")
169
- print(f"beat_mask_width {data[beat_mask_width]}")
170
- print(f"beat_mask_downbeats {data[beat_mask_downbeats]}")
171
- print(f"stretch_factor {data[stretch_factor]}")
172
- print(f"seed {data[seed]}")
173
- print(f"pitch_shift_amt {data[pitch_shift_amt]}")
174
- print(f"sample_cutoff {data[sample_cutoff]}")
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
- _seed = data[seed] if data[seed] > 0 else None
182
  zv, mask_z = interface.coarse_vamp(
183
  z,
184
  mask=mask,
185
- sampling_steps=data[num_steps],
186
- mask_temperature=data[masktemp]*10,
187
- sampling_temperature=data[sampletemp],
188
  return_mask=True,
189
- typical_filtering=data[typical_filtering],
190
- typical_mass=data[typical_mass],
191
- typical_min_tokens=data[typical_min_tokens],
192
- top_p=_top_p,
193
  gen_fn=interface.coarse.generate,
194
- seed=_seed,
195
- sample_cutoff=data[sample_cutoff],
196
  )
197
 
198
- if use_coarse2fine:
199
  zv = interface.coarse_to_fine(
200
  zv,
201
- mask_temperature=data[masktemp]*10,
202
- sampling_temperature=data[sampletemp],
203
  mask=mask,
204
- sampling_steps=data[num_steps],
205
- sample_cutoff=data[sample_cutoff],
206
- seed=_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 _vamp(data, return_mask=True)
227
 
228
  def api_vamp(data):
229
- return _vamp(data, return_mask=False)
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())