Интересное что-то
517 subscribers
2.72K photos
253 videos
140 files
4.53K links
Материалы и мысли, понадерганные отовсюду
Блог: https://t.me/asisakov_channel
Чат: https://t.me/youknowds_chat
Download Telegram
Forwarded from эйай ньюз
Stable Diffusion 3.5 Large

Stability наконец-то выпустили 8B модельку, которую тизерили ещё в феврале. Идёт в двух версиях - обычная и Turbo (которой нужно всего 4 степа). Ещё обещают обновённую Medium завезти, но только 29 октября, через неделю.

По качеству полная моделька, по заявлениям Stability находится между FLUX.1 dev и schnell. Turbo - чуть хуже schnell. До FLUX.1 Pro обоим далеко. Зато хвастаются что SD 3.5 лучше всех в понимании промптов.

Доступны по комьюнити лицензии - то есть если у вас годовая выручка до миллиона долларов, ничего платить не нужно. А вот если больше, то попросят раскошелиться на энтерпрайз лицензию.

После фиаско с Medium 3.0 (которая была ошибкой), к релизу отношусь настороженно.

Не жду, что Stability когда-либо сможет выпустить новую SOTA, т.к. все основные авторы SD ушли.

Веса
Turbo версия
Код
Блогпост

@ai_newz
Фабричный методэто порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.

from __future__ import annotations
from abc import ABC, abstractmethod


class Creator(ABC):
"""
Класс Создатель объявляет фабричный метод, который должен возвращать объект
класса Продукт. Подклассы Создателя обычно предоставляют реализацию этого
метода.
"""

@abstractmethod
def factory_method(self):
"""
Обратите внимание, что Создатель может также обеспечить реализацию
фабричного метода по умолчанию.
"""
pass

def some_operation(self) -> str:
"""
Также заметьте, что, несмотря на название, основная обязанность
Создателя не заключается в создании продуктов. Обычно он содержит
некоторую базовую бизнес-логику, которая основана на объектах Продуктов,
возвращаемых фабричным методом. Подклассы могут косвенно изменять эту
бизнес-логику, переопределяя фабричный метод и возвращая из него другой
тип продукта.
"""

# Вызываем фабричный метод, чтобы получить объект-продукт.
product = self.factory_method()

# Далее, работаем с этим продуктом.
result = f"Creator: The same creator's code has just worked with {product.operation()}"

return result


"""
Конкретные Создатели переопределяют фабричный метод для того, чтобы изменить тип
результирующего продукта.
"""


class ConcreteCreator1(Creator):
"""
Обратите внимание, что сигнатура метода по-прежнему использует тип
абстрактного продукта, хотя фактически из метода возвращается конкретный
продукт. Таким образом, Создатель может оставаться независимым от конкретных
классов продуктов.
"""

def factory_method(self) -> Product:
return ConcreteProduct1()


class ConcreteCreator2(Creator):
def factory_method(self) -> Product:
return ConcreteProduct2()


class Product(ABC):
"""
Интерфейс Продукта объявляет операции, которые должны выполнять все
конкретные продукты.
"""

@abstractmethod
def operation(self) -> str:
pass


"""
Конкретные Продукты предоставляют различные реализации интерфейса Продукта.
"""


class ConcreteProduct1(Product):
def operation(self) -> str:
return "{Result of the ConcreteProduct1}"


class ConcreteProduct2(Product):
def operation(self) -> str:
return "{Result of the ConcreteProduct2}"


def client_code(creator: Creator) -> None:
"""
Клиентский код работает с экземпляром конкретного создателя, хотя и через
его базовый интерфейс. Пока клиент продолжает работать с создателем через
базовый интерфейс, вы можете передать ему любой подкласс создателя.
"""

print(f"Client: I'm not aware of the creator's class, but it still works.\n"
f"{creator.some_operation()}", end="")


if __name__ == "__main__":
print("App: Launched with the ConcreteCreator1.")
client_code(ConcreteCreator1())
print("\n")

print("App: Launched with the ConcreteCreator2.")
client_code(ConcreteCreator2())
#паттерны

Введение

Сегодня мы рассмотрим паттерн проектирования "Адаптер".

Классификация

Тип:
Структурный

Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.

Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.

Из чего состоит и как работает паттерн адаптер

1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами.


adapter = Adapter()
result = adapter.do() + "5"


2. Интерфейс с которым может работать клиентский код.


class Test1:
def do(self) -> str:
return "3"


3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен.


class Test2:
def specific_do(self) -> float:
return 3.4


4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате.


class Adapter(Test1, Test2):
def do(self) -> str:
return f"Translated: {round(self.specific_do())}"


Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем.

Плюсы данного паттерна

1. Скрывает все "низкоуровневые" преобразования интерфейсов от клиента. Реализует принцип абстракция.

Минусы данного паттерна

Таковых я не обнаружил

Пример и задача

В качестве примера возьмём класс с методом do который возвращает небольшой текст. Также есть класс с методом secret_do который возвращает другую строку, зашифрованную шифром Цезаря со сдвигом 5, которая ещё и полностью развёрнута.

В виде клиента выступает функция которая постит текст в ваш блог.(Можете просто создать функцию которая выводит переданный в неё текст). Естественно она должна принимать только расшифрованный текст.

Реализуйте адаптер для второго класса, который спасёт ваш блог от зашифрованных постов.

Пример из реального кода

