For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/ai-machine-learning/ai-training-models-comparaison-wandb.md.

AI Training - Tutoriel - Comparer des modèles avec W&B pour la classification audio

Voir en Markdown

Comparez 2 modèles en entraînant 2 jobs en parallèle. Voyez lequel est le meilleur avec vos données !

Objectif

L'objectif de ce tutoriel est de comparer deux méthodes en exécutant deux jobs en parallèle afin de classifier des audios. Pour voir quel modèle est le plus performant en termes de précision, de consommation de ressources et de temps d'entraînement, nous utiliserons l'outil Weights & Biases.

Graphique en coordonnées parallèles Models comparaison reliant les axes accuracy val_accuracy loss val_loss Relative Time et best_epoch au best_val_loss obtenu pour deux runs

Cas d'usage

Le cas d'usage est la Spoken Digit Database. Elle est disponible sur Kaggle.

La base de données contient des fichiers audio de chiffres de zéro à neuf, enregistrés par différentes personnes. Elle contient au total 1700 fichiers audio.

Licence de la base de données : Attribution 4.0 International (CC BY 4.0)

Modèles d'IA

Pour construire ces classificateurs de sons, nous utiliserons deux méthodes.

Classification audio basée sur les caractéristiques audio

La première méthode consiste à créer un modèle d'intelligence artificielle (IA) pour classifier des fichiers audio en utilisant différentes caractéristiques des sons.

Pour cela, un traitement des données en amont est nécessaire. Chaque son constituera une ligne d'un fichier csv grâce à sa transformation en 26 paramètres calculés par Librosa.

Un réseau de neurones artificiels (ANN) est ensuite construit et entraîné sur 100 epochs. Il prend en entrée les 26 paramètres calculés par Librosa et renvoie en sortie une probabilité pour chaque classe.

Classification d'images basée sur les spectrogrammes

La seconde méthode consiste à créer un modèle de classification d'images utilisant les spectrogrammes de chaque son.

Les données doivent être traitées au préalable. À partir de chaque son, un spectrogramme (une image) est généré à l'aide du module Python Librosa. Un réseau de neurones convolutif (CNN) est ensuite construit et entraîné sur 100 epochs.

Il prend en entrée les spectrogrammes dont la taille est définie et renvoie en sortie une probabilité pour chaque classe.

Outil de comparaison

Deux modèles d'intelligence artificielle de natures différentes sont entraînés pour accomplir la même tâche : classifier des enregistrements audio de personnes prononçant des chiffres de zéro à neuf.

Pour les comparer, nous utilisons l'outil Weights and Biases, qui permet de suivre et d'enregistrer facilement les performances des modèles de deep learning.

Avec Weights & Biases, vous pouvez construire de meilleurs modèles plus rapidement grâce au suivi des expériences, au versioning des jeux de données et à la gestion des modèles.

Dans notre cas, nous pourrons suivre l'évolution des différents modèles en fonction des valeurs de précision et de perte. L'outil nous offre également la possibilité de visualiser les temps d'entraînement et la consommation de ressources (GPU).

Pour en savoir plus sur Weights & Biases, reportez-vous à la documentation.

Les principes de base de l'utilisation de Weights & Biases sont disponibles ici avec AI Notebooks.

Prérequis

  • Un projet AI Training créé au sein d'un projet Public Cloud sur votre compte OVHcloud ;
  • Un utilisateur pour AI Training ;
  • Docker installé sur votre ordinateur local ;
  • Vérifiez que vous disposez d'un compte Docker Hub ;
  • Quelques connaissances sur la construction d'images et le Dockerfile ;
  • Un compte Weights & Biases, que vous pouvez créer sur leur site. C'est gratuit pour les particuliers.

Accès à l'espace client OVHcloud

  • Lien direct :
  • Pour accéder à vos services : Public Cloud > Sélectionnez votre projet

En pratique

