Перейти к основному содержимому

Modal Serverless Gpu

Серверная GPU-облачная платформа для выполнения ML-нагрузок. Используйте, когда нужен доступ к GPU по запросу без управления инфраструктурой, развертывание ML-моделей в виде API или выполнение пакетных заданий с автоматическим масштабированием.

Метаданные навыка​

ИсточникОпционально — установка с помощью vibeos skills install official/mlops/modal
Путьoptional-skills/mlops/modal
Версия1.0.0
АвторOrchestra Research
ЛицензияMIT
Зависимостиmodal>=0.64.0
Платформыlinux, macos, windows
ТегиInfrastructure, Serverless, GPU, Cloud, Deployment, Modal

Справочник: полный SKILL.md​

к сведению

Ниже приведено полное определение навыка, которое VibeOS загружает при активации этого навыка. Это то, что агент видит как инструкции, когда навык активен.

Modal Serverless GPU

Подробное руководство по выполнению ML-нагрузок на серверной GPU-облачной платформе Modal.

Когда использовать Modal​

Используйте Modal, когда:

  • Выполняете ресурсоемкие ML-нагрузки на GPU без управления инфраструктурой
  • Развертываете ML-модели в виде автоматически масштабируемых API
  • Запускаете пакетные задания (обучение, инференс, обработка данных)
  • Нужна посекундная оплата GPU без затрат на простой
  • Быстро прототипируете ML-приложения
  • Запускаете запланированные задания (нагрузки по расписанию)

Ключевые возможности:

  • Серверные GPU: T4, L4, A10G, L40S, A100, H100, H200, B200 по запросу
  • Нативный Python: Определение инфраструктуры в коде Python, без YAML
  • Автомасштабирование: Масштабирование до нуля, мгновенное масштабирование до 100+ GPU
  • Субсекундный холодный старт: Инфраструктура на Rust для быстрого запуска контейнеров
  • Кэширование контейнеров: Кэширование слоев образов для быстрой итерации
  • Веб-эндпоинты: Развертывание функций в виде REST API с обновлениями без простоев

Используйте альтернативы вместо этого:

  • RunPod: Для долгоживущих подов с постоянным состоянием
  • Lambda Labs: Для зарезервированных экземпляров GPU
  • SkyPilot: Для мультиоблачной оркестрации и оптимизации затрат
  • Kubernetes: Для сложных многосервисных архитектур

Быстрый старт​

Установка​

pip install modal
modal setup # Открывает браузер для аутентификации

Hello World с GPU​

import modal

app = modal.App("hello-gpu")

@app.function(gpu="T4")
def gpu_info():
import subprocess
return subprocess.run(["nvidia-smi"], capture_output=True, text=True).stdout

@app.local_entrypoint()
def main():
print(gpu_info.remote())

Запуск: modal run hello_gpu.py

Базовый эндпоинт инференса​

import modal

app = modal.App("text-generation")
image = modal.Image.debian_slim().pip_install("transformers", "torch", "accelerate")

@app.cls(gpu="A10G", image=image)
class TextGenerator:
@modal.enter()
def load_model(self):
from transformers import pipeline
self.pipe = pipeline("text-generation", model="gpt2", device=0)

@modal.method()
def generate(self, prompt: str) -> str:
return self.pipe(prompt, max_length=100)[0]["generated_text"]

@app.local_entrypoint()
def main():
print(TextGenerator().generate.remote("Hello, world"))

Основные концепции​

Ключевые компоненты​

КомпонентНазначение
AppКонтейнер для функций и ресурсов
FunctionСерверная функция с характеристиками вычислений
ClsКлассовые функции с хуками жизненного цикла
ImageОпределение образа контейнера
VolumeПостоянное хранилище для моделей/данных
SecretБезопасное хранение учетных данных

Режимы выполнения​

КомандаОписание
modal run script.pyВыполнить и завершить
modal serve script.pyРазработка с горячей перезагрузкой
modal deploy script.pyПостоянное облачное развертывание

Конфигурация GPU​

Доступные GPU​

GPUVRAMЛучше всего подходит для
T416 ГББюджетный инференс, небольшие модели
L424 ГБИнференс, архитектура Ada Lovelace
A10G24 ГБОбучение/инференс, в 3,3 раза быстрее T4
L40S48 ГБРекомендуется для инференса (лучшее соотношение цена/производительность)
A100-40GB40 ГБОбучение больших моделей
A100-80GB80 ГБОчень большие модели
H10080 ГБСамый быстрый, FP8 + Transformer Engine
H200141 ГБАвтообновление с H100, пропускная способность 4,8 ТБ/с
B200ПоследняяАрхитектура Blackwell

