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.

...

  • 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 script.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.   Dans le même répertoire de base de submitscript.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.

...