Contenu principal

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

batch

Exécuter un script ou une fonction MATLAB sur un worker

Description

j = batch(script) exécute le fichier de script script sur un worker dans le cluster spécifié par le profil de cluster par défaut. (Note : N'incluez pas l'extension de fichier .m avec le nom du script.) La fonction renvoie j, un handle vers l'objet job qui exécute le script. Le fichier de script script est copié sur le worker.

Par défaut, les variables de l'espace de travail sont copiées du client vers les workers lorsque vous exécutez batch(script). Les objets job et task ne sont pas copiés sur les workers.

exemple

j = batch(expression) exécute expression comme une expression sur un worker dans le cluster spécifié par le profil de cluster par défaut. La fonction renvoie j, un handle vers l'objet job qui exécute l'expression.

Par défaut, les variables de l'espace de travail sont copiées du client vers les workers lorsque vous exécutez batch(expression). Les objets job et task ne sont pas copiés sur les workers.

j = batch(myCluster,script) est identique à batch(script) sauf que le script s'exécute sur un worker dans le cluster spécifié par l'objet cluster myCluster.

j = batch(myCluster,expression) est identique à batch(expression) sauf que l'expression s'exécute sur un worker dans le cluster spécifié par l'objet cluster myCluster.

j = batch(fcn,N,{x1,...,xn}) exécute la fonction fcn sur un worker dans le cluster spécifié par le profil de cluster par défaut. La fonction renvoie j, un handle vers l'objet job qui exécute la fonction. La fonction est évaluée avec les arguments donnés, x1,...,xn, et renvoie les arguments de sortie N. Le fichier de fonction pour fcn est copié sur le worker. (Note : N'incluez pas l'extension de fichier .m avec l'argument du nom de la fonction.)

exemple

j = batch(myCluster,fcn,N,{x1,...,xn}) est identique à batch(fcn,N,{x1,...,xn}) sauf que la fonction s'exécute sur un worker dans le cluster spécifié par l'objet cluster myCluster.

exemple

j = batch(___,Name,Value) spécifie les options qui modifient le comportement d'un job à l'aide d'un ou plusieurs arguments nom-valeur. Ces options prennent en charge le traitement par lots pour les fonctions et les scripts, sauf indication contraire. Utilisez cette syntaxe en plus de l’une des combinaisons d’arguments d’entrée dans les syntaxes précédentes.

exemple

Exemples

réduire tout

Cet exemple montre comment utiliser batch pour décharger le travail vers une session de travail MATLAB ® qui s'exécute en arrière-plan.

Vous pouvez continuer à utiliser MATLAB pendant que les calculs sont en cours.

Exécutez un script en tant que job en batch en utilisant la fonction batch. Par défaut, batch utilise votre profil de cluster par défaut. Vérifiez votre profil de cluster par défaut dans l'onglet MATLAB Accueil, dans la section Environnement, dans Parallèle > Sélectionner Environnement parallèle. Vous pouvez également spécifier un profil de cluster avec l'argument de paire nom-valeur 'Profile'.

job = batch('myScript');

batch ne bloque pas MATLAB et vous pouvez continuer à travailler pendant que les calculs ont lieu.

Si vous souhaitez bloquer MATLAB jusqu'à ce que le job se termine, utilisez la fonction wait sur l'objet job.

wait(job);

Par défaut, MATLAB enregistre la sortie de la fenêtre de commande du job en batch dans le journal du job. Pour le récupérer, utilisez la fonction diary.

diary(job)
--- Start Diary ---
n = 100

--- End Diary ---

Une fois le job terminé, récupérez les résultats en utilisant la fonction load.

load(job,'x');
plot(x)

Si vous souhaitez charger toutes les variables dans le job en batch, utilisez plutôt load(job).

Une fois que vous avez chargé toutes les variables requises, supprimez l'objet job pour nettoyer ses données et éviter de consommer des ressources inutilement.

delete(job);
clear job

Notez que si vous envoyez un fichier de script en utilisant batch, MATLAB transfère toutes les variables de l'espace de travail au cluster, même si votre script ne les utilise pas. Le temps de transfert de données pour un grand espace de travail peut être substantiel. En tant que meilleure pratique, convertissez votre script en fichier de fonction pour éviter cette surcharge de communication. Pour un exemple utilisant une fonction, voir Exécuter des jobs en batch et accéder aux fichiers à partir des workers .

