| 272 | === Les jobs paramétriques === |
| 273 | |
| 274 | Pour soumettre des jobs identiques en tous points sauf pour un seul paramètre d'exécution, on peut utiliser un job paramétrique : plutôt que de créer un .jdl par job, on crée un seul fichier .jdl dont la soumission va générer automatiquement la collection de jobs. C'est une variante des collections de job décrites précédemment. |
| 275 | |
| 276 | Les attribut JDL suivants sont utilisés pour définir un job paramétrique : |
| 277 | |
| 278 | * Parameters : une liste d'éléments (ex: {a, b, c}, {2, 7, 20}) ou un entier représentant la valeur maximale du paramètre |
| 279 | * ParameterStart : un entier représentant la valeur minimale du paramètre |
| 280 | * ParameterStep : un entier représentant l'incrément du paramètre |
| 281 | |
| 282 | Si `Parameters` est un entier, le nombre de jobs générés est : |
| 283 | {{{ |
| 284 | N = (Parameters - ParameterStart) / ParameterStep |
| 285 | }}} |
| 286 | |
| 287 | Pour que tous les jobs tournent sur le même CE, mettre la ligne suivante dans le .jdl : |
| 288 | {{{ |
| 289 | NodesCollocation = true; |
| 290 | }}} |
| 291 | |
| 292 | __Exemple 1__ : un programme exécuté avec 4 fichiers différents `Input1.txt`, `Input2.txt`, `Input3.txt`, `Input4.txt`. |
| 293 | |
| 294 | * Créer le script correspondant au programme : |
| 295 | {{{ |
| 296 | [diarra@ipngrid01 ParametricJobs]$ cat ParametricNum.sh |
| 297 | #!/bin/sh |
| 298 | MyParam=$1 |
| 299 | echo "Debut execution du programme" |
| 300 | echo "Parametre = ${MyParam}" |
| 301 | # On peut travailler sur le fichier de Input et de Output |
| 302 | # cat Input${MyParam}.txt > Output${MyParam}.txt |
| 303 | }}} |
| 304 | |
| 305 | * Créer le JDL suivant (_PARAM_ vaudra successivement 1, 2, 3 puis 4) : |
| 306 | {{{ |
| 307 | [diarra@ipngrid01 ParametricJobs]$ cat ParametricNum.jdl |
| 308 | JobType = "Parametric"; |
| 309 | Executable = "ParametricNum.sh"; |
| 310 | Arguments = "_PARAM_"; |
| 311 | StdOutput = "std.out"; |
| 312 | StdError = "std.err"; |
| 313 | InputSandbox = {"ParametricNum.sh", "Input_PARAM_.txt"}; |
| 314 | OutputSandbox = {"std.out", "std.err", "Output_PARAM_.txt" }; |
| 315 | MyProxyServer = "myproxy.grif.fr"; |
| 316 | Parameters = 5; |
| 317 | ParameterStart = 1; |
| 318 | ParameterStep = 1; |
| 319 | #NodesCollocation = true; |
| 320 | #Requirements = RegExp("ipngrid12.*\.fr:2119/jobmanager.*ipno$", other.GlueCEUniqueID); |
| 321 | }}} |
| 322 | |
| 323 | * Soumettre le job : |
| 324 | {{{ |
| 325 | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-submit -a -o jid ParametricNum.jdl |
| 326 | }}} |
| 327 | |
| 328 | * Vérifier le status du job et l'existence de 4 sous-jobs : |
| 329 | {{{ |
| 330 | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-status -i jid |
| 331 | |
| 332 | ************************************************************* |
| 333 | BOOKKEEPING INFORMATION: |
| 334 | Status info for the Job : https://grid02.lal.in2p3.fr:9000/7X5T_8XEcxUjDeng1q92Wg |
| 335 | Current Status: Running |
| 336 | Submitted: Fri Jun 6 16:31:52 2008 CEST |
| 337 | ************************************************************* |
| 338 | - Nodes information for: |
| 339 | Status info for the Job : https://grid02.lal.in2p3.fr:9000/6zsSfE0nVOVyrWCQPga6fw |
| 340 | Current Status: Running |
| 341 | Status Reason: Job successfully submitted to Globus |
| 342 | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
| 343 | Submitted: Fri Jun 6 16:31:52 2008 CEST |
| 344 | ************************************************************* |
| 345 | Status info for the Job : https://grid02.lal.in2p3.fr:9000/DFqOECrwMEWmmpZs65oG3Q |
| 346 | Current Status: Running |
| 347 | Status Reason: Job successfully submitted to Globus |
| 348 | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
| 349 | Submitted: Fri Jun 6 16:31:52 2008 CEST |
| 350 | ************************************************************* |
| 351 | Status info for the Job : https://grid02.lal.in2p3.fr:9000/Ez2DyOUSDxCof9Sh0pQPog |
| 352 | Current Status: Running |
| 353 | Status Reason: Job successfully submitted to Globus |
| 354 | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
| 355 | Submitted: Fri Jun 6 16:31:52 2008 CEST |
| 356 | ************************************************************* |
| 357 | Status info for the Job : https://grid02.lal.in2p3.fr:9000/FxUda1Mz5DyB7SglhMDBEw |
| 358 | Current Status: Scheduled |
| 359 | Status Reason: Job successfully submitted to Globus |
| 360 | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
| 361 | Submitted: Fri Jun 6 16:31:52 2008 CEST |
| 362 | ************************************************************* |
| 363 | }}} |
| 364 | |
| 365 | * Quand le status de la collection de jobs est `Done`, récupérer l'output des différents jobs en utilisant la procédure habituelle. Comme dans toutes les collections de job, il y a un répertoire par sous-job et le fichier `ids_nodes.map` indique le nom du répertoire associé à chaque sous-job : |
| 366 | {{{ |
| 367 | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-output -i jid |
| 368 | |
| 369 | Connecting to the service https://grid09.lal.in2p3.fr:7443/glite_wms_wmproxy_server |
| 370 | ================================================================================ |
| 371 | JOB GET OUTPUT OUTCOME |
| 372 | |
| 373 | Output sandbox files for the DAG/Collection : |
| 374 | https://grid02.lal.in2p3.fr:9000/7X5T_8XEcxUjDeng1q92Wg |
| 375 | have been successfully retrieved and stored in the directory: |
| 376 | /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg |
| 377 | ================================================================================ |
| 378 | }}} |
| 379 | |
| 380 | * Visualiser l'output du 3ème job et vérifier qu'il a bien reçu la valeur `3` en paramètre : |
| 381 | {{{ |
| 382 | [diarra@ipngrid01 ParametricJobs]$ cat /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/Node_3/std.out |
| 383 | Debut execution du programme |
| 384 | Parametre = 3 |
| 385 | }}} |
| 386 | |
| 387 | |
| 388 | __ Exemple 2__ : un programme de simulation; `my_sim.exe` doit faire trois simulations `alpha`, `beta` et `gamma`. Dans ce cas on n'utilise que l'attribut `Parameters` et le JDL sera : |
| 389 | {{{ |
| 390 | JobType = "Parametric"; |
| 391 | Executable = "my_sim.exe"; |
| 392 | Arguments = "_PARAM_"; |
| 393 | Parameters = {alpha, beta, gamma}; |
| 394 | InputSandbox = {"my_sim.exe", ...}; |
| 395 | ... |
| 396 | }}} |
| 397 | |
| 398 | ''Note : il ne faut pas mettre de "" autour des éléments contenus dans `Parameters`.'' |
| 399 | |
| 400 | |
345 | | === Les jobs paramétriques === |
346 | | |
347 | | Pour soumettre des jobs identiques à tous points sauf pour un seul paramètre d'exécution, on peut utiliser un job paramétrique. En d'autres termes, plutôt que de créer un .jdl par job, on crée un seul fichier .jdl dont la soumission |
348 | | va générer automatiquement la collection de jobs. |
349 | | |
350 | | On se sert des attribut JDL suivants : |
351 | | |
352 | | * Parameters : un entier ou une liste d'éléments (ex: {a, b, c}, {2, 7, 20}) |
353 | | * ParameterStart : un entier |
354 | | * ParameterStep : un entier |
355 | | |
356 | | Si Parameters est un entier, le nombre de jobs généré est : |
357 | | |
358 | | {{{ |
359 | | N = (Parameters - ParameterStart) / ParameterStep |
360 | | }}} |
361 | | Si on veut que tous les jobs tournent sur le même CE, on peut mettre la ligne |
362 | | suivante dans le .jdl : |
363 | | |
364 | | {{{ |
365 | | NodesCollocation = true; |
366 | | }}} |
367 | | Prenoms un exemple. Nous avons un programme qui doit tourner avec 4 fichiers Input1.txt, Input2.txt, Input3.txt, Input4.txt. Plutôt que de créer 4 .jdl, on peut créer le job paramétrique que voici : |
368 | | |
369 | | {{{ |
370 | | [diarra@ipngrid01 ParametricJobs]$ cat ParametricNum.jdl |
371 | | JobType = "Parametric"; |
372 | | Executable = "ParametricNum.sh"; |
373 | | Arguments = "_PARAM_"; |
374 | | StdOutput = "std.out"; |
375 | | StdError = "std.err"; |
376 | | InputSandbox = {"ParametricNum.sh", "Input_PARAM_.txt"}; |
377 | | OutputSandbox = {"std.out", "std.err", "Output_PARAM.txt" }; |
378 | | MyProxyServer = "myproxy.grif.fr"; |
379 | | Parameters = 5; |
380 | | ParameterStart = 1; |
381 | | ParameterStep = 1; |
382 | | #NodesCollocation = true; |
383 | | #Requirements = RegExp("ipngrid12.*\.fr:2119/jobmanager.*ipno$", other.GlueCEUniqueID); |
384 | | }}} |
385 | | |
386 | | {{{ |
387 | | [diarra@ipngrid01 ParametricJobs]$ cat ParametricNum.sh |
388 | | #!/bin/sh |
389 | | MyParam=$1 |
390 | | echo "Debut execution du programme" |
391 | | echo "Parametre = ${MyParam}" |
392 | | # On peut travailler sur le fichier de Input et de Output |
393 | | # cat Input${MyParam}.txt > Output${MyParam}.txt |
394 | | }}} |
395 | | |
396 | | Les explications : |
397 | | |
398 | | * ParameterStart : c'est la valeur de départ du paramètre |
399 | | * ParameterStep : c'est la valeur de l'incrément |
400 | | * Parameters : c'est la valeur maximale (N.B.: si Parameters=N, les valeurs utilisées sont <=N-1). |
401 | | |
402 | | Dans le .jdl le paramètre courant est contenu dans _PARAM_ . On peut ainsi le |
403 | | transmettre comme argument ou dans le nom des fichiers comme dans notre exemple. |
404 | | |
405 | | Dans notre exemple, _PARAM_ vaudra donc successivement 1, 2, 3 puis 4. |
406 | | |
407 | | Soumettons le job : |
408 | | |
409 | | {{{ |
410 | | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-submit -a -o jid ParametricNum.jdl |
411 | | |
412 | | Connecting to the service https://grid09.lal.in2p3.fr:7443/glite_wms_wmproxy_server |
413 | | ====================== glite-wms-job-submit Success ====================== |
414 | | The job has been successfully submitted to the WMProxy |
415 | | Your job identifier is: |
416 | | |
417 | | https://grid02.lal.in2p3.fr:9000/7X5T_8XEcxUjDeng1q92Wg |
418 | | The job identifier has been saved in the following file: |
419 | | /home/diarra/work/ParametricJobs/jid |
420 | | ========================================================================== |
421 | | }}} |
422 | | |
423 | | Quattres jobs sont soumis en parrallèle comme le montre la commande glite-wms-job-status : |
424 | | |
425 | | {{{ |
426 | | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-status -i jid |
427 | | |
428 | | ************************************************************* |
429 | | BOOKKEEPING INFORMATION: |
430 | | Status info for the Job : https://grid02.lal.in2p3.fr:9000/7X5T_8XEcxUjDeng1q92Wg |
431 | | Current Status: Running |
432 | | Submitted: Fri Jun 6 16:31:52 2008 CEST |
433 | | ************************************************************* |
434 | | - Nodes information for: |
435 | | Status info for the Job : https://grid02.lal.in2p3.fr:9000/6zsSfE0nVOVyrWCQPga6fw |
436 | | Current Status: Running |
437 | | Status Reason: Job successfully submitted to Globus |
438 | | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
439 | | Submitted: Fri Jun 6 16:31:52 2008 CEST |
440 | | ************************************************************* |
441 | | Status info for the Job : https://grid02.lal.in2p3.fr:9000/DFqOECrwMEWmmpZs65oG3Q |
442 | | Current Status: Running |
443 | | Status Reason: Job successfully submitted to Globus |
444 | | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
445 | | Submitted: Fri Jun 6 16:31:52 2008 CEST |
446 | | ************************************************************* |
447 | | Status info for the Job : https://grid02.lal.in2p3.fr:9000/Ez2DyOUSDxCof9Sh0pQPog |
448 | | Current Status: Running |
449 | | Status Reason: Job successfully submitted to Globus |
450 | | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
451 | | Submitted: Fri Jun 6 16:31:52 2008 CEST |
452 | | ************************************************************* |
453 | | Status info for the Job : https://grid02.lal.in2p3.fr:9000/FxUda1Mz5DyB7SglhMDBEw |
454 | | Current Status: Scheduled |
455 | | Status Reason: Job successfully submitted to Globus |
456 | | Destination: ipngrid12.in2p3.fr:2119/jobmanager-pbs-ipno |
457 | | Submitted: Fri Jun 6 16:31:52 2008 CEST |
458 | | ************************************************************* |
459 | | }}} |
460 | | |
461 | | A la fin de l'exécution des jobs, quand le status des jobs est "Done", on peut |
462 | | récupérer les résulat de la collection. |
463 | | |
464 | | {{{ |
465 | | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-status -i jid |
466 | | |
467 | | ************************************************************* |
468 | | BOOKKEEPING INFORMATION: |
469 | | Status info for the Job : https://grid02.lal.in2p3.fr:9000/7X5T_8XEcxUjDeng1q92Wg |
470 | | Current Status: Done (Success) |
471 | | Exit code: 0 |
472 | | Submitted: Fri Jun 6 16:31:52 2008 CEST |
473 | | ************************************************************* |
474 | | ... |
475 | | }}} |
476 | | |
477 | | On récupère les résultats : |
478 | | |
479 | | {{{ |
480 | | [diarra@ipngrid01 ParametricJobs]$ glite-wms-job-output -i jid |
481 | | |
482 | | Connecting to the service https://grid09.lal.in2p3.fr:7443/glite_wms_wmproxy_server |
483 | | ================================================================================ |
484 | | JOB GET OUTPUT OUTCOME |
485 | | |
486 | | Output sandbox files for the DAG/Collection : |
487 | | https://grid02.lal.in2p3.fr:9000/7X5T_8XEcxUjDeng1q92Wg |
488 | | have been successfully retrieved and stored in the directory: |
489 | | /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg |
490 | | ================================================================================ |
491 | | }}} |
492 | | |
493 | | |
494 | | {{{ |
495 | | [diarra@ipngrid01 ParametricJobs]$ ls -l /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/* |
496 | | -rw-r--r-- 1 diarra sii 735 Jun 6 16:40 /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/ids_nodes.map |
497 | | |
498 | | /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/Node_1: |
499 | | total 0 |
500 | | -rw-r--r-- 1 diarra sii 0 Jun 6 16:40 std.err |
501 | | -rw-r--r-- 1 diarra sii 43 Jun 6 16:40 std.out |
502 | | |
503 | | /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/Node_2: |
504 | | total 0 |
505 | | -rw-r--r-- 1 diarra sii 0 Jun 6 16:40 std.err |
506 | | -rw-r--r-- 1 diarra sii 43 Jun 6 16:40 std.out |
507 | | |
508 | | /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/Node_3: |
509 | | total 0 |
510 | | -rw-r--r-- 1 diarra sii 0 Jun 6 16:40 std.err |
511 | | -rw-r--r-- 1 diarra sii 43 Jun 6 16:40 std.out |
512 | | |
513 | | /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/Node_4: |
514 | | total 0 |
515 | | -rw-r--r-- 1 diarra sii 0 Jun 6 16:40 std.err |
516 | | -rw-r--r-- 1 diarra sii 43 Jun 6 16:40 std.out |
517 | | }}} |
518 | | |
519 | | Pour le 3ème job par exemple on a bien utilisé 3 comme valeur du paramètre |
520 | | conformement au paramétrage de notre .jdl : |
521 | | |
522 | | {{{ |
523 | | [diarra@ipngrid01 ParametricJobs]$ cat /home/diarra/JobOutput/diarra_7X5T_8XEcxUjDeng1q92Wg/Node_3/std.out |
524 | | Debut execution du programme |
525 | | Parametre = 3 |
526 | | }}} |
527 | | |
528 | | Si Parameters est une liste, les paramètres ParameterStart et ParameterStep ne sont pas nécessaires. |
529 | | |
530 | | N.B.: il ne faut pas mettre de "" autour des éléments contenus dans Parameters. |
531 | | |
532 | | Si nous avons un exécutable my_sim.exe qui doit faire trois simulations alpha, beta et gamma, le .jdl peut contenir les lignes : |
533 | | |
534 | | {{{ |
535 | | JobType = "Parametric"; |
536 | | Executable = "my_sim.exe"; |
537 | | Arguments = "_PARAM_"; |
538 | | Parameters = {alpha, beta, gamma}; |
539 | | InputSandbox = {"my_sim.exe", ...}; |
540 | | ... |
541 | | }}} |
542 | | |
543 | | En soumettant ce job, une collection de 3 jobs sera générée et chaque job fera |
544 | | une simulation avec un des paramètres contenu dans Parameters. |
545 | | |
546 | | |