| from paddlenlp.utils.serialization import load_torch |
| import paddle |
| import safetensors.numpy |
| import os |
| import ppdiffusers |
| from contextlib import contextmanager |
|
|
| @contextmanager |
| def context_nologging(): |
| ppdiffusers.utils.logging.set_verbosity_error() |
| try: |
| yield |
| finally: |
| ppdiffusers.utils.logging.set_verbosity_info() |
|
|
|
|
| __all__ = ['convert_paddle_lora_to_safetensor_lora', 'convert_pytorch_lora_to_paddle_lora'] |
|
|
| def convert_paddle_lora_to_safetensor_lora(paddle_file, safe_file=None): |
| if not os.path.exists(paddle_file): |
| print(f"{paddle_file} 文件不存在!") |
| return |
| if safe_file is None: |
| safe_file = paddle_file.replace("paddle_lora_weights.pdparams", "pytorch_lora_weights.safetensors") |
| |
| tensors = paddle.load(paddle_file) |
| new_tensors = {} |
| for k, v in tensors.items(): |
| new_tensors[k] = v.cpu().numpy().T |
| safetensors.numpy.save_file(new_tensors, safe_file) |
| print(f"文件已经保存到{safe_file}!") |
| |
| def convert_pytorch_lora_to_paddle_lora(pytorch_file, paddle_file=None): |
| if not os.path.exists(pytorch_file): |
| print(f"{pytorch_file} 文件不存在!") |
| return |
| if paddle_file is None: |
| paddle_file = pytorch_file.replace("pytorch_lora_weights.bin", "paddle_lora_weights.pdparams") |
| |
| tensors = load_torch(pytorch_file) |
| new_tensors = {} |
| for k, v in tensors.items(): |
| new_tensors[k] = v.T |
| paddle.save(new_tensors, paddle_file) |
| print(f"文件已经保存到{paddle_file}!") |
|
|
|
|
|
|
| import time |
| from typing import Optional, Type |
| import paddle |
| import requests |
| from huggingface_hub import create_repo, upload_folder, get_full_repo_name |
|
|
| |
| |
| def _retry( |
| func, |
| func_args: Optional[tuple] = None, |
| func_kwargs: Optional[dict] = None, |
| exceptions: Type[requests.exceptions.RequestException] = requests.exceptions.RequestException, |
| max_retries: int = 0, |
| base_wait_time: float = 0.5, |
| max_wait_time: float = 2, |
| ): |
| func_args = func_args or () |
| func_kwargs = func_kwargs or {} |
| retry = 0 |
| while True: |
| try: |
| return func(*func_args, **func_kwargs) |
| except exceptions as err: |
| if retry >= max_retries: |
| raise err |
| else: |
| sleep_time = min(max_wait_time, base_wait_time * 2**retry) |
| print(f"{func} timed out, retrying in {sleep_time}s... [{retry/max_retries}]") |
| time.sleep(sleep_time) |
| retry += 1 |
| |
| def upload_lora_folder(upload_dir, repo_name, pretrained_model_name_or_path, prompt, hub_token=None): |
| repo_name = get_full_repo_name(repo_name, token=hub_token) |
| _retry( |
| create_repo, |
| func_kwargs={"repo_id": repo_name, "exist_ok": True, "token": hub_token}, |
| base_wait_time=1.0, |
| max_retries=5, |
| max_wait_time=10.0, |
| ) |
| save_model_card( |
| repo_name, |
| base_model=pretrained_model_name_or_path, |
| prompt=prompt, |
| repo_folder=upload_dir, |
| ) |
| |
| print(f"Pushing to {repo_name}") |
| _retry( |
| upload_folder, |
| func_kwargs={ |
| "repo_id": repo_name, |
| "repo_type": "model", |
| "folder_path": upload_dir, |
| "commit_message": "submit best ckpt", |
| "token": hub_token, |
| "ignore_patterns": ["checkpoint-*/*", "logs/*", "validation_images/*"], |
| }, |
| base_wait_time=1.0, |
| max_retries=5, |
| max_wait_time=20.0, |
| ) |
| |
| def save_model_card(repo_name, base_model=str, prompt=str, repo_folder=None): |
| yaml = f""" |
| --- |
| license: creativeml-openrail-m |
| base_model: {base_model} |
| instance_prompt: {prompt} |
| tags: |
| - stable-diffusion |
| - stable-diffusion-ppdiffusers |
| - text-to-image |
| - ppdiffusers |
| - lora |
| inference: false |
| --- |
| """ |
| model_card = f""" |
| # LoRA DreamBooth - {repo_name} |
| 本仓库的 LoRA 权重是基于 {base_model} 训练而来的,我们采用[DreamBooth](https://dreambooth.github.io/)的技术并使用 {prompt} 文本进行了训练。 |
| """ |
| with open(os.path.join(repo_folder, "README.md"), "w") as f: |
| f.write(yaml + model_card) |