La guida definitiva alla configurazione di Python e Tensorflow per Apple Silicon Mac (M1 e M2)

Feb 26 2023
Installare TensorFlow e Python su Mac ARM non è mai stato così facile
Ho cambiato lavoro un anno fa e mi sono ritrovato con un nuovissimo MacBook Pro M1 con cui lavorare. Ho dovuto installare tutto ciò di cui uno scienziato di dati ha bisogno, il che è stato un vero dolore.
Foto di Ales Nesetril su Unsplash

Ho cambiato lavoro un anno fa e mi sono ritrovato con un nuovissimo MacBook Pro M1 con cui lavorare. Ho dovuto installare tutto ciò di cui uno scienziato di dati ha bisogno, il che è stato un vero dolore.

A peggiorare le cose, si scopre che non l'ho impostato correttamente ed è stato il caos.

Ma un collega ha condiviso una serie di passaggi e, dopo averli seguiti ed essere riuscito a impostare tutto con successo, ho pensato di poterlo condividere con tutti voi. Quindi l'ho riassunto e ampliato con informazioni extra e passaggi per completezza. Siccome non ho trovato nulla di simile su Internet, o almeno quando ho cercato, ho deciso di renderlo pubblico in modo che tutti possano beneficiarne.

In questa storia troverai una guida passo-passo su come installare correttamente Python e Tensorflow nei Mac M1 e M2 senza affrontare il dolore di provare a configurare tutto da solo.

Il flusso di lavoro è relativamente semplice:

  1. Per prima cosa installeremo i requisiti di base di cui ogni sviluppatore ha bisogno su un Mac (se non stai utilizzando un nuovo Mac, è probabile che tu li abbia già coperti).
  2. Quindi passare all'installazione di Python utilizzando pyenv .
  3. Infine, installa e configura Tensorflow correttamente per un Mac M1 o M2.

Configurazione di Python

I Mac al giorno d'oggi sono già dotati di Python installato, almeno Python2, ma credo che ci siano modi migliori e consigliati per lavorare con Python in un arm64 come il tuo MacBook M1 o M2.

Strumenti della riga di comando XCode

Innanzitutto, dovrai installare gli strumenti della riga di comando XCode :

~> xcode-select --install
~> xcrun --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk

Homebrew

Una volta installati gli strumenti della riga di comando, dovremo installare due homebrew . Perché due? Ne vogliamo uno nativo (Apple Silicon) e uno per Intel (chiamato anche Rosetta). Per fare ciò, dovremo avere un Terminal/iTerm2 per ogni architettura. È facile.

Consiglio di utilizzare iTerm2[1] in quanto è un terminale migliorato per macOS, ma funziona allo stesso modo se preferisci attenersi al terminale integrato.

Vai alla cartella Applicazioni, duplica "iTerm" e rinomina la copia in "intel iTerm" (o simile). Per quella nuova app, fai clic con il pulsante destro del mouse e seleziona "Ottieni informazioni". Nella sezione Generale, seleziona "Apri con Rosetta".

Ora dobbiamo impostare Homebrew [2].

Dal terminale Intel, eseguire:

~> arch --x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

- Se vedi x86_64, allora sei in Intel/Rosetta.

- Ma se l'output mostra arm64, sei in quello nativo (M1/M2).

Ora apri il terminale nativo (l'iTerm o il terminale predefinito) ed esegui il prossimo set di istruzioni:

~> cd ~/Downloads
~> mkdir homebrew
~> curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
~> sudo mv homebrew /opt/homebrew

  • Su Intel iTerm:
  • ~> brew --prefix
    /usr/local
    ~> brew list
    <list of installed packages>
    

    ~> brew --prefix
    /opt/homebrew
    ~> brew list
    <list of installed packages (different than x86_64)>
    

    ... rest of the file above ...
    
    #
    # homebrew setup, following https://noahpeeters.de/posts/apple-silicon/homebrew-setup/
    #
    if [ -d "/opt/homebrew/bin" ]; then
        export PATH="/opt/homebrew/bin:$PATH"
    fi
    
    function ibrew() {
       arch --x86_64 /usr/local/bin/brew $@
    }
    
    # variables needed to properly install things under intel or m1
    
    ARCH="$(uname -m)"
    case ARCH in
        i386)   ARCH="386" ;;
        i686)   ARCH="386" ;;
        x86_64) ARCH="amd64" ;;
        arm)    dpkg --print-architecture | grep -q "arm64" && ARCH="arm64" || ARCH="arm" ;;
    esac
    
    if [[ "${ARCH}"  == "arm64" ]]; then
        PREFIX="/opt/homebrew"
    else
        PREFIX="/usr/local"
    fi
    
    
    # https://github.com/pyenv/pyenv/issues/1768
    SDK_PATH="$(xcrun --show-sdk-path)"
    
    echo $PREFIX
    echo $SDK_PATH
    
    export CPATH="${SDK_PATH}/usr/include"
    export CFLAGS="-I${SDK_PATH}/usr/include/sasl $CFLAGS"
    export CFLAGS="-I${SDK_PATH}/usr/include $CFLAGS"
    export CFLAGS="-I${PREFIX}/include $CFLAGS"
    export LDFLAGS="-L${SDK_PATH}/usr/lib $LDFLAGS"
    export LDFLAGS="-L${PREFIX}/lib $LDFLAGS"
    export LDFLAGS="-L${PREFIX}/opt/openssl/lib $LDFLAGS"
    export CPPFLAGS="-I${PREFIX}/opt/openssl/include $CPPFLAGS"
    