Шаблоны спецификации GPU​

# Один GPU
@app.function(gpu="A100")

# Конкретный вариант памяти
@app.function(gpu="A100-80GB")

# Несколько GPU (до 8)
@app.function(gpu="H100:4")

# GPU с запасными вариантами
@app.function(gpu=["H100", "A100", "L40S"])

# Любой доступный GPU
@app.function(gpu="any")

Образы контейнеров​

# Базовый образ с pip
image = modal.Image.debian_slim(python_version="3.11").pip_install(
"torch==2.1.0", "transformers==4.36.0", "accelerate"
)

# Из CUDA-базы
image = modal.Image.from_registry(
"nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04",
add_python="3.11"
).pip_install("torch", "transformers")

# С системными пакетами
image = modal.Image.debian_slim().apt_install("git", "ffmpeg").pip_install("whisper")

Постоянное хранилище​

volume = modal.Volume.from_name("model-cache", create_if_missing=True)

@app.function(gpu="A10G", volumes={"/models": volume})
def load_model():
import os
model_path = "/models/llama-7b"
if not os.path.exists(model_path):
model = download_model()
model.save_pretrained(model_path)
volume.commit() # Сохранить изменения
return load_from_path(model_path)

Веб-эндпоинты​

Декоратор эндпоинта FastAPI​

@app.function()
@modal.fastapi_endpoint(method="POST")
def predict(text: str) -> dict:
return {"result": model.predict(text)}

Полное ASGI-приложение​

from fastapi import FastAPI
web_app = FastAPI()

@web_app.post("/predict")
async def predict(text: str):
return {"result": await model.predict.remote.aio(text)}

@app.function()
@modal.asgi_app()
def fastapi_app():
return web_app

Типы веб-эндпоинтов​

ДекораторСценарий использования
@modal.fastapi_endpoint()Простая функция → API
@modal.asgi_app()Полные приложения FastAPI/Starlette
@modal.wsgi_app()Приложения Django/Flask
@modal.web_server(port)Произвольные HTTP-серверы

Динамическая пакетная обработка​

@app.function()
@modal.batched(max_batch_size=32, wait_ms=100)
async def batch_predict(inputs: list[str]) -> list[dict]:
# Входные данные автоматически группируются в пакеты
return model.batch_predict(inputs)

Управление секретами​

# Создать секрет
modal secret create huggingface HF_TOKEN=hf_xxx
@app.function(secrets=[modal.Secret.from_name("huggingface")])
def download_model():
import os
token = os.environ["HF_TOKEN"]

Планирование​

@app.function(schedule=modal.Cron("0 0 * * *"))  # Ежедневно в полночь
def daily_job():
pass

@app.function(schedule=modal.Period(hours=1))
def hourly_job():
pass

Оптимизация производительности​

Снижение холодного старта​

@app.function(
container_idle_timeout=300, # Держать теплым 5 минут
allow_concurrent_inputs=10, # Обрабатывать параллельные запросы
)
def inference():
pass

Лучшие практики загрузки модели​

@app.cls(gpu="A100")
class Model:
@modal.enter() # Выполняется один раз при запуске контейнера
def load(self):
self.model = load_model() # Загрузка во время прогрева

@modal.method()
def predict(self, x):
return self.model(x)

Параллельная обработка​

@app.function()
def process_item(item):
return expensive_computation(item)

@app.function()
def run_parallel():
items = list(range(1000))
# Распределение по параллельным контейнерам
results = list(process_item.map(items))
return results

Общая конфигурация​

@app.function(
gpu="A100",
memory=32768, # 32 ГБ RAM
cpu=4, # 4 ядра CPU
timeout=3600, # Максимум 1 час
container_idle_timeout=120,# Держать теплым 2 минуты
retries=3, # Повтор при сбое
concurrency_limit=10, # Максимум параллельных контейнеров
)
def my_function():
pass

Отладка​

# Тестирование локально
if __name__ == "__main__":
result = my_function.local()

# Просмотр логов
# modal app logs my-app

Частые проблемы​

ПроблемаРешение
Задержка холодного стартаУвеличьте container_idle_timeout, используйте @modal.enter()
GPU OOMИспользуйте более мощный GPU (A100-80GB), включите градиентную контрольную точку
Сбой сборки образаЗафиксируйте версии зависимостей, проверьте совместимость CUDA
Ошибки тайм-аутаУвеличьте timeout, добавьте контрольные точки

Ссылки​

  • Расширенное использование — Многопроцессорные GPU, распределенное обучение, оптимизация затрат
  • Устранение неполадок — Частые проблемы и решения

Ресурсы​