Планируйте нагрузки GPU и создавайте задачи

Используйте Declarative Automation Bundles для планирования задачи на GPU AI Runtime и комбинирования её с другой задачей, например, с подготовкой данных до основного процесса. Определите рабочую нагрузку и её расписание в YAML, затем разверните их как задачу. Для учебного конвейера запускайте предобработку на вычислительных ресурсах CPU и начинайте обучение на GPU после того, как данные будут готовы.

Это руководство начинается с ворклоада, который печатает «Hello world», затем строит запланированный конвейер предобработки и обучения. Если у вас уже есть YAML для рабочей нагрузки AI Runtime, см. «Преобразование рабочей нагрузки AI Runtime в бандл».

Принцип работы

  • Пакет содержит ваш код и конфигурациюdatabricks.yml.
  • Работа группирует задачи и определяет, когда они выполняются.
  • ai_runtime_task запускает вашу команду в AI Runtime.

Поле depends_on объединяет задачи в направленный ациклический граф (DAG), и поле schedule планирует выполнение вашей задачи по расписанию.

databricks bundle deploy загружает код и создаёт или обновляет задание. databricks bundle run сразу же запускает выполнение задания. При каждом запуске AI Runtime предоставляет GPU-вычисления, запускает вашу команду и записывает запуск в названный эксперимент MLflow.

Requirements

Пример Hello World с ai_runtime_task

В этом примере выполнена команда shell на одном GPU A10.

  1. Создайте каталог для пакета. В этом каталоге создайте command.sh с следующим содержимым:

    #!/usr/bin/env bash
    set -euo pipefail
    echo "Hello world"
    
  2. Создайте databricks.yml в одной и той же директории:

    bundle:
      name: hello-ai-runtime
    
    resources:
      jobs:
        hello:
          name: hello-ai-runtime
          tasks:
            - task_key: hello
              environment_key: default
              ai_runtime_task:
                experiment: hello-ai-runtime
                deployments:
                  - command_path: ${workspace.file_path}/command.sh
                    compute:
                      accelerator_type: GPU_1xA10
                      accelerator_count: 1
          environments:
            - environment_key: default
              spec:
                environment_version: '6'
    
    targets:
      dev:
        mode: development
        default: true
    
  3. Из каталога bundle проверьте, разверните и выполните задание:

    databricks bundle validate --target dev
    databricks bundle deploy --target dev
    databricks bundle run hello --target dev
    
  4. Откройте URL запуска, напечатанный CLI, и просмотрите hello вывод задачи. Он содержит Hello world. Серия также появляется в эксперименте hello-ai-runtime MLflow.

Более сложный пример: Запланировать конвейер предварительной обработки и обучения

Этот пример готовит небольшой набор данных на CPU, а затем обучает линейную модель на одном GPU A10. Обе задачи используют один и тот же файл тома для передачи данных между ними. Работа запланирована на 09:00 UTC каждый день, расписание приостановлено, пока вы его не протестируете.

