{/ Эта страница автоматически создается на основе файла SKILL.md навыка с помощью сайта site/scripts/generate-skill-docs.py. Редактируйте исходный код SKILL.md, а не эту страницу. /}

Модальный бессерверный графический процессор

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

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

Источник Необязательно — установите с помощью hermesskills installofficial/mlops/modal
Путь optional-skills/mlops/modal
Версия 1.0.0
Автор Исследование оркестра
Лицензия Массачусетский технологический институт
Зависимости модальный>=0.64.0
Платформы Linux, MacOS, Windows
Теги «Инфраструктура», «Бессерверные», «Графический процессор», «Облако», «Развертывание», «Модальный режим»

Ссылка: полная версия SKILL.md:::информация

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

Модальный бессерверный графический процессор

Комплексное руководство по запуску рабочих нагрузок машинного обучения на бессерверной облачной платформе графического процессора Modal.

Когда использовать модальное окно

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

Основные особенности: - Бессерверные графические процессоры: T4, L4, A10G, L40S, A100, H100, H200, B200 по требованию. - Python-native: определение инфраструктуры в коде Python, без YAML. - Автомасштабирование: масштабирование до нуля, мгновенное масштабирование до 100+ графических процессоров. - Холодный запуск за доли секунды: инфраструктура на основе Rust для быстрого запуска контейнеров. - Кэширование контейнера: слои изображения кэшируются для быстрой итерации. - Веб-конечные точки: развертывайте функции как REST API с обновлениями без простоев.

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

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

Установка

pip install modal
modal setup  # Opens browser for authentication

Привет, мир с графическим процессором

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())

Запустите: модальный запуск 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"))

Основные понятия

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

Компонент Цель
Приложение Контейнер для функций и ресурсов
Функция Бессерверная функция с вычислительными характеристиками
Клс Функции на основе классов с перехватчиками жизненного цикла
Изображение Определение образа контейнера
Объем Постоянное хранилище моделей/данных
Секрет Безопасное хранение учетных данных

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

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

Конфигурация графического процессора

Доступные графические процессоры

графический процессор видеопамять Лучшее для
Т4 16 ГБ Бюджетный вывод, небольшие модели
L4 24 ГБ Вывод, арка Ады Лавлейс
А10Г 24 ГБ Обучение/вывод: в 3,3 раза быстрее, чем T4
L40S 48 ГБ Рекомендуется для вывода (лучшая цена/производительность)
А100-40ГБ 40 ГБ Обучение большой модели
А100-80ГБ 80 ГБ Очень большие модели
H100 80 ГБ Самый быстрый двигатель FP8 + трансформатор
Н200 141 ГБ Автоматическое обновление с H100, пропускная способность 4,8 ТБ/с
Б200 Последние Архитектура Блэквелла

Шаблоны спецификаций графического процессора

# Single GPU
@app.function(gpu="A100")

# Specific memory variant
@app.function(gpu="A100-80GB")

# Multiple GPUs (up to 8)
@app.function(gpu="H100:4")

# GPU with fallbacks
@app.function(gpu=["H100", "A100", "L40S"])

# Any available GPU
@app.function(gpu="any")

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

# Basic image with pip
image = modal.Image.debian_slim(python_version="3.11").pip_install(
    "torch==2.1.0", "transformers==4.36.0", "accelerate"
)

# From CUDA base
image = modal.Image.from_registry(
    "nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04",
    add_python="3.11"
).pip_install("torch", "transformers")

# With system packages
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()  # Persist changes
    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(порт) Произвольные HTTP-серверы

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

@app.function()
@modal.batched(max_batch_size=32, wait_ms=100)
async def batch_predict(inputs: list[str]) -> list[dict]:
    # Inputs automatically batched
    return model.batch_predict(inputs)

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

# Create secret
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 * * *"))  # Daily midnight
def daily_job():
    pass

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

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

Устранение холодного запуска

@app.function(
    container_idle_timeout=300,  # Keep warm 5 min
    allow_concurrent_inputs=10,  # Handle concurrent requests
)
def inference():
    pass

Рекомендации по загрузке модели

@app.cls(gpu="A100")
class Model:
    @modal.enter()  # Run once at container start
    def load(self):
        self.model = load_model()  # Load during warm-up

    @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))
    # Fan out to parallel containers
    results = list(process_item.map(items))
    return results

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

@app.function(
    gpu="A100",
    memory=32768,              # 32GB RAM
    cpu=4,                     # 4 CPU cores
    timeout=3600,              # 1 hour max
    container_idle_timeout=120,# Keep warm 2 min
    retries=3,                 # Retry on failure
    concurrency_limit=10,      # Max concurrent containers
)
def my_function():
    pass

Отладка

# Test locally
if __name__ == "__main__":
    result = my_function.local()

# View logs
# modal app logs my-app

Распространенные проблемы

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

Ссылки

Ресурсы