Depuis la 1ère partie (à consulter ou re-consulter pour les généralités), le fonctionnement d'Xgrid a un peu changé et certaines facilités d'utilisation ont disparu. Notamment l'utilisation de binaires en dehors du bac à sable XGRID. Sur les clients, l'agent Xgrid fonctionne en "Nobody". Sauf ,apparemment, dans le cas d'une utilisation de tous les clients sous Kerberos. Mais c'est à vérifier. Comme j'utilise des agents hétérogènes (Mac, Solaris, Linux), j'ai choisi la manière la plus fiable : je me suis adapté à "Nobody".
Dans cette deuxième partie sur l'utilisation d'Xgrid, je vais aborder l'envoi de travaux dans un fichier "batch", l'utilisation de l'agent Xgrid Java (utilisation d'agents Unix/Linux hors OS X) avec le thème de l'encodage vidéo.
Nous aborderons aussi le ScoreBoarding (ART) de Xgrid, pas documenté chez Apple !! pour déterminer les agents éligibles au calcul.
Pour cet article, j'ai utilisé un Xserve G4 Bipro sous 10.5.6 en contrôleur Xgrid et serveur de fichiers NFS. Ce serveur n'est pas agent de la grille pour réserver ses ressources.
Les agents sont variés : Il y a des Mac, des Solaris et des Linux.
Le but du projet est l'encodage le plus rapide possible d'une séquence vidéo en H264 de haute qualité avec audio AAC : création d'une séquence HD mp4.
Le contrôleur et les agents doivent être réglés sans authentification lors de l'utilisation d'agents non Mac. xgridagent-java ne supporte pas les authentifications.
Un partage de fichiers avec un point de montage identique sur tous les agents et client. Ce partage doit avoir les droits en lecture et écriture pour tous *
Le choix d'utiliser un partage de fichiers commun plutôt que d'envoyer les fichiers vers le contrôleur par l'intermédiaire d'un
* Dans une grille hétérogène, on ne peut pas utiliser l'authentification Kerberos pour Xgrid. Les agents fonctionneront sous "nobody" . Ce qui limite les accès au système sur les agents.
Pour générer des mp4, ffmpeg aura besoin des librairies x264 et librairies faac (partagées).
Si vous compilez vous même ffmpeg, pensez à ajouter ses librairies dans les options du configure.
OS X serveur permet le montage automatique de partage. Le miens est réglé pour monter le partage sous /tmp/XGRID sur chaque agent et client.
Pour ceux qui ne possède pas OS X server, ainsi que pour les clients non Mac, montez le partage manuellement sous : /tmp/XGRID
Placez une séquence de test à encoder dans /tmp/XGRID
Puis, sur les agents lancez :
/usr/local/bin/ffmpeg -i /tmp/XGRID/test.mpg -acodec libfaac -ab 128k -vcodec libx264 -crf 21 -ss 00:00:00 -t 00:00:05 /tmp/XGRID/test.mp4
Cette commande créera un fichier mp4 avec les 5 premières secondes de test.mpg
Si l'encodage se passe bien, l'agent peut être considéré comme valide.
Répétez l'opération sur chaque agent. Cette opération est facultative mais elle permet de s'assurer que chaque agent répondra correctement lorsque la grille enverra des travaux ffmpeg.
Nous avions vu dans la première partie la manière d'envoyer une tache à la fois dans la grille. Un travail étant décomposé en plusieurs tâches, il est intéressant d'envoyer toutes les tâches d'un travail en une seule commande.
Travail = encodage de vidéo en mp4
tâche 1 = encodage partie 1,
tâche 2 = encodage partie 2,
etc...
On utilise pour cela un fichier "batch".
xgrid -h controleur -job batch fichier_batch
Le fichier batch est présenté sous la forme d'un fichier xml qui regroupe toutes les actions à effectuer dans la grille. On y décrit d'abord le travail (job) puis les tâches de ce travail.

