Где хранить веса?
Evgenii NikitinЧитал тут книгу LLMs in Production, в одной из глав описывались плюсы и минусы разных способов получения контейнером весов большой модели. В компьютерном зрении модельки тоже бывают немаленькие, а ещё моделей в одном сервисе может быть много, поэтому тема важная для многих DL-щиков.

Итак, какие же бывают способы?
- Basic Service - качаем веса с S3 или другого хранилища во время старта контейнера. Плюсы - просто. Минусы - долгий старт, особенно для больших моделей.
- Fusing - монтируем S3-хранилище на машину через s3fs. Плюсы - упрощает код, не нужен явный шаг скачивания модели. Минусы - по скорости особо не отличается от прошлого метода.
- Baking - качаем веса прям в докер-образ на этапе сборки. Плюсы - сильно упрощает деплой, всё, что нужно для старта модели, находится в одном докер-образе, не нужно ничего перекачивать при рестарте контейнера на той же машине. Минусы - может быть ещё медленнее (особенно если не испольузем свой реджистри), менее секьюрно, так как веса зашиты прям в образ.
- Mounted Volume - заранее скачиваем веса на какой-нибудь диск, который можно примаунтить к нашей машине. Плюсы - самый быстрый метод. Минусы - усложняет пайплайн релиза, менее надёжно, если у диска нет реплик, платим за SSD-хранилище в каждом регионе облака.
- Intermediary Mounted Volume - скачиваем веса при старте как в методе Basic Service, но сразу же кладём их на какой-нибудь общий диск, чтоб другие реплики модели могли взять веса оттуда. Плюсы - простой пайплайн и быстрая загрузка для всех реплик, кроме первой. Минусы - медленная загрузка первой реплики =)
В Цельсе мы в основном используем метод Baking - веса качаются в образ ещё на этапе сборки контейнера. Почему?
- Установка нашего ПО часто происходит на самых разных удалённых машинах, в том числе без доступа к интернету. Был забавный случай на эту тему - контейнер не стартовал, потому что torchvision случайно пытался скачать какие-то ненужные веса, а интернета на машине не было.
- Модели всё-таки не такие огромные, и в худшем случае пулл контейнера может занимать до 10 минут - обычно у нас нет необходимости обновляться очень быстро.
- Лень менять.