Vous allez suivre différentes étapes pour traiter vos données et entraîner vos deux modèles.

  • Traitement des données plus détaillé dans ce notebook concernant la classification des sons de mammifères marins.
  • Le lien direct vers les fichiers Python complets se trouve ici.

Le tutoriel se déroule comme suit :

Schéma dessiné à la main de deux approches où les fichiers audio sont convertis soit en un fichier CSV fourni à un ANN soit en spectrogrammes fournis à un CNN les deux résultats étant envoyés vers Weights and Biases

Nous allons principalement voir comment écrire le code de traitement des données et d'entraînement des modèles, les fichiers requirements.txt et packages.txt, ainsi que le Dockerfile. Si vous souhaitez consulter le code complet, reportez-vous au dépôt GitHub.

Cloner le dépôt GitHub

La première chose à faire est de cloner le dépôt GitHub.

git clone https://github.com/ovh/ai-training-examples

Vous pouvez ensuite vous placer dans le répertoire dédié.

cd ai-training-examples/jobs/weights-and-biases/audio-classification-models-comparaison

Envoyer votre jeu de données sur Public Cloud Storage

Info

Téléchargez d'abord les données sur Kaggle.

Il s'agit d'un fichier zip (audio_files.zip) ! Nous allons l'envoyer dans un conteneur d'objets nommé spoken-digit.

Si vous souhaitez l'envoyer depuis l', rendez-vous dans la section Object Storage et créez un nouveau conteneur d'objets en cliquant sur Object Storage > Créer un conteneur d'objets.

Info

