Une visite guidée sur la façon d'installer pytorch
optimisé et éventuellement le nouveau MLX
d'Apple et/ou tensorflow
ou JAX
de Google sur les Mac Apple Silicon et comment utiliser les grands modèles de langage HuggingFace
pour vos propres expériences. Les Mac récents affichent de bonnes performances pour les tâches d'apprentissage automatique.
Nous effectuerons les étapes suivantes :
homebrew
pytorch
avec la prise en charge de MPS (metal performance shaders) à l'aide des GPU Apple Siliconmlx
d'AppleJAX
avec les pilotes métalliques d'Apple (expérimental à ce stade (2024-07), et pas toujours à jour.)tensorflow
avec les optimisations des pilotes métalliques enfichables en métal d'Applejupyter lab
pour exécuter des notebookshuggingface
et exécutez des modèles de langage pré-entraînés à l'aide transformers
et de quelques lignes de code dans le laboratoire Jupyter.Ensuite, nous fournissons des procédures supplémentaires pour :
(passez à 1. Préparatifs si vous savez quel framework vous allez utiliser)
Tensorflow, JAX, Pytorch et MLX sont des frameworks d'apprentissage en profondeur qui fournissent les bibliothèques requises pour effectuer des opérations tensorielles optimisées utilisées dans la formation et l'inférence. À haut niveau, la fonctionnalité des quatre est équivalente. Huggingface s'appuie sur n'importe lequel de ces frameworks et fournit une vaste bibliothèque de modèles pré-entraînés pour de nombreux cas d'utilisation différents, prêts à être utilisés ou à personnaliser, ainsi qu'un certain nombre de bibliothèques pratiques et d'exemples de code pour un démarrage facile.
jax-metal
n'est pas toujours à jour avec les dernières versions de JAX
.HuggingFace publie un aperçu de la prise en charge des modèles pour chaque framework. Actuellement, Pytorch est le standard de facto, si vous souhaitez utiliser des modèles existants.
Pour la réponse (sans doute trop simplifiée) à la question « Quel est le plus rapide ? » jetez un œil au Jupyter notebook 02-Benchmarks, et une fois l’installation terminée, vous pourrez tester votre propre environnement. Le cahier permet de comparer la vitesse des multiplications matricielles pour différents frameworks. Cependant, la différence entre les frameworks lors de l'exécution de tâches de formation ou d'inférence sur modèle « standard » sera probablement moins prononcée.
Si vous ne l'avez pas fait, accédez à https://brew.sh/ et suivez les instructions pour installer homebrew. Une fois cela fait, ouvrez un terminal et tapez brew --version
pour vérifier qu'il est correctement installé.
Utilisez maintenant brew
pour installer des versions plus récentes de python
et git
. La recommandation est d'utiliser Python 3.12 par défaut de Homebrew, si vous ne prévoyez pas d'utiliser Tensorflow avec l'optimisation Metal (nécessite toujours 3.11 (au 2024-04)).
brew install [email protected] git
brew install [email protected] git
vous pouvez installer les deux versions de Python, puis créer un environnement virtuel en utilisant la version spécifique de Python dont vous avez besoin pour chaque cas.
Si vous envisagez d'utiliser également Linux, sachez que la prise en charge des versions Python diffère parfois entre les versions Mac et Linux des frameworks.
Apple ne consacre pas trop d'énergie à maintenir le python de MacOS à jour. Si vous souhaitez utiliser un python par défaut à jour, il est logique de faire du python de l'homebrew le python système par défaut. Donc, si vous souhaitez utiliser le système Python 3.11 ou 3.12 d'homebrew à l'échelle mondiale, le moyen le plus simple de le faire (après
brew install [email protected]
ou3.11
) :
Modifiez ~/.zshrc
et insérez :
# This is OPTIONAL and only required if you want to make homebrew's Python 3.12 as the global version:
export PATH= " /opt/homebrew/opt/[email protected]/bin: $PATH "
export PATH=/opt/homebrew/opt/[email protected]/libexec/bin: $PATH
Modifiez toutes les références de 3.12
à 3.11
lorsque vous souhaitez créer le python standard du système Python 3.11 d'homebrew.
(Redémarrez votre terminal pour activer les changements de chemin, ou entrez source ~/.zshrc
dans votre session de terminal actuelle.)
Quel que soit le système Python utilisé, lors de la création d'un environnement virtuel, vous pouvez toujours sélectionner la version spécifique de Python que vous souhaitez utiliser dans le
venv
en créant levenv
avec exactement ce python. Par exemple,/usr/bin/python3 -m venv my_venv_name
crée un environnement virtuel à l'aide du python macOS d'Apple (qui au moment d'écrire ces lignes, 2024-07, est toujours bloqué à 3.9.6). Voir ci-dessous, Environnements virtuels , pour plus de détails.
Clonez maintenant ce projet en tant que projet de test :
git clone https://github.com/domschl/HuggingFaceGuidedTourForMac
Cela clone le projet de test dans un répertoire HuggingFaceGuidedTourForMac
Créez maintenant un environnement Python 3.12 pour ce projet et activez-le :
(Encore une fois : remplacez par 3.11
, si vous en avez besoin)
python3.12 -m venv HuggingFaceGuidedTourForMac
La création d'un venv ajoute les fichiers requis (binaires python, bibliothèques, configurations) pour l'environnement python virtuel au dossier du projet que nous venons de cloner, en utilisant à nouveau le même répertoire HuggingFaceGuidedTourForMac
. Entrez dans le répertoire et activez l'environnement virtuel :
cd HuggingFaceGuidedTourForMac
source bin/activate
Maintenant, le répertoire HuggingFaceGuidedTourForMac
contient le contenu du référentiel github (par exemple 00-SystemCheck.ipynb
) et les fichiers de l'environnement virtuel (par exemple bin
, lib
, etc
, include
, share
, pyvenv.cfg
) :
Alternatives : Si de nombreuses versions différentes de Python sont installées, vous pouvez créer un environnement qui utilise une version spécifique en spécifiant le chemin du python utilisé pour créer le venv
, par exemple :
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
utilise explicitement le python de homebrew pour créer un nouveau venv
, alors que
/usr/bin/python3 -m venv my_old_system_venv
utiliserait la version macOS Python d'Apple pour le nouvel environnement.
Désactivez cet environnement virtuel, utilisez simplement :
deactivate
Pour le réactiver, entrez dans le répertoire qui contient le venv
, ici : HuggingFaceGuidedTourForMac
et utilisez :
source bin/activate
venv
Une propriété très peu intuitive de
venv
est le fait : pendant que vous entrez dans un environnement en l'activant dans le sous-répertoire de votre projet (avecsource bin/activate
), levenv
reste actif lorsque vous quittez le dossier du projet et commencez à travailler sur quelque chose de complètement différent jusqu'à ce que vous désactivez explicitement levenv
avecdeactivate
.Il existe un certain nombre d'outils qui modifient l'invite du système du terminal pour afficher le
venv
actuellement actif, ce qui est très utile. Découvrez starship (recommandé), ou, si vous aimez l'embellissementOh My Zsh
.
Exemple avec powerlevel10k
installé. Le côté gauche de l'invite système affiche le répertoire actuel, le côté droit affiche le nom du venv
. Actuellement, aucun venv
n’est actif.
Après avoir activé un venv
dans HuggingFaceGuidedTourForMac
:
Même si le répertoire de travail est modifié (ici en home
), puisque le venv
est toujours actif, son nom est affiché sur le côté droit par powerlevel10k
. Très pratique.
Voir https://docs.python.org/3/tutorial/venv.html pour plus d'informations sur les environnements virtuels Python.
pytorch
Assurez-vous que votre environnement virtuel est actif avec pip -V
(V majuscule), cela devrait afficher un chemin pour pip
dans votre projet :
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.12/site-packages/pip (python 3.12)
Après https://pytorch.org
, nous installerons Pytorch avec pip
. Vous avez besoin d'au moins la version 2.x (par défaut depuis 2023) pour bénéficier du support MPS (Metal Performance Shaders) dans pytorch, qui offre un avantage significatif en termes de performances sur Apple Silicon.
Pour installer pytorch
dans le venv
:
pip install -U torch numpy torchvision torchaudio
Pour tester que pytorch
est correctement installé et que les shaders de performances MPS metal sont disponibles, ouvrez un terminal, tapez python
et dans le shell python, saisissez :
import torch
# check if MPS is available:
torch . backends . mps . is_available ()
Cela devrait renvoyer True
.
MLX
pip install -U mlx
Encore une fois, démarrez python
et entrez :
import mlx . core as mx
print ( mx . __version__ )
Cela devrait imprimer une version, telle que 0.16.1
(2024-07)
JAX
JAX est un excellent choix si vous vous concentrez sur l'optimisation de bas niveau des algorithmes et la recherche au-delà des limites des algorithmes d'apprentissage en profondeur établis. Inspiré de numpy
, il prend en charge la différenciation automatique de « tout » (pour les problèmes d'optimisation) et prend en charge la vectorisation et la parallélisation des algorithmes Python au-delà du simple apprentissage en profondeur. Pour obtenir les fonctionnalités attendues d'autres frameworks d'apprentissage en profondeur (couches, fonctions de boucle de formation et « haut niveau » similaires), envisagez d'installer une bibliothèque de réseaux neuronaux supplémentaire telle que : flax
.
Malheureusement, les pilotes JAX
metal ont commencé à prendre du retard par rapport aux versions JAX et vous devez donc vérifier le tableau de compatibilité des versions prises en charge de JAX
qui correspondent aux pilotes jax-metal
disponibles.
Pour installer une version spécifique de JAX
et la dernière version jax-metal
avec pip
dans l'environnement actif :
# The version 0.4.26 is taken from the compatibility table mentioned above. Update as required.
pip install -U jax==0.4.26 jaxlib==0.4.26 jax-metal
Démarrez python
(3.12 est pris en charge) et saisissez :
import jax
print ( jax . devices ()[ 0 ])
Cela devrait afficher (lors de la première exécution uniquement) :
Platform 'METAL' is experimental and not all JAX functionality may be correctly supported!
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
W0000 00:00:1721975334.430133 43061 mps_client.cc:510] WARNING: JAX Apple GPU support is experimental and not all JAX functionality is correctly supported!
Metal device set to: Apple M2 Max
systemMemory: 32.00 GB
maxCacheSize: 10.67 GB
I0000 00:00:1721975334.446739 43061 service.cc:145] XLA service 0x60000031d100 initialized for platform METAL (this does not guarantee that XLA will be used). Devices:
I0000 00:00:1721975334.446771 43061 service.cc:153] StreamExecutor device (0): Metal, <undefined>
I0000 00:00:1721975334.448269 43061 mps_client.cc:406] Using Simple allocator.
I0000 00:00:1721975334.448308 43061 mps_client.cc:384] XLA backend will use up to 22906109952 bytes on device 0 for SimpleAllocator.
[METAL(id=0)]
Ici, METAL:0
est l'appareil que JAX utilisera pour les calculs, et Apple Silicon est pris en charge.
Si, à la place, vous voyez des erreurs telles que :
RuntimeError: Unable to initialize backend 'METAL': INVALID_ARGUMENT: Mismatched PJRT plugin PJRT API version (0.47) and framework PJRT API version 0.54). (you may need to uninstall the failing plugin package, or set JAX_PLATFORMS=cpu to skip this backend.)
Votre version de jax
et jaxlib
sont incompatibles avec jax-metal
. Vérifiez le tableau de compatibilité pour jax-metal
et installez les versions requises comme indiqué dans le tableau.
tensorflow
Tensorflow perd rapidement son support, et même Google ne publie pas de nouveaux modèles pour Tensorflow. Un plan de migration est recommandé si vous envisagez de l'utiliser.
Alors que Tensorflow prend en charge Python 3.12 depuis la version 2.16, l'accélérateur macOS
tensorflow-metal
n'a pas été mis à jour depuis 2023-09 (état de 2024-07) et nécessite Python 3.11 :
Assurez-vous que votre environnement virtuel est actif avec pip -V
(V majuscule), cela devrait afficher un chemin pour pip
dans votre projet :
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.11/site-packages/pip (python 3.11)
Après https://developer.apple.com/metal/tensorflow-plugin/, nous installerons tensorflow
avec pip
dans notre venv
:
pip install -U tensorflow tensorflow-metal
Pour tester que tensorflow
est correctement installé, ouvrez un terminal, tapez python
et dans le shell python, saisissez :
import tensorflow as tf
tf . config . list_physical_devices ( 'GPU' )
Vous devriez voir quelque chose comme :
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
À ce stade, votre Apple Silicon Mac devrait être prêt à exécuter pytorch
et éventuellement MLX
et/ou JAX
ou tensorflow
avec prise en charge de l'accélération matérielle, en utilisant le framework Apple Metal.
Pour tester cela, vous pouvez utiliser jupyter lab
pour exécuter certains notebooks. Pour installer jupyter lab
, assurez-vous d'abord que l'environnement virtuel que vous souhaitez utiliser est actif ( pip -V
) et tapez :
pip install -U jupyterlab ipywidgets
Si d'autres versions de Jupyter sont installées, le chemin d'accès à la version de Jupyter nouvellement installée dans
venv
n'est souvent pas mis à jour correctement, réactivez l'environnement pour vous assurer que la version locale correcte de Jupyter est utilisée :
deactivate
source bin/activate
Pour démarrer l'atelier Jupyter, tapez :
jupyter lab
Cela devrait ouvrir une fenêtre de navigateur avec jupyter lab
en cours d'exécution. Vous pouvez ensuite créer un nouveau notebook python et exécuter du code pour tester que tensorflow
et pytorch
fonctionnent correctement :
import torch
print ( "Pytorch version:" , torch . __version__ )
Si cela réussit, votre Mac est maintenant prêt pour les expériences de Deep Learning.
HuggingFace est une excellente ressource pour les expériences de PNL et de Deep Learning. Il fournit un grand nombre de modèles de langage pré-entraînés et une API simple pour les utiliser. Cela nous permettra de nous lancer rapidement dans des expériences de Deep Learning.
transformers
À partir des instructions d'installation de Huggingface, nous utilisons pip
pour installer transformers
:
pip install -U transformers accelerate " huggingface_hub[cli] "
Lorsque vous expérimenterez HuggingFace, vous téléchargerez des modèles volumineux qui seront stockés dans votre répertoire personnel à l'adresse :
~/.cache/huggingface/hub
. Vous pouvez supprimer ces modèles à tout moment en supprimant ce répertoire ou une partie de son contenu.
accelerate
est facultative, mais utilisée pour exécuter certains grands modèles. L'effet secondaire de l'installation accelerate
pourrait être une rétrogradation de certains autres modules comme numpy
."huggingface_hub[cli]"
installe les outils de ligne de commande huggingface qui sont parfois nécessaires pour télécharger des modèles (sous licence partiellement propriétaire) comme Llama 3. Dans le répertoire HuggingFaceGuidedTourForMac
et active venv
, démarrez jupyter lab
et chargez le notebook 00-SystemCheck.ipynb
. Le notebook vérifiera d’abord tous les frameworks d’apprentissage en profondeur et donnera des informations s’ils sont correctement installés. Ensuite, Pytorch est utilisé pour une expérience simple.
Utilisez <Shift>-Enter
pour exécuter les cellules du bloc-notes.
Si vous avez démarré Jupyter Lab avant d'installer Huggingface, vous devez soit redémarrer le noyau python dans Jupyter, soit simplement redémarrer Jupyter Lab, sinon il ne trouvera pas la bibliothèque Transformers.
Après les différents tests, vous devriez enfin voir quelque chose comme ceci :
Si vous avez reçu une classification POSITIVE
avec un score de 0.99
, alors vous êtes prêt à commencer à expérimenter avec HuggingFace !
Vous verrez que les bibliothèques
HuggingFace
téléchargent toutes sortes de gros blobs binaires contenant les données du modèle entraîné. Ces données sont stockées dans votre répertoire personnel à l'adresse :~/.cache/huggingface/hub
. Vous pouvez supprimer ces modèles à tout moment en supprimant ce répertoire ou une partie de son contenu.
Vous pouvez ouvrir le notebook 01-ChatBot.ipynb
pour essayer un chatbot très simple sur votre Mac.
Le code python utilisé est :
import torch
from transformers import AutoModelForCausalLM , AutoTokenizer
from transformers . utils import logging
# Disable warnings about padding_side that cannot be rectified with current software:
logging . set_verbosity_error ()
model_names = [ "microsoft/DialoGPT-small" , "microsoft/DialoGPT-medium" , "microsoft/DialoGPT-large" ]
use_model_index = 1 # Change 0: small model, 1: medium, 2: large model (requires most resources!)
model_name = model_names [ use_model_index ]
tokenizer = AutoTokenizer . from_pretrained ( model_name ) # , padding_side='left')
model = AutoModelForCausalLM . from_pretrained ( model_name )
# The chat function: received a user input and chat-history and returns the model's reply and chat-history:
def reply ( input_text , history = None ):
# encode the new user input, add the eos_token and return a tensor in Pytorch
new_user_input_ids = tokenizer . encode ( input_text + tokenizer . eos_token , return_tensors = 'pt' )
# append the new user input tokens to the chat history
bot_input_ids = torch . cat ([ history , new_user_input_ids ], dim = - 1 ) if history is not None else new_user_input_ids
# generated a response while limiting the total chat history to 1000 tokens,
chat_history_ids = model . generate ( bot_input_ids , max_length = 1000 , pad_token_id = tokenizer . eos_token_id )
# pretty print last ouput tokens from bot
return tokenizer . decode ( chat_history_ids [:, bot_input_ids . shape [ - 1 ]:][ 0 ], skip_special_tokens = True ), chat_history_ids
history = None
while True :
input_text = input ( "> " )
if input_text in [ "" , "bye" , "quit" , "exit" ]:
break
reply_text , history_new = reply ( input_text , history )
history = history_new
if history . shape [ 1 ] > 80 :
old_shape = history . shape
history = history [:, - 80 :]
print ( f"History cut from { old_shape } to { history . shape } " )
# history_text = tokenizer.decode(history[0])
# print(f"Current history: {history_text}")
print ( f"D_GPT: { reply_text } " )
Ceci montre un chatbot (assez limité et répétitif) utilisant les modèles DialoGPT de Microsoft.
Choses à essayer :
use_model_index
entre 0..2
, vous pouvez sélectionner un modèle de langage petit, moyen ou grand.history_text
ci-dessus.~/.cache/huggingface/hub
. Les éléments manquants sont automatiquement retéléchargés en cas de besoin. llama.cpp
qui implémente le code d'inférence nécessaire pour exécuter des LLM dans un code C++ hautement optimisé, prenant en charge l'accélération Metal du Mac.Ce paragraphe vise à désinstaller conda qui était utilisé dans les anciennes versions de ce guide :
brew uninstall miniconda
Les modifications supplémentaires sont (elles sont toutes inactives, une fois la miniconda supprimée) :
~/.condarc
(liste des chaînes) et ~/.conda
.~/.zshrc
(ou .bashrc
) pour la configuration du chemin et de l'environnement.~/.cache/huggingface/hub
. Supprimez simplement le répertoire. conda
à pip
et venv
pour les dernières versions de tensorflow 2.13, Pytorch 2, macOS Sonoma, l'installation est désormais beaucoup plus simple.pytorch
v2.0, le canal pytorch-nightly
peut désormais être remplacé par pytorch
dans les instructions d'installation. Le canal pytorch-nightly
n'est plus nécessaire pour la prise en charge MPS.