Экскурсия о том, как установить оптимизированный pytorch
и, при необходимости, новый MLX
от Apple и/или tensorflow
или JAX
от Google на Apple Silicon Mac, а также как использовать большие языковые модели HuggingFace
для собственных экспериментов. Последние Mac показывают хорошую производительность в задачах машинного обучения.
Мы выполним следующие шаги:
homebrew
pytorch
с поддержкой MPS (шейдеры производительности металла) с использованием графических процессоров Apple Silicon.mlx
от Apple.JAX
с металлическими драйверами Apple (на данный момент это экспериментальный вариант (2024-07 гг.) И не всегда актуальный).tensorflow
с оптимизацией металлических подключаемых металлических драйверов Apple.jupyter lab
для запуска блокнотовhuggingface
и запустите несколько предварительно обученных языковых моделей с помощью transformers
и всего нескольких строк кода в лаборатории Jupyter.Затем мы предоставляем дополнительные инструкции по:
(перейдите к пункту 1. Подготовка, если вы знаете, какой фреймворк собираетесь использовать)
Tensorflow, JAX, Pytorch и MLX — это платформы глубокого обучения, которые предоставляют необходимые библиотеки для выполнения оптимизированных тензорных операций, используемых при обучении и выводе. На высоком уровне функциональность всех четырех эквивалентна. Huggingface построен на основе любой из этих платформ и предоставляет большую библиотеку предварительно обученных моделей для множества различных вариантов использования, готовых к использованию или настройке, а также ряд удобных библиотек и примеров кода для легкого начала работы.
jax-metal
не всегда соответствует последним версиям JAX
.HuggingFace публикует обзор поддержки моделей для каждой платформы. В настоящее время Pytorch является стандартом де-факто, если вы хотите использовать существующие модели.
Для (вероятно, слишком упрощенного) ответа на вопрос «Что самое быстрое?» взгляните на блокнот Jupyter 02-Benchmarks, и после завершения установки вы сможете протестировать свою собственную среду. Блокнот позволяет сравнивать скорость умножения матриц для разных фреймворков. Однако разница между платформами при выполнении «стандартных» задач обучения модели или вывода, скорее всего, будет менее выраженной.
Если вы этого не сделали, перейдите на https://brew.sh/ и следуйте инструкциям по установке доморощенного продукта. После этого откройте терминал и введите brew --version
, чтобы убедиться, что он установлен правильно.
Теперь используйте brew
для установки более свежих версий python
и git
. Рекомендуется использовать Python 3.12 по умолчанию Homebrew, если вы не планируете использовать Tensorflow с оптимизацией Metal (все еще требуется 3.11 (в 2024-04)).
brew install [email protected] git
brew install [email protected] git
вы можете установить обе версии Python, а затем создать виртуальную среду, используя конкретную версию Python, необходимую для каждого случая.
Если вы планируете также использовать Linux, имейте в виду, что поддержка версий Python иногда различается в версиях платформ для Mac и Linux.
Apple не вкладывает слишком много усилий в поддержание актуальности Python для MacOS. Если вы хотите использовать обновленный Python по умолчанию, имеет смысл сделать доморощенный Python системным Python по умолчанию. Итак, если вы хотите использовать систему Homebrew Python 3.11 или 3.12 глобально, самый простой способ сделать это (после
brew install [email protected]
или3.11
):
Отредактируйте ~/.zshrc
и вставьте:
# 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
Измените все ссылки с 3.12
на 3.11
если хотите сделать Python 3.11 для доморощенного Python 3.11 системным стандартом.
(Перезагрузите терминал, чтобы активировать изменения пути, или введите source ~/.zshrc
в текущем сеансе терминала.)
Независимо от используемого системного Python, при создании виртуальной среды вы всегда можете выбрать конкретную версию Python, которую хотите использовать в
venv
, создавvenv
именно с этим Python. Например,/usr/bin/python3 -m venv my_venv_name
создает виртуальную среду с использованием Python macOS от Apple (который на момент написания этой статьи, 2024–2007 гг., все еще оставался на версии 3.9.6). Более подробную информацию см. ниже в разделе «Виртуальные среды» .
Теперь клонируйте этот проект как тестовый:
git clone https://github.com/domschl/HuggingFaceGuidedTourForMac
Это клонирует тестовый проект в каталог HuggingFaceGuidedTourForMac
Теперь создайте среду Python 3.12 для этого проекта и активируйте ее:
(Опять же: замените на 3.11
, если вам нужно)
python3.12 -m venv HuggingFaceGuidedTourForMac
Создание venv добавляет необходимые файлы (двоичные файлы Python, библиотеки, конфигурации) для виртуальной среды Python в папку проекта, которую мы только что клонировали, снова используя тот же каталог HuggingFaceGuidedTourForMac
. Войдите в каталог и активируйте виртуальную среду:
cd HuggingFaceGuidedTourForMac
source bin/activate
Теперь каталог HuggingFaceGuidedTourForMac
содержит содержимое репозитория github (например, 00-SystemCheck.ipynb
) и файлы для виртуальной среды (например, bin
, lib
etc
, include
, share
, pyvenv.cfg
):
Альтернативы: если у вас установлено много разных версий Python, вы можете создать среду, использующую определенную версию, указав путь к Python, который используется для создания venv
, например:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
явно использует доморощенный Python для создания нового venv
, тогда как
/usr/bin/python3 -m venv my_old_system_venv
будет использовать версию Python для macOS от Apple для новой среды.
Деактивируйте эту виртуальную среду, просто используйте:
deactivate
Чтобы повторно активировать его, войдите в каталог, содержащий venv
, здесь: HuggingFaceGuidedTourForMac
, и используйте:
source bin/activate
venv
Очень неинтуитивным свойством
venv
является тот факт: пока вы входите в среду, активировав ее в подкаталоге вашего проекта (с помощьюsource bin/activate
),venv
остается активным, когда вы покидаете папку проекта и начинаете работать над чем-то совершенно другим , пока вы явно деактивируетеvenv
с помощьюdeactivate
.Существует ряд инструментов, которые изменяют системное приглашение терминала для отображения текущего активного
venv
, что очень полезно. Посмотрите звездолет (рекомендуется) или, если вам нравится украшательствоOh My Zsh
.
Пример с установленным powerlevel10k
. В левой части системного приглашения отображается текущий каталог, в правой — имя venv
. В настоящее время ни один venv
не активен.
После активации venv
в HuggingFaceGuidedTourForMac
:
Даже если рабочий каталог изменен (здесь на home
), поскольку venv
все еще активен, его имя отображается справа с помощью powerlevel10k
. Очень удобно.
См. https://docs.python.org/3/tutorial/venv.html для получения дополнительной информации о виртуальных средах Python.
pytorch
Убедитесь, что ваша виртуальная среда активна с помощью pip -V
(заглавная буква V). Это должно показать путь к pip
в вашем проекте:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.12/site-packages/pip (python 3.12)
Следуя https://pytorch.org
, мы установим Pytorch с помощью pip
. Вам нужна как минимум версия 2.x (по умолчанию с 2023 года), чтобы получить поддержку MPS (Metal Performance Shaders) в pytorch, которая обеспечивает значительное преимущество в производительности на Apple Silicon.
Чтобы установить pytorch
в venv
:
pip install -U torch numpy torchvision torchaudio
Чтобы проверить, что pytorch
установлен правильно и доступны шейдеры производительности металла MPS, откройте терминал, введите python
и в оболочке Python введите:
import torch
# check if MPS is available:
torch . backends . mps . is_available ()
Это должно вернуть True
.
MLX
pip install -U mlx
Снова запустите python
и введите:
import mlx . core as mx
print ( mx . __version__ )
Это должно напечатать версию, например 0.16.1
(2024-07).
JAX
JAX — отличный выбор, если ваша цель — низкоуровневая оптимизация алгоритмов и исследования, выходящие за рамки существующих алгоритмов глубокого обучения. Созданный по образцу numpy
, он поддерживает автоматическое дифференцирование «всего» (для задач оптимизации) и поддерживает векторизацию и распараллеливание алгоритмов Python, выходя за рамки простого глубокого обучения. Чтобы получить функциональность, ожидаемую от других сред глубокого обучения (слои, функции цикла обучения и аналогичные «высокоуровневые»), рассмотрите возможность установки дополнительной библиотеки нейронных сетей, такой как: flax
.
К сожалению, драйверы JAX
metal начали отставать от выпусков JAX, и поэтому вам необходимо проверить таблицу совместимости поддерживаемых версий JAX
, соответствующих доступным драйверам jax-metal
.
Чтобы установить конкретную версию JAX
и последнюю версию jax-metal
с помощью pip
в активную среду:
# 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
Запустите python
(поддерживается версия 3.12) и введите:
import jax
print ( jax . devices ()[ 0 ])
Должно отображаться (только при первом запуске):
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)]
Здесь METAL:0
— это устройство, которое JAX будет использовать для вычислений, и поддерживается Apple Silicon.
Если вместо этого вы видите такие ошибки, как:
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.)
Ваша версия jax
и jaxlib
несовместима с jax-metal
. Проверьте таблицу совместимости jax-metal
и установите необходимые версии, как указано в таблице.
tensorflow
Tensorflow быстро теряет поддержку, и даже Google не публикует новые модели для Tensorflow. Если вы планируете его использовать, рекомендуется использовать план миграции.
Хотя Tensorflow поддерживает Python 3.12 с версии 2.16, ускоритель
tensorflow-metal
для macOS не обновлялся с 2023-09 (статус 2024-07) и требует Python 3.11:
Убедитесь, что ваша виртуальная среда активна с помощью pip -V
(заглавная буква V). Это должно показать путь к pip
в вашем проекте:
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.11/site-packages/pip (python 3.11)
Следуя https://developer.apple.com/metal/tensorflow-plugin/, мы установим tensorflow
с помощью pip
в наш venv
:
pip install -U tensorflow tensorflow-metal
Чтобы проверить правильность установки tensorflow
, откройте терминал, введите python
и в оболочке Python введите:
import tensorflow as tf
tf . config . list_physical_devices ( 'GPU' )
Вы должны увидеть что-то вроде:
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
На этом этапе ваш Apple Silicon Mac должен быть готов к запуску pytorch
и, при необходимости, MLX
и/или JAX
или tensorflow
с поддержкой аппаратного ускорения с использованием платформы Apple Metal.
Чтобы проверить это, вы можете использовать jupyter lab
для запуска некоторых блокнотов. Чтобы установить jupyter lab
, сначала убедитесь, что виртуальная среда, которую вы хотите использовать, активна ( pip -V
), и введите:
pip install -U jupyterlab ipywidgets
Если у вас установлены другие версии Jupyter, путь к вновь установленной версии Jupyter в
venv
часто не обновляется правильно, повторно активируйте среду, чтобы убедиться, что используется правильная локальная версия Jupyter:
deactivate
source bin/activate
Чтобы запустить лабораторию Jupyter, введите:
jupyter lab
Должно открыться окно браузера с запущенной jupyter lab
. Затем вы можете создать новый блокнот Python и запустить некоторый код, чтобы проверить правильность работы tensorflow
и pytorch
:
import torch
print ( "Pytorch version:" , torch . __version__ )
Если все прошло успешно, ваш Mac теперь готов к экспериментам по глубокому обучению.
HuggingFace — отличный ресурс для экспериментов в области НЛП и глубокого обучения. Он предоставляет большое количество предварительно обученных языковых моделей и простой API для их использования. Это позволит нам быстро приступить к экспериментам по глубокому обучению.
transformers
Из инструкции по установке Huggingface мы используем pip
для установки transformers
:
pip install -U transformers accelerate " huggingface_hub[cli] "
Экспериментируя с HuggingFace, вы загрузите большие модели, которые будут храниться в вашем домашнем каталоге по адресу:
~/.cache/huggingface/hub
. Вы можете удалить эти модели в любое время, удалив этот каталог или часть его содержимого.
accelerate
не является обязательным, но используется для запуска некоторых больших моделей. Побочным эффектом установки accelerate
может быть понижение версии некоторых других модулей, таких как numpy
."huggingface_hub[cli]"
устанавливает инструменты командной строки Huggingface, которые иногда требуются для загрузки (частично лицензированных) моделей, таких как Llama 3. В каталоге HuggingFaceGuidedTourForMac
и активном venv
запустите jupyter lab
и загрузите блокнот 00-SystemCheck.ipynb
. Ноутбук сначала проверит все платформы глубокого обучения и предоставит информацию, правильно ли они установлены. После этого Pytorch используется для простого эксперимента.
Используйте <Shift>-Enter
чтобы запустить ячейки записной книжки.
Если вы запустили Jupyter Lab перед установкой Huggingface, вам нужно либо перезапустить ядро Python в Jupyter, либо просто перезапустить Jupyter Lab, иначе библиотека Transformers не будет найдена.
После различных тестов вы, наконец, должны увидеть что-то вроде этого:
Если вы получили POSITIVE
оценку 0.99
, то вы готовы начать экспериментировать с HuggingFace!
Вы увидите, что библиотеки
HuggingFace
загружают всевозможные большие двоичные объекты, содержащие данные обученной модели. Эти данные хранятся в вашем домашнем каталоге по адресу:~/.cache/huggingface/hub
. Вы можете удалить эти модели в любое время, удалив этот каталог или часть его содержимого.
Вы можете открыть блокнот 01-ChatBot.ipynb
чтобы опробовать очень простого чат-бота на своем Mac.
Используемый код Python:
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 } " )
Это показывает (довольно ограниченный и повторяющийся) чат-бот, использующий модели Microsoft DialoGPT.
Что стоит попробовать:
use_model_index
между 0..2
, вы можете выбрать малую, среднюю или большую языковую модель.history_text
выше.~/.cache/huggingface/hub
. Недостающие материалы автоматически перезагружаются при необходимости. llama.cpp
, который реализует код вывода, необходимый для запуска LLM, в высокооптимизированном коде C++, поддерживающем ускорение Metal Mac.Этот абзац предназначен для удаления conda, который использовался в старых версиях этого руководства:
brew uninstall miniconda
Дополнительные модификации (все они неактивны после удаления миниконды):
~/.condarc
(список каналов) и ~/.conda
.~/.zshrc
(или .bashrc
) для настройки пути и среды.~/.cache/huggingface/hub
. Просто удалите каталог. conda
на pip
и venv
для последних версий tensorflow 2.13, Pytorch 2, macOS Sonoma, установка теперь намного проще.pytorch
v2.0, канал pytorch-nightly
теперь можно заменить на pytorch
в инструкциях по установке. Канал pytorch-nightly
больше не нужен для поддержки MPS.