Асинхронность и мультипроцессность для ускорения вычислений в Python

Almaty Python Meetup #5

ТИ
Темирлан Илик
GoDays

Когда вычисления упираются в потолок, на помощь приходят асинхронность и мультипроцессность.

Темирлан Илик — backend-разработчик в GoDays — объясняет на пальцах, как asyncio и multiprocessing помогают ускорять вычисления в Python.

В докладе: — как устроен асинхронный паттерн: event loop, очередь задач и неблокирующая обработка ввода-вывода — что такое мультипроцессность: процесс на ядро, пулы процессов и нюансы fork (Linux/macOS против Windows) — когда что применять: asyncio для IO-bound задач, multiprocessing — для CPU-bound — объединение обоих подходов через библиотеку aiomultiprocess — практический пример: ускорение ML-инференса на данных из Telegram

Видео

Презентация

Слайд 1: Как асинхрон и мультипроцессность 1 / 20
Текст презентации

Слайд 1: Как асинхрон и мультипроцессность

Как асинхрон и мультипроцессность помогают ускорять вычисления? Примеры и практики

Слайд 2: Введение

Введение Данный документ написан в целях ознакомления с такими понятиями как асинхронность и мультипроцессорность в программировании. Применению asyncio и multiprocessing, а также библиотеки aiomultiprocess, на практике.

Слайд 3: Об о мне

Об о мне Меня зовут Темирлан, мне 20 лет. В коммерческой разработке уже 5 лет. Backend разработчик в GoDays. Студент в МУИТ.

Слайд 4: Async

Async Асинхрон - это шаблон ожидания IO процессов в виде очереди/пула запросов, где каждый запуск функции имеет свой асинхронный контекст и точки IO операций, так он позволяет программе работать в non-blocking режиме. В парадигме Python асинхрон является инструментом для смены паттернов работы функций. Изначально паттерн работы следующий

Слайд 5: Если у нас появляется множество запросов на “Ввод”, тогда

Если у нас появляется множество запросов на “Ввод”, тогда “Вывод” будет осуществляться в том порядке в котором поступали запросы(в порядке очереди). Но при асинхронном паттерне работы будет следующий результат

Слайд 6: Мы закладываем следующий шаблон работы

Мы закладываем следующий шаблон работы: 1.Когда мы получаем запрос, перенаправляем его в Event Loop(Наш обработчик событий/корутин). 2.Выполняем код до точки ожидания и передаем в Process Pool(Наше хранилище задач/фьючерсов). 3.Раз в несколько тиков, выполняются системные вызовы, если такой получили, проходимся по Process Pool и смотрим на точки ожидания, если получили на него ответ выполняем программу. *Для операции вывода идет та же последовательность

Слайд 7: Как видно, при смене паттерна работы функций на асинхронный, мы не

Как видно, при смене паттерна работы функций на асинхронный, мы не ожидаем полного завершения каждого из запросов, а выбираем следующий из запросов на “Ввод”/“Вывод”. Таким образом мы можем существенно ускорить процесс обработки запросов, но никак не скорость их вычисления.

Слайд 8: Что такое мультипроцессность?

Что такое мультипроцессность? Мультипроцессность - это способ запуска приложения, при котором каждый “Процесс” запускается на отдельном ядре процессора. Процесс - это экземпляр приложения со своей выделенной памятью и потоками.

Слайд 9: Если присмотреться можно заметить “Pool” в котором как

Если присмотреться можно заметить “Pool” в котором как раз и запускаются эти процессы, но вопрос как Pool создает эти процессы?

Слайд 10: Так же тут есть подводные камни. Например Windows OS не

Так же тут есть подводные камни. Например Windows OS не могут делать Fork, так делают в основном Linux и MacOS. Fork как бы наследует образ приложения и меня в нем лишь часть кода параметрами и переменными.

Слайд 11: Можно ли их объединять и имеет ли смысл?

Можно ли их объединять и имеет ли смысл?

Слайд 12: Да, можно, да имеет

Да, можно, да имеет • Мы просто записываем всё в едином варианте. Используем Asyncio в задачах с IO-bound и Multiprocessing в CPU-bound. • Применяться оно может в разных направлениях и обстоятельствах, например в ETL процессах или для ML-инференса. • Будем разбирать на примере с библиотекой aiomultiprocess • А так же покажем прирост в ML инференсе. Данный подход можно применять и при обучении модели.

Слайд 13: Примером как раз

Примером как раз можно взять ML-инференс, для большего актуальности применения данных данные будем доставать из telegram. Почему ML-Инфренес и telegram? Это актуально и показывает нагрузку CPU/ GPU и IO bound процессы

Слайд 14: Multiprocessing

Multiprocessing Async Async + Multiprocessing

Слайд 15: ВАЖНО!

ВАЖНО! • Как вы ранее видели логику поражения процессов, вы так же должны знать что всё имеет свою цену, в том числе и стоимость работы в асинхронном режиме и в многопроцессном. А объединяя всё выше указанное вы повышаете себе время изначального запуска на порождение всех этих структур и систем.

Слайд 16: Результаты

Результаты:

Слайд 17: Всё ради этого

Всё ради этого:

Слайд 18: Ссылки

Ссылки GitHub LinkedIn

Слайд 19: Референсы и просто полезные

Референсы и просто полезные источники: • https://www.dataleadsfuture.com/combining-multiprocessing-and-asyncio-in-python-for-performance-boosts/ • https://www.dataleadsfuture.com/supercharge-your-python-asyncio-with-aiomultiprocess-a-comprehensive-guide/ • https://www.dataleadsfuture.com/aiomultiprocess-super-easy-integrate-multiprocessing-asyncio-in-python/ • https://www.dataleadsfuture.com/using-tqdm-with-asyncio-in-python/ • https://medium.com/@yarusl42/asyncio-in-depth-part-1-8457efb4106b • https://habr.com/ru/articles/804799/ • https://medium.com/devopss-hole/python-multiprocessing-pickle-issue-e2d35ccf96a9 • https://medium.com/devopss-hole/python-multiprocessing-pickle-issue-e2d35ccf96a9 • https://huggingface.co/models?pipeline_tag=text-classi cation&sort=trending

Слайд 20: Спасибо за внимание

Спасибо за внимание

Другие доклады митапа