Qwen-Model-Converter / scripts_reference /download_and_pack_model.py
Gerchegg's picture
Upload scripts_reference/download_and_pack_model.py with huggingface_hub
3e50b14 verified
"""
Скрипт для скачивания и упаковки модели в формат 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" Можно удалить после успешной загрузки")