Pour des options plus avancées avec batch, voir Exécuter des jobs en batch et accéder aux fichiers à partir des workers .

Vous pouvez décharger vos calculs pour les exécuter en arrière-plan en utilisant batch .

Si votre code nécessite l'accès à des fichiers, vous pouvez utiliser des options supplémentaires, telles que 'AttachedFiles' ou 'AdditionalPaths', pour rendre les données accessibles. Vous pouvez continuer à travailler dans MATLAB pendant que les calculs ont lieu. Si vous soumettez vos calculs à un cluster distant, vous pouvez fermer MATLAB et récupérer les résultats ultérieurement.

Préparer un exemple

Utilisez la fonction de support prepareSupportingFiles pour copier les données nécessaires à cet exemple dans votre dossier de travail actuel.

prepareSupportingFiles;

Votre dossier de travail actuel contient désormais 4 fichiers : A.dat, B1.dat, B2.dat et B3.dat.

Exécuter un job en batch

Créez un objet cluster en utilisant parcluster . Par défaut, parcluster utilise votre profil de cluster par défaut. Vérifiez votre profil de cluster par défaut dans l'onglet MATLAB Accueil, dans la section Environnement, dans Parallèle > Sélectionner un cluster par défaut.

c = parcluster();

Placez votre code dans une fonction et soumettez-le sous forme de job en batch en utilisant batch. Pour un exemple de fonction personnalisée, voir la fonction de support divideData. Spécifiez le nombre attendu d'arguments de sortie et un cell array avec des entrées pour la fonction.

Notez que si vous envoyez un fichier de script par lots, MATLAB transfère toutes les variables de l'espace de travail vers le cluster, même si votre script ne les utilise pas. Si vous disposez d'un grand espace de travail, cela a un impact négatif sur le temps de transfert des données. En tant que meilleure pratique, convertissez votre script en fichier de fonction pour éviter cette surcharge de communication. Vous pouvez le faire en ajoutant simplement une ligne de fonction au début de votre script. Pour réduire la surcharge dans cet exemple, divideData est défini dans un fichier en dehors de ce script en direct.

Si votre code utilise un pool parallèle, utilisez l'argument de paire nom-valeur 'Pool' pour créer un pool parallèle avec le nombre de workers que vous spécifiez. batch utilise un worker supplémentaire pour exécuter la fonction elle-même.

Par défaut, batch modifie le dossier de travail initial des workers vers le dossier actuel du client MATLAB. Il peut être utile de contrôler le dossier de travail initial dans les workers. Par exemple, vous souhaiterez peut-être le contrôler si votre cluster utilise un système de fichiers différent et que, par conséquent, les chemins sont différents, comme lorsque vous soumettez depuis une machine cliente Windows vers un cluster Linux.

  • Pour conserver le dossier de travail initial des workers et utiliser leur valeur par défaut, définissez 'CurrentFolder' sur '.' .

  • Pour modifier le dossier de travail initial, définissez 'CurrentFolder' sur un dossier de votre choix.

Cet exemple utilise un pool parallèle avec trois workers et choisit un emplacement temporaire pour le dossier de travail initial. Utilisez batch pour décharger les calculs dans divideData .

job = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir);

batch exécute divideData sur un worker parallèle, vous pouvez donc continuer à travailler dans MATLAB pendant que les calculs ont lieu.

Si vous souhaitez bloquer MATLAB jusqu'à ce que le job soit terminé, utilisez la fonction wait sur l'objet job.

wait(job);

Pour récupérer les résultats, utilisez fetchOutputs sur l'objet job. Comme divideData dépend d'un fichier que les workers ne peuvent pas trouver, fetchOutputs génère une erreur. Vous pouvez accéder aux informations d'erreur en utilisant getReport sur la propriété Error des objets Task dans le job. Dans cet exemple, le code dépend d'un fichier que les workers ne peuvent pas trouver.

getReport(job.Tasks(1).Error)
ans = 
    'Error using divideData (line 4)
     Unable to read file 'B2.dat'. No such file or directory.'

Accéder aux fichiers à partir des workers

Par défaut, batch analyse automatiquement votre code et transfère les fichiers requis aux workers. Dans certains cas, vous devez transférer explicitement ces fichiers, par exemple lorsque vous déterminez le nom d'un fichier au moment de l'exécution.

Dans cet exemple, divideData accède au fichier de support A.dat, que batch détecte et transfère automatiquement. La fonction accède également à B1.dat, mais elle résout le nom du fichier au moment de l'exécution, de sorte que l'analyse automatique des dépendances ne le détecte pas.

