O guia definitivo de configuração de Python e Tensorflow para Apple Silicon Macs (M1 e M2)

Feb 26 2023
Instalar TensorFlow e Python em Macs ARM nunca foi tão fácil
Troquei de emprego há um ano e me encontrei com um novo M1 MacBook Pro para trabalhar. Tive que instalar tudo o que um cientista de dados precisa, o que foi um verdadeiro problema.
Foto de Ales Nesetril no Unsplash

Troquei de emprego há um ano e me encontrei com um novo M1 MacBook Pro para trabalhar. Tive que instalar tudo o que um cientista de dados precisa, o que foi um verdadeiro problema.

Para piorar as coisas, descobri que não o configurei corretamente e foi um caos.

Mas um colega de trabalho compartilhou um conjunto de etapas e, depois de segui-las e conseguir configurar tudo com sucesso, pensei em compartilhar com todos vocês. Portanto, resumi e expandi com informações extras e etapas para completá-lo. Como não encontrei nada parecido na Internet, ou pelo menos quando pesquisei, resolvi tornar público para que todos possam se beneficiar.

Nesta história, você encontrará um guia passo a passo sobre como instalar com êxito o Python e o Tensorflow em Macs M1 e M2 sem passar pelo trabalho de tentar configurar tudo sozinho.

O fluxo de trabalho é relativamente simples:

  1. Primeiro, instalaremos os requisitos básicos de que qualquer desenvolvedor precisa em um Mac (se você não estiver usando um novo Mac, é provável que já os tenha coberto).
  2. Em seguida, passe para a instalação do Python usando pyenv .
  3. Por fim, instale e configure o Tensorflow corretamente para um Mac M1 ou M2.

Configurando o Python

Os Macs hoje em dia já vêm com o Python instalado, pelo menos o Python2, mas acredito que existam maneiras melhores e recomendadas de trabalhar com o Python em um arm64 como o seu MacBook M1 ou M2.

Ferramentas de linha de comando do XCode

Primeiro, você precisará instalar as ferramentas de linha de comando do XCode :

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

Homebrews

Assim que tivermos as ferramentas de linha de comando instaladas, precisaremos instalar dois homebrews . Por que dois? Queremos um nativo (Apple Silicon) e outro para Intel (também chamado Rosetta). Para isso, teremos que ter um Terminal/iTerm2 para cada arquitetura. É fácil.

Eu recomendo usar o iTerm2[1], pois é um terminal aprimorado para macOS, mas funciona da mesma maneira se você preferir manter o terminal integrado.

Vá para a pasta Aplicativos, duplique o “iTerm” e renomeie a cópia para “intel iTerm” (ou similar). Para esse novo aplicativo, clique com o botão direito do mouse e selecione "Obter informações". Na seção Geral, marque “Abrir usando Rosetta”.

Agora temos que configurar o Homebrew [2].

No Terminal Intel, execute:

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

- Se você vir x86_64, então você está no Intel/Rosetta.

- Mas se a saída mostrar arm64, você está no nativo (M1/M2).

Agora abra o Terminal nativo (o iTerm ou Terminal padrão) e execute o próximo conjunto de instruções:

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

  • No 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, agora estamos em posição de começar a instalar coisas relacionadas ao Python. Começaremos com pyenv , o que tornará o processo de instalação de várias versões do Python extremamente suave.

Abra seu terminal nativo e simplesmente digite o comando abaixo:

~> brew install pyenv

Para que o pyenv funcione corretamente, precisamos instalar várias dependências[3]. No nosso 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

Porque com este tipo de processo uma checagem dupla sempre vale a pena, então execute o próximo comando: ~/.pyenv/versions/3.9.9/bin/pythonsubstituindo 3.9.9pela versão que você decidiu instalar e definir como global. Uma vez no shell, tente importar 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

Embora não seja obrigatório tê-lo instalado, é sempre uma boa prática usar ambientes para seus projetos. É por isso que também decidi colocá-lo aqui porque é fácil e uma boa prática. Para instalá-lo:

~> brew install pipenv

Instalando o Tensorflow

Vamos para a segunda parte agora. Instalar o TensorFlow em um Mac M1 ou M2 tem sido um pesadelo para muitos de nós, mas não precisa mais.

Você deve se lembrar que editamos o ~/.zshrcarquivo há algum tempo. Agora, vamos adicionar isso ao final:

# 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"

Depois de baixado, meu conselho é sair e reabrir o terminal nativo e executar:

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

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

  1. Vá para a pasta do seu projeto: por exemplocd Documents/project
  2. Ative o ambiente:pipenv shell
  3. Instale o Tensorflow:pipenv install tensorflow-macos

Veja como existe um pacote que instalei chamado tensorflow-metal [5] para acelerar o treinamento de nossos modelos na GPU do nosso Mac para que você considere instalá-lo com

~> pipenv install tensorflow-metal

Agora você sabe como enfrentar a dor de configurar um novo Mac para ciência de dados e aproveitar ao máximo seus novos chips.

Espero que isso tenha sido útil o suficiente e qualquer dúvida ou problema que você possa encontrar, sinta-se à vontade para comentar esta história - eu ou outro especialista certamente o ajudaremos.

Não quero partir sem agradecer gentilmente por ter lido minha história. Costumo postar no Medium e, se você gostou deste post, sinta-se à vontade para me seguir. Isso ajuda muito.

Recursos

[1] iTerm2 — substituição do terminal macOS

[2] Noah Peters, Setup Homebrew no Apple Silicon

[3] Wiki Pyenv

[4] Uso básico do Pipenv

[5] PyPi oficial — pacote Tensorflow-metal