| | """
|
| | Скрипт для конвертации модели Qwen из safetensors в формат diffusers
|
| | """
|
| | import torch
|
| | import os
|
| | from diffusers import DiffusionPipeline
|
| | from safetensors.torch import load_file
|
| | from huggingface_hub import HfApi, create_repo
|
| |
|
| |
|
| | SAFETENSORS_PATH = r"D:\swarm_Comfy\SwarmUI_Model_Downloader_v82\SwarmUI\Models\unet\QwenSolobandModel\Qwen_Soloband_Model_V1-000140.safetensors"
|
| | BASE_MODEL = "Qwen/Qwen-Image"
|
| | OUTPUT_DIR = "./qwen_soloband_diffusers"
|
| | HF_REPO = "Gerchegg/Qwen-Soloband-Diffusers"
|
| | HF_TOKEN = os.environ.get("HF_TOKEN", "hf_YOUR_TOKEN_HERE")
|
| |
|
| | def convert_safetensors_to_diffusers():
|
| | """
|
| | Конвертация safetensors модели в формат diffusers
|
| | """
|
| | print("Загрузка базовой модели Qwen-Image...")
|
| |
|
| | pipeline = DiffusionPipeline.from_pretrained(
|
| | BASE_MODEL,
|
| | torch_dtype=torch.bfloat16
|
| | )
|
| |
|
| | print(f"Загрузка весов из safetensors: {SAFETENSORS_PATH}")
|
| |
|
| | state_dict = load_file(SAFETENSORS_PATH)
|
| |
|
| | print("Загрузка весов в transformer...")
|
| |
|
| |
|
| | if hasattr(pipeline, 'transformer'):
|
| |
|
| | transformer_state_dict = {}
|
| | for key, value in state_dict.items():
|
| |
|
| | new_key = key.replace("model.", "").replace("diffusion_model.", "")
|
| | transformer_state_dict[new_key] = value
|
| |
|
| |
|
| | missing_keys, unexpected_keys = pipeline.transformer.load_state_dict(
|
| | transformer_state_dict,
|
| | strict=False
|
| | )
|
| |
|
| | if missing_keys:
|
| | print(f"Предупреждение: отсутствующие ключи: {missing_keys[:5]}...")
|
| | if unexpected_keys:
|
| | print(f"Предупреждение: неожиданные ключи: {unexpected_keys[:5]}...")
|
| |
|
| | print(f"Сохранение модели в формате diffusers: {OUTPUT_DIR}")
|
| |
|
| | pipeline.save_pretrained(OUTPUT_DIR)
|
| |
|
| | print("Конвертация завершена!")
|
| | return OUTPUT_DIR
|
| |
|
| | def upload_to_huggingface(model_dir, repo_id, token):
|
| | """
|
| | Загрузка модели в HuggingFace Hub
|
| | """
|
| | print(f"Создание/проверка репозитория: {repo_id}")
|
| | api = HfApi()
|
| |
|
| | try:
|
| |
|
| | create_repo(
|
| | repo_id=repo_id,
|
| | token=token,
|
| | exist_ok=True,
|
| | repo_type="model"
|
| | )
|
| | print("Репозиторий готов")
|
| | except Exception as e:
|
| | print(f"Репозиторий уже существует или ошибка: {e}")
|
| |
|
| | print("Загрузка файлов модели...")
|
| |
|
| | api.upload_folder(
|
| | folder_path=model_dir,
|
| | repo_id=repo_id,
|
| | token=token,
|
| | repo_type="model"
|
| | )
|
| |
|
| | print(f"Модель успешно загружена в {repo_id}!")
|
| | print(f"Ссылка: https://huggingface.co/{repo_id}")
|
| |
|
| | if __name__ == "__main__":
|
| |
|
| | output_dir = convert_safetensors_to_diffusers()
|
| |
|
| |
|
| | upload = input("\nЗагрузить модель в HuggingFace Hub? (y/n): ")
|
| | if upload.lower() == 'y':
|
| | upload_to_huggingface(output_dir, HF_REPO, HF_TOKEN)
|
| | else:
|
| | print(f"Модель сохранена локально в: {output_dir}")
|
| |
|
| |
|