type divideData.m 
function X = divideData()
    A = load("A.dat"); 
    X = zeros(flip(size(A)));
    parfor i = 1:3
        B = load("B" + i + ".dat");
        X = X + A\B;
    end
end

Si les données se trouvent dans un emplacement auquel les workers peuvent accéder, vous pouvez utiliser l'argument de paire nom-valeur 'AdditionalPaths' pour spécifier l'emplacement. ''AdditionalPaths' ajoute ce chemin au chemin de recherche MATLAB des workers et rend les données visibles pour eux.

pathToData = pwd;
job(2) = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir, ...
    'AdditionalPaths',pathToData);
wait(job(2));

Si les données se trouvent dans un emplacement auquel les workers ne peuvent pas accéder, vous pouvez transférer des fichiers vers les workers en utilisant l'argument de paire nom-valeur 'AttachedFiles'. Vous devez transférer des fichiers si le client et les workers ne partagent pas le même système de fichiers ou si votre cluster utilise l'interface de planification générique en mode non partagé. Pour plus d'informations, voir Configure Using the Generic Scheduler Interface (MATLAB Parallel Server).

filenames = "B" + string(1:3) + ".dat";
job(3) = batch(c,@divideData,1,{}, ...
    'Pool',3, ...
    'CurrentFolder',tempdir, ...
    'AttachedFiles',filenames);

Trouver un job existant

Si vous soumettez le job à un cluster de suppression, vous pouvez fermer MATLAB après la soumission du job et récupérer les résultats ultérieurement. Avant de fermer MATLAB, notez l'ID du job.

job3ID = job(3).ID
job3ID = 25

Lorsque vous ouvrez à nouveau MATLAB, vous pouvez trouver le job en utilisant la fonction findJob.

job(3) = findJob(c,'ID',job3ID);
wait(job(3));

Vous pouvez également utiliser le Job Monitor pour suivre votre job. Vous pouvez l'ouvrir à partir de l'onglet MATLAB Accueil, dans la section Environnement, dans Parallèle > Surveiller les jobs.

Récupérer les résultats et nettoyer les données

Pour récupérer les résultats d'un job en batch, utilisez la fonction fetchOutputs. fetchOutputs renvoie un cell array avec les sorties de la fonction exécutée avec batch.

X = fetchOutputs(job(3))
X = 1×1 cell array
    {40×207 double}

Lorsque vous avez récupéré toutes les sorties requises et que vous n'avez plus besoin de l'objet job, supprimez-le pour nettoyer ses données et éviter de consommer des ressources inutilement.

delete(job)
clear job

Arguments d'entrée

réduire tout

Script MATLAB, spécifié comme un vecteur de caractères ou un string scalar.

Par défaut, les variables de l'espace de travail sont copiées du client vers les workers lorsque vous spécifiez cet argument. Les objets job et task ne sont pas copiés sur les workers.

Exemple : batch('aScript');

Types de données : char | string

Expression à évaluer, spécifiée comme un vecteur de caractères ou un string scalar.

Par défaut, les variables de l'espace de travail sont copiées du client vers les workers lorsque vous spécifiez cet argument. Les objets job et task ne sont pas copiés sur les workers.

Exemple : batch('y = magic(3)');

Types de données : char | string

Cluster, spécifié comme un objet parallel.Cluster qui représente les ressources de calcul du cluster. Pour créer l'objet, utilisez la fonction parcluster.

Exemple : cluster = parcluster; batch(cluster,'aScript');

Types de données : parallel.Cluster

Fonction à évaluer par le worker, spécifiée comme un handle de fonction ou un nom de fonction.

Exemple : batch(@myFunction,1,{x,y});

Types de données : char | string | function_handle

Nombre de sorties attendues de la fonction évaluée fcn, spécifiée sous la forme d'un entier non négatif.

Exemple : batch(@myFunction,1,{x,y});

Types de données : single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Arguments d'entrée de la fonction fcn, spécifiés sous forme de cell array.

Exemple : batch(@myFunction,1,{x,y});

Types de données : cell

Arguments nom-valeur

réduire tout

Spécifiez des paires d'arguments facultatives comme Name1=Value1,...,NameN=ValueN, où Name est le nom de l'argument et Value est la valeur correspondante. Les arguments nom-valeur doivent apparaître après les autres arguments, mais l'ordre des paires n'a pas d'importance.

