Spaces:
Paused
Paused
return to normal commandl ine
Browse files
app.py
CHANGED
|
@@ -1,34 +1,46 @@
|
|
| 1 |
import pathlib
|
| 2 |
import tempfile
|
| 3 |
-
from typing import
|
| 4 |
|
| 5 |
import gradio as gr
|
| 6 |
import huggingface_hub
|
| 7 |
import torch
|
| 8 |
import yaml
|
| 9 |
-
from gradio_logsview.logsview import LogsView, LogsViewRunner
|
| 10 |
-
from mergekit.common import parse_kmb
|
| 11 |
from mergekit.config import MergeConfiguration
|
| 12 |
-
from mergekit.merge import run_merge
|
| 13 |
-
from mergekit.options import MergeOptions
|
| 14 |
|
| 15 |
has_gpu = torch.cuda.is_available()
|
| 16 |
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
if has_gpu
|
| 25 |
-
else
|
| 26 |
-
allow_crimes=True,
|
| 27 |
-
out_shard_size=parse_kmb("1B"),
|
| 28 |
-
lazy_unpickle=True,
|
| 29 |
-
write_model_card=True,
|
| 30 |
-
)
|
| 31 |
)
|
|
|
|
| 32 |
## This Space is heavily inspired by LazyMergeKit by Maxime Labonne
|
| 33 |
## https://colab.research.google.com/drive/1obulZ1ROXHjYLn6PPZJwRR6GzgQogxxb
|
| 34 |
|
|
@@ -78,8 +90,8 @@ examples = [[str(f)] for f in pathlib.Path("examples").glob("*.yml")]
|
|
| 78 |
|
| 79 |
|
| 80 |
def merge(
|
| 81 |
-
|
| 82 |
-
) ->
|
| 83 |
if not yaml_config:
|
| 84 |
raise gr.Error("Empty yaml, pick an example below")
|
| 85 |
try:
|
|
@@ -101,7 +113,9 @@ def merge(
|
|
| 101 |
name = "-".join(
|
| 102 |
model.model.path for model in merge_config.referenced_models()
|
| 103 |
)
|
| 104 |
-
repo_name = f"mergekit-{merge_config.merge_method}-{name}".replace(
|
|
|
|
|
|
|
| 105 |
if len(repo_name) > 50:
|
| 106 |
repo_name = repo_name[:25] + "-etc-" + repo_name[25:]
|
| 107 |
runner.log(f"Will save merged in {repo_name} once process is done.")
|
|
@@ -111,17 +125,12 @@ def merge(
|
|
| 111 |
"No token provided, merge will run in dry-run mode (no upload at the end of the process)."
|
| 112 |
)
|
| 113 |
|
| 114 |
-
|
| 115 |
-
yield from runner.run_python(
|
| 116 |
-
run_merge,
|
| 117 |
-
merge_config=merge_config,
|
| 118 |
-
out_path=str(merged_path),
|
| 119 |
-
options=merge_options,
|
| 120 |
-
config_source=str(config_path),
|
| 121 |
-
)
|
| 122 |
|
| 123 |
if runner.exit_code != 0:
|
| 124 |
-
yield runner.log(
|
|
|
|
|
|
|
| 125 |
return
|
| 126 |
|
| 127 |
if hf_token is not None:
|
|
@@ -168,6 +177,6 @@ with gr.Blocks() as demo:
|
|
| 168 |
)
|
| 169 |
gr.Markdown(MARKDOWN_ARTICLE)
|
| 170 |
|
| 171 |
-
button.click(fn=merge, inputs=[
|
| 172 |
|
| 173 |
demo.queue(default_concurrency_limit=1).launch()
|
|
|
|
| 1 |
import pathlib
|
| 2 |
import tempfile
|
| 3 |
+
from typing import Iterable, List
|
| 4 |
|
| 5 |
import gradio as gr
|
| 6 |
import huggingface_hub
|
| 7 |
import torch
|
| 8 |
import yaml
|
| 9 |
+
from gradio_logsview.logsview import Log, LogsView, LogsViewRunner
|
|
|
|
| 10 |
from mergekit.config import MergeConfiguration
|
|
|
|
|
|
|
| 11 |
|
| 12 |
has_gpu = torch.cuda.is_available()
|
| 13 |
|
| 14 |
+
# Running directly from Python doesn't work well with Gradio+run_process because of:
|
| 15 |
+
# Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method
|
| 16 |
+
# Let's use the CLI instead.
|
| 17 |
+
#
|
| 18 |
+
# import mergekit.merge
|
| 19 |
+
# from mergekit.common import parse_kmb
|
| 20 |
+
# from mergekit.options import MergeOptions
|
| 21 |
+
#
|
| 22 |
+
# merge_options = (
|
| 23 |
+
# MergeOptions(
|
| 24 |
+
# copy_tokenizer=True,
|
| 25 |
+
# cuda=True,
|
| 26 |
+
# low_cpu_memory=True,
|
| 27 |
+
# write_model_card=True,
|
| 28 |
+
# )
|
| 29 |
+
# if has_gpu
|
| 30 |
+
# else MergeOptions(
|
| 31 |
+
# allow_crimes=True,
|
| 32 |
+
# out_shard_size=parse_kmb("1B"),
|
| 33 |
+
# lazy_unpickle=True,
|
| 34 |
+
# write_model_card=True,
|
| 35 |
+
# )
|
| 36 |
+
# )
|
| 37 |
+
|
| 38 |
+
cli = "mergekit-yaml config.yaml merge --copy-tokenizer" + (
|
| 39 |
+
" --cuda --low-cpu-memory"
|
| 40 |
if has_gpu
|
| 41 |
+
else " --allow-crimes --out-shard-size 1B --lazy-unpickle"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
)
|
| 43 |
+
|
| 44 |
## This Space is heavily inspired by LazyMergeKit by Maxime Labonne
|
| 45 |
## https://colab.research.google.com/drive/1obulZ1ROXHjYLn6PPZJwRR6GzgQogxxb
|
| 46 |
|
|
|
|
| 90 |
|
| 91 |
|
| 92 |
def merge(
|
| 93 |
+
yaml_config: str, hf_token: str | None, repo_name: str | None
|
| 94 |
+
) -> Iterable[List[Log]]:
|
| 95 |
if not yaml_config:
|
| 96 |
raise gr.Error("Empty yaml, pick an example below")
|
| 97 |
try:
|
|
|
|
| 113 |
name = "-".join(
|
| 114 |
model.model.path for model in merge_config.referenced_models()
|
| 115 |
)
|
| 116 |
+
repo_name = f"mergekit-{merge_config.merge_method}-{name}".replace(
|
| 117 |
+
"/", "-"
|
| 118 |
+
).strip("-")
|
| 119 |
if len(repo_name) > 50:
|
| 120 |
repo_name = repo_name[:25] + "-etc-" + repo_name[25:]
|
| 121 |
runner.log(f"Will save merged in {repo_name} once process is done.")
|
|
|
|
| 125 |
"No token provided, merge will run in dry-run mode (no upload at the end of the process)."
|
| 126 |
)
|
| 127 |
|
| 128 |
+
yield from runner.run_command(cli.split(), cwd=merged_path)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
|
| 130 |
if runner.exit_code != 0:
|
| 131 |
+
yield runner.log(
|
| 132 |
+
"Merge failed. Terminating here. No model has been uploaded."
|
| 133 |
+
)
|
| 134 |
return
|
| 135 |
|
| 136 |
if hf_token is not None:
|
|
|
|
| 177 |
)
|
| 178 |
gr.Markdown(MARKDOWN_ARTICLE)
|
| 179 |
|
| 180 |
+
button.click(fn=merge, inputs=[config, token, repo_name], outputs=[logs])
|
| 181 |
|
| 182 |
demo.queue(default_concurrency_limit=1).launch()
|