...
Bloc de code | ||
---|---|---|
| ||
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.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.
...