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
| GPU | VRAM | Лучше всего подходит для |
|---|---|---|
T4 | 16 ГБ | Бюджетный инференс, небольшие модели |
L4 | 24 ГБ | Инференс, архитектура Ada Lovelace |
A10G | 24 ГБ | Обучение/инференс, в 3,3 раза быстрее T4 |
L40S | 48 ГБ | Рекомендуется для инференса (лучшее соотношение цена/производительность) |
A100-40GB | 40 ГБ | Обучение больших моделей |
A100-80GB | 80 ГБ | Очень большие модели |
H100 | 80 ГБ | Самый быстрый, FP8 + Transformer Engine |
H200 | 141 ГБ | Автообновление с 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, распределенное обучение, оптимизация затратУстранение неполадок— Частые проблемы и решения
Ресурсы
- Документация: https://modal.com/docs
- Примеры: https://github.com/modal-labs/modal-examples
- Цены: https://modal.com/pricing
- Discord: https://discord.gg/modal