...
- 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.i17echo "$> 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.
...