Eine geführte Tour zur Installation von optimiertem pytorch
und optional Apples neuem MLX
und/oder Googles tensorflow
oder JAX
auf Apple Silicon Macs und zur Verwendung großer HuggingFace
-Sprachmodelle für Ihre eigenen Experimente. Neuere Macs zeigen eine gute Leistung für maschinelle Lernaufgaben.
Wir werden die folgenden Schritte durchführen:
homebrew
installierenpytorch
mit MPS-Unterstützung (Metal Performance Shader) mithilfe von Apple Silicon GPUsmlx
Framework von AppleJAX
mit den Metal-Treibern von Apple (zu diesem Zeitpunkt (2024–07) ist es experimentell und nicht immer aktuell.)tensorflow
mit und die Metal-Pluggable-Metal-Treiberoptimierungen von Applejupyter lab
um Notebooks auszuführenhuggingface
und führen Sie einige vorab trainierte Sprachmodelle mit transformers
und nur wenigen Codezeilen im Jupyter Lab aus.Dann bieten wir zusätzliche HowTos für:
(Fahren Sie mit 1. Vorbereitungen fort, wenn Sie wissen, welches Framework Sie verwenden werden)
Tensorflow, JAX, Pytorch und MLX sind Deep-Learning-Frameworks, die die erforderlichen Bibliotheken zur Durchführung optimierter Tensoroperationen für Training und Inferenz bereitstellen. Auf hoher Ebene ist die Funktionalität aller vier gleichwertig. Huggingface baut auf jedem dieser Frameworks auf und bietet eine große Bibliothek vorab trainierter Modelle für viele verschiedene Anwendungsfälle, die sofort verwendet oder angepasst werden können, sowie eine Reihe praktischer Bibliotheken und Beispielcodes für einen einfachen Einstieg.
jax-metal
-Treiber ist nicht immer auf dem neuesten Stand mit den neuesten Versionen von JAX
.HuggingFace veröffentlicht eine Übersicht über die Modellunterstützung für jedes Framework. Derzeit ist Pytorch der De-facto-Standard, wenn man bestehende Modelle nutzen möchte.
Für die (wahrscheinlich zu vereinfachte) Antwort auf die Frage „Was ist am schnellsten?“ Werfen Sie einen Blick auf die Jupyter Notebook 02-Benchmarks, und sobald Sie die Installation abgeschlossen haben, können Sie Ihre eigene Umgebung testen. Das Notebook ermöglicht den Vergleich der Geschwindigkeit von Matrixmultiplikationen für verschiedene Frameworks. Allerdings wird der Unterschied zwischen den Frameworks bei der Durchführung von „Standard“-Modelltrainings- oder Inferenzaufgaben höchstwahrscheinlich weniger ausgeprägt sein.
Wenn Sie dies noch nicht getan haben, gehen Sie zu https://brew.sh/ und befolgen Sie die Anweisungen zur Installation von Homebrew. Sobald Sie fertig sind, öffnen Sie ein Terminal und geben Sie brew --version
ein, um zu überprüfen, ob es korrekt installiert ist.
Verwenden Sie nun brew
, um neuere Versionen von python
und git
zu installieren. Die Empfehlung lautet, Homebrews Standard-Python 3.12 zu verwenden, wenn Sie nicht vorhaben, Tensorflow mit Metal-Optimierung zu verwenden (erfordert weiterhin 3.11 (Stand 2024-04)).
brew install [email protected] git
brew install [email protected] git
Sie können beide Versionen von Python installieren und dann eine virtuelle Umgebung mit der spezifischen Python-Version erstellen, die Sie jeweils benötigen.
Wenn Sie auch Linux verwenden möchten, beachten Sie, dass die Unterstützung der Python-Version manchmal zwischen der Mac- und der Linux-Version von Frameworks unterschiedlich ist.
Apple investiert nicht allzu viel Energie in die Aktualisierung des MacOS-Pythons. Wenn Sie ein aktuelles Standard-Python verwenden möchten, ist es sinnvoll, das Python von Homebrew zum Standard-System-Python zu machen. Wenn Sie also Python 3.11 oder 3.12 von Homebrew systemweit verwenden möchten, ist dies am einfachsten (nach
brew install [email protected]
or3.11
):
Bearbeiten Sie ~/.zshrc
und fügen Sie Folgendes ein:
# 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
Ändern Sie alle Verweise von 3.12
auf 3.11
, wenn Sie Homebrews Python 3.11 zum Systemstandard-Python machen möchten.
(Starten Sie Ihr Terminal neu, um die Pfadänderungen zu aktivieren, oder geben Sie source ~/.zshrc
in Ihrer aktuellen Terminalsitzung ein.)
Unabhängig vom verwendeten System-Python können Sie beim Erstellen einer virtuellen Umgebung immer die spezifische Python-Version auswählen, die Sie im
venv
verwenden möchten, indem Sie dasvenv
mit genau diesem Python erstellen. Beispielsweise erstellt/usr/bin/python3 -m venv my_venv_name
eine virtuelle Umgebung mit Apples macOS Python (das zum Zeitpunkt des Verfassens dieses Artikels, 2024-07, immer noch bei 3.9.6 steckt). Weitere Einzelheiten finden Sie weiter unten unter „Virtuelle Umgebungen“ .
Klonen Sie nun dieses Projekt als Testprojekt:
git clone https://github.com/domschl/HuggingFaceGuidedTourForMac
Dadurch wird das Testprojekt in ein Verzeichnis HuggingFaceGuidedTourForMac
geklont
Erstellen Sie nun eine Python 3.12-Umgebung für dieses Projekt und aktivieren Sie sie:
(Nochmals: bei Bedarf durch 3.11
ersetzen)
python3.12 -m venv HuggingFaceGuidedTourForMac
Durch das Erstellen eines Venv werden die für die virtuelle Python-Umgebung erforderlichen Dateien (Python-Binärdateien, Bibliotheken, Konfigurationen) zum Projektordner hinzugefügt, den wir gerade geklont haben, wobei wiederum dasselbe Verzeichnis HuggingFaceGuidedTourForMac
verwendet wird. Geben Sie das Verzeichnis ein und aktivieren Sie die virtuelle Umgebung:
cd HuggingFaceGuidedTourForMac
source bin/activate
Jetzt enthält das Verzeichnis HuggingFaceGuidedTourForMac
den Inhalt des Github-Repositorys (z. B. 00-SystemCheck.ipynb
) und die Dateien für die virtuelle Umgebung (z. B. bin
, lib
etc
, include
, share
, pyvenv.cfg
):
Alternativen: Wenn Sie viele verschiedene Python-Versionen installiert haben, können Sie eine Umgebung erstellen, die eine bestimmte Version verwendet, indem Sie den Pfad der Python angeben, die zum Erstellen des venv
verwendet wird, z. B.:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
verwendet Homebrews Python explizit, um ein neues venv
zu erstellen, wohingegen
/usr/bin/python3 -m venv my_old_system_venv
würde Apples macOS-Python-Version für die neue Umgebung verwenden.
Deaktivieren Sie diese virtuelle Umgebung, indem Sie einfach Folgendes verwenden:
deactivate
Um es erneut zu aktivieren, geben Sie das Verzeichnis ein, das den venv
enthält, hier: HuggingFaceGuidedTourForMac
und verwenden Sie:
source bin/activate
venv
Eine sehr unintuitive Eigenschaft von
venv
ist die Tatsache: Während Sie eine Umgebung betreten, indem Sie sie im Unterverzeichnis Ihres Projekts aktivieren (mitsource bin/activate
), bleibtvenv
aktiv, wenn Sie den Projektordner verlassen und mit der Arbeit an etwas völlig anderem beginnen, bis Sie deaktivieren denvenv
explizit mitdeactivate
.Es gibt eine Reihe von Tools, die die Eingabeaufforderung des Terminalsystems so ändern, dass sie den aktuell aktiven
venv
anzeigt, was sehr hilfreich ist. Schauen Sie sich Starship an (empfohlen) oder, wenn Sie Verschönerung mögen,Oh My Zsh
.
Beispiel mit installiertem powerlevel10k
. Auf der linken Seite der Systemeingabeaufforderung wird das aktuelle Verzeichnis angezeigt, auf der rechten Seite wird der Name des venv
angezeigt. Derzeit ist kein venv
aktiv.
Nach der Aktivierung eines venv
in HuggingFaceGuidedTourForMac
:
Auch wenn das Arbeitsverzeichnis geändert wird (hier zu home
), da der venv
noch aktiv ist, wird sein Name auf der rechten Seite von powerlevel10k
angezeigt. Sehr praktisch.
Weitere Informationen zu virtuellen Python-Umgebungen finden Sie unter https://docs.python.org/3/tutorial/venv.html.
pytorch
Stellen Sie sicher, dass Ihre virtuelle Umgebung mit pip -V
(Großbuchstabe V) aktiv ist. Dies sollte einen Pfad für pip
innerhalb Ihres Projekts anzeigen:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.12/site-packages/pip (python 3.12)
Nach https://pytorch.org
werden wir Pytorch mit pip
installieren. Sie benötigen mindestens Version 2.x (Standard seit 2023), um MPS (Metal Performance Shaders)-Unterstützung in Pytorch zu erhalten, was einen erheblichen Leistungsvorteil auf Apple Silicon bietet.
So installieren Sie pytorch
im venv
:
pip install -U torch numpy torchvision torchaudio
Um zu testen, ob pytorch
korrekt installiert ist und MPS-Metal-Performance-Shader verfügbar sind, öffnen Sie ein Terminal, geben Sie python
ein und geben Sie in der Python-Shell Folgendes ein:
import torch
# check if MPS is available:
torch . backends . mps . is_available ()
Dies sollte True
zurückgeben.
MLX
pip install -U mlx
Starten Sie erneut python
und geben Sie Folgendes ein:
import mlx . core as mx
print ( mx . __version__ )
Dies sollte eine Version wie 0.16.1
(2024-07) drucken.
JAX
installieren JAX ist eine ausgezeichnete Wahl, wenn Ihr Fokus auf der Low-Level-Optimierung von Algorithmen und der Forschung über die Grenzen etablierter Deep-Learning-Algorithmen hinaus liegt. Nach dem Vorbild von numpy
unterstützt es die automatische Differenzierung von „allem“ (für Optimierungsprobleme) und unterstützt die Vektorisierung und Parallelisierung von Python-Algorithmen über reines Deep Learning hinaus. Um die Funktionalität zu erhalten, die von anderen Deep-Learning-Frameworks erwartet wird (Ebenen, Trainingsschleifenfunktionen und ähnliche „High-Level“), sollten Sie die Installation zusätzlicher neuronaler Netzwerkbibliotheken wie „ flax
in Betracht ziehen.
Leider hinken die JAX
Metal-Treiber hinter den JAX-Versionen hinterher. Daher müssen Sie in der Kompatibilitätstabelle nach den unterstützten JAX
-Versionen suchen, die mit den verfügbaren jax-metal
Treibern übereinstimmen.
So installieren Sie eine bestimmte Version von JAX
und das neueste jax-metal
mit pip
in der aktiven Umgebung:
# 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
Starten Sie python
(3.12 wird unterstützt) und geben Sie Folgendes ein:
import jax
print ( jax . devices ()[ 0 ])
Folgendes sollte angezeigt werden (nur beim ersten Start):
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)]
Hier ist METAL:0
das Gerät, das JAX für Berechnungen verwendet, und Apple Silicon wird unterstützt.
Wenn Sie stattdessen Fehler sehen wie:
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.)
Ihre Version von jax
und jaxlib
ist nicht mit jax-metal
kompatibel. Überprüfen Sie die Kompatibilitätstabelle für jax-metal
und installieren Sie die erforderlichen Versionen wie in der Tabelle angegeben.
tensorflow
installierenTensorflow verliert schnell an Unterstützung und nicht einmal Google veröffentlicht neue Modelle für Tensorflow. Wenn Sie planen, diesen zu verwenden, wird ein Migrationsplan empfohlen.
Während Tensorflow Python 3.12 seit 2.16 unterstützt, wurde der macOS
tensorflow-metal
Accelerator seit 2023-09 (Stand 2024-07) nicht mehr aktualisiert und erfordert Python 3.11:
Stellen Sie sicher, dass Ihre virtuelle Umgebung mit pip -V
(Großbuchstabe V) aktiv ist. Dies sollte einen Pfad für pip
innerhalb Ihres Projekts anzeigen:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.11/site-packages/pip (python 3.11)
Nach https://developer.apple.com/metal/tensorflow-plugin/ werden wir tensorflow
mit pip
in unserem venv
installieren:
pip install -U tensorflow tensorflow-metal
Um zu testen, ob tensorflow
korrekt installiert ist, öffnen Sie ein Terminal, geben Sie python
ein und geben Sie in der Python-Shell Folgendes ein:
import tensorflow as tf
tf . config . list_physical_devices ( 'GPU' )
Sie sollten etwa Folgendes sehen:
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
Zu diesem Zeitpunkt sollte Ihr Apple Silicon Mac bereit sein, pytorch
und optional MLX
und/oder JAX
oder tensorflow
mit Hardwarebeschleunigungsunterstützung unter Verwendung des Apple Metal Frameworks auszuführen.
Um dies zu testen, können Sie jupyter lab
verwenden, um einige Notebooks auszuführen. Um jupyter lab
zu installieren, stellen Sie zunächst sicher, dass die virtuelle Umgebung, die Sie verwenden möchten, aktiv ist ( pip -V
), und geben Sie Folgendes ein:
pip install -U jupyterlab ipywidgets
Wenn Sie andere Jupyter-Versionen installiert haben, wird der Pfad zur neu installierten Jupyter-Version innerhalb des
venv
oft nicht korrekt aktualisiert. Aktivieren Sie die Umgebung erneut, um sicherzustellen, dass die richtige lokale Jupyter-Version verwendet wird:
deactivate
source bin/activate
Geben Sie zum Starten des Jupyter-Labors Folgendes ein:
jupyter lab
Dies sollte ein Browserfenster öffnen, in dem jupyter lab
ausgeführt wird. Anschließend können Sie ein neues Python-Notebook erstellen und Code ausführen, um zu testen, ob tensorflow
und pytorch
ordnungsgemäß funktionieren:
import torch
print ( "Pytorch version:" , torch . __version__ )
Wenn dies erfolgreich abgeschlossen wurde, ist Ihr Mac nun bereit für Deep-Learning-Experimente.
HuggingFace ist eine großartige Ressource für NLP- und Deep-Learning-Experimente. Es bietet eine große Anzahl vorab trainierter Sprachmodelle und eine einfache API für deren Verwendung. Dadurch können wir schnell mit Deep-Learning-Experimenten beginnen.
transformers
installieren Aus der Huggingface-Installationsanleitung geht hervor, dass wir pip
verwenden, um transformers
zu installieren:
pip install -U transformers accelerate " huggingface_hub[cli] "
Wenn Sie mit HuggingFace experimentieren, laden Sie große Modelle herunter, die in Ihrem Home-Verzeichnis unter
~/.cache/huggingface/hub
gespeichert werden. Sie können diese Modelle jederzeit entfernen, indem Sie dieses Verzeichnis oder Teile seines Inhalts löschen.
accelerate
ist optional, wird aber für den Betrieb einiger großer Modelle verwendet. Ein Nebeneffekt der Installation von accelerate
könnte ein Downgrade einiger anderer Module wie numpy
sein."huggingface_hub[cli]"
installiert die Huggingface-Befehlszeilentools, die manchmal zum Herunterladen von (teilweise proprietär lizenzierten) Modellen wie Llama 3 erforderlich sind. Starten Sie im Verzeichnis HuggingFaceGuidedTourForMac
und aktivem venv
jupyter lab
und laden Sie das Notizbuch 00-SystemCheck.ipynb
. Das Notebook prüft zunächst alle Deep-Learning-Frameworks und gibt Auskunft, ob diese korrekt installiert sind. Anschließend wird Pytorch für ein einfaches Experiment verwendet.
Verwenden Sie <Shift>-Enter
um die Zellen des Notizbuchs auszuführen.
Wenn Sie Jupyter Lab vor der Installation von Huggingface gestartet haben, müssen Sie entweder den Python-Kernel in Jupyter neu starten oder Jupyter Lab einfach neu starten, da es sonst die Transformers-Bibliothek nicht findet.
Nach den verschiedenen Tests sollten Sie endlich so etwas sehen:
Wenn Sie die Klassifizierung POSITIVE
mit einem Wert von 0.99
erhalten haben, können Sie mit HuggingFace experimentieren!
Sie werden sehen, dass die
HuggingFace
-Bibliotheken alle möglichen großen Binärblobs herunterladen, die die Daten des trainierten Modells enthalten. Diese Daten werden in Ihrem Home-Verzeichnis unter~/.cache/huggingface/hub
gespeichert. Sie können diese Modelle jederzeit entfernen, indem Sie dieses Verzeichnis oder Teile seines Inhalts löschen.
Sie können das Notizbuch 01-ChatBot.ipynb
öffnen, um einen sehr einfachen Chatbot auf Ihrem Mac auszuprobieren.
Der verwendete Python-Code ist:
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 } " )
Dies zeigt einen (ziemlich begrenzten und sich wiederholenden) Chatbot, der die DialoGPT-Modelle von Microsoft verwendet.
Dinge, die Sie ausprobieren sollten:
use_model_index
zwischen 0..2
können Sie entweder ein kleines, mittleres oder großes Sprachmodell auswählen.history_text
verknüpften Zeilen oben auskommentieren.~/.cache/huggingface/hub
. Fehlende Inhalte werden bei Bedarf automatisch erneut heruntergeladen. llama.cpp
, das den für die Ausführung von LLMs erforderlichen Inferenzcode in hochoptimiertem C++-Code implementiert und so die Metal-Beschleunigung des Mac unterstützt.In diesem Absatz wird Conda deinstalliert, das in älteren Versionen dieses Handbuchs verwendet wurde:
brew uninstall miniconda
Weitere Modifikationen sind (alle sind inaktiv, sobald Miniconda entfernt wird):
~/.condarc
(Liste der Kanäle) und ~/.conda
.~/.zshrc
(oder .bashrc
) für die Einrichtung von Pfad und Umgebung.~/.cache/huggingface/hub
befinden. Entfernen Sie einfach das Verzeichnis. conda
auf pip
und venv
umgestellt. Die Installation ist jetzt viel einfacher.pytorch
v2.0 nun veröffentlicht ist, kann in der Installationsanleitung nun der Kanal pytorch-nightly
durch pytorch
ersetzt werden. Der pytorch-nightly
-Kanal wird für die MPS-Unterstützung nicht mehr benötigt.