File size: 4,230 Bytes
5adaf2e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
"""

Скрипт для конвертации модели 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}")
    # Загружаем веса из safetensors
    state_dict = load_file(SAFETENSORS_PATH)
    
    print("Загрузка весов в transformer...")
    # Загружаем веса в transformer компонент
    # Qwen-Image использует DiT (Diffusion Transformer)
    if hasattr(pipeline, 'transformer'):
        # Фильтруем ключи, которые относятся к 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}")
    # Сохраняем в формате diffusers
    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()
    
    # Спрашиваем пользователя, загружать ли в HF
    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}")