Spaces:
Running on Zero
Running on Zero
LING commited on
Commit ·
e5cbf19
1
Parent(s): f55264b
remove description markdown, add GPU support
Browse files- app.py +0 -1
- runtime.py +6 -6
app.py
CHANGED
|
@@ -30,7 +30,6 @@ def process_fn(xml_path: str | None, use_example: bool, seed: int) -> str:
|
|
| 30 |
|
| 31 |
|
| 32 |
with gr.Blocks(title="DExter", delete_cache=(3600, 86400)) as demo:
|
| 33 |
-
gr.Markdown("Generate expressive piano MIDI from a MusicXML score. The official model samples 999 diffusion steps, so generation can take several minutes on CPU.")
|
| 34 |
inputs = [
|
| 35 |
gr.File(type="filepath", file_types=[".xml", ".musicxml"], label="Piano MusicXML score").set_info(
|
| 36 |
"Uncompressed MusicXML, up to 2 MB and 400 notes. Upload takes priority over the example."
|
|
|
|
| 30 |
|
| 31 |
|
| 32 |
with gr.Blocks(title="DExter", delete_cache=(3600, 86400)) as demo:
|
|
|
|
| 33 |
inputs = [
|
| 34 |
gr.File(type="filepath", file_types=[".xml", ".musicxml"], label="Piano MusicXML score").set_info(
|
| 35 |
"Uncompressed MusicXML, up to 2 MB and 400 notes. Upload takes priority over the example."
|
runtime.py
CHANGED
|
@@ -25,6 +25,7 @@ from renderer import Renderer
|
|
| 25 |
CHECKPOINT = ROOT / "weights" / "last-v1.ckpt"
|
| 26 |
EXAMPLE = ROOT / "examples" / "Schubert_D783_no15.musicxml"
|
| 27 |
MAX_NOTES = 400
|
|
|
|
| 28 |
|
| 29 |
|
| 30 |
@lru_cache(maxsize=1)
|
|
@@ -38,14 +39,13 @@ def load_model():
|
|
| 38 |
cfg = compose(config_name="inference")
|
| 39 |
args = OmegaConf.to_container(cfg.model.model.args, resolve=True)
|
| 40 |
task = OmegaConf.to_container(cfg.task, resolve=True)
|
| 41 |
-
# Preserve the normalization statistics embedded in the pretrained checkpoint.
|
| 42 |
for key in ("dataset_means", "dataset_stds"):
|
| 43 |
if task.get(key) is None:
|
| 44 |
task.pop(key)
|
| 45 |
model = getattr(dexter_model, cfg.model.model.name).load_from_checkpoint(
|
| 46 |
-
checkpoint_path=str(CHECKPOINT), map_location=
|
| 47 |
)
|
| 48 |
-
model.eval()
|
| 49 |
return model, int(cfg.seg_len), int(cfg.overlap)
|
| 50 |
|
| 51 |
|
|
@@ -76,11 +76,11 @@ def render(score_path: str | Path, output_path: str | Path, seed: int = 13) -> P
|
|
| 76 |
window = codec[start : start + seg_len]
|
| 77 |
padded = np.pad(window, ((0, seg_len - len(window)), (0, 0)))
|
| 78 |
segments.append(padded)
|
| 79 |
-
score_batch = torch.from_numpy(np.stack(segments))
|
| 80 |
batch = {
|
| 81 |
-
"p_codec": torch.zeros(len(segments), seg_len, 5),
|
| 82 |
"s_codec": score_batch,
|
| 83 |
-
"c_codec": torch.zeros(len(segments), seg_len, 7),
|
| 84 |
}
|
| 85 |
|
| 86 |
with torch.inference_mode():
|
|
|
|
| 25 |
CHECKPOINT = ROOT / "weights" / "last-v1.ckpt"
|
| 26 |
EXAMPLE = ROOT / "examples" / "Schubert_D783_no15.musicxml"
|
| 27 |
MAX_NOTES = 400
|
| 28 |
+
DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 29 |
|
| 30 |
|
| 31 |
@lru_cache(maxsize=1)
|
|
|
|
| 39 |
cfg = compose(config_name="inference")
|
| 40 |
args = OmegaConf.to_container(cfg.model.model.args, resolve=True)
|
| 41 |
task = OmegaConf.to_container(cfg.task, resolve=True)
|
|
|
|
| 42 |
for key in ("dataset_means", "dataset_stds"):
|
| 43 |
if task.get(key) is None:
|
| 44 |
task.pop(key)
|
| 45 |
model = getattr(dexter_model, cfg.model.model.name).load_from_checkpoint(
|
| 46 |
+
checkpoint_path=str(CHECKPOINT), map_location=DEVICE, **args, **task
|
| 47 |
)
|
| 48 |
+
model.to(DEVICE).eval()
|
| 49 |
return model, int(cfg.seg_len), int(cfg.overlap)
|
| 50 |
|
| 51 |
|
|
|
|
| 76 |
window = codec[start : start + seg_len]
|
| 77 |
padded = np.pad(window, ((0, seg_len - len(window)), (0, 0)))
|
| 78 |
segments.append(padded)
|
| 79 |
+
score_batch = torch.from_numpy(np.stack(segments)).to(DEVICE)
|
| 80 |
batch = {
|
| 81 |
+
"p_codec": torch.zeros(len(segments), seg_len, 5, device=DEVICE),
|
| 82 |
"s_codec": score_batch,
|
| 83 |
+
"c_codec": torch.zeros(len(segments), seg_len, 7, device=DEVICE),
|
| 84 |
}
|
| 85 |
|
| 86 |
with torch.inference_mode():
|