Pyenv

Ok, quindi ora siamo in grado di iniziare a installare materiale relativo a Python. Inizieremo con pyenv , che renderà estremamente fluido il processo di installazione di varie versioni di Python.

Apri il tuo terminale nativo e digita semplicemente il comando seguente:

~> brew install pyenv

Affinché pyenv funzioni correttamente, dobbiamo installare diverse dipendenze[3]. Nel nostro caso:

~> brew install openssl readline sqlite3 xz zlib tcl-tk libffi

~> ibrew install openssl readline sqlite3 xz zlib tcl-tk libffi

~> pyenv install 3.9.9
~> pyenv global 3.9.9

Perché con questo tipo di processo vale sempre la pena fare un doppio controllo, quindi esegui il comando successivo: ~/.pyenv/versions/3.9.9/bin/pythonsostituisci 3.9.9con la versione che hai deciso di installare e imposta come globale. Una volta nella shell, prova a importare ctypes:

Python 3.9.9 (main, Feb 15 2023, 11:25:42)
[Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes
>>>

Pipenv

Sebbene averlo installato non sia obbligatorio, è sempre buona norma utilizzare gli ambienti per i propri progetti. Ecco perché ho deciso di metterlo anche qui perché è facile e buona pratica. Per installarlo:

~> brew install pipenv

Installazione di Tensorflow

Passiamo ora alla seconda parte. Installare TensorFlow su un Mac M1 o M2 è stato un incubo per molti di noi, ma non è più necessario.

Ricorderai che abbiamo modificato il ~/.zshrcfile qualche tempo fa. Ora, aggiungeremo questo alla fine:

# tensorflow grpcio https://github.com/grpc/grpc/issues/25082
export GRPC_PYTHON_BUILD_SYSTEM_OPENSSL=1
export GRPC_PYTHON_BUILD_SYSTEM_ZLIB=1
export CFLAGS="-I/opt/homebrew/opt/openssl/include"
export LDFLAGS="-L/opt/homebrew/opt/openssl/lib"

Una volta scaricato, il mio consiglio è di chiudere e riaprire il terminale nativo e quindi eseguire:

~> bash ~/Miniconda3-latest-MacOSX-arm64.sh -b -p $HOME/miniconda

~> source ~/miniconda/bin/activate
(base) ~> conda install -c apple tensorflow-deps

  1. Vai alla cartella del tuo progetto: ad esempiocd Documents/project
  2. Attiva l'ambiente:pipenv shell
  3. Installa Tensorflow:pipenv install tensorflow-macos

Guarda come c'è un pacchetto che ho installato chiamato tensorflow-metal [5] per accelerare l'addestramento dei nostri modelli nella GPU del nostro Mac in modo che tu possa considerare di installarlo con

~> pipenv install tensorflow-metal

Ora sai come affrontare la fatica di configurare un Mac nuovo di zecca per la scienza dei dati e ottenere il massimo dai suoi nuovi chip.

Spero che questo sia stato abbastanza utile e qualsiasi dubbio o problema che potresti incontrare, sentiti libero di commentare questa storia - io o un altro esperto ti aiuteremo sicuramente.

Non voglio andarmene senza ringraziarti gentilmente per aver raccontato la mia storia. Posto spesso su Medium e, se ti è piaciuto questo post, sentiti libero di seguirmi. Aiuta molto.

Risorse

[1] iTerm2 — Sostituzione del terminale macOS

[2] Noah Peters, Setup Homebrew su Apple Silicon

[3] Wiki Pyenv

[4] Utilizzo di base di Pipenv

[5] PyPi ufficiale — Pacchetto Tensorflow-metal