Planifier des charges de travail GPU et composer des tâches
Utilisez les Declarative Automation Bundles pour planifier une charge de travail GPU AI Runtime et la combiner avec d’autres travaux, comme la préparation des données en amont. Définissez la charge de travail et son calendrier en YAML, puis déployez-les en tant que Job. Pour un pipeline d’entraînement, exécutez le prétraitement sur le CPU compute et start l’entraînement GPU une fois les données prêtes.
Ce guide commence avec une charge de travail qui imprime « Hello world », puis crée un pipeline de prétraitement et d’entraînement planifié. Si vous avez déjà un YAML de charge de travail AI Runtime, consultez Convertir une charge de travail AI Runtime en bundle.
Comment ça marche
- Un bundle contient votre code et une configuration
databricks.yml. - Un job regroupe des tâches et définit le moment de leur exécution.
- Un
ai_runtime_taskexécute votre commande sur le Runtime IA.
Le champ depends_on connecte les tâches dans un graphe orienté acyclique (DAG), et le champ schedule programme votre job pour qu’il s’exécute selon un rythme défini.
databricks bundle deploy upload le code et crée ou met à jour le Job. databricks bundle run start immédiatement une exécution de Job. À chaque exécution, AI Runtime effectue le provisionnement du compute GPU, exécute votre commande et enregistre l'exécution dans l'Experimentation MLflow nommée.
Configuration requise
- Un workspace dans une région prise en charge. Voir Exigences.
- La dernière version de la CLI Databricks, authentifiée auprès de votre workspace. Mettez à jour une installation existante avant d'utiliser ces exemples.
- Pour l'exemple de prétraitement, un volume Unity Catalog existant. L'identité d'exécution du job nécessite les privilèges
USE CATALOG,USE SCHEMA,READ VOLUMEetWRITE VOLUMEpour ce volume. Voir Privilèges pour les volumes Unity Catalog.
Exemple Bonjour tout le monde avec ai_runtime_task
Cet exemple exécute une commande Shell sur un GPU A10.
-
Créer un répertoire pour le bundle. Dans ce répertoire, créez
command.shavec les contenus suivants :Bash#!/usr/bin/env bashset -euo pipefailecho "Hello world" -
Créer
databricks.ymldans le même répertoire :YAMLbundle:name: hello-ai-runtimeresources:jobs:hello:name: hello-ai-runtimetasks:- task_key: helloenvironment_key: defaultai_runtime_task:experiment: hello-ai-runtimedeployments:- command_path: ${workspace.file_path}/command.shcompute:accelerator_type: GPU_1xA10accelerator_count: 1environments:- environment_key: defaultspec:environment_version: '6'targets:dev:mode: developmentdefault: true -
Depuis le répertoire du bundle, validez, déployez et lancez le job :
Bashdatabricks bundle validate --target devdatabricks bundle deploy --target devdatabricks bundle run hello --target dev -
Ouvrez l'URL d'exécution affichée par le CLI et affichez la sortie de la tâche
hello. Il contientHello world. L'exécution apparaît également dans l’Experimentation MLflowhello-ai-runtime.
Exemple plus complexe : Planifier un pipeline de prétraitement et d’entraînement
Cet exemple prépare un petit dataset sur un compute CPU, puis entraîne un modèle linéaire sur un GPU A10. Les deux tâches utilisent le même fichier de volume pour transmettre des données entre elles. Le job est programmé quotidiennement à 09:00 UTC, avec le planning en pause jusqu'à ce que vous le testiez.
Créer le projet
-
Créez un répertoire séparé avec le layout suivant :
Textscheduled-training/├── databricks.yml├── prep.py├── command.sh└── src/└── train.py -
Créez
prep.pyavec les contenus suivants. Remplacez<catalog>,<schema>et<volume>par les noms de vos volumes. Ce notebook source normalise les valeurs d’entrée et écrit les données préparées dans le volume :Python# Databricks notebook sourceimport jsonfrom pathlib import Pathdata_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}") -
Créez
src/train.pyavec le contenu suivant. Utilisez le même chemin de volume que dansprep.py:Pythonimport jsonfrom pathlib import Pathimport torchdata_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}") -
Créer
command.shpour exécuter le code d’entraînement. Le bundle ci-dessous packagesrc/, doncCODE_SOURCE_PATHpointe vers le répertoiresrcextrait :Bash#!/usr/bin/env bashset -euo pipefailcd "$CODE_SOURCE_PATH"python train.py -
Créez
databricks.ymlavec le contenu suivant. Le bundle packagesrc/pour la tâche GPU. Le Notebookpreps'exécute sur le compute CPU Serverless, etdepends_onstarttrainseulement après queprepa réussi.max_concurrent_runs: 1empêche les exécutions de ce job de remplacer leurs fichiers d'entrée respectifs :YAMLbundle:name: scheduled-trainingartifacts:code:type: tgzpath: .include: [src]files:- source: ./dist/code.tgzresources:jobs:train_pipeline:name: scheduled-trainingmax_concurrent_runs: 1schedule:quartz_cron_expression: '0 0 9 * * ?'timezone_id: UTCpause_status: PAUSEDtasks:- task_key: prepnotebook_task:notebook_path: ./prep.py- task_key: traindepends_on:- task_key: prepenvironment_key: trainingai_runtime_task:experiment: scheduled-trainingcode_source_path: ./dist/code.tgzdeployments:- command_path: ${workspace.file_path}/command.shcompute:accelerator_type: GPU_1xA10accelerator_count: 1environments:- environment_key: trainingspec:environment_version: '6'dependencies:- torchtargets:dev:mode: developmentdefault: true
Tester et activer le calendrier
-
Depuis
scheduled-training/, déployez le bundle et start une exécution manuelle :Bashdatabricks bundle validate --target devdatabricks bundle deploy --target devdatabricks bundle run train_pipeline --target dev -
Ouvrez l’URL d’exécution imprimée par le CLI. Confirmez que
prepest réussi avant quetrainstart. Le résultatprepindique 10 lignes préparées et le résultattrainindiqueTrained on cuda:0et la perte. -
Dans
databricks.yml, modifiezpause_statusdu planning dePAUSEDàUNPAUSED. Le bloc de planning est maintenant :YAMLschedule:quartz_cron_expression: '0 0 9 * * ?'timezone_id: UTCpause_status: UNPAUSED -
Déployez la modification pour activer le planning quotidien :
Bashdatabricks bundle deploy --target devLa définition de
pause_status: UNPAUSEDactive explicitement ce calendrier même pour une cible de développement. Dans Jobs et pipelines , ouvrez le job déployé et confirmez que son planning est actif pour 09:00 UTC. Voir Exécuter des jobs selon un calendrier.
Pour suspendre des exécutions programmées, définissez pause_status: PAUSED et déployez à nouveau. Pour supprimer le Job d’exemple et les fichiers upload par le bundle, exécutez la commande suivante depuis son répertoire :
databricks bundle destroy --target dev
Les données préparées dans votre volume sont conservées. Supprimez le répertoire de données scheduled-training lorsque vous n'en avez plus besoin.
Ressources supplémentaires
- Convertir un YAML de charge de travail AI Runtime existant en bundle. Voir Convertir une charge de travail AI Runtime en bundle.
- Configurez l’empaquetage du code, le compute, les environnements et les paramètres des tâches. Consultez Configurer des tâches de bundle AI Runtime.
- Planifiez un notebook existant sur GPU. Consultez Créer et gérer des jobs de notebook planifiés.
- Suivez les exécutions d'entraînement. Voir suivi de l’Experimentation et observabilité.
- Checkpoint pour l'état du modèle, l'optimiseur et le pipeline de données. Consultez Améliorer les performances et la résilience de l’entraînement sur l’IA Runtime.