Инструменты кэширования для ML-функций в Python 3.11
Работа инференса ML-проекта может быть очень интенсивной по CPU и требовать значительной RAM. С ростом RPS, числа подов и при наличии нескольких DC, вопрос приобретает ещё большее значение, т.к. неэффективность умножается на число инстансов приложения.
Ресурсы в РФ всегда дорогие, поэтому имеет смысл рассмотреть вариант Server-Side кэширования вызовов таких функций. Кэширование позволяет значительно сократить время выполнения, сохраняя результаты предыдущих вычислений.
В этом посте я рассмотрел популярные инструменты кэширования, которые могут быть полезны для оптимизации вызовов дорогостоящих CPU-bound ML-функций в Python 3.11.
Популярные инструменты кэширования
Инструмент | Описание | Поддерживаемые типы кэширования | Документация | GitHub-репозиторий |
---|---|---|---|---|
functools.lru_cache |
Встроенный декоратор для кэширования результатов функций в памяти. | LRU (Least Recently Used) | Документация | - |
cachetools |
Библиотека для расширенного кэширования с поддержкой различных стратегий. | LRU, LFU, TTL, RR | Документация | GitHub |
diskcache |
Кэширование на диске с поддержкой многопоточности и различных политик. | LRU, LFU, TTL | Документация | GitHub |
joblib |
Инструмент для параллельных вычислений и кэширования результатов. | Memory, Disk | Документация | GitHub |
dogpile.cache |
Библиотека для кэширования с поддержкой различных бэкэндов. | TTL, Region-based | Документация | GitHub |
Золотое правило кэширование
При всем при этом, проектирование и реализация кэша должны быть тщательно спланированы.
Процитирую Sam Newman в книге Building Microservices (кстати, см. мой обзор не неё):
- Не надо кэшировать в слишком многих местах. Тяжело отслеживать всю цепочку.
- Если используется TTL для client-side и server-side, то их время потенциально может складываться. Тут можно использовать timestamp-based expiration.
- ⚠️ Преждевременная оптимизация может вызвать проблемы. Кэширование добавляет сложности, а мы хотим добавить как можно меньше сложности. Идеальное количество мест для кэширования равно нулю. Все остальное должно быть оптимизацией, которую вы должны сделать, но помните о сложности, которую это может принести.
- ℹ️ Относитесь к кэшированию в первую очередь как к оптимизации производительности. Кэшируйте в как можно меньшем количестве мест, чтобы было легче рассуждать о свежести данных.