Auteur : Johann Brochier (Scoub_Lite)

Date : Mai 2010

XGRID 2ème partie

Sommaire

  1. Introduction
  2. Le projet
  3. Les outils
  4. Détails sur ffmpeg
  5. Ma grille de test
  6. Test de fonctionnement de ffmpeg sur les agents (facultatif mais prudent)
  7. Fichier Batch pour Xgrid
  8. Concaténation de fichiers mp4
  9. Agent Ranking Tool d'Xgrid
  10. Conclusion

1. Introduction


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.

2. Le projet


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.


3. Les outils


Agents :
  • ffmpeg installé dans /usr/local *
  • Pour les agents non Mac : xgridagent-java

  • Coté client :
  • Un Mac

  • Pour la concaténation des tronçons encodés
  • GPAC
  • ou
  • QuickTime pro
  • ou
  • QTCoffee

  • Xgrid :

    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.


    Serveur de fichiers :

    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 ( cf partie 1ere partie ) permet d'éviter des transferts multiples de fichiers volumineux (vidéo) et gagner du temps.
    * 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.


    4. Détails sur ffmpeg


    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.


    5. Ma grille de test


  • Xserve G4 bipro 1,33Ghz avec 2Go de Ram et 1,5 To de disque ( OS X server 10.5.6 )
  • 1 MacMini CoreDuo 1,66Ghz 2Go de Ram OS X 10.5.6
  • 1 MacMini Core2Duo 1,83Ghz 2Go de Ram OS X 10.5.6
  • 1 iMac Core2Duo 2,4Ghz 4Go de Ram OS X 10.5.6
  • 1 Ultra24 Core2Duo Quad 2,4Ghz 4Go de Ram Solaris 10u6

  • Le tout connecté en Gigabit Ethernet.
    Le Xserve est contrôleur de grille et serveur de fichiers NFS ( Il n'est pas agent pour laisser ses processeurs tranquille). Le choix de NFS est de faciliter le partage de fichier dans un milieu hétérogène.
    Les autres sont agents.
    Tous les agents possèdent un ffmpeg (même version de préférence) fonctionnel dans /usr/local/


    6 Test de fonctionnement de ffmpeg sur les agents (facultatif mais prudent).


    6.1 Montage du point de partage sur tous les agents


    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


    6.2 Test de ffmpeg

    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.


    7 Fichier Batch pour Xgrid


    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


    7.1 Description d'un 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.

    Batch_format

    7.2 Exemple de fichier batch pour l'encodage de 2 tronçons d'une vidéo mpeg2


    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"

    8 Concaténation de fichiers mp4


    Deux possibilité sont offertes :

  • GPAC avec l'utilitaire MP4Box
  • QuickTime Pro seul ou en utilisant QTCoffee

  • 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.

    9 Agent Ranking Tool d'Xgrid

    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"

    art

    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 :


    batchformatart

    Le fichier script (ou binaire) ART sera exécuté sur l'agent. Il doit être compatible avec l'agent.


    10 Conclusion

    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 !

    Début de page Début de page Début de page

    Dernière mise à jour de cette page : Dimanche 16 mai 2010. Version : 1.00