Benchmark Whisper : Nvidia RTX 4090 vs M1 Pro avec MLX
(owehrens.com)- Le modèle Whisper large a été exécuté avec le framework MLX pour Apple Silicon afin de comparer l’écart entre un ordinateur portable et un GPU haut de gamme sur la transcription d’un audio de 10 minutes
- Dans les conditions de base, le MacBook M1 Pro a pris 216 secondes, contre 186 secondes pour la RTX 4090 ; la RTX 4090 était donc environ 30 secondes, soit environ 16 %, plus rapide
- Avec insanely-fast-whisper sur la RTX 4090, la transcription avec whisper-large-v3 descend à 8 secondes, ce qui montre que l’optimisation du modèle et de l’implémentation peut fortement modifier une comparaison matérielle
- L’exécution via MPS sur macOS a pris 4 min 23 s, tandis que le M2 Ultra avec 76 cœurs GPU et le M3 Max avec 40 cœurs GPU se sont montrés nettement plus rapides que le M1, avec des vitesses similaires entre eux
- L’augmentation de la consommation électrique était de +242 W pour le PC RTX 4090 par rapport à l’inactivité, contre +38 W pour le MacBook M1 Pro ; l’ensemble des résultats constitue davantage une comparaison indicative des performances de MLX qu’un benchmark rigoureux
Exécuter un benchmark Whisper avec MLX
- Apple a publié MLX, un framework de machine learning pour Apple Silicon, et l’exemple Whisper fourni a été utilisé pour le benchmark
- Un nouveau fichier a été ajouté au dépôt existant de benchmarks Whisper, puis le même fichier audio a été transcrit avec le modèle
whisper largedéjà téléchargé - Le code d’exécution appelle
transcribe(audio=audio_file, model='large'), puis mesure le temps total à partir de l’écart entre les horodatages de début et de fin - Le résultat retourné est une liste de segments, chacun contenant des champs tels que
avg_logprob,compression_ratio,start,end,textettokens - Cette structure de résultat est identique à celle obtenue en exécutant Python Whisper sur la RTX 4090
Résultats de base : M1 Pro et RTX 4090
- Pour un fichier audio de 10 minutes, le temps d’exécution avec M1 Pro + MLX est de
0:03:36.296329, soit environ 216 secondes - Sur le même fichier, le temps d’exécution avec Nvidia RTX 4090 a été mesuré à
0:03:06.707770, soit environ 186 secondes - La RTX 4090 est environ 30 secondes plus rapide que le M1 Pro, soit environ 16 % plus rapide en proportion
- Pendant la mesure, tous les cœurs graphiques du M1 Pro ont été pleinement utilisés ; les autres programmes ont été fermés et des éléments comme le fond d’écran du bureau ont été désactivés
- Toutefois, en utilisant un modèle optimisé pour Nvidia, le temps de transcription de la RTX 4090 descend à 8 secondes
Matériel de test
-
MacBook
- MacBook M1 Pro 14 pouces, modèle 2021
- 8 cœurs CPU : 6 cœurs de performance, 2 cœurs d’efficacité
- 32 Go de RAM
- 16 cœurs GPU
-
PC
- Intel Core i7-12700KF 8×3,60 GHz
- RAM 2×32 Go 3200 MHz DDR4 Kingston FURY Beast
- SSD Kingston KC3000 PCIe 4.0 NVMe 1000 Go
- Lecture 7000 Mo/s, écriture 6000 Mo/s
- GeForce RTX 4090 24 Go GDDR6X, Palit RTX 4090 GameRock OmniBlack
Comment insanely-fast-whisper change la comparaison
- Dans un commentaire Hacker News, un résultat d’exécution du même fichier de 10 minutes avec insanely-fast-whisper et une RTX 4090 a été publié
- Avec whisper-large-v3, la transcription s’est terminée en moins de 8 secondes ; en incluant le chargement du modèle avant le début de la transcription, le total était de 15 secondes
- Une exécution directe ultérieure de la commande
insanely-fast-whisper --file-name audio.mp3 --flash Truea également confirmé une transcription en 8 secondes - Les logs de sortie contenaient des avertissements liés à Flash Attention 2 et au déplacement vers le GPU, mais la transcription s’est terminée et
output.jsona été généré - Sur macOS, il était possible de l’exécuter avec
--device mps --batch-size 4, et la transcription du même fichier a pris 0:04:23
Mise à jour avec M2 Ultra et M3 Max
- Ivan a exécuté le même fichier audio sur un M2 Ultra avec 76 cœurs GPU et un M3 Max avec 40 cœurs GPU
- Les deux systèmes ont obtenu des résultats nettement plus rapides que le M1 Pro, avec des vitesses similaires entre eux
- Les chiffres de comparaison peuvent difficilement être considérés comme des benchmarks précis à 100 %, car d’autres processus, le temps de chargement, ainsi que les démarrages à froid et à chaud peuvent influencer les résultats
Consommation électrique et limites de mesure
- La différence de consommation entre l’état inactif et l’exécution GPU a été mesurée avec une prise Shelly
- Le PC a affiché une hausse de +242 W par rapport à l’inactivité lors de l’exécution sur RTX 4090
- Le MacBook a affiché une hausse de +38 W par rapport à l’inactivité lors de l’exécution sur les 16 cœurs GPU du M1
- La mesure de la consommation électrique est elle aussi davantage une valeur de référence indicative qu’un chiffre précis à 100 %
- L’ensemble du test est moins une mesure scientifique qu’une comparaison donnant un ordre d’idée des performances que le framework MLX peut offrir
Contexte d’utilisation réel
- L’objectif du test est lié à l’exploitation du moteur de recherche de podcasts podpodgogo.com
- Il s’agit de transcrire des dizaines de milliers d’épisodes de podcasts, de permettre une recherche en texte intégral et d’effectuer aussi un peu de data mining
- Historique des mises à jour
- 11 décembre : ajout des spécifications matérielles et de tests supplémentaires sans chargement du modèle
- 12 décembre : présentation de la RTX 4090 comme la carte graphique grand public la plus rapide et mise à jour des chiffres M2/M3
- 13 décembre : prise en compte d’un commentaire sur Hacker News concernant Whisper optimisé pour Nvidia
1 commentaires
Avis sur Hacker News
À moins que Whisper n’ait été exécuté de façon très inefficace sur la 4090, ces résultats semblent suspects
J’ai une 3090 et un M1 Max 32 Go ; je n’ai pas testé Whisper, mais l’écart de performances en inférence sur Llama et Stable Diffusion était énorme, surtout avec SDXL dans Stable Diffusion : environ 9 secondes sur la 3090 contre autour de 1 min 10 s sur le M1 Max
Les deux architectures ont très peu de choses en commun et, même si Stable Diffusion utilise l’encodeur de texte pré-entraîné de CLIP, celui-ci est lui aussi assez différent d’un Transformer encodeur-décodeur
En plus, cet article traite du nouveau framework Apple MLX, qui n’a probablement pas été utilisé dans les tests Llama ou Stable Diffusion
Je ne sais pas si c’est une limite matérielle ou un manque d’optimisation de la bibliothèque MLX, mais il paraît peu probable qu’un cas d’usage aussi évident ait simplement été ignoré
Il est plus plausible que les convolutions utilisent une précision élevée et un ensemble de tuiles bien plus grand, ce qui impose des changements de contexte coûteux quand l’ensemble de la transformation ne tient pas dans le GPU
Donc, si ce ne sont pas le même logiciel et le même modèle, il faut être très prudent avec son intuition sur les performances de Whisper
Et même si c’était le cas, le fait qu’on veuille des optimisations propres à chaque plateforme limite encore la portée de la comparaison
On dirait que ça utilise le dépôt OpenAI Whisper
Pour une comparaison correcte, il faudrait comparer faster-whisper ou insanely-fast-whisper sur 4090 avec MLX
faster-whisper fonctionne de manière séquentielle, tandis qu’insanely-fast-whisper traite l’audio par blocs de 30 secondes
J’utilise Whisper en production, et comme je trouve que la qualité est meilleure quand on inclut le texte du segment précédent, j’utilise faster-whisper
Grosso modo, faster-whisper est généralement 4 à 5 fois plus rapide qu’OpenAI/whisper, et insanely-fast-whisper peut encore être 3 à 4 fois plus rapide que faster-whisper
Les modèles ici semblent toujours être en fp16, pas quantifiés, donc il doit rester de la marge pour accélérer
Modification : j’ai vu qu’il ne prend pas encore en charge l’inférence CPU ; ce serait intéressant si c’était ajouté
J’aimerais aussi connaître la comparaison de vitesse avec un réglage à 5, et idéalement ce paramètre devrait être exposé à l’utilisateur
Comme je traite des audios de très mauvaise qualité, la qualité de transcription est importante ; une comparaison de vitesse obtenue au détriment de la qualité a donc peu d’intérêt pour moi
Le point essentiel de cet article est qu’il exploite le tout nouveau Apple MLX, et que le code utilise des optimisations spécifiques à Apple
https://news.ycombinator.com/item?id=38539153
Il existe des implémentations plus rapides de Whisper
Modification : puisque je me suis fait avoir, j’ai téléchargé le fichier de 10 minutes utilisé dans l’article et je l’ai lancé avec insanely-fast-whisper sur une 4090 ; l’installation s’est faite avec deux commandes
Avec whisper-large-v3, la transcription du fichier s’est terminée en moins de 8 secondes, et en incluant le temps de chargement du modèle avant le début de la transcription, cela faisait 15 secondes
Ce temps supplémentaire ne dépend évidemment pas de la durée de l’audio
La 4090 est donc 6 à 12 fois plus rapide que le meilleur d’Apple
Si vous avez déjà un PC gaming où la brancher, c’est bien moins cher qu’un M2 Ultra, et même en achetant un PC complet neuf avec une 4090, cela reste moins cher
Ce n’est pas surprenant, mais on voit beaucoup de vœux pieux chez les possesseurs de Mac haut de gamme qui veulent croire que leur machine excelle partout
Les puces Apple série M sont très impressionnantes et la grande quantité de RAM est excellente, mais en machine learning haute performance, il est difficile de rivaliser avec Nvidia
Si vous avez un Mac, vous utiliserez les performances de ce Mac ; si vous avez un PC gaming, vous utiliserez les performances de ce PC
Même si vous avez les deux, vous utiliserez probablement l’IA qui tourne sur la machine que vous utilisez au quotidien
Je me demande ce que ça donnerait par rapport à insanely-fast-whisper : https://github.com/Vaibhavs10/insanely-fast-whisper
Je comprends que, sans utiliser d’optimisations, on peut faire une comparaison à armes égales, mais si ces optimisations n’ont pas été portées vers MLX, j’ai quand même l’impression qu’il vaut mieux utiliser une 4090.
J’ai regardé MLX récemment et, sur Mac, ça va clairement gagner en popularité ; ce sera sans doute aussi le cas sur iOS quand des bindings Swift arriveront : https://github.com/ml-explore/mlx/issues/15
Cela dit, pour l’instant, des problèmes de compilation en C++20 pourraient encore bloquer.
Quel que soit le matériel qui gagne dans un benchmark, pour un modèle populaire, il existe généralement une implémentation CUDA énormément optimisée à la main qui écrase le reste.
Il y a bien quelques rares exceptions, par exemple PyTorch a tellement travaillé sur torch.compile que GPT-Fast fonctionne bien sur AMD dans certains cas d’usage très étroits.
Sur Apple Silicon, aucune exception de ce type ne me vient à l’esprit.
Je pense qu’il battrait facilement les deux benchmarks d’origine, mais il faudrait probablement choisir une taille de batch bien inférieure à 24.
Aujourd’hui, Whisper à 3 à 4 fois le temps réel est très lent ; ce benchmark pourrait même être battu avec un CPU.
Je me demande si cela s’applique aussi à d’autres modèles, ou si Whisper a été choisi à cause de son caractère sériel et de ses calculs entiers.
https://github.com/ml-explore/mlx-examples/tree/main/stable_... semble aller dans ce sens.
À l’époque des 4 cœurs, ça allait, mais avec les nombres de cœurs modernes, ça n’a plus de sens.
L’évolutivité mémoire des GPU est bien meilleure, même sur le grand public.
Lancer Whisper sur un Mac M1 est facile, mais par défaut il n’utilise pas MLX.
J’ai passé une heure ou deux à comprendre quoi installer et configurer pour lui faire utiliser MLX, avec des erreurs Python et Torch obscures.
J’ai fini par abandonner et louer une VM avec GPU ; en quelques minutes, Whisper tournait.
Elle n’utilise pas MLX, mais elle utilise Metal.
On peut débattre longtemps pour savoir quel choix est absolument le meilleur pour la tâche X, mais j’aime le fait d’obtenir ce niveau de performances avec une consommation électrique aussi faible.
Sinon, en utilisant ce dépôt dérivé de Whisper, la plupart des GPU transcrivent même une heure d’audio en moins d’une minute : https://github.com/Vaibhavs10/insanely-fast-whisper
Sur L4, même avec ctranslate2 réglé sur une taille de batch aussi basse que 4, il bat tous leurs benchmarks, sauf l’A100 avec flash attention 2.
C’est dommage que le mode batch n’ait finalement jamais été intégré à faster-whisper ; à cause de ça, les gens semblent avoir du mal à essayer facilement ctranslate2.
Pour des dépôts comme https://github.com/SYSTRAN/faster-whisper, on comprend tout de suite pourquoi c’est plus rapide que l’implémentation d’origine, et d’autres accélèrent aussi en abaissant la précision de quantification, au prix de résultats moins bons.
Mais ici, ce n’est pas particulièrement clair pourquoi c’est plus rapide.
Vu à quel point c’est plus rapide, ça m’intrigue encore plus.
C’est particulièrement intéressant quand on pense au Vision Pro d’Apple.
Pouvoir faire tourner des modèles de manière économe en énergie n’est peut-être pas crucial pour tout le monde sur un ordinateur portable, mais c’est un gros avantage pour un casque qui consomme déjà beaucoup.
J’aimerais demander de l’aide.
Existe-t-il une bonne appli ou un bon workflow open source de transcription et de diarisation des locuteurs ?
J’ai regardé https://github.com/thomasmol/cog-whisper-diarization et https://about.transcribee.net/, mais les deux ne fonctionnaient pas bien, avec notamment des crashs.
Je découpe les MP3 en morceaux que Whisper peut traiter, puis je les envoie un par un à l’API pour transcription.
Jusqu’ici, ça fonctionne comme prévu, et cela ne demande que quelques lignes de Python.