Создание проекта

  1. Создайте отдельный каталог с следующим оформлением:

    scheduled-training/
    ├── databricks.yml
    ├── prep.py
    ├── command.sh
    └── src/
        └── train.py
    
  2. Создайте prep.py со следующим содержимым. Замените <catalog>, <schema>и <volume> на названия ваших томов. Этот блокнот нормализует входные значения и записывает подготовленные данные в хранилище:

    # Databricks notebook source
    import json
    from pathlib import Path
    
    data_path = Path("/Volumes/<catalog>/<schema>/<volume>/scheduled-training/data.json")
    inputs = [value / 10 for value in range(10)]
    data = {"x": inputs, "y": [2 * value + 1 for value in inputs]}
    data_path.parent.mkdir(parents=True, exist_ok=True)
    data_path.write_text(json.dumps(data))
    print(f"Prepared {len(inputs)} rows at {data_path}")
    
  3. Создайте src/train.py с использованием следующего контента. Используйте тот же путь тома, что и в prep.py:

    import json
    from pathlib import Path
    
    import torch
    
    data_path = Path("/Volumes/<catalog>/<schema>/<volume>/scheduled-training/data.json")
    data = json.loads(data_path.read_text())
    x = torch.tensor(data["x"], device="cuda").reshape(-1, 1)
    y = torch.tensor(data["y"], device="cuda").reshape(-1, 1)
    model = torch.nn.Linear(1, 1).to("cuda")
    optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
    
    for _ in range(200):
        optimizer.zero_grad()
        loss = torch.nn.functional.mse_loss(model(x), y)
        loss.backward()
        optimizer.step()
    
    print(f"Trained on {x.device}: loss={loss.item():.4f}")
    
  4. Создайте command.sh для запуска кода обучения. Пакет ниже содержит src/, поэтому CODE_SOURCE_PATH указывает на извлеченный каталог src:

    #!/usr/bin/env bash
    set -euo pipefail
    cd "$CODE_SOURCE_PATH"
    python train.py
    
  5. Создайте databricks.yml с использованием следующего контента. Набор включает src/ для задачи GPU. prep Блокнот работает на бессерверных вычислительных ресурсах CPU, и depends_on запускает train только после того, как prep завершится успешно. max_concurrent_runs: 1 Предотвращает перезапись входных файлов при запусках этого задания:

    bundle:
      name: scheduled-training
    
    artifacts:
      code:
        type: tgz
        path: .
        include: [src]
        files:
          - source: ./dist/code.tgz
    
    resources:
      jobs:
        train_pipeline:
          name: scheduled-training
          max_concurrent_runs: 1
          schedule:
            quartz_cron_expression: '0 0 9 * * ?'
            timezone_id: UTC
            pause_status: PAUSED
          tasks:
            - task_key: prep
              notebook_task:
                notebook_path: ./prep.py
            - task_key: train
              depends_on:
                - task_key: prep
              environment_key: training
              ai_runtime_task:
                experiment: scheduled-training
                code_source_path: ./dist/code.tgz
                deployments:
                  - command_path: ${workspace.file_path}/command.sh
                    compute:
                      accelerator_type: GPU_1xA10
                      accelerator_count: 1
          environments:
            - environment_key: training
              spec:
                environment_version: '6'
                dependencies:
                  - torch
    
    targets:
      dev:
        mode: development
        default: true
    

Протестируйте и включите планировщик

  1. В scheduled-training/ разверните пакет и запустите вручную:

    databricks bundle validate --target dev
    databricks bundle deploy --target dev
    databricks bundle run train_pipeline --target dev
    
  2. Откройте URL запуска, напечатанный CLI. Убедитесь, что prep выполняется успешно до того, как train начнется. Вывод prep показывает 10 подготовленных строк, а вывод train показывает Trained on cuda:0 и потерю.

  3. В databricks.yml измените у расписания pause_status с PAUSED на UNPAUSED. Блок расписания сейчас такой:

    schedule:
      quartz_cron_expression: '0 0 9 * * ?'
      timezone_id: UTC
      pause_status: UNPAUSED
    
  4. Развернуть изменение для активации ежедневного расписания:

    databricks bundle deploy --target dev
    

    Установка pause_status: UNPAUSED явно включает это расписание даже для цели разработки. В разделе Jobs & Pipelines откройте развернутое задание и убедитесь, что его расписание активно на 09:00 UTC. См . статью "Выполнение заданий по расписанию".

Чтобы приостановить запланированные запуски, установите pause_status: PAUSED и разверните заново. Чтобы удалить пример задачи и файлы, загруженные бандлом, выполните следующее из его каталога bundle:

databricks bundle destroy --target dev

Подготовленные данные в вашем разделе сохраняются. Удалите scheduled-training каталог данных, когда он вам больше не нужен.

Дополнительные ресурсы