|
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) |