Avant R2021a, utilisez des virgules pour séparer chaque nom et valeur, et entourez Name de guillemets.

Exemple : j = batch(@myFunction,1,{x,y},'Pool',3);

Variables à copier sur les workers, spécifiées sous la forme d'une paire séparée par des virgules composée de 'Workspace' et d'un scalaire de structure.

La valeur par défaut est une structure scalaire avec des champs correspondant à des variables dans l'espace de travail client. Spécifiez les variables comme champs dans la structure scalaire.

Les variables de l'espace de travail ne sont copiées du client vers les workers que si vous spécifiez script ou expression. Les objets job et task ne sont pas copiés sur les workers.

Exemple : workspace.myVar = 5; j = batch('aScript','Workspace',workspace);

Types de données : struct

Profil de cluster utilisé pour identifier le cluster, spécifié comme la paire séparée par des virgules composée de 'Profile' et d'un vecteur de caractères ou d'une chaîne de caractères. Si cette option est omise, le profil par défaut est utilisé pour identifier le cluster et est appliqué aux propriétés du job et de la task.

Exemple : j = batch('aScript','Profile','Processes');

Types de données : char | string

Chemins à ajouter au chemin de recherche MATLAB des workers avant l'exécution du script ou de la fonction, spécifiés sous la forme d'une paire séparée par des virgules composée de 'AdditionalPaths' et d'un vecteur de caractères, d'un tableau de chaîne de caractères ou d'un cell array de vecteurs de caractères.

Le chemin de recherche par défaut peut ne pas être le même sur les workers et sur le client ; la différence de chemin peut être le résultat de dossiers de travail actuels différents (cwd), de plates-formes ou d'accès au système de fichiers réseau. La spécification de l'argument nom-valeur 'AdditionalPaths' permet de garantir que les workers recherchent des fichiers, tels que des fichiers de code, des fichiers de données ou des fichiers de modèle, aux emplacements corrects.

Vous pouvez utiliser 'AdditionalPaths' pour accéder aux fichiers d'un système de fichiers partagé. Notez que les représentations de chemin peuvent varier en fonction des machines cibles. 'AdditionalPaths' doit être les chemins tels que vus par les machines du cluster. Par exemple, si Z:\data sur votre machine Windows® locale est /network/data sur votre cluster Linux®, ajoutez ce dernier à 'AdditionalPaths'. Si vous utilisez un datastore, utilisez plutôt 'AlternateFileSystemRoots' pour gérer d'autres représentations. Pour plus d'informations, voir Set Up Datastore for Processing on Different Machines or Clusters.

Notez que AdditionalPaths aide uniquement à trouver des fichiers lorsque vous y faites référence à l'aide d'un chemin relatif ou d'un nom de fichier, et non d'un chemin absolu.

Exemple : j = batch(@myFunction,1,{x,y},'AdditionalPaths','/network/data/');

Types de données : char | string | cell

Fichiers ou dossiers à transférer aux workers, spécifiés comme une paire séparée par des virgules composée de 'AttachedFiles' et d'un vecteur de caractères, d'un tableau de chaînes de caractères ou d'un cell array de vecteurs de caractères.

Exemple : j = batch(@myFunction,1,{x,y},'AttachedFiles','myData.dat');

Types de données : char | string | cell

Indicateur permettant d'ajouter des entrées ajoutées par l'utilisateur sur le chemin client aux chemins de travail, spécifiés comme la paire séparée par des virgules composée de 'AutoAddClientPath' et d'une valeur logique.

Exemple : j = batch(@myFunction,1,{x,y},'AutoAddClientPath',false);

Types de données : logical

Drapeau permettant d'activer l'analyse des dépendances et de joindre automatiquement les fichiers de code au job, spécifié comme la paire séparée par des virgules composée de 'AutoAttachFiles' et d'une valeur logique. Si vous définissez la valeur sur true, le script ou la fonction batch est analysé et les fichiers de code dont il dépend sont automatiquement transférés aux workers.

Exemple : j = batch(@myFunction,1,{x,y},'AutoAttachFiles',true);

Types de données : logical

Dossier dans lequel le script ou la fonction s'exécute, spécifié comme une paire séparée par des virgules composée de 'CurrentFolder' et d'un vecteur de caractères ou d'une chaîne de caractères. Il n’y a aucune garantie que ce dossier existe sur le worker. La valeur par défaut de cette propriété est le répertoire courant de MATLAB lorsque la commande batch est exécutée. Si l'argument est '.', il n'y a aucun changement dans le dossier avant l'exécution par lots.

