Blog
Ausführen des nicht unterstützten Azure Python SDK auf meinem brandneuen M2 Mac

Wie es anfing
Bei der Installation von Software auf meinem neuen MacBook Pro M2 habe ich mit einer Neuinstallation begonnen, anstatt eine Sicherungskopie wiederherzustellen. Das klappte wunderbar, bis ich versuchte, einem von einem Kollegen geschriebenen Tutorial zu folgen, das das Azure Python SDK zur Erstellung eines Datensatzes und zum Hochladen auf ein Azure-Speicherkonto verwendet.
Der Fehler war nicht sehr aussagekräftig und recht allgemein gehalten:
ModuleNotFoundError: No module named 'azureml.dataprep'
Versuchen wir, das zu beheben
Eine Suche im Internet ergab, dass ich die Abhängigkeit von azureml-dataset-runtime installieren musste. Ich nahm an, dass dies bereits geschehen war, da in der Datei pyproject.toml darauf verwiesen wurde, aber ich war so naiv und versuchte, die Bibliothek zu installieren.
pip install azureml-dataset-runtime==1.40.0
Failed to build numpy
ERROR: Could not build wheels for numpy, which is required to install pyproject.toml-based projects
[end of output]
Ich habe noch etwas weiter gesucht und ein bekanntes Problem mit dem Azure ML Python SDK auf M1 oder M2 MacBooks gefunden: Azure Python SDK Problem
Der Vorschlag war, Rosetta zu verwenden, um Python auf einem Mac auszuführen. Das hörte sich für mich etwas zu hart an, also suchte ich ein wenig weiter und stieß auf diesen Beitrag: How to create a separate Rosetta Terminal (Wie man ein separates Rosetta-Terminal erstellt ), in dem gezeigt wird, wie man eine separate Terminal Anwendung erstellt, die Rosetta verwendet. Leider funktionierte dies nicht auf dem M2 MacBook (Ventura), wie in den Kommentaren weiter unten im Thread angegeben. Die Diskussion in diesem Thread gab mir jedoch einige Hinweise für die weitere Suche nach einer Lösung.
Die Geschichte geht weiter
Also brauchte ich ein Programm namens Rosetta. Dabei handelt es sich um einen Emulator, mit dem Sie Anwendungen ausführen können, die ausschließlich für Intel-Prozessoren kompiliert wurden, um sie auf Apple-Silizium auszuführen. Und ja, das schien etwas zu sein, das ich brauchte. Aber nicht für meine gesamte Software, oder? Und auch nicht für alle meine Python-Projekte. Ich musste ein wenig mehr zu diesem Thema recherchieren und dann fiel mir dieser Stackoverflow-Beitrag ins Auge.
Eine zusätzliche Suche nach dem Befehl arch führte mich zu diesem letzten Befehl zum Starten einer Terminal-Sitzung mit der x86_64 Architektur:
arch -x86_64 /bin/zsh --login
damit dies funktioniert, muss Rosetta installiert sein. Sollte dies nicht der Fall sein, können Sie es mit diesem Befehl installieren:
softwareupdate --install-rosetta --agree-to-license
Die arch -x86_64 /bin/zsh --login ist eine nette Kommandozeile, aber nicht so leicht zu merken, also habe ich eine Hilfsfunktion in meinem .zshrc
# Rosetta start alternative session
switch_rosetta () {
arch -x86_64 /bin/zsh --login
}
Das war's also?
Nun, nicht wirklich. Wir sind erst auf halbem Wege. Damit der Python-Code richtig funktioniert, brauchen wir mehr als nur eine separate Sitzung. Die verwendete Software muss auch architekturspezifisch sein. Ich musste also ein separates Homebrew installieren, das ich für die Installation von Software für die Rosetta-Umgebung verwenden konnte.
switch_rosetta
# install Homebrew
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Glücklicherweise wird die Rosetta-Version von Homebrew an einem anderen Ort installiert (/usr/local/Cellar und /usr/local/bin) als die bereits vorhandene Homebrew-Installation (/opt/homebrew und /opt/homebrew/bin)
Auf diese Weise können wir die benötigte Software für unser Projekt separat installieren.
brew install python@3.8
brew install azure-cli
brew install poetry
etc...
Fertigstellung der Einrichtung
Es wäre schön, wenn die Terminal-Sitzung die separaten Homebrew-Einstellungen usw. kennen würde. Also habe ich wieder einige Hilfsfunktionen in meinem .zshrc
# Rosetta alternative sessions
archcheck () {
if [ "$(uname -p)" = "i386" ]
then
echo "Running in i386 mode (Rosetta)"
eval "$(/usr/local/Homebrew/bin/brew shellenv)"
# Remove /opt/homebrew/bin and /opt/homebrew/sbin from path to not interfere with /usr/local/bin
path=( ${path[@]:#/opt/homebrew*} )
# separate pypoetry cache directory to separate the different poetry virtual envs
# Cache directory needs to be created: mkdir -p ${HOME}/Library/Caches/pypoetry-i386
export POETRY_CACHE_DIR=${HOME}/Library/Caches/pypoetry-i386
alias brew='/usr/local/Homebrew/bin/brew'
elif [ "$(uname -p)" = "arm" ]
then
echo "Running in ARM mode (M2)"
eval "$(/opt/homebrew/bin/brew shellenv)"
# Remove /usr/local/bin from path to not interfere with /opt/homebrew
path=( ${path[@]:#/usr/local/bin} )
export POETRY_CACHE_DIR=${HOME}/Library/Caches/pypoetry
alias brew='/opt/homebrew/bin/brew'
else
echo "Unknown architecture detected"
fi
}
eval "archcheck"
Das war's
Jetzt kann ich problemlos zwischen Terminal-Sitzungen wechseln und die meisten Einstellungen werden automatisch in der Archcheck-Funktion vorgenommen. Es ist nicht 100%ig narrensicher. Zum Beispiel funktionieren die Befehle von /usr/local/bin aus dem Pfad, um die beiden von Homebrew installierten Softwarepakete nicht zu vermischen, aber auch Docker Desktop verwendet diesen Ort, um die symbolischen Links zu den Docker-Befehlen zu installieren. Ich habe das Problem behoben, indem ich diese symbolischen Links auch nach
Ich glaube, dass dies ein sehr guter Ausgangspunkt ist, von dem hoffentlich auch andere, die für AzureML entwickeln, profitieren werden.
Bereinigung
Sobald die gesamte Software mit Apple Sillicon kompatibel ist, sollten Sie die separate Homebrew-Installation bereinigen.
Dieser Beitrag über die Deinstallation von Homebrew kann Ihnen als Ausgangspunkt dienen. Stellen Sie sicher, dass Sie dies in der Rosetta Terminal-Sitzung tun. Nach dieser Bereinigung kann auch die Datei .zshrc bereinigt werden.
Verfasst von
Kris Geusebroek
Unsere Ideen
Weitere Blogs
Contact



