Text-to-Image
Diffusers
PaddlePaddle
English
stable-diffusion
stable-diffusion-ppdiffusers
ppdiffusers
lora
Instructions to use peteli/hometown with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Diffusers
How to use peteli/hometown with Diffusers:
pip install -U diffusers transformers accelerate
import torch from diffusers import DiffusionPipeline # switch to "mps" for apple devices pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", dtype=torch.bfloat16, device_map="cuda") pipe.load_lora_weights("peteli/hometown") prompt = "a sea of lavender and gold flowers in the world of fairy tales is my hometown" image = pipe(prompt).images[0] - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- Draw Things
- DiffusionBee
| from paddlenlp.utils.serialization import load_torch | |
| import paddle | |
| import safetensors.numpy | |
| import os | |
| import ppdiffusers | |
| from contextlib import 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 | |
| # Since HF sometimes timeout, we need to retry uploads | |
| # Credit: https://github.com/huggingface/datasets/blob/06ae3f678651bfbb3ca7dd3274ee2f38e0e0237e/src/datasets/utils/file_utils.py#L265 | |
| 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) # Exponential backoff | |
| 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, | |
| ) | |
| # Upload model | |
| 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) |