Exemple : j = batch(@myFunction,1,{x,y},'CurrentFolder','.');

Types de données : char | string

Drapeau permettant de collecter le journal à partir de l'appel de fonction, spécifié comme la paire séparée par des virgules composée de 'CaptureDiary' et d'une valeur logique. Pour plus d'informations sur les données collectées, voir diary.

Exemple : j = batch('aScript','CaptureDiary',false);

Types de données : logical

Variables d'environnement à copier de la session client vers les workers, spécifiées sous la forme d'une paire séparée par des virgules composée de 'EnvironmentVariables' et d'un vecteur de caractères, d'un tableau de chaînes de caractères ou d'un cell array de vecteurs de caractères. Les noms spécifiés ici sont ajoutés à la propriété EnvironmentVariables spécifiée dans le profil parallèle applicable pour former la liste complète des variables d'environnement. Les variables répertoriées qui ne sont pas définies ne sont pas copiées vers les workers. Ces variables d’environnement sont définies sur les workers pour la durée du job en batch.

Exemple : j = batch('aScript','EnvironmentVariables',"MY_ENV_VAR");

Types de données : char | string | cell

Nombre de workers à intégrer dans un pool parallèle, spécifié comme une paire séparée par des virgules composée de 'Pool' et soit :

  • Un entier non négatif.

  • Un vecteur à 2 éléments d'entiers non négatifs, qui est interprété comme une plage. La taille du pool parallèle résultant est aussi grande que possible dans la plage demandée.

De plus, notez que batch utilise un autre worker pour exécuter le job en batch lui-même.

Le script ou la fonction utilise ce pool pour exécuter des instructions telles que parfor et spmd qui se trouvent à l'intérieur du code par lots. Étant donné que le pool nécessite N workers en plus du worker exécutant le lot, le cluster doit avoir au moins N+1 workers disponibles. Vous n’avez pas besoin d’un pool parallèle déjà en cours d’exécution pour exécuter batch, et le nouveau pool créé par lots n’est pas lié à un pool que vous avez peut-être déjà ouvert. Pour plus d'informations, voir Run Batch Job with Parallel Pool.

Si vous utilisez la valeur par défaut, 0, le script ou la fonction s'exécute sur un seul worker et non sur un pool parallèle.

batch prend en charge les pools avec jusqu'à 2000 workers. (depuis R2024a)

Exemple : j = batch(@myFunction,1,{x,y},'Pool',4);

Exemple : j = batch(@myFunction,1,{x,y},'Pool',[2,6]);

Types de données : single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Depuis R2024a

Drapeau permettant de spécifier si la prise en charge de spmd est activée sur le pool parallèle d'un job en batch, spécifié comme valeur logique. Vous ne pouvez désactiver la prise en charge que sur un cluster Job Scheduler local ou MATLAB.

Les itérations parfor n'impliquent pas de communication entre les workers. Par conséquent, si 'SpmdEnabled' est false, une boucle parfor continue même si un ou plusieurs workers s'arrêtent pendant l'exécution de la boucle.

Types de données : logical

Arguments de sortie

réduire tout

Job, renvoyé sous forme d'objet parallel.Job.

Exemple : j = batch('aScript');

Types de données : parallel.Job

Conseils

  • Pour afficher l'état ou suivre la progression d'un job en batch, utilisez le moniteur de jobs, comme décrit dans Job Monitor. Vous pouvez également utiliser le moniteur de jobs pour récupérer un objet de job pour un job en batch créé dans une session différente ou pour un job en batch créé sans renvoyer d'objet de job à partir de l'appel batch.

  • Supprimez tous les jobs en batch dont vous n’avez plus besoin pour éviter de consommer inutilement des ressources de stockage de cluster.

  • Pour développer et tester votre code, vous pouvez exécuter des jobs en batch sur un cluster local de votre machine cliente. Si vous fermez votre session MATLAB, tous les jobs en batch utilisant le cluster local s'arrêtent également immédiatement.

  • Lorsque vous déchargez du travail vers un cluster distant, vous pouvez fermer la session client MATLAB pendant le traitement du job en batch et récupérer les informations d'un job en batch ultérieurement ou dans une nouvelle session client.

Historique des versions

Introduit dans R2008a

développer tout