Una visita guiada sobre cómo instalar pytorch
optimizado y, opcionalmente, el nuevo MLX
de Apple y/o tensorflow
o JAX
de Google en Apple Silicon Macs y cómo utilizar los modelos de lenguaje grande HuggingFace
para sus propios experimentos. Los Mac recientes muestran un buen rendimiento en tareas de aprendizaje automático.
Realizaremos los siguientes pasos:
homebrew
pytorch
con soporte MPS (metal performance shaders) usando las GPU Apple Siliconmlx
de AppleJAX
con los controladores metálicos de Apple (en este momento es experimental (2024-07) y no siempre está actualizado).tensorflow
con las optimizaciones del controlador metálico enchufable de Applejupyter lab
para ejecutar portátileshuggingface
y ejecute algunos modelos de lenguaje previamente entrenados usando transformers
y solo unas pocas líneas de código dentro de jupyter lab.Luego proporcionamos instrucciones adicionales para:
(salte a 1. Preparativos si sabe qué marco va a utilizar)
Tensorflow, JAX, Pytorch y MLX son marcos de aprendizaje profundo que proporcionan las bibliotecas necesarias para realizar operaciones tensoriales optimizadas utilizadas en entrenamiento e inferencia. En un nivel alto, la funcionalidad de los cuatro es equivalente. Huggingface se basa en cualquiera de esos marcos y proporciona una gran biblioteca de modelos previamente entrenados para muchos casos de uso diferentes, listos para usar o personalizar, además de una serie de bibliotecas convenientes y código de muestra para comenzar fácilmente.
jax-metal
no siempre está actualizado con las últimas versiones de JAX
.HuggingFace publica una descripción general del soporte de modelos para cada marco. Actualmente, Pytorch es el estándar de facto, si desea utilizar modelos existentes.
Para la respuesta (probablemente demasiado simplificada) a la pregunta "¿Cuál es el más rápido?" Eche un vistazo al cuaderno Jupyter 02-Benchmarks y, una vez que haya completado la instalación, podrá probar su propio entorno. El cuaderno permite comparar la velocidad de las multiplicaciones de matrices para diferentes marcos. Sin embargo, la diferencia entre los marcos cuando se realizan tareas de inferencia o entrenamiento de modelos "estándar" probablemente será menos pronunciada.
Si no lo ha hecho, vaya a https://brew.sh/ y siga las instrucciones para instalar homebrew. Una vez hecho esto, abra una terminal y escriba brew --version
para verificar que esté instalado correctamente.
Ahora use brew
para instalar versiones más recientes de python
y git
. La recomendación es usar Python 3.12 predeterminado de Homebrew, si no planea usar Tensorflow con optimización de Metal (aún requiere 3.11 (en 2024-04)).
brew install [email protected] git
brew install [email protected] git
puedes instalar ambas versiones de Python y luego crear un entorno virtual usando la versión de Python específica que necesitas para cada caso.
Si planea usar también Linux, tenga en cuenta que la compatibilidad con la versión Python a veces difiere entre las versiones de los marcos para Mac y Linux.
Apple no pone demasiada energía en mantener actualizado Python de MacOS. Si desea utilizar un Python predeterminado actualizado, tiene sentido hacer que el Python de Homebrew sea el Python predeterminado del sistema. Entonces, si desea utilizar el sistema Python 3.11 o 3.12 de Homebrew a nivel mundial, la forma más sencilla de hacerlo (después de
brew install [email protected]
o3.11
):
Edite ~/.zshrc
e inserte:
# 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
Cambie todas las referencias de 3.12
a 3.11
cuando desee hacer que el sistema Python 3.11 de Homebrew sea Python estándar.
(Reinicie su terminal para activar los cambios de ruta, o ingrese source ~/.zshrc
en su sesión actual de terminal).
Independientemente del sistema Python en uso, al crear un entorno virtual, siempre puede seleccionar la versión específica de Python que desea usar en el
venv
creando elvenv
exactamente con ese Python. Por ejemplo,/usr/bin/python3 -m venv my_venv_name
crea un entorno virtual usando macOS python de Apple (que en el momento de escribir este artículo, 2024-07, todavía está bloqueado en 3.9.6). Consulte a continuación, Entornos virtuales , para obtener más detalles.
Ahora clona este proyecto como proyecto de prueba:
git clone https://github.com/domschl/HuggingFaceGuidedTourForMac
Esto clona el proyecto de prueba en un directorio HuggingFaceGuidedTourForMac
Ahora cree un entorno Python 3.12 para este proyecto y actívelo:
(Nuevamente: reemplácelo con 3.11
, si es necesario)
python3.12 -m venv HuggingFaceGuidedTourForMac
La creación de un venv agrega los archivos necesarios (binarios de Python, bibliotecas, configuraciones) para el entorno virtual de Python a la carpeta del proyecto que acabamos de clonar, usando nuevamente el mismo directorio HuggingFaceGuidedTourForMac
. Ingrese al directorio y active el entorno virtual:
cd HuggingFaceGuidedTourForMac
source bin/activate
Ahora el directorio HuggingFaceGuidedTourForMac
contiene el contenido del repositorio de github (por ejemplo, 00-SystemCheck.ipynb
) y los archivos para el entorno virtual (por ejemplo, bin
, lib
, etc
, include
, share
, pyvenv.cfg
):
Alternativas: si tiene instaladas muchas versiones diferentes de Python, puede crear un entorno que use una versión específica especificando la ruta de Python que se usa para crear el venv
, por ejemplo:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
usa python de homebrew explícitamente para crear un nuevo venv
, mientras que
/usr/bin/python3 -m venv my_old_system_venv
usaría la versión Python de macOS de Apple para el nuevo entorno.
Desactive este entorno virtual, simplemente use:
deactivate
Para reactivarlo, ingrese al directorio que contiene el venv
, aquí: HuggingFaceGuidedTourForMac
y use:
source bin/activate
venv
Una propiedad muy poco intuitiva de
venv
es el hecho: mientras ingresa a un entorno activándolo en el subdirectorio de su proyecto (consource bin/activate
),venv
permanece activo cuando sale de la carpeta del proyecto y comienza a trabajar en algo completamente diferente hasta que desactivas explícitamente elvenv
condeactivate
.Hay una serie de herramientas que modifican el indicador del sistema terminal para mostrar el
venv
actualmente activo, lo cual es muy útil. Echa un vistazo a Starship (recomendado) o, si te gustan los adornos,Oh My Zsh
.
Ejemplo con
powerlevel10k
instalado. El lado izquierdo del mensaje del sistema muestra el directorio actual, el lado derecho mostrará el nombre del venv
. Actualmente, no hay ningún venv
activo.
Después de activar un venv
en HuggingFaceGuidedTourForMac
:
Incluso si se cambia el directorio de trabajo (aquí a
home
), dado que venv
todavía está activo, su nombre se muestra en el lado derecho junto a powerlevel10k
. Muy útil.
Consulte https://docs.python.org/3/tutorial/venv.html para obtener más información sobre los entornos virtuales de Python.
pytorch
Asegúrese de que su entorno virtual esté activo con pip -V
(V mayúscula), esto debería mostrar una ruta para pip
dentro de su proyecto:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.12/site-packages/pip (python 3.12)
Siguiendo https://pytorch.org
, instalaremos Pytorch con pip
. Necesita al menos la versión 2.x (predeterminada desde 2023) para obtener compatibilidad con MPS (Metal Performance Shaders) dentro de pytorch, que ofrece una ventaja de rendimiento significativa en Apple Silicon.
Para instalar pytorch
en venv
:
pip install -U torch numpy torchvision torchaudio
Para probar que pytorch
esté instalado correctamente y que los sombreadores de rendimiento MPS metal estén disponibles, abra una terminal, escriba python
y dentro del shell de Python, ingrese:
import torch
# check if MPS is available:
torch . backends . mps . is_available ()
Esto debería devolver True
.
MLX
pip install -U mlx
Nuevamente, inicie python
e ingrese:
import mlx . core as mx
print ( mx . __version__ )
Esto debería imprimir una versión, como 0.16.1
(2024-07)
JAX
JAX es una excelente opción, si su enfoque es la optimización de bajo nivel de algoritmos y la investigación más allá de los límites de los algoritmos de aprendizaje profundo establecidos. Modelado a partir de numpy
, admite la diferenciación automática de "todo" (para problemas de optimización) y admite la vectorización y paralelización de algoritmos de Python más allá del mero aprendizaje profundo. Para obtener la funcionalidad que se espera de otros marcos de aprendizaje profundo (capas, funciones de bucle de entrenamiento y "alto nivel" similares), considere instalar una biblioteca de redes neuronales adicional como: flax
.
Desafortunadamente, los controladores JAX
metal han comenzado a retrasarse con respecto a las versiones de JAX y, por lo tanto, debe verificar en la tabla de compatibilidad las versiones compatibles de JAX
que coinciden con los controladores jax-metal
disponibles.
Para instalar una versión específica de JAX
y la última versión de jax-metal
con pip
en el entorno activo:
# 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
Inicie python
(se admite 3.12) e ingrese:
import jax
print ( jax . devices ()[ 0 ])
Esto debería mostrar (solo en la primera ejecución):
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)]
Aquí METAL:0
es el dispositivo que JAX utilizará para los cálculos y se admite Apple Silicon.
Si, en cambio, ves errores como:
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.)
Su versión de jax
y jaxlib
es incompatible con jax-metal
. Consulte la tabla de compatibilidad de jax-metal
e instale las versiones requeridas como se indica en la tabla.
tensorflow
Tensorflow está perdiendo soporte rápidamente y ni siquiera Google publica nuevos modelos para Tensorflow. Se recomienda un plan de migración, si planea utilizarlo.
Si bien Tensorflow admite Python 3.12 desde 2.16, el acelerador
tensorflow-metal
de macOS no se ha actualizado desde 2023-09 (estado de 2024-07) y requiere Python 3.11:
Asegúrese de que su entorno virtual esté activo con pip -V
(V mayúscula), esto debería mostrar una ruta para pip
dentro de su proyecto:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.11/site-packages/pip (python 3.11)
Siguiendo https://developer.apple.com/metal/tensorflow-plugin/, instalaremos tensorflow
con pip
dentro de nuestro venv
:
pip install -U tensorflow tensorflow-metal
Para probar que tensorflow
está instalado correctamente, abra una terminal, escriba python
y dentro del shell de Python, ingrese:
import tensorflow as tf
tf . config . list_physical_devices ( 'GPU' )
Deberías ver algo como:
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
En este punto, su Apple Silicon Mac debería estar lista para ejecutar pytorch
y, opcionalmente, MLX
y/o JAX
o tensorflow
con soporte de aceleración de hardware, utilizando el marco Apple Metal.
Para probar esto, puede usar jupyter lab
para ejecutar algunos cuadernos. Para instalar jupyter lab
, primero asegúrese de que el entorno virtual que desea utilizar esté activo ( pip -V
) y escriba:
pip install -U jupyterlab ipywidgets
Si tiene otras versiones de Jupyter instaladas, la ruta a la versión recién instalada de Jupyter dentro del
venv
a menudo no se actualiza correctamente, vuelva a activar el entorno para asegurarse de que se utilice la versión local correcta de Jupyter:
deactivate
source bin/activate
Para iniciar el laboratorio de Jupyter, escriba:
jupyter lab
Esto debería abrir una ventana del navegador con jupyter lab
ejecutándose. Luego puede crear un nuevo cuaderno de Python y ejecutar código para probar que tensorflow
y pytorch
funcionan correctamente:
import torch
print ( "Pytorch version:" , torch . __version__ )
Si esto se completó correctamente, su Mac ahora está lista para experimentos de aprendizaje profundo.
HuggingFace es un gran recurso para experimentos de PNL y aprendizaje profundo. Proporciona una gran cantidad de modelos de lenguaje previamente entrenados y una API simple para usarlos. Nos permitirá comenzar rápidamente con experimentos de aprendizaje profundo.
transformers
Según las instrucciones de instalación de Huggingface, utilizamos pip
para instalar transformers
:
pip install -U transformers accelerate " huggingface_hub[cli] "
Al experimentar con HuggingFace, descargará modelos grandes que se almacenarán en su directorio de inicio en:
~/.cache/huggingface/hub
. Puede eliminar estos modelos en cualquier momento eliminando este directorio o partes de su contenido.
accelerate
es opcional, pero se usa para ejecutar algunos modelos grandes. El efecto secundario de la instalación de accelerate
podría ser la degradación de algunos otros módulos como numpy
."huggingface_hub[cli]"
instala las herramientas de línea de comandos de huggingface que a veces son necesarias para descargar modelos (con licencia parcial de propiedad) como Llama 3. Dentro del directorio HuggingFaceGuidedTourForMac
y venv
activo, inicie jupyter lab
y cargue el cuaderno 00-SystemCheck.ipynb
. El cuaderno primero verificará todos los marcos de aprendizaje profundo y brindará información si están instalados correctamente. Luego, se utiliza Pytorch para un experimento simple.
Utilice <Shift>-Enter
para ejecutar las celdas del cuaderno.
Si inició Jupyter Lab antes de instalar Huggingface, debe reiniciar el kernel de Python en Jupyter o simplemente reiniciar Jupyter Lab; de lo contrario, no encontrará la biblioteca Transformers.
Después de varias pruebas, finalmente deberías ver algo como esto:
Si recibió una clasificación de etiqueta de POSITIVE
con una puntuación de 0.99
, ¡entonces está listo para comenzar a experimentar con HuggingFace!
Verá que las bibliotecas
HuggingFace
están descargando todo tipo de blobs binarios grandes que contienen los datos del modelo entrenado. Esos datos se almacenan en su directorio de inicio en:~/.cache/huggingface/hub
. Puede eliminar estos modelos en cualquier momento eliminando este directorio o partes de su contenido.
Puedes abrir el cuaderno 01-ChatBot.ipynb
para probar un chatbot muy simple en tu Mac.
El código Python utilizado es:
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 } " )
Esto muestra un chatbot (bastante limitado y repetitivo) que utiliza los modelos DialoGPT de Microsoft.
Cosas para probar:
use_model_index
entre 0..2
, puede seleccionar un modelo de lenguaje pequeño, mediano o grande.history_text
anteriores.~/.cache/huggingface/hub
. El contenido que falta se vuelve a descargar automáticamente cuando es necesario. llama.cpp
que implementa el código de inferencia necesario para ejecutar LLM en código C++ altamente optimizado, compatible con la aceleración Metal de Mac.Este párrafo es para desinstalar conda que se usó en versiones anteriores de esta guía:
brew uninstall miniconda
Las modificaciones adicionales son (todas están inactivas, una vez que se elimina la miniconda):
~/.condarc
(lista de canales) y ~/.conda
.~/.zshrc
(o .bashrc
) para la configuración de la ruta y el entorno.~/.cache/huggingface/hub
. Simplemente elimine el directorio. conda
a pip
y venv
para las últimas versiones de tensorflow 2.13, Pytorch 2, macOS Sonoma, la instalación ahora es mucho más sencilla.pytorch
v2.0, el canal pytorch-nightly
ahora se puede reemplazar por pytorch
en las instrucciones de instalación. El canal pytorch-nightly
ya no es necesario para la compatibilidad con MPS.