Nous allons encoder le fichier test.mpg qui se trouve dans /tmp/XGRID/test.mpg en 2 tronçons mp4 de 2 minutes chacuns.
Les commandes manuelles sont
# /usr/local/bin/ffmpeg -i /tmp/XGRID/test.mpg -acodec libfaac -ab 128k \
-vcodec libx264 -crf 21 -ss 00:00:00 -t 00:02:00 /tmp/XGRID/job_partie1.mp4
et
# /usr/local/bin/ffmpeg -i /tmp/XGRID/test.mpg -acodec libfaac -ab 128k \
-vcodec libx264 -crf 21 -ss 00:02:00 -t 00:02:00 /tmp/XGRID/job_partie2.mp4
Le fichier batch équivalent sera comme ceci :
{
jobSpecification =
name = "Encode";
taskSpecifications = { partie1 = { arguments = ( "-i", "/tmp/XGRID/test.mpg", "-acodec", "libfaac", "-ab", "128k", "-vcodec", "libx264", "-crf", "21", "-ss", "00:00:00", "-t", "00:02:00", "/tmp/XGRID/partie_job_1.mp4" ); command = "/usr/local/bin/ffmpeg"; };partie2 = {
arguments = ( "-i", "/tmp/XGRID/test.mpg", "-acodec", "libfaac", "-ab", "128k", "-vcodec", "libx264", "-crf", "21", "-ss", "00:02:00", "-t", "00:02:00", "/tmp/XGRID/partie_job_2.mp4" ); command = "/usr/local/bin/ffmpeg"; }; }; };}
Il suffit d'envoyer ce fichier batch dans la grille pour lancer ce travail comportant 2 tâches.
# xgrid -h controleur -job batch fichier_batch
Lorsque l'ensemble des tâches sera terminé, le status du travail passera en terminé (jobStatus = finished) :
Pour vérifier l'état du travail :
# xgrid -h controleur -job attributes -id jobidentifier
{
jobAttributes = {
activeCPUPower = 0;
dateNow = ... ;
dateStarted = ... ;
dateStopped = ... ;
dateSubmitted = ... ;
jobStatus = Finished;
name = "Encode";
percentDone = 100;
taskCount = 2;
undoneTaskCount = 0;
};
}
Lorsque le travail est terminé, vous aurez deux fichiers mp4 :
/tmp/XGRID/partie_job_1.mp4
et
/tmp/XGRID/partie_job_2.mp4
Il faudra concaténer proprement ces 2 fichiers pour obtenir la séquence complète en mp4.
Nota : le découpage d'une séquence en tronçons ne permettra pas facilement de faire un encodage en 2 passes. Je me suis limité à un encodage une passe.
Pour augmenter la qualité de l'encodage en une passe, j'autorise la création de fichiers un peu plus "gros"
Deux possibilité sont offertes :
Les 2 tronçons mpeg2 encodés en mp4 peuvent avoir une différence de temps entre les pistes audio et vidéo de quelques dixièmes de secondes
Lors de la lecture de chaque tronçon indépendamment, la synchro est parfaite.
Mais lors d'une concaténation par MP4Box, il n'y a pas de correction. Ce qui entraîne un décalage (desynchro A/V) dès la première jonction.
En utilisant QuickTime Pro, la synchro est préservée quelque soit la durée.
Cette désynchro ne devrait apparaître que suivant certains formats audio/vidéo en entrée.
Il y a une astuce sur MP4Box pour rattraper la synchro au niveau des jonction.
Cette astuce est de calculer la différence de durée entre la piste audio et vidéo et d'ajouter ce délai à la piste audio lors de la concaténation.
Premièrement, crée un nouveau mp4 avec un délai de retard à l'audio pour le 2ème tronçon (exemple, on retarde la piste audio de 80ms par rapport à la vidéo ):
# MP4Box -add partie_job_2.mp4#1 -add partie_job_2.mp4#2:delay=80 -new partie_job_2_retard.mp4
Puis on fait la concaténation des 2 tronçons :
# MP4Box -add partie_job_1.mp4 -cat partie_job_2_retard.mp4 -new final.mp4
Mais cette astuce n'est pas terrible à mes yeux. En plus le fichier final ne gardera le délai que sur certains lecteurs ( pas tous !! ).
Pour éviter les problèmes, QuickTime Pro fonctionne sans bidouille.
Vous pouvez concaténer manuellement vos fichiers (via copier/coller) ou utiliser l'utilitaire ( ligne de commande ) catmovie ( qui utilise QTkit ) fourni dans QTCoffee
# catmovie partie_job_1.mp4 partie_job_2.mp4 -self-contained -o final.mp4
Je n'approfondirai pas ce domaine qui peut être un article énorme à lui seul tant les formats vidéos sont nombreux et vraiment différents.
L'agent Ranking Tool ( ART ) d'Xgrid est un outil très intéressant mais malheureusement peu documenté.
Son but est de déterminer si un agent de la grille est autorisé ou non à effectuer une tache pour un travail envoyé à la grille.
C'est à dire, que lors de l'envoi d'un travail dans la grille, le client émet des conditions pour la prise en charge de son travail par les agents. On pourrait imaginer que seuls les processeurs de plus de X Ghz peuvent y prendre part, seuls les clients Mac, etc... enfin tout !
L'ART exécutera un script ou un binaire ( créé par l'utilisateur ) sur l'agent et le résultat sera analysé par les conditions ART (toujours au choix de l'utilisateur ).
Les conditions sont basées sur un résultat minimum; maximum; égal
Par exemple, si je ne veux que mon travail dans la grille ne soit effectué que par des machines "Darwin", mon script ART ( test.sh) sera :
#!/bin/sh
uname
Et ma condition :
artEqual = "Darwin"

Lorsqu'un agent recevra du contrôleur le script ART, il va l'exécuter et envoyer le résultat au contrôleur. Le contrôleur décidera (suivant la/les conditions à respecter) d'envoyer ou non la tache à l'agent.
Si l'agent ne remplie pas les conditions, le test est envoyé à l'agent suivant disponible et ainsi de suite. Si aucun agent de répond aux conditions, la tâche restera en attente jusqu'à ce qu'un agent répondant au critère soit disponible.
Testez vos scripts ART :) sinon, le contrôleur pourra peut-être attendre longtemps des agents disponibles :)
Par exemple, si nous ne voulons que des OS=Darwin dans l'encodage de nos séquence (exemple le plus simple), on ajoutera les entrées suivantes dans le fichier batch :

Le fichier script (ou binaire) ART sera exécuté sur l'agent. Il doit être compatible avec l'agent.
Avec un peu de pratique et essais, Xgrid est un outils puissant et simple pour faire une grille.
xgridagent-java qui permet à n'importe qu'elle machine Unix/Linux (java) d'entrer dans la grille est une plus-value importante !
Dernière mise à jour de cette page : Dimanche 16 mai 2010. Version : 1.00