| import os |
| import shutil |
| from tempfile import TemporaryDirectory |
| from typing import List, Optional, Tuple |
| import subprocess |
| from huggingface_hub import CommitOperationAdd, HfApi |
| from huggingface_hub.file_download import repo_folder_name |
|
|
| ConversionResult = Tuple[List["CommitOperationAdd"], List[Tuple[str, "Exception"]]] |
|
|
| def convert_to_core_ml( |
| model_id: str, folder: str, token: Optional[str], model_version: str, additional_args: str |
| ) -> ConversionResult: |
| |
| command = ["python3", "-m" , "python_coreml_stable_diffusion.torch2coreml", "--model-version", model_version, "-o", folder] |
| additional_args = additional_args |
| if additional_args == "": |
| |
| additional_args = f"--convert-unet --convert-text-encoder --convert-vae-decoder --attention-implementation SPLIT_EINSUM --quantize-nbits 6" |
|
|
| command.extend(additional_args.split(" ")) |
|
|
| print("Starting conversion: ", command) |
|
|
| subprocess.run(command) |
|
|
| print("Done") |
|
|
| api = HfApi(token=token) |
| api.upload_folder( |
| folder_path=folder, |
| repo_id=model_id, |
| path_in_repo="models", |
| repo_type="model", |
| ) |
|
|
| def quantize( |
| api: "HfApi", model_id: str, model_version: str, additional_args: str |
| ) -> None: |
| |
| with TemporaryDirectory() as d: |
| folder = os.path.join(d, repo_folder_name(repo_id=model_id, repo_type="models")) |
| os.makedirs(folder) |
| try: |
| convert_to_core_ml(model_id, folder, token=api.token, model_version=model_version, additional_args=additional_args) |
| finally: |
| shutil.rmtree(folder) |