-
Notifications
You must be signed in to change notification settings - Fork 77
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DONE] - FFMPEG use GPU #1168
base: develop
Are you sure you want to change the base?
[DONE] - FFMPEG use GPU #1168
Conversation
Merge pull request EsupPortail#1119 from EsupPortail/develop
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Merci pour cette modif qui devrait aider les possesseurs de GPU :)
Il manque juste quelques descriptions sur les nouvelles fonctions (au format Pydoc)
if not return_value: | ||
self.error_encoding = True | ||
def _run_mp4_command(use_gpu: bool = False) -> bool: | ||
mp4_command = self.get_mp4_command(use_gpu=use_gpu) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
manque une petite Pydoc à chaque nouvelle fonction, au format
"""Describe briefly the function."""
(Majuscule au début et point à la fin)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Attention, la PR ne passe pas le controle Flake8 :
Run flake8
./pod/video_encode_transcript/Encoding_video.py:394:30: F821 undefined name 'FFMPEG_LIB_GPU'
./pod/video_encode_transcript/Encoding_video.py:552:5: C901 'Encoding_video.encode_video_part' is too complex (12)
@@ -304,8 +344,8 @@ def create_output_dir(self): | |||
os.makedirs(output_dir) | |||
self.output_dir = output_dir | |||
|
|||
def get_mp4_command(self) -> str: | |||
mp4_command = "%s " % FFMPEG_CMD | |||
def get_mp4_command(self, use_gpu: bool = False) -> str: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il manque la documentation
def get_hls_command(self) -> str: | ||
hls_command = "%s " % FFMPEG_CMD | ||
def get_hls_command(self, use_gpu: bool = False) -> str: | ||
hls_command = "%s " % (FFMPEG_CMD_GPU if use_gpu else FFMPEG_CMD) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Il manque également la documentation
self.create_main_livestream() | ||
self.add_encoding_log("hls_command", hls_command, return_value, return_msg) | ||
|
||
def _run_hls_command(use_gpu: bool = False) -> bool: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Documentation manquante
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello,
Je ne peux pas tester cette PR sur l'encodage GPU, car j'utilise encore l'ancien système d'encodage déporté avec slurm https://www.esup-portail.org/wiki/pages/viewpage.action?pageId=1114832898, avec des serveurs utilisant des Tesla T4.
Mais, dans mon environnement, j'ai pu tester quelques requêtes ffmpeg qui doivent être générées par cette PR.
Voici alors quelques éléments de comparaison entre l'ancien système et ce nouveau.
Pour infos, mes retours concernent des tests réalisés avec une vidéo de 17min en 1080p de 880Mo (avec d'autres fichiers vidéos, les résultats étaient semblables).
1.MP4 Dans l'ancien système, la requête unitaire d'encodage en mp4, en 720p, est la suivante :
ffmpeg -y -vsync 0 -hwaccel_device 1 -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i /tmp/encoding-20531/discours_d_ouverture.mp4 -c:a aac -ar 48000 -strict experimental -profile:v high -pixel_format yuv420p -force_key_frames "expr:gte(t,n_forced*1)" -preset slow -qmin 20 -qmax 50 -vf "scale_npp=-2:720:interp_algo=super" -c:v h264_nvenc -ss 0 -to 1019 -b:a 128k -minrate 1000k -b:v 2000k -maxrate 3000k -bufsize 4000k -max_muxing_queue_size 9999 -movflags faststart -write_tmcd 0 "/tmp/encoding-20531/20531/720p_discours_d_ouverture_UM.mp4"
Cette commande génére un fichier 720p, de 208Mo, en 1m23,576s.
2.MP4 Avec cette PR, je pense que les requêtes ffmpeg générées ressemblent à celles-ci (en lien avec le paramétrage de base de Pod) :
ffmpeg -hwaccel_device 0 -hwaccel_output_format cuda -hwaccel cuda -hide_banner -threads 0 -i "/tmp/encoding-20531/discours_d_ouverture.mp4" -map 0:v:0 -map 0:a:0 -c:v h264_nvenc -vf "scale_cuda=-2:720:interp_algo=bicubic:format=yuv420p" -preset p6 -profile:v high -level 0 -forced-idr 1 -b:v 2000k -maxrate 2000k -bufsize 2000k -rc vbr -rc-lookahead 20 -bf 1 -force_key_frames "expr:gte(t,n_forced*1)" -c:a aac -ar 48000 -b:a 128k -movflags faststart -y -fps_mode passthrough "/tmp/encoding-20531/20531/720p_discours_d_ouverture_NEW.mp4"
Cette commande génére un fichier 720p, de 257Mo, en 1m21,374s.
3.HLS Dans l'ancien système, la requête unitaire d'encodage en hls, est la suivante :
ffmpeg -y -vsync 0 -hwaccel_device 1 -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i /tmp/encoding-20531/discours_d_ouverture.mp4 -c:a aac -ar 48000 -strict experimental -profile:v high -pixel_format yuv420p -force_key_frames "expr:gte(t,n_forced*1)" -preset slow -qmin 20 -qmax 50 -vf "scale_npp=-2:1080:interp_algo=super" -c:v h264_nvenc -ss 0 -to 1019 -b:a 128k -minrate 1000k -b:v 2000k -maxrate 3000k -bufsize 4000k -max_muxing_queue_size 9999 -hls_playlist_type vod -hls_time 2 -hls_flags single_file /tmp/encoding-20531/20531/1080p_discours_d_ouverture_UM.m3u8
Cela génère, en plus du fichier m3u8, un fichier 1080p de 259Mo en 2m21,309s.
4.HLS Avec cette PR, je pense que les requêtes ffmpeg générées ressemblent à celles-ci (en lien avec le paramétrage de base de Pod) :
ffmpeg -hwaccel_device 0 -hwaccel_output_format cuda -hwaccel cuda -hide_banner -threads 0 -i "/tmp/encoding-20531/discours_d_ouverture.mp4" -vf "scale_cuda=-2:1080:interp_algo=bicubic:format=yuv420p" -b:v 3000k -maxrate 3000k -bufsize 4000k -b:a:0 96k -rc vbr -rc-lookahead 20 -bf 1 -hls_playlist_type vod -hls_time 2 -hls_flags single_file -master_pl_name "livestream1080.m3u8" -y "/tmp/encoding-20531/20531/discours_d_ouverture_NEW.m3u8"
Cela génère, en plus du fichier m3u8, un fichier 1080p de 383Mo en 1m26,564s.
Conclusion :
Dans mon cas, si les requêtes ffmpeg sont correctes, j'ai l'impression que cette PR va me permettre de gagner du temps sur les encodages HLS (gain d'environ 40%), mais va nécessiter du stockage supplémentaire, surtout pour les fichiers .ts (stockage +48%).
No description provided.