Перейти к содержанию

Инструменты кэширования для 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 (кстати, см. мой обзор не неё):

  1. Не надо кэшировать в слишком многих местах. Тяжело отслеживать всю цепочку.
  2. Если используется TTL для client-side и server-side, то их время потенциально может складываться. Тут можно использовать timestamp-based expiration.
  3. ⚠️ Преждевременная оптимизация может вызвать проблемы. Кэширование добавляет сложности, а мы хотим добавить как можно меньше сложности. Идеальное количество мест для кэширования равно нулю. Все остальное должно быть оптимизацией, которую вы должны сделать, но помните о сложности, которую это может принести.
  4. ℹ️ Относитесь к кэшированию в первую очередь как к оптимизации производительности. Кэшируйте в как можно меньшем количестве мест, чтобы было легче рассуждать о свежести данных.

Что дальше?

  1. Нашли эту статью полезной? Поделитесь ею и помогите распространить знания!
  2. Нашли ошибку или есть идеи 💡 о том, что и как я могу улучшить? Напишите мне в Telegram.
  3. Хотите узнать обо мне больше? Читайте здесь.