https://github.com/aiogram/aiogram/blob/b190bbba1915ed3b7f311a780f34723ebd6b5acd/aiogram/contrib/fsm_storage/redis.py#L280

Вот его объяснение какую задачу решает адаптер в данном случае:

Здесь адаптер дает возможность контроллеру хранилища (RedisStorage) работать с первой версией редиса, т.е. адаптирует aioredis-v1, там еще есть адаптер для aioredis-v2, но он в отличие от первой версии адаптирует только создание клиента редиса


Дополнительные материалы

https://habr.com/ru/post/85095/
Forwarded from Tensor Banana
Запускаем SD 3.5 Large fp8 в comfyUI


Модель в формате fp8 должна влезть в 8GB VRAM. Если у вас меньше - попробуйте варианты в формате gguf, они есть и на 4 гига, но качество будет хуже.

1. Качаем свежий comfyUI https://github.com/comfyanonymous/ComfyUI или обновляем ваш старый (update_comfyui_stable.bat)

2. Качаем 3 клипа (все кроме t5xxl_fp16.safetensors) и кладем в папку /models/clip/: https://huggingface.co/lodestones/stable-diffusion-3-medium/tree/main/text_encoders

3. Скачать саму sd3 в fp8 или gguf формате, пишут, что скорость почти одинаковая. Дефолтная модель в fp16 весит слишком много (16 GB), поэтому я использовал fp8, положил в папку /models/checkpoints/. Гуфы надо класть в папку /models/unet/

fp8 (8GB) https://huggingface.co/matt3ounstable/stable-diffusion-3.5-large-fp8/tree/main
или gguf (4-8 GB) https://huggingface.co/city96/stable-diffusion-3.5-large-gguf/tree/main
(для гуфов нужно установить ноды: "ComfyUI-GGUF", они есть в ComfyUI-Manager. Далее для загрузки модели ипользовать ноду "Unet loader (GGUF)")

4. Качаем vae и кладем в /models/vae/ https://huggingface.co/stabilityai/stable-diffusion-3.5-large/blob/main/vae/diffusion_pytorch_model.safetensors

5. Качаем workflow (картинку) для fp8 и перетаскиваем в браузер в ComfyUI https://github.com/Mozer/comfy_stuff/blob/main/workflows/sd35_large_fp8.png
для гуфов workflow сами измените ноду LoadCheckpoint на Unet loader (GGUF).

6. Проверяем, что нужные модельки выставлены в TripleCLIPLoader, LoadCheckpoint и LoadVAE. Готово.

## Скорость
SD3.5 large FP8:
На 2080Ti-22GB (pcie 3.0 4x, power-limit 80%)
Холодный старт - 75s
1024x1024 20 steps - 42s, 1.61s/it
жрет vram - 21 GB

На 3060-12GB (pcie 3.0 4x, power-limit 80%)
Холодный старт - 91s
1024x1024 20 steps - 75s, 3.20s/it
жрет vram - 11 GB

Скорость Flux-dev-fp8 у меня чуть-чуть медленнее (2080ti, 1024x1024 20 steps - 45s, 1.94s/it)

Если в SD3.5 не менять промпт, и vae вынести на вторую видюху, то полное время на генерацию будет 35s.

SD-3.5-Large-8b тренилась на разрешении до 1 мегапикселя, так что ставить разрешение больше чем 1024х1024 не стоит - будет ухудшение качества. (Flux работает до 2-х мегапикселей). Модель поменьше, SD-3.5-Medium-2.5B, обещают выпустить уже 29 декабря, и в ней обещают разрешение до 2 mpx. Еще есть Large-Turbo модель, генерирует всего за 4 шага, но качество будет хуже, ее не тестил.

Общее впечатление: flux лучше. Он реалистичнее, анатомия лучше, разрешение больше, следование промпту лучше. А тут результат напоминает SDXL. Но, наверняка, для SD3 будут свои файнтюны и лоры, которые улучшат ситуацию и добавят что-то новое, например flux очень дорого файнтюнить (lora - дешево). Текст пишет, но в мелком тексте будут неточности. Пишут, что sd3 лучше чем flux следует заданному художественному стилю. Сам не тестил.

Nsfw - умеет, верх - норм (лучше чем у флакса из коробки), низ - без деталей (+- как у флакса из коробки). Для реализма нужно снизить cfg например до 3.0.

Затестить онлайн https://huggingface.co/spaces/stabilityai/stable-diffusion-3.5-large
Forwarded from Gour
На civitai выложили смешанную модель (Large + Large Turbo) на 8 шагов
https://civitai.com/models/880208/sd-35-fusion-8-steps-merge-full-model-and-lora-version
Как со встроенными энкодерами (полноценный чекпоинт), так и без них (unet), fp8 и fp16

Есть и обычная fp8 сразу с энкодерами https://civitai.com/models/882666?modelVersionId=988061

Ну и там же кванты есть всякие разные https://civitai.com/models/886778?modelVersionId=992647

С civitai, скорость скачивания, возможно, быстрее будет
Тут что-то про долгосрочную память завезли. Снова огромная статья, которую разбирать полноценно некогда, только автоматом. Подкаст и ссылка на ютуб видео там же в канале.
Forwarded from Galqiwi's boredom
Наконец-то закончил работу над большим пет-проектом.

Я смог запустить Llama 3.1-8b прямо в браузере на cpu с помощью нашего нового алгоритма сжатия AQLM+PV.

Можно потестить демо здесь

видео