GPU iş yüklerini planlayın ve görevler oluşturun

Deklarative Automation Bundles'u kullanarak bir AI Çalışma Zamanı GPU iş yükünü planlayın ve bunu yukarı akış veri hazırlığı gibi diğer işlerle birleştirin. İş yükünü ve takvimini YAML'de tanımlayın, sonra bunları bir Job olarak dağıtın. Bir eğitim iş hattı için, CPU işlem kaynağında ön işleme çalıştırın ve veriler hazır olduktan sonra GPU eğitimine başlayın.

Bu rehber, "Hello world" yazdıran bir iş yüküyle başlar, ardından planlanmış bir ön işleme ve eğitim boru hattı oluşturur. Zaten bir AI Çalışma Zamanı iş yükü YAML'niz varsa, Bir AI Çalışma Zamanı iş yükünü pakete dönüştür sayfasına bakınız.

Nasıl çalışır?

  • Bir paket , sizin kodunuzu ve bir databricks.yml yapılandırmayı içerir.
  • Bir iş, görevleri gruplar ve ne zaman çalıştıklarını tanımlar.
  • Bir ai_runtime_task, komutunuzu AI Runtime'da çalıştırır.

depends_on alanı görevleri yönlendirilmiş bir asiklik grafik (DAG) olarak bağlar ve schedule alanı işinizi bir kadansa göre programlar.

databricks bundle deploy kodu yükler ve işi oluşturur veya günceller. databricks bundle run hemen bir iş çalıştırması başlatır. Her run’da AI Runtime, GPU hesaplamasını sağlar, komutunuzu çalıştırır ve run’ı adlı MLflow deneyine kaydeder.

Requirements

ai_runtime_task içeren Merhaba dünya örneği

Bu örnek, bir A10 GPU'da shell komutu çalıştırıyor.

  1. Paket için bir dizin oluşturun. O dizinde, aşağıdaki içeriklerle command.sh oluşturun:

    #!/usr/bin/env bash
    set -euo pipefail
    echo "Hello world"
    
  2. Aynı dizinde databricks.yml oluşturun:

    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 dizininden doğrulayın, dağıtın ve işi çalıştırın:

    databricks bundle validate --target dev
    databricks bundle deploy --target dev
    databricks bundle run hello --target dev
    
  4. CLI tarafından yazdırılan çalıştırma URL'sini açın ve hello görevinin çıktısını görüntüleyin. İçinde Hello world bulunur. Bu çalışma ayrıca MLflow deneyinde hello-ai-runtime de yer alır.

Daha karmaşık örnek: Ön işleme ve eğitim boru hattı planlayın

Bu örnek, CPU hesaplamasında küçük bir veri seti hazırlar, ardından bir A10 GPU üzerinde doğrusal bir model eğitir. Her iki görev de aynı volume dosyasını kullanarak aralarında veri aktarır. İş her gün 09:00 UTC'ye planlanmış, test edilene kadar program duraklatılmış.

Projeyi oluşturma

  1. Aşağıdaki düzenle ayrı bir dizin oluşturun:

    scheduled-training/
    ├── databricks.yml
    ├── prep.py
    ├── command.sh
    └── src/
        └── train.py
    
  2. Aşağıdaki içerikle oluşturun prep.py. <schema>, <volume> ve <catalog> öğelerini biriminizin adlarıyla değiştirin. Bu kaynak not defteri, giriş değerlerini normalleştirir ve hazırlanan verileri birime yazar:

    # 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. Aşağıdaki içeriklerle src/train.py oluşturun. prep.py içindekiyle aynı birim yolunu kullanın:

    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. Eğitim kodunu çalıştırmak için Oluştur command.sh oluşturun. Aşağıdaki paket src/ içerir, bu nedenle CODE_SOURCE_PATH, çıkarılan src dizinine işaret eder:

    #!/usr/bin/env bash
    set -euo pipefail
    cd "$CODE_SOURCE_PATH"
    python train.py
    
  5. databricks.yml öğesini aşağıdaki içeriklerle oluşturun. Paket, GPU görevi için src/ içerir. prep notebook, sunucusuz CPU hesaplamasında çalışır ve train başarılı olduktan sonra depends_on başlar. max_concurrent_runs: 1 Bu işin çalıştırmaları, birbirlerinin girdi dosyasının üzerine yazmasını önler:

    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
    

Zamanlamayı test et ve etkinleştir

  1. Buradan scheduled-training/demeti dağıtın ve manuel bir çalıştırmaya başlayın:

    databricks bundle validate --target dev
    databricks bundle deploy --target dev
    databricks bundle run train_pipeline --target dev
    
  2. CLI tarafından yazdırılan çalıştırma adresini açın. train başlamadan önce prep işleminin başarılı olduğunu onaylayın. prep çıktısı 10 hazırlanmış satır bildirir ve train çıktısı Trained on cuda:0 ve kaybı bildirir.

  3. databricks.yml içinde, zamanlamanın pause_status değerini PAUSED'den UNPAUSED'e değiştirin. Zamanlama bloğu şimdi:

    schedule:
      quartz_cron_expression: '0 0 9 * * ?'
      timezone_id: UTC
      pause_status: UNPAUSED
    
  4. Günlük programı etkinleştirmek için değişikliği yayınlayın:

    databricks bundle deploy --target dev
    

    pause_status: UNPAUSED değerini açıkça belirtmek, bir geliştirme hedefi için bile bu zamanlamayı etkinleştirir. Jobs & Pipelines’ta, dağıtılan işi açın ve 09:00 UTC için zamanlamasının aktif olduğunu doğrulayın. Bkz İşleri bir zamanlamaya göre çalıştırma.

Zamanlanmış çalışmaları durdurmak için pause_status: PAUSED ayarlayın ve yeniden dağıtın. Örnek işi ve paket tarafından yüklenen dosyaları kaldırmak için, bundle dizininden aşağıdakıları çalıştırın:

databricks bundle destroy --target dev

Biriminizdeki hazırlanan veriler kalır. Artık ihtiyacınız kalmadığında veri scheduled-training dizinini sil.

Ek kaynaklar