Forwarded from Pattern Guru. Шаблоны проектирования. Архитектура ПО
Фабричный метод — это порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
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())
Forwarded from Pattern Guru. Шаблоны проектирования. Архитектура ПО
#паттерны
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
1. Клиент. Описывает бизнес логику программы. Работает с адаптером и другими объектами.
2. Интерфейс с которым может работать клиентский код.
3. Класс, который имеет нужную клиенту логику, однако клиент не может с ним общаться, так как интерфейс данного класса ему не понятен.
4. Адаптер - класс который помогает клиенту использовать функционал незнакомого ему сервиса в правильном формате. Реализует клиентский интерфейс. Содержит ссылку на незнакомый сервис. Адаптер при получении вызовов от клиента через клиентский интерфейс и переводит их в вызовы незнакомого сервиса в правильном формате.
Уточнение: Приложение должно использовать объект адаптера только через клиентский интерфейс. Это позволит легко создавать и изменять адаптеры в будущем.
Плюсы данного паттерна
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/
Введение
Сегодня мы рассмотрим паттерн проектирования "Адаптер".
Классификация
Тип: Структурный
Определение: Адаптер — это структурный паттерн проектирования, который позволяет объектам с несовместимыми интерфейсами работать вместе.
Адаптер выступает прослойкой между объектами превращая вызовы одного в понятные для другого.
Очень удобно понять адаптер на примере из жизни. Представим человеку который говорит только на французском нужно рассказать историю человеку который понимает только немецкий. Сами понять они друг друга не смогут, поэтому им понадобится переводчик, который переведёт французкий на немецкий. В данном случае переводчик выступит адаптером.
Из чего состоит и как работает паттерн адаптер
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/
GitHub
aiogram/aiogram/contrib/fsm_storage/redis.py at b190bbba1915ed3b7f311a780f34723ebd6b5acd · aiogram/aiogram
aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio - aiogram/aiogram
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
Модель в формате 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, скорость скачивания, возможно, быстрее будет
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 gonzo-обзоры ML статей
Тут что-то про долгосрочную память завезли. Снова огромная статья, которую разбирать полноценно некогда, только автоматом. Подкаст и ссылка на ютуб видео там же в канале.
Telegram
gonzo_ML_podcasts
Youtube: https://www.youtube.com/watch?v=vQ5o4XdrLVw
Forwarded from Galqiwi's boredom
Наконец-то закончил работу над большим пет-проектом.
Я смог запустить Llama 3.1-8b прямо в браузере на cpu с помощью нашего нового алгоритма сжатия AQLM+PV.
Можно потестить демо здесь
видео
Я смог запустить Llama 3.1-8b прямо в браузере на cpu с помощью нашего нового алгоритма сжатия AQLM+PV.
Можно потестить демо здесь
видео
YouTube
AQLM.rs demo
You can try this demo at https://galqiwi.github.io/aqlm-rs/about.html
00:00 Loading
04:40 Actual demo
This was run on Macbook Pro M1. Any other laptop or phone with sufficient RAM should work too.
00:00 Loading
04:40 Actual demo
This was run on Macbook Pro M1. Any other laptop or phone with sufficient RAM should work too.
Forwarded from Quant Researcher
📚3 книги, которые должен освоить каждый квант
Недавно на quant.courses зашел разговор о ключевых книгах, разобравшись в которых можно создать прочную базу для успешного прохождения любого собеседования.
Важно именно разобраться в концептах из книг, а не просто прочитать. Разобраться — это значит прорешать все задачи в конце глав и понять каждую формулу. Благо, сейчас есть ChatGPT; еще 5 лет назад нам приходилось искать другие источники, чтобы разобраться в непонятных моментах из этих книг.
1. Options, Futures, and Other Derivatives, Джон Халл. Библия деривативов. Объемная книга с академической базой, необходимой для работы с производными финансовыми инструментами. Ее плюс в том, что она охватывает и базовые инструменты: акции, облигации и т.д.
2. Trades, Quotes and Prices: Financial Markets Under the Microscope, Жан-Филипп Бушо. Лучшая книга по микроструктуре рынка. Внимание: может вызвать много вопросов по матанализу!
3. Advances in Financial Machine Learning Маркос Лопес де Прадо. Книга о применении машинного обучения в финансах. Примечателен и ее автор, Маркос Лопес де Прадо, редкий случай академика, успешно работающего в хедж-фонде.
Вдумчивый читатель заметит, что в списке нет книг Кирилла Ильинского. Администрация канала считает, что еще никто в мире не смог разобраться в них до конца. Это настоящая библия кванта, которую нужно перечитывать многократно, каждый раз открывая для себя новые уровни смыслов.
Quant Researcher
Недавно на quant.courses зашел разговор о ключевых книгах, разобравшись в которых можно создать прочную базу для успешного прохождения любого собеседования.
Важно именно разобраться в концептах из книг, а не просто прочитать. Разобраться — это значит прорешать все задачи в конце глав и понять каждую формулу. Благо, сейчас есть ChatGPT; еще 5 лет назад нам приходилось искать другие источники, чтобы разобраться в непонятных моментах из этих книг.
1. Options, Futures, and Other Derivatives, Джон Халл. Библия деривативов. Объемная книга с академической базой, необходимой для работы с производными финансовыми инструментами. Ее плюс в том, что она охватывает и базовые инструменты: акции, облигации и т.д.
2. Trades, Quotes and Prices: Financial Markets Under the Microscope, Жан-Филипп Бушо. Лучшая книга по микроструктуре рынка. Внимание: может вызвать много вопросов по матанализу!
3. Advances in Financial Machine Learning Маркос Лопес де Прадо. Книга о применении машинного обучения в финансах. Примечателен и ее автор, Маркос Лопес де Прадо, редкий случай академика, успешно работающего в хедж-фонде.
Вдумчивый читатель заметит, что в списке нет книг Кирилла Ильинского. Администрация канала считает, что еще никто в мире не смог разобраться в них до конца. Это настоящая библия кванта, которую нужно перечитывать многократно, каждый раз открывая для себя новые уровни смыслов.
Quant Researcher