Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

...

Bloc de code
languagebash
celery -A pod.main worker -l info


Installation de Shibboleth SP pour l'authentification Shibboleth

Vous pouvez suivre le tutoriel suivant pour installer un SP Shibboleth sur une distribution Debian : https://tuakiri.ac.nz/confluence/display/Tuakiri/Install+Shibboleth+SP+on+Debian+Based+linux

Mise en place de l'encodage distant

  • Générer une paire de clés pour l'utilisateur pod sur le serveur podv2
  • Copier la clé publique sur le serveur d'encodage distant dans le fichier .ssh/authorized_key  (hpc)
  • L'utilisateur hpc doit aussi pouvoir se connecter via ssh sur le serveur podv2. Generer sa paire de clés puis copier sa clé public dans le fichier authorized_key du serveur podv2.
  • Ouvrir les firewall de maniere à ce que les serveurs puissent communiquer.
  • Configurer l'encodage distant via les settings de podv2:
    ENCODE_VIDEO = "start_remote_encode"
    """
    # pourl'encodage distant, il faut préciser le login, l'host et la clé pour appeler cet encodage
    # REMOTE ENCODING SETTINGS
    """
    SSH_REMOTE_USER = "poduser"
    SSH_REMOTE_HOST = "encode-gpu.univ.fr"
    SSH_REMOTE_KEY = "/home/poduser/.ssh/id_rsa"
    SSH_REMOTE_CMD = "./script.sh"
  • Redemarrez nginx et uwsgi-pod afin que la modif soit prise en compte.
  • Copier le fichier encode_gpu.py present dans podv2 (/home/pod/django_projects/pod/video) sur le serveur hpc (donnez les droits d'execution) sur le serveur d'encodage distant.
  • Copier le fichier submit.sh sur le serveur d'encodage distant. C'est ce script qui va créer le job d'encodage
    # Video encoding automation
    #
    # Cyrille TOULET <cyrille.toulet@univ-lille.fr>
    # Nicolas Can <nicolas.can@univ-lille.fr>
    
    # Define variables
    GPU_TYPE="RTX2080"
    BASE_DIR="/home/poduser/encoding"
    WORK_DIR="/tmp"
    HOME_DIR="/home/poduser"
    REMOTE_SERVER="pod@pod.univ.fr"
    REMOTE_MEDIA_PATH="/usr/local/django_projects/podv2/pod/media"
    POD_REMOTE_HOST="pod.univ.fr"
    JOB_NAME="undefined-job"
    INPUT_FILE="default-input.mp4"
    DEBUG=False
    
    while getopts n:i:v:u:d: option
    do
    case "${option}"
    in
    n) JOB_NAME=${OPTARG};;
    i) INPUT_FILE=${OPTARG};;
    v) VIDEO_ID=${OPTARG};;
    u) USER_ID=${OPTARG};;
    d) DEBUG=${OPTARG};;
    esac
    done
    
    # Step 1: Create encoding directory
    mkdir -p ${BASE_DIR}/${JOB_NAME}
    
    # Step 2: Generate batch file
    cp $(dirname $(readlink -f $0))/encode.template ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{GPU_TYPE}|${GPU_TYPE}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{BASE_DIR}|${BASE_DIR}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{WORK_DIR}|${WORK_DIR}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{JOB_NAME}|${JOB_NAME}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{REMOTE_SERVER}|${REMOTE_SERVER}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{REMOTE_MEDIA_PATH}|${REMOTE_MEDIA_PATH}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{INPUT_FILE}|${INPUT_FILE}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{VIDEO_ID}|${VIDEO_ID}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{USER_ID}|${USER_ID}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{POD_REMOTE_HOST}|${POD_REMOTE_HOST}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    sed -i "s|{DEBUG}|${DEBUG}|g" ${BASE_DIR}/${JOB_NAME}/encode.job
    
    
    # Step 2: Submit slurm job
    cd ${HOME_DIR}/slurm-encoding-out
    sbatch ${BASE_DIR}/${JOB_NAME}/encode.job
  • Adapter les parametres suivants (exemple de paramétrages) :

    # Define variables
    GPU_TYPE="GTX1080" #Le type de carte graphique utilisée
    BASE_DIR="/b/home/di/podtest" #dossier racine d'encodage
    WORK_DIR="/b/home/di/podtest/tmp" #dossier temporaire de travail
    HOME_DIR="/b/home/di/podtest" #dossier racine
    REMOTE_SERVER="pod@podv272-test.di.unistra.fr" #connexion ssh au serveur podv2 
    REMOTE_MEDIA_PATH="/data/www/pod/media" #dossier media sur podv2
    POD_REMOTE_HOST="podv272-test.di.unistra.fr" #url podv2
    JOB_NAME="undefined-job" #valeur par defaut car au lancement du job un nom sera attribué
    INPUT_FILE="default-input.mp4" #valeur par defaut car au lancement du job un nom sera attribué
    DEBUG=True

  • Copier le fichier encode.template sur le serveur d'encodage distant. base de submit.sh qui va le transformer en encode.job (avec des sed) puis ce job va etre mis en attente

    #!/bin/bash
    #SBATCH --nodes=1
    #SBATCH --ntasks-per-node=12
    #SBATCH --time=01:00:00
    #SBATCH --job-name={JOB_NAME}
    #SBATCH --mem=16G
    #SBATCH --gres=gpu:{GPU_TYPE}:1
    
    
    # Encoding job for POD platform
    # Cyrille TOULET <cyrille.toulet@univ-lille.fr>
    # Nicolas CAN <nicolas.can@univ-lille.fr>
    
    
    # Print job info
    echo "Job running at" $(date)" with following specs:"
    echo -e " - Job name: ${SLURM_JOB_NAME}"
    echo -e " - Job ID: ${SLURM_JOB_ID}"
    echo " - Allocated nodes: ${SLURM_JOB_NODELIST}"
    echo " - Allocated CPU cores: ${SLURM_NTASKS}"
    echo -e " - Allocated GPU: /dev/nvidia${CUDA_VISIBLE_DEVICES}\n"
    
    mkdir -p {WORK_DIR}/{JOB_NAME}
    
    # Step 1: Download input file
    echo "$> scp {REMOTE_SERVER}:{REMOTE_MEDIA_PATH}/videos/{USER_ID}/{INPUT_FILE} {WORK_DIR}/{JOB_NAME}/"
    scp {REMOTE_SERVER}:{REMOTE_MEDIA_PATH}/videos/{USER_ID}/{INPUT_FILE} {WORK_DIR}/{JOB_NAME}/
    
    # Step 2: Encode video
    module load ffmpeg/4.2.3 nvidia/cuda/10.0/compilers
    module load anaconda3/2020.02
    echo "$> python3 /home/nicolas.can/pod-encoding/encode_gpu.py --device ${CUDA_VISIBLE_DEVICES} --dir {WORK_DIR}/{JOB_NAME} --input {INPUT_FILE} --job ${SLURM_JOB_ID} --name {JOB_NAME}"
    python3 /home/nicolas.can/pod-encoding/encode_gpu.py --device ${CUDA_VISIBLE_DEVICES} --dir {WORK_DIR}/{JOB_NAME} --input {INPUT_FILE} --job ${SLURM_JOB_ID} --name {JOB_NAME} --debug {DEBUG}
    module purge
    
    # Step 3: Upload output files
    scp -r {WORK_DIR}/{JOB_NAME}/{VIDEO_ID} {REMOTE_SERVER}:{REMOTE_MEDIA_PATH}/videos/{USER_ID}
    
    # Step 4: Clear video files
    SIZE=$(du -sh {BASE_DIR}/{JOB_NAME})
    rm -rf {BASE_DIR}/{JOB_NAME}
    echo "End of encoding job. Release ${SIZE} for job {JOB_NAME}"
    SIZE=$(du -sh {WORK_DIR}/{JOB_NAME})
    rm -rf {WORK_DIR}/{JOB_NAME}
    echo "End of encoding job. Release ${SIZE} for job {JOB_NAME}"
    
    # Step 5: Call a custom API to report the end of encoding
    echo "ssh call import_encoded_video {VIDEO_ID}"
    echo "$> ssh {REMOTE_SERVER} \"cd /home/pod/django_projects/podv2 && /home/pod/.virtualenvs/django_pod/bin/python manage.py import_encoded_video {VIDEO_ID}\""
    ssh {REMOTE_SERVER} "cd /home/pod/django_projects/podv2 && /home/pod/.virtualenvs/django_pod/bin/python manage.py import_encoded_video {VIDEO_ID}"
  • Adaptez les parametres SBATCH à votre infrastructure slurm dans ce fichier

    #SBATCH -p pod # utiliser la file hpc standard
    #BATCH -N 1-1 # nombre de noeuds min-max
    #SBATCH -t 24:00:00 # temps estimé utilisépar le scheduler slurm
    #SBATCH --gres=gpu:4 # on exige 1 GPU
    #SBATCH --exclusive

  • Adaptez l'etape 2 en fonction des modules disponibles sur votre infrastructure hpc et du chemin du fichier encode_gpu.py

    # Step 2: Encode video
    module load ffmpeg/ffmpeg
    module load python/python-3.6.2.i17

    echo "$> python3 /b/home/di/podtest/encode_gpu.py --device ${CUDA_VISIBLE_DEVICES} --dir {WORK_DIR}/{JOB_NAME} --input {INPUT_FILE} --job ${SLURM_JOB_ID} --name {JOB_NAME}"
    python3 /b/home/di/podtest/encode_gpu.py --device ${CUDA_VISIBLE_DEVICES} --dir {WORK_DIR}/{JOB_NAME} --input {INPUT_FILE} --job ${SLURM_JOB_ID} --name {JOB_NAME} --debug {DEBUG}
    module purge

  • Adaptez également les chemins de votre application podv2  pour l'étape 5

    # Step 5: Call a custom API to report the end of encoding
    echo "ssh call import_encoded_video {VIDEO_ID}"
    echo "$> ssh {REMOTE_SERVER} \"cd /home/pod/django_projects && /data/www/pod/.virtualenvs/django_pod/bin/python manage.py import_encoded_video {VIDEO_ID}\""
    ssh {REMOTE_SERVER} "cd /home/pod/django_projects && /data/www/pod/.virtualenvs/django_pod/bin/python manage.py import_encoded_video {VIDEO_ID}"

  • Créer le répertoire d'encodage temporaire

    ${HOME_DIR}/tmp

  • Créer le répertoire 

    ${HOME_DIR}/slurm-encoding-out qui contiendra les logs d'encodage des jobs.

  • Tester en lancant un encodage depuis votre serveur podv2.

...