Skip to content
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

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from
Open

Conversation

Trockyyy
Copy link

No description provided.

Copy link
Collaborator

@Badatos Badatos left a 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)
Copy link
Collaborator

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)

Copy link
Collaborator

@Badatos Badatos left a 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:
Copy link
Contributor

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)
Copy link
Contributor

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:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Documentation manquante

@LoicBonavent LoicBonavent self-requested a review July 9, 2024 07:45
Copy link
Collaborator

@LoicBonavent LoicBonavent left a 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%).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants