Serverless Computing
Бессерверные вычисления запускают код по требованию, а провайдер управляет серверами и масштабирует их вплоть до нуля, взимая плату за каждый запрос. Рассматриваются холодные запуски и применение ИИ.
Бессерверные вычисления — это модель облачного выполнения, при которой провайдер запускает код только в ответ на событие, автоматически запускает и масштабирует базовые серверы, отключает их до нуля, когда трафик прекращается, и выставляет счёт за запросы и время выполнения, а не за зарезервированные машины. Серверы по-прежнему существуют, но разработчикам не нужно их выделять, обновлять или подбирать для них размер. Эта модель получила широкое распространение благодаря AWS Lambda, анонсированной в ноябре 2014 года, и сейчас охватывает платформы функций, такие как Lambda, Azure Functions и Cloud Run functions, а также бессерверные контейнеры, например Google Cloud Run и Azure Container Apps. Исследователи из UC Berkeley описали преимущества и ограничения этой модели в статье 2019 года «Упрощённое облачное программирование: взгляд Беркли на бессерверные вычисления». Для машинного обучения бессерверная архитектура подходит для обслуживания моделей при всплесках или непредсказуемом трафике: плата за простаивающий сервер GPU между такими всплесками обошлась бы дороже самой работы.
Как работает бессерверное выполнение#
Код упаковывают в функцию или образ контейнера и привязывают к триггерам: HTTP-запросу, появлению файла в объектном хранилище, сообщению в очереди или расписанию. Когда поступает событие и доступен свободный прогретый экземпляр, платформа сразу запускает на нём обработчик. В противном случае происходит холодный запуск: платформа создаёт изолированную песочницу, например одну из микроВМ Firecracker, разработанных AWS для Lambda, загружает код, запускает языковую среду выполнения и выполняет код инициализации вне обработчика, прежде чем обработать событие. Экземпляры не хранят состояние и могут быть удалены, поэтому всё, что должно пережить запрос, сохраняют во внешнем хранилище или базе данных.
Холодные запуски и модели машинного обучения#
В машинном обучении холодные запуски обходятся дорого, поскольку при инициализации импортируется фреймворк, например PyTorch, и загружаются веса модели, которые могут занимать сотни мегабайт. Обычно модель загружают один раз на экземпляр — вне обработчика или при первом использовании, — чтобы каждый последующий запуск на прогретом экземпляре мог её повторно использовать. Этот обработчик использует именно такой подход с классификатором ResNet-50 из torchvision:
import time
import torch
import torchvision
model = None # module state survives between invocations while the instance stays warm
def handler(event, context):
"""Classify one image tensor, building the model only on a cold start."""
global model
cold_start = model is None
if cold_start:
model = torchvision.models.resnet50().eval() # built once per instance
with torch.inference_mode():
logits = model(event["image"])
return {"cold_start": cold_start, "class_id": int(logits.argmax())}
for _ in range(3):
start = time.perf_counter()
response = handler({"image": torch.rand(1, 3, 224, 224)}, context=None)
print(response["cold_start"], f"{(time.perf_counter() - start) * 1000:.0f} ms")На CPU Apple M5 Pro первый вызов строит сеть и занимает около 0,2 секунды, а два последующих вызова с повторным использованием сети на прогретом экземпляре занимают примерно по 15 мс. Команды сокращают оставшееся время холодного запуска с помощью образов контейнеров меньшего размера, компактных или квантованных моделей и более лёгких сред выполнения, таких как ONNX Runtime. Другой способ убрать холодный запуск — поддерживать минимальное число прогретых экземпляров, например использовать выделенную конкурентность Lambda или минимальное количество экземпляров Cloud Run, — но тогда снова приходится платить за простой.
Бессерверная архитектура для ИИ-нагрузок#
Бессерверная архитектура подходит для событийно-ориентированных конвейеров компьютерного зрения. Загрузка в объектное хранилище может запускать функцию, которая проверяет корректность изображения и изменяет его размер при предварительной обработке данных, прежде чем изображение попадёт в обучающий набор данных, а в системе охранной сигнализации датчик движения может отправить один кадр функции обнаружения объектов, которая отправляет оповещение только при обнаружении человека. Дальше всё определяют ограничения платформы: AWS Lambda ограничивает продолжительность каждого вызова 15 минутами, предоставляет до 10 240 МБ памяти и не предоставляет GPU, поэтому подходит для инференса на CPU с компактными моделями, но исключает длительные запуски обучения, не говоря уже о распределённом обучении на большом количестве GPU. Бессерверные вычисления с GPU восполнили этот пробел: Cloud Run подключает GPU NVIDIA L4 к контейнерам, которые при этом масштабируются до нуля, а такие платформы, как Modal, тарифицируют время использования GPU посекундно.
Платформа Ultralytics предлагает такой же компромисс для развёртываний YOLO: конечная точка с размером по умолчанию — 1 vCPU и 2 GiB — бесплатна и в состоянии простоя масштабируется до нуля; запуск из состояния простоя может занимать около минуты. Пользовательские размеры поддерживают один прогретый экземпляр и тарифицируются за всё время его работы.
Бессерверная архитектура и родственные модели#
- Инфраструктура как услуга: виртуальные машины работают круглосуточно и тарифицируются независимо от того, поступают ли запросы; клиент управляет операционной системой и масштабированием. Длительные задания на обучение обычно запускают здесь.
- Kubernetes: оркестрирует контейнеры в кластерах, которыми управляет команда. Knative добавляет поверх него масштабирование до нуля по запросам; KServe использует эту возможность для обслуживания моделей.
- Периферийные вычисления: выполняют код на устройствах, которые производят данные, или рядом с ними. Бессерверные вычисления выполняют код в облачном регионе, а некоторые периферийные платформы сочетают оба подхода, запуская функции во множестве небольших локаций рядом с пользователями.










