| import gradio as gr |
| from convert_diffusion_to_gguf import SUPPORTED_ARCHS, qconfig_map, convert |
| from huggingface_hub import create_repo, upload_file |
| from argparse import Namespace |
| from io import StringIO |
| from pathlib import Path |
|
|
| log_stream = StringIO() |
|
|
|
|
| def upload(args): |
| url = "" |
| if args.host_repo_id and args.hf_token: |
| repo_id = create_repo(args.host_repo_id, repo_type="model", exist_ok=True, token=args.hf_token).repo_id |
| info = upload_file( |
| repo_id=repo_id, path_in_repo=str(args.outfile), path_or_fileobj=str(args.outfile), token=args.hf_token |
| ) |
| url = info.commit_url |
| print(f"Uploaded to {url}") |
|
|
| return url |
|
|
|
|
| def go_gguf( |
| model_repo_id, |
| subfolder, |
| arch, |
| outtype, |
| outfile_name, |
| bigendian, |
| verbose, |
| host_repo_id, |
| hf_token, |
| progress=gr.Progress(track_tqdm=True), |
| ): |
| log_stream.truncate(0) |
| log_stream.seek(0) |
| args = Namespace( |
| model=Path(model_repo_id), |
| subfolder=subfolder, |
| arch=arch, |
| outtype=outtype, |
| outfile=Path(outfile_name), |
| bigendian=bigendian, |
| verbose=verbose, |
| host_repo_id=host_repo_id, |
| hf_token=hf_token, |
| cache_dir=None, |
| ) |
| try: |
| progress(0.1, desc="Starting conversion... (This may take a while depending on model size)") |
| convert(args) |
| progress(0.8, desc="β
Conversion Complete. Starting upload...") |
| url = upload(args) |
| if url: |
| return log_stream.getvalue(), f"### β
Success!\n\nUploaded to: [{url}]({url})" |
| else: |
| return ( |
| log_stream.getvalue(), |
| "### β
Conversion Complete!\n\n(File was not uploaded as no repo/token was provided)", |
| ) |
| except Exception as e: |
| return log_stream.getvalue(), str(e) |
|
|
|
|
| with gr.Blocks(theme=gr.themes.Soft()) as demo: |
| gr.Markdown("<h1><center>GGUF Converter for Diffusers format model checkpoints</center></h1>") |
| gr.Markdown( |
| "Convert `diffusers` format model checkpoints from the Hub to GGUF format and optionally upload them back. Based on [this repo](https://github.com/ngxson/diffusion-to-gguf)." |
| ) |
|
|
| with gr.Row(): |
| with gr.Column(scale=1): |
| gr.Markdown("### π₯ Input Model") |
| model_repo_id = gr.Textbox(label="Model Repo ID", placeholder="e.g., Qwen/Qwen-Image") |
| subfolder = gr.Textbox(label="Subfolder (Optional)", placeholder="e.g., transformer") |
|
|
| gr.Markdown("### βοΈ Conversion Settings") |
| arch = gr.Dropdown(choices=SUPPORTED_ARCHS, label="Architecture") |
| outtype = gr.Dropdown(choices=list(qconfig_map.keys()), label="Quantization Type", value="F16") |
| outfile_name = gr.Textbox(label="Output Filename", value="{ftype}.gguf") |
|
|
| with gr.Accordion("Advanced Settings", open=False): |
| bigendian = gr.Checkbox(label="Use Big Endian") |
| verbose = gr.Checkbox(label="Verbose Logging", value=True) |
|
|
| gr.Markdown("### π€ Upload to Hub (Optional)") |
| host_repo_id = gr.Textbox(label="Your Hub Repo ID", placeholder="e.g., YourUsername/My-GGUFs") |
| hf_token = gr.Textbox(label="Hugging Face Token", type="password", placeholder="hf_...") |
|
|
| convert_btn = gr.Button("Convert & Upload", variant="primary") |
|
|
| with gr.Column(scale=2): |
| gr.Markdown("### π Logs") |
| logs_output = gr.Textbox( |
| label="Conversion Logs", lines=25, max_lines=25, interactive=False, autoscroll=True |
| ) |
| gr.Markdown("### π Result") |
| url_output = gr.Markdown() |
|
|
| gr.Examples( |
| examples=[ |
| [ |
| "black-forest-labs/FLUX.1-schnell", |
| "transformer", |
| "flux", |
| "Q4_0", |
| "flux-schnell-q4.gguf", |
| False, |
| False, |
| "YourUsername/MyGGUFs", |
| "hf_...", |
| ], |
| [ |
| "Qwen/Qwen-Image", |
| "transformer", |
| "qwen", |
| "Q8_0", |
| "qwen-q4.gguf", |
| False, |
| False, |
| "YourUsername/MyGGUFs", |
| "hf_...", |
| ], |
| ], |
| inputs=[model_repo_id, subfolder, arch, outtype, outfile_name, bigendian, verbose, host_repo_id, hf_token], |
| ) |
|
|
| convert_btn.click( |
| fn=go_gguf, |
| inputs=[model_repo_id, subfolder, arch, outtype, outfile_name, bigendian, verbose, host_repo_id, hf_token], |
| outputs=[logs_output, url_output], |
| ) |
|
|
| if __name__ == "__main__": |
| demo.launch() |
|
|