File size: 6,785 Bytes
3e50b14 | 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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | """
Скрипт для скачивания и упаковки модели в формат diffusers
Скачивает:
1. VAE от Qwen/Qwen-Image
2. Text Encoder от Qwen/Qwen-Image
3. Tokenizer от Qwen/Qwen-Image
4. Scheduler config от Qwen/Qwen-Image
5. Кастомный Transformer от Gerchegg/QwenSolobandModel
Упаковывает всё в diffusers формат и сохраняет в Qwen-ImageForFlo_2/
"""
from huggingface_hub import hf_hub_download, snapshot_download, HfApi
from pathlib import Path
import json
import shutil
import os
HF_TOKEN = os.environ.get("HF_TOKEN", "hf_YOUR_TOKEN_HERE") # Замените на ваш токен
# Пути
TEMP_DIR = "temp_model_download"
SPACE_DIR = "Qwen-ImageForFlo_2"
MODEL_DIR = f"{SPACE_DIR}/model"
# Создаем директории
Path(TEMP_DIR).mkdir(exist_ok=True)
Path(MODEL_DIR).mkdir(parents=True, exist_ok=True)
print("""
╔══════════════════════════════════════════════════════════════╗
║ СКАЧИВАНИЕ И УПАКОВКА МОДЕЛИ ║
╚══════════════════════════════════════════════════════════════╝
📥 Будет скачано:
1. VAE (~0.3GB) от Qwen/Qwen-Image
2. Text Encoder (~17GB) от Qwen/Qwen-Image
3. Tokenizer (~5MB) от Qwen/Qwen-Image
4. Scheduler config от Qwen/Qwen-Image
5. Кастомный Transformer (~40.9GB) от Gerchegg/QwenSolobandModel
📦 Упаковка в diffusers формат:
Целевая папка: {MODEL_DIR}/
⏱️ Примерное время: 10-20 минут (зависит от скорости интернета)
💾 Размер: ~58GB
""")
input("Нажмите Enter для начала скачивания...")
print("\n" + "="*60)
print("ШАГ 1: Скачивание базовой модели Qwen-Image")
print("="*60)
# Скачиваем всю базовую модель
print("\n📥 Скачивание полной модели Qwen/Qwen-Image...")
print(" Это займет 10-15 минут...")
base_model_path = snapshot_download(
repo_id="Qwen/Qwen-Image",
local_dir=f"{TEMP_DIR}/Qwen-Image",
token=HF_TOKEN,
allow_patterns=["*.json", "*.txt", "*.md", "*.model", "vae/*", "text_encoder/*", "tokenizer/*", "scheduler/*"]
)
print(f"✓ Базовая модель скачана в: {base_model_path}")
print("\n" + "="*60)
print("ШАГ 2: Скачивание кастомного Transformer")
print("="*60)
print("\n📥 Скачивание Qwen_Soloband_Model_V1-000140.safetensors (40.9GB)...")
print(" Это займет 5-10 минут...")
custom_transformer_path = hf_hub_download(
repo_id="Gerchegg/QwenSolobandModel",
filename="Qwen_Soloband_Model_V1-000140.safetensors",
local_dir=f"{TEMP_DIR}/custom",
token=HF_TOKEN
)
print(f"✓ Кастомный transformer скачан: {custom_transformer_path}")
print("\n" + "="*60)
print("ШАГ 3: Упаковка в diffusers формат")
print("="*60)
print("\n📦 Создание структуры diffusers...")
# Создаем структуру папок
for subfolder in ['vae', 'text_encoder', 'tokenizer', 'scheduler', 'transformer']:
Path(f"{MODEL_DIR}/{subfolder}").mkdir(parents=True, exist_ok=True)
# Копируем компоненты
print(" Копирование VAE...")
shutil.copytree(
f"{TEMP_DIR}/Qwen-Image/vae",
f"{MODEL_DIR}/vae",
dirs_exist_ok=True
)
print(" Копирование Text Encoder...")
shutil.copytree(
f"{TEMP_DIR}/Qwen-Image/text_encoder",
f"{MODEL_DIR}/text_encoder",
dirs_exist_ok=True
)
print(" Копирование Tokenizer...")
shutil.copytree(
f"{TEMP_DIR}/Qwen-Image/tokenizer",
f"{MODEL_DIR}/tokenizer",
dirs_exist_ok=True
)
print(" Копирование Scheduler...")
shutil.copytree(
f"{TEMP_DIR}/Qwen-Image/scheduler",
f"{MODEL_DIR}/scheduler",
dirs_exist_ok=True
)
# Копируем кастомный transformer
print(" Копирование кастомного Transformer...")
shutil.copy(
custom_transformer_path,
f"{MODEL_DIR}/transformer/diffusion_pytorch_model.safetensors"
)
# Копируем model_index.json
print(" Копирование конфигураций...")
if os.path.exists(f"{TEMP_DIR}/Qwen-Image/model_index.json"):
shutil.copy(
f"{TEMP_DIR}/Qwen-Image/model_index.json",
f"{MODEL_DIR}/model_index.json"
)
print("\n✓ Модель упакована в diffusers формат!")
print("\n" + "="*60)
print("ШАГ 4: Создание .gitattributes для LFS")
print("="*60)
gitattributes_content = """*.safetensors filter=lfs diff=lfs merge=lfs -text
*.bin filter=lfs diff=lfs merge=lfs -text
*.gguf filter=lfs diff=lfs merge=lfs -text
*.h5 filter=lfs diff=lfs merge=lfs -text
*.tflite filter=lfs diff=lfs merge=lfs -text
*.tar.gz filter=lfs diff=lfs merge=lfs -text
*.ot filter=lfs diff=lfs merge=lfs -text
*.onnx filter=lfs diff=lfs merge=lfs -text
*.arrow filter=lfs diff=lfs merge=lfs -text
*.ftz filter=lfs diff=lfs merge=lfs -text
*.joblib filter=lfs diff=lfs merge=lfs -text
"""
with open(f"{SPACE_DIR}/.gitattributes", 'w') as f:
f.write(gitattributes_content)
print("✓ .gitattributes создан")
print("\n" + "="*60)
print("✅ ПОДГОТОВКА ЗАВЕРШЕНА!")
print("="*60)
print(f"\n📂 Структура модели в {MODEL_DIR}/:")
print(f" ├── vae/")
print(f" ├── text_encoder/")
print(f" ├── tokenizer/")
print(f" ├── scheduler/")
print(f" ├── transformer/")
print(f" │ └── diffusion_pytorch_model.safetensors (40.9GB)")
print(f" └── model_index.json")
print(f"\n📊 Размер модели:")
total_size = sum(f.stat().st_size for f in Path(MODEL_DIR).rglob('*') if f.is_file())
print(f" Всего: {total_size / 1024**3:.1f} GB")
print(f"\n🎯 Следующие шаги:")
print(f" 1. Проверьте содержимое {MODEL_DIR}/")
print(f" 2. Запустите create_space_app.py для создания app.py")
print(f" 3. Загрузите в HF с помощью upload_to_space.py")
print(f"\n💾 Временные файлы в: {TEMP_DIR}/")
print(f" Можно удалить после успешной загрузки")
|