2 points par GN⁺ 2023-12-14 | 1 commentaires | Partager sur WhatsApp
  • 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 large dé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, text et tokens
  • 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 True a é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.json a é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

 
GN⁺ 2023-12-14
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

    • Vous prenez des chiffres d’inférence d’un modèle de diffusion latente comme SDXL pour les généraliser à l’inférence d’un Transformer encodeur-décodeur comme Whisper
      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
    • Whisper a déjà été beaucoup optimisé pour Apple Silicon, et whisper.cpp est un bon exemple qui exploite bien ces avantages
      En plus, cet article traite du nouveau framework Apple MLX, qui n’a probablement pas été utilisé dans les tests Llama ou Stable Diffusion
    • Même si la documentation est encore jeune, d’après celle de MLX, les convolutions, très utilisées dans les GAN et surtout dans Stable Diffusion, semblent ne presque pas bénéficier d’améliorations significatives avec MLX, et paraissent même plus lentes que sur CPU dans certains cas
      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
    • J’ai une 4090 et un M1 Max 64 Go, et sur Llama 2, la 4090 est largement supérieure
    • Après avoir beaucoup utilisé Whisper, j’ai vu des versions qui, à qualité égale, consommaient moins de mémoire tout en offrant des performances supérieures d’un ou deux ordres de grandeur, sans que j’en comprenne parfaitement la raison
      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

    • Je me demande si insanely-fast-whisper est assez rapide pour permettre une transcription en temps réel même sur CPU
      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é
    • Je me demande si insanely-fast-whisper utilise une taille de faisceau de 5 ou de 1
      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

    • Ce n’est pas non plus comparé à une implémentation Nvidia optimisée
      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
    • Franchement, je ne vois pas pourquoi il faudrait s’en soucier
      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.

    • C’est précisément là que Nvidia est fort.
      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.
    • Pour comparer correctement, il faudrait faire tourner le code insanely-fast-whisper sur une 4090.
      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.
    • L’article a été mis à jour avec les résultats d’insanely-fast.
  • 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.

    At the time of writing this comparison convolutions are still some of the least optimized operations in MLX.
    Le point essentiel semble être qu’on peut utiliser 64 Go ou plus de RAM très rapide, directement reliée au CPU/GPU, avec des avantages en latence et en accès partagé.
    Quand on regarde l’enveloppe de puissance de ces systèmes, les chiffres sont clairement impressionnants.
    Il faut toutefois aussi tenir compte du fait qu’un système M3 Max avec la configuration minimale de RAM coûte environ deux fois le prix d’une 4090.

    • Dire que la mémoire de l’Apple Silicon est rapide, c’est surtout vrai par comparaison avec les CPU grand public qui sont restés longtemps en mémoire double canal.
      À 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.

  • 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

    • À l’usage, ctranslate2 m’a même semblé plus rapide qu’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.
    • J’aimerais vraiment comprendre comment c’est possible, et s’il y a une différence de qualité par rapport à l’original.
      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.

    • J’ai construit ma propre solution, assez simple.
      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.