Dans l'espace client OVHcloud, vous pouvez envoyer des fichiers mais pas des dossiers. Par exemple, vous pouvez envoyer un fichier .zip pour optimiser la bande passante, puis le décompresser plus tard en y accédant via un JupyterLab. Vous pouvez également utiliser l'OVHcloud AI CLI pour envoyer des fichiers et des dossiers (plus stable qu'un envoi via votre navigateur).

Si vous souhaitez le faire avec la CLI, suivez simplement ce guide. Vous devez choisir la région, le nom de votre conteneur et le chemin où se trouvent vos données, puis utiliser la commande suivante :

ovhai bucket object upload <container>@<region> <paths>

Vous devriez obtenir :

├── spoken-digit
    └── audio_files.zip
    └── audio_files
        └── zero
        └── one
        └── two
        └── three
        └── four
        └── five
        └── six
        └── seven
        └── eight
        └── nine

Écrire les fichiers Python de traitement des données

Pour la partie traitement des données, nous distinguons deux fichiers Python.

Audio vers fichier csv avec extraction de caractéristiques

Le premier fichier Python s'appelle data-processing-audio-files-csv.py. Il permet de transformer tous les sons en paramètres Librosa et de créer un fichier csv.

Reportez-vous aux commentaires du code pour plus d'informations.

L'en-tête du fichier csv :

Cinq premières lignes du dataframe de caractéristiques extraites avec les colonnes filename length chroma_stft rms spectral_centroid spectral_bandwidth tempo et mfcc pour un total de 28 colonnes

Audio vers spectrogramme avec génération d'image

Le premier fichier Python s'appelle data-processing-audio-files-spectrograms.py. Il vous permet d'obtenir un spectrogramme (une image) correspondant à chaque son.

Reportez-vous aux commentaires du code pour plus d'informations.

Un exemple de spectrogramme :

Spectrogramme de Mel d'un échantillon audio où l'énergie apparaît sous forme de bandes orange et jaune vif sur un fond sombre

Une fois le traitement des données terminé, les modèles d'IA doivent être construits.

Écrire les fichiers Python d'entraînement des modèles

Pour la partie entraînement des modèles, nous distinguons deux fichiers Python.

Warning

À propos de la WANDB API KEY : veillez à bien remplacer MY_WANDB_API_KEY par la vôtre dans les deux fichiers Python d'entraînement.

ANN pour la classification audio basée sur les caractéristiques des sons

Un réseau de neurones artificiels est construit pour classifier des audios en fonction de leurs caractéristiques.

Il prend en entrée les 26 paramètres Librosa préalablement normalisés.

Le modèle renvoie en sortie un score entre 0 et 1 pour chaque classe via une fonction d'activation softmax. La classe avec le score le plus élevé est susceptible d'être celle correspondant au chiffre prononcé.

Reportez-vous aux commentaires du code pour plus d'informations.

CNN pour la classification d'images basée sur les spectrogrammes

Un réseau de neurones convolutif est construit pour classifier des images qui sont en réalité des spectrogrammes.

L'avantage d'utiliser des CNN est leur capacité à développer une représentation interne d'une image à deux dimensions. Cela permet au modèle d'apprendre la position et l'échelle dans les différentes structures de données, ce qui est important lorsqu'on travaille avec des images.

Il prend en entrée les spectrogrammes préalablement traités par le générateur de données Keras pour la classification d'images.

Comme précédemment, le modèle renvoie en sortie un score entre 0 et 1 pour chaque classe via une fonction d'activation softmax.

Reportez-vous aux commentaires du code pour plus d'informations.

Warning

Pour pouvoir observer et comparer les performances de nos deux modèles, les métriques observées doivent être les mêmes.

L'accuracy nous permettra de mesurer la précision de notre modèle.

sparse_categorical_crossentropy ou categorical_crossentropy nous permettent de mesurer la perte.

Écrire les fichiers requirements.txt et packages.txt

Le fichier requirements.txt nous permettra d'indiquer tous les modules nécessaires au fonctionnement de notre application.

matplotlib==3.5.2
pandas==1.4.3
split-folders==0.5.1
opencv-python-headless==4.5.5.64
librosa==0.8.0
tensorflow==2.9.1
wandb==0.12.21

Le fichier packages.txt nous permettra d'installer et d'utiliser le module Librosa et ses dépendances.

libsndfile1-dev

Ces fichiers seront utiles lors de l'écriture du Dockerfile.

Écrire le Dockerfile de l'application

Votre Dockerfile doit commencer par l'instruction FROM indiquant l'image parente à utiliser. Dans notre cas, nous choisissons de partir d'une image python:3.9 :

FROM python:3.9

Créez le répertoire personnel et ajoutez-y vos fichiers :

WORKDIR /workspace
ADD . /workspace

Installez le fichier packages.txt qui contient vos modules Python nécessaires à l'aide d'une commande apt-get install ... :

RUN apt-get update
RUN xargs -a packages.txt apt-get install --yes

Installez le fichier requirements.txt qui contient vos modules Python nécessaires à l'aide d'une commande pip install ... :

RUN pip install --no-cache-dir -r requirements.txt

Donnez les droits d'accès corrects à l'utilisateur OVHcloud (42420:42420) :

Warning

N'oubliez pas l'argument --user=42420:42420 si vous souhaitez simuler exactement le même comportement que celui qui se produira sur les jobs AI Training. Il exécute le container Docker en tant qu'utilisateur OVHcloud spécifique (utilisateur 42420:42420).

RUN chown -R 42420:42420 /workspace
ENV HOME=/workspace
Warning

Ici, nous ne spécifions pas de commande (CMD) à exécuter par défaut puisque nous le ferons directement dans le job AI Training.

Construire l'image Docker depuis le Dockerfile

Lancez l'une des commandes suivantes depuis le répertoire du Dockerfile pour construire l'image de votre application :

Warning

N'oubliez pas de remplacer <your-docker-id> par le vôtre.

# Build the image using your machine's default architecture
docker build . -t <your-docker-id>/audio-classification-models:latest

# Build image targeting the linux/amd64 architecture
docker buildx build --platform linux/amd64 -t <your-docker-id>/audio-classification-models:latest .
  • La première commande construit l'image en utilisant l'architecture par défaut de votre système. Cela peut fonctionner si votre machine utilise déjà l'architecture linux/amd64, qui est requise pour exécuter des containers avec nos produits AI. Cependant, sur des systèmes avec une architecture différente (par exemple ARM64 sur Apple Silicon), l'image résultante ne sera pas compatible et ne pourra pas être déployée.

  • La seconde commande cible explicitement l'architecture linux/amd64 afin de garantir la compatibilité avec nos services AI. Elle nécessite buildx, qui n'est pas installé par défaut. Si vous n'avez jamais utilisé buildx, vous pouvez l'installer en exécutant : docker buildx install

Info

L'argument point . indique que votre contexte de build (emplacement du Dockerfile et des autres fichiers nécessaires) est le répertoire courant.

L'argument -t vous permet de choisir l'identifiant à donner à votre image. En général, les identifiants d'image sont composés d'un nom et d'un tag de version <name>:<version>. Pour cet exemple, nous avons choisi audio-classification-models:latest.

Envoyer l'image vers votre Docker Hub

Warning

Pour en savoir plus sur le Docker Hub, cliquez ici.

docker push <your-docker-id>/audio-classification-models:latest

Lancer les jobs

Info

Nous utiliserons ici la CLI ovhai. Si vous souhaitez le faire depuis l'espace client OVHcloud, reportez-vous à cette documentation.

Les jobs sont lancés en deux étapes. D'abord, les jobs de traitement des données sont lancés. Une fois qu'ils sont Done, les jobs d'entraînement peuvent être exécutés.

Info

Pour en savoir plus sur le fonctionnement des jobs et leur statut, consultez cette documentation.

Traitement des données

  • Audio vers fichier csv avec extraction de caractéristiques :

Pour exécuter ce job, vous devez brancher un volume contenant vos sons. Une fois le job au statut Done, votre fichier csv sera synchronisé avec votre Object Storage.

Info

--volume <my-data>@<region>/:/workspace/data:RW:cache est le volume attaché pour le stockage des données. Ce volume est en lecture/écriture (RW) car le fichier csv sera créé et enregistré.

ovhai job run <your-docker-id>/audio-classification-models:latest \
      --cpu 12 \
      --volume <my-data>@<region>/:/workspace/data:RW:cache \
      -- bash -c 'python data-processing/data-processing-audio-files-csv.py'
  • Audio vers spectrogramme avec génération d'image :

Pour exécuter ce job, vous devez brancher un volume contenant vos sons. Une fois le job au statut Done, votre fichier csv sera synchronisé avec votre Object Storage.

Info

--volume <my-data>@<region>/:/workspace/data:RW:cache est le volume attaché pour le stockage des données. Ce volume est en lecture/écriture (RW) car les spectrograms seront créés et enregistrés.

ovhai job run <your-docker-id>/audio-classification-models:latest \
      --cpu 12 \
      --volume <my-data>@<region>/:/workspace/data:RW:cache \
      -- bash -c 'python data-processing/data-processing-audio-files-spectrograms.py'
Info

Ici, les modules Python et leurs dépendances ne sont pas adaptés à l'utilisation de GPUs.

Cependant, ces étapes prennent du temps. Nous utilisons donc autant de CPUs que possible (12).

À la fin du traitement des données, votre conteneur Object Storage devrait se présenter comme suit :

├── spoken-digit
    └── audio_files.zip
    └── audio_files
        └── zero
        └── one
        └── ...
        └── nine
    └── csv_files
        └── data_3_sec.csv
    └── spectrograms
        └── zero
        └── one
        └── ...
        └── nine
    └── spectrograms_split
        └── train
            └── zero
            └── one
            └── ...
            └── nine
        └── val
            └── zero
            └── one
            └── ...
            └── nine

Pour obtenir le statut de vos jobs, exécutez la commande suivante :

ovhai job get <job-id>

Une fois vos données pré-traitées et les deux jobs au statut Done, vous pourrez démarrer vos deux jobs d'entraînement.

Entraînement des modèles

  • ANN pour la classification audio basée sur les caractéristiques audio :

Pour exécuter ce job, vous devez brancher un volume contenant vos sons. Une fois le job au statut Done, votre fichier csv sera synchronisé avec votre Object Storage.

Info

--volume <my-data>@<region>/:/workspace/data:RO:cache est le volume attaché pour le stockage des données. Ce volume est en lecture seule (RO) car le fichier csv sera uniquement lu.

ovhai job run <your-docker-id>/audio-classification-models:latest \
      --gpu 1 \
      --volume <my-data>@<region>/:/workspace/data:RO:cache \
      -- bash -c 'python models-training/train-classification-audio_files_csv.py'
  • CNN pour la classification d'images basée sur les spectrogrammes :

Pour exécuter ce job, vous devez brancher un volume contenant vos sons. Une fois le job au statut Done, votre fichier csv sera synchronisé avec votre Object Storage.

Info

--volume <my-data>@<region>/:/workspace/data:RO:cache est le volume attaché pour le stockage des données. Ce volume est en lecture seule (RO) car les données spectrograms seront uniquement lues.

ovhai job run <your-docker-id>/audio-classification-models:latest \
      --gpu 1 \
      --volume <my-data>@<region>/:/workspace/data:RO:cache \
      -- bash -c 'python models-training/train-image-classification-audio-files-spectrograms.py'
Info

Envisagez d'ajouter l'attribut --unsecure-http si vous souhaitez que votre application soit accessible sans authentification.

Vous pouvez maintenant comparer vos modèles avec Weights & Biases.

Comparer avec Weights & Biases

Vous pourrez vérifier l'entraînement de vos modèles une fois vos jobs en statut d'exécution. Exécutez la commande suivante :

ovhai job get <job-id>

Une fois les jobs en statut d'exécution, vous pouvez consulter les logs pour obtenir le lien Weight & Biases. Exécutez la commande :

ovhai job logs <job-id>

Vous pouvez maintenant accéder au panneau Weights & Biases. Vous pourrez consulter les valeurs de précision et de perte pour les jeux d'entraînement et de validation.

  • Données d'entraînement :

Précision :

Graphique accuracy où le run image-classification-spectrogramms dépasse 0.9 tandis que le run audio-classification-features monte plus lentement jusqu'à environ 0.9

Perte :

Graphique loss où le run image-classification-spectrogramms descend rapidement sous 0.2 tandis que le run audio-classification-features décroît progressivement jusqu'à environ 0.3
  • Données de validation :

Précision :

Graphique val_accuracy où le run image-classification-spectrogramms se stabilise au-dessus de 0.9 tandis que le run audio-classification-features se stabilise autour de 0.7

Perte :

Graphique val_loss où le run image-classification-spectrogramms descend sous 0.2 tandis que le run audio-classification-features reste autour de 1 et remonte légèrement à la fin

Vous pouvez ensuite observer quel modèle est le meilleur en termes de vitesse, de précision ou de consommation de ressources...

Graphique GPU Power Usage en watts où le run image-classification-spectrogramms reste proche de 38.7 W pendant près de trois heures tandis que le run audio-classification-features n'apparaît que sous forme d'un bref pic près de 36.6 W

Dans ce cas, nous constatons que le modèle classifiant les spectrogrammes est meilleur en termes de précision et de perte sur le jeu de validation.

Cependant, il met plus de temps à s'entraîner et consomme plus de ressources de calcul.

Aller plus loin

  • Pour construire une app permettant de classifier des audios, reportez-vous à ce tutoriel.
  • Vous souhaitez savoir comment construire et utiliser une image Docker personnalisée avec AI Training ? C'est ici.

Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.

Votre avis nous intéresse !

N’hésitez pas à nous faire part de vos questions, retours et suggestions pour améliorer le service :

Cette page vous a-t-elle aidé ?