Это перевод, оригинал тут
Обзор того, как установить оптимизированный pytorch и опционально новый MLX от Apple и/или tensorflow или JAX от Google на Apple Silicon Mac и как использовать большие языковые модели HuggingFace для собственных экспериментов. Последние Mac показывают хорошую производительность для задач машинного обучения.
Выполним следующие шаги:
- Установка
homebrew - Установка
pytorchс поддержкой MPS (metal performance shaders) с использованием графических процессоров Apple Silicon - Установка нового фреймворка
mlxот Apple - Установка
JAXс драйверами Metal от Apple (экспериментальные на данный момент (2025-04), и не всегда актуальные.) - Установка
tensorflowс оптимизацией подключаемого драйвера Metal от Apple - Установка
jupyter labдля запуска Jupyter notebook - Установка
huggingfaceи запустите несколько предварительно обученных языковых моделей с помощьюtransformersи всего нескольких строк кода в jupyter lab.
Дополнительно:
- Запуск больших языковых моделей (LLM), которые конкурируют с коммерческими проектами: Llama 2 или Llama 3 с llama.cpp (s.b.) с использованием ускорения Mac Metal.
(перейдите к 1. Подготовка, если вы знаете, какой фреймворк вы собираетесь использовать)
Tensorflow, JAX, Pytorch и MLX — это фреймворки глубокого обучения, которые предоставляют необходимые библиотеки для выполнения оптимизированных тензорных операций, используемых при обучении и выводе. На высоком уровне функциональность всех четырех эквивалентна. Huggingface строится на основе любого из этих фреймворков и предоставляет большую библиотеку предварительно обученных моделей для множества различных вариантов использования, готовых к использованию или настройке, а также ряд удобных библиотек и примеров кода для легкого начала работы.
- Pytorch — это наиболее общий и в настоящее время наиболее широко используемый фреймворк глубокого обучения. В случае сомнений используйте Pytorch. Он поддерживает множество различных аппаратных платформ (включая оптимизации Apple Silicon).
- JAX — это более новый фреймворк Google, который исследователи считают лучшей альтернативой Tensorflow. Он поддерживает GPU, TPU и фреймворк Apple Metal (все еще экспериментальный) и является более «низкоуровневым», особенно при использовании без дополнительных слоев нейронной сети, таких как flax. JAX на Apple Silicon все еще «экзотичен», поэтому для производственных проектов используйте Pytorch, а для исследовательских проектов интересны как JAX, так и MLX: MLX имеет более динамичную разработку (на данный момент), JAX поддерживает больше аппаратных фреймворков (GPU и TPU) помимо Apple Silicon, но разработка драйверов
jax-metalне всегда соответствует последним версиямJAX. - MLX — это новичок Apple, и поэтому общая поддержка и документация (в настоящее время) гораздо более ограничены, чем у других основных фреймворков. Он красивый и хорошо спроектирован (они извлекли уроки из Torch и TensorFlow), но при этом тесно связан с Apple Silicon. В настоящее время он лучше всего подходит для студентов, у которых есть оборудование Apple и которые хотят изучать или экспериментировать с глубоким обучением. То, чему вы учитесь с MLX, легко переносится в Pytorch, но имейте в виду, что для развертывания всего, что вы разработали, в не-Apple-вселенной необходимо преобразование моделей и перенос кода обучения и вывода.
- corenet — это [недавно выпущенная библиотека обучения] Apple (https://github.com/apple/corenet), которая использует PyTorch и инфраструктуру HuggingFace, а также содержит примеры того, как переносить модели в MLX. См. пример: OpenElm (MLX).
- Tensorflow — это «COBOL» глубокого обучения, и он практически молчаливо прекращен Google. Сам Google публикует новые модели для PyTorch и JAX/Flax, а не для Tensorflow. Если вас не заставляют использовать Tensorflow, потому что ваша организация уже использует его, игнорируйте его. Если ваша организация использует TF, составьте план миграции! Посмотрите на Pytorch для производства и JAX для исследований.
HuggingFace публикует Обзор поддержки моделей для каждого фреймворка. В настоящее время Pytorch является стандартом де-факто, если вы хотите использовать существующие модели.
Для (вероятно, слишком упрощенного) ответа на вопрос «Что самое быстрое?» взгляните на блокнот Jupyter 02-Бенчмарки, и после завершения установки вы можете протестировать свою собственную среду. Блокнот позволяет сравнивать скорость умножения матриц для разных фреймворков. Однако разница между фреймворками при выполнении «стандартных» задач обучения или вывода моделей, скорее всего, будет менее выраженной.
Если вы этого еще не сделали, перейдите на https://brew.sh/ и следуйте инструкциям по установке homebrew.
После этого откройте терминал и введите brew --version, чтобы проверить, что он установлен правильно.
Теперь используйте brew для установки более новых версий python и git. Рекомендуется использовать Python 3.12 по умолчанию для Homebrew, если вы не планируете использовать Tensorflow с оптимизацией Metal (все еще требуется 3.11 (в 2024-04)).
brew install python@3.12 gitbrew install python@3.11 git
вы можете установить обе версии Python, а затем создать виртуальную среду, используя нужную вам версию Python для каждого случая.
Если вы также планируете использовать Linux, учтите, что поддержка версий Python иногда различается между версиями фреймворков для Mac и Linux.
Apple не вкладывает много сил в поддержание актуальности Python от MacOS. Если вы хотите использовать актуальный Python по умолчанию, имеет смысл сделать Python от Homebrew системным Python по умолчанию. Итак, если вы хотите использовать homebrew's Python 3.11 или 3.12 системно-глобально, самый простой способ сделать это (после
brew install python@3.12или3.11):
Отредактируйте ~/.zshrc и вставьте:
# Это НЕОБЯЗАТЕЛЬНО и требуется только если вы хотите сделать homebrew's Python 3.12 глобальной версией:
export PATH="/opt/homebrew/opt/python@3.12/bin:$PATH"
export PATH=/opt/homebrew/opt/python@3.12/libexec/bin:$PATHИзмените все ссылки 3.12 на 3.11, если хотите сделать homebrew's Python 3.11 системно-стандартным python.
(Перезапустите терминал, чтобы активировать изменения пути, или введите source ~/.zshrc в текущем сеансе терминала.)
Независимо от используемого системного python при создании виртуальной среды вы всегда можете выбрать конкретную версию python, которую хотите использовать в
venv, создавvenvименно с этим python. Например,/usr/bin/python3 -m venv my_venv_nameсоздает виртуальную среду с использованием python macOS от Apple (который на момент написания этой статьи, 2025-04, все еще застрял на версии 3.9.6). Подробнее см. ниже, Виртуальные среды.
Теперь клонируйте этот проект как тестовый проект:
git clone https://github.com/p12s/huggingfaceЭто клонирует тестовый проект в каталог huggingface
Теперь создайте среду Python 3.12 для этого проекта и активируйте ее:
(Снова: замените на 3.11, если нужно)
python3.12 -m venv huggingfaceСоздание venv добавляет необходимые файлы (бинарные файлы Python, библиотеки, конфигурации) для виртуальной среды Python в папку проекта, которую мы только что клонировали, снова используя тот же каталог huggingface. Войдите в каталог и активируйте виртуальную среду:
cd huggingface
source bin/activateТеперь каталог huggingface содержит содержимое репозитория github (например, 00-SystemCheck.ipynb) и файлы для виртуальной среды (например, bin, lib, etc, include, share, pyvenv.cfg):
Альтернативы: Если у вас установлено много разных версий Python, вы можете создать среду, которая использует определенную версию, указав путь к Python, который используется для создания venv, например:
/opt/homebrew/opt/python@3.12/bin/python3.12 -m venv my_new_312_envявно использует Python Homebrew для создания нового venv, тогда как
/usr/bin/python3 -m venv my_old_system_venvиспользует версию Python MacOS от Apple для новой среды.
Деактивируйте эту виртуальную среду, просто используйте:
deactivateЧтобы повторно активировать ее, войдите в каталог, содержащий venv, здесь: huggingface и используйте:
source bin/activate
Очень неинтуитивное свойство
venvзаключается в следующем: когда вы входите в среду, активируя ее в подкаталоге вашего проекта (с помощьюsource bin/activate),venvостается активным, когда вы покидаете папку проекта и начинаете работать над чем-то совершенно другим пока вы явно не деактивируетеvenvс помощьюdeactivate.Существует ряд инструментов, которые изменяют системное приглашение терминала для отображения текущего активного
venv, что очень полезно. Посмотрите starship (рекомендуется) или, если вам нравится украшательствоOh My Zsh.
Пример с установленным powerlevel10k. В левой части системного приглашения отображается текущий каталог, в правой части — имя venv. В настоящее время venv не активен.
После активации venv в huggingface:
Даже если рабочий каталог изменен (здесь на home), так как venv все еще активен, его имя отображается справа с помощью powerlevel10k. Очень удобно.
Подробнее о виртуальных средах Python см. https://docs.python.org/3/tutorial/venv.html.
Убедитесь, что ваша виртуальная среда активна с помощью pip -V (заглавная буква V), это должно показать путь для pip в вашем проекте:
<your-path>/huggingface/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 metal, откройте терминал, введите python и в оболочке python введите:
import torch
# проверьте, доступен ли MPS:
torch.backends.mps.is_available()Это должно вернуть True.
pip install -U mlxСнова запустите python и введите:
import mlx.core as mx
print(mx.__version__)Это должно вывести версию, например 0.16.1 (2024-07)
- Посетите Apple проект MLX и особенно mlx-examples!
- На Huggingface есть активное сообщество MLX, которое перенесло множество сетей на MLX: Huggingface MLX-Community
- Новый corenet от Apple использует PyTorch и инфраструктуру HuggingFace, а также содержит примеры того, как переносить модели на MLX. Смотрите пример: OpenElm (MLX).
JAX — отличный выбор, если вы сосредоточены на низкоуровневой оптимизации алгоритмов и исследованиях за пределами устоявшихся алгоритмов глубокого обучения. Созданный по образцу numpy, он поддерживает автоматическую дифференциацию «всего» (для задач оптимизации) и поддерживает векторизацию и параллелизацию алгоритмов Python за пределами простого глубокого обучения. Чтобы получить функциональность, ожидаемую от других фреймворков глубокого обучения (слои, функции цикла обучения и подобные «высокоуровневые»), рассмотрите возможность установки дополнительной библиотеки нейронных сетей, такой как: flax.
К сожалению, драйверы JAX metal начали отставать от релизов JAX, поэтому вам необходимо проверить таблицу совместимости на предмет поддерживаемых версий JAX, которые соответствуют доступным драйверам jax-metal.
Чтобы установить определенную версию JAX и последнюю jax-metal с pip в активную среду:
# Версия 0.4.26 взята из таблицы совместимости, упомянутой выше. Обновляйте по мере необходимости.
pip install -U jax==0.4.34 jaxlib==0.4.34 jax-metalЗапустите python (поддерживается 3.12) и введите:
import jax
print(jax.devices()[0])Должно отобразиться (только при первом запуске):
Платформа 'METAL' является экспериментальной, и не все функции JAX могут поддерживаться правильно!
ВНИМАНИЕ: все сообщения журнала до вызова absl::InitializeLog() записываются в STDERR
W0000 00:00:1721975334.430133 43061 mps_client.cc:510] ВНИМАНИЕ: Поддержка JAX Apple GPU является экспериментальной, и не все функции JAX могут поддерживаться правильно!
Устройство Metal установлено на: Apple M2 Max
systemMemory: 32,00 ГБ
maxCacheSize: 10,67 ГБ
I0000 00:00:1721975334.446739 43061 service.cc:145] Служба XLA 0x60000031d100 инициализирована для платформы METAL (это не гарантирует, что будет использоваться XLA). Устройства:
I0000 00:00:1721975334.446771 43061 service.cc:153] Устройство StreamExecutor (0): Metal, <undefined>
I0000 00:00:1721975334.448269 43061 mps_client.cc:406] Используется простой распределитель.
I0000 00:00:1721975334.448308 43061 mps_client.cc:384] XLA бэкэнд будет использовать до 22906109952 байт на устройстве 0 для SimpleAllocator.
[METAL(id=0)]
Здесь METAL:0 — это устройство, которое JAX будет использовать для вычислений, и Apple Silicon поддерживается.
Если вместо этого вы видите ошибки типа:
RuntimeError: Невозможно инициализировать бэкенд 'METAL': INVALID_ARGUMENT: Несоответствие версии API PJRT плагина PJRT (0.47) и версии API PJRT фреймворка 0.54). (Вам может потребоваться удалить неисправный пакет плагина или задать JAX_PLATFORMS=cpu, чтобы пропустить этот бэкенд.)
Ваши версии jax и jaxlib несовместимы с jax-metal. Проверьте таблицу совместимости на предмет jax-metal и установите требуемые версии, как указано в таблице.
- Примеры проектов HuggingFace с JAX и Flax
- Довольно лаконичная документация Apple находится в документации Apple JAX.
Tensorflow быстро теряет поддержку, и даже Google не публикует новые модели для Tensorflow. Рекомендуется план миграции, если вы планируете использовать это.
Хотя Tensorflow поддерживает Python 3.12 с версии 2.16, ускоритель macOS
tensorflow-metalне обновлялся с 2023-09 (состояние 2025-04) и требует Python 3.11:
Убедитесь, что ваша виртуальная среда активна с pip -V (заглавная V), это должно показать путь для pip в вашем проекте:
<your-path>/huggingface/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 lab, введите:
jupyter labДолжно открыться окно браузера с запущенной jupyter lab. Затем вы можете создать новый блокнот Python и запустить код, чтобы проверить, что tensorflow и pytorch работают правильно:
import torch
print("Pytorch version:", torch.__version__)Если все прошло успешно, ваш Mac готов к экспериментам с глубоким обучением.
HuggingFace — отличный ресурс для экспериментов с NLP и глубоким обучением. Он предоставляет большое количество предварительно обученных языковых моделей и простой API для их использования. Он позволит нам быстро приступить к экспериментам с глубоким обучением.
В инструкциях по установке huggingface мы используем pip для установки transformers:
pip install -U transformers acceleration "huggingface_hub[cli]"
or
pip install transformers -i https://pypi.python.org/simple
pip install -U accelerate
При экспериментах с HuggingFace вы загрузите большие модели, которые будут храниться в вашем домашнем каталоге по адресу:
~/.cache/huggingface/hub. Вы можете удалить эти модели в любое время, удалив этот каталог или часть его содержимого.
-
accelerateнеобязателен, но используется для запуска некоторых больших моделей. Побочным эффектом установкиaccelerateможет стать понижение версии некоторых других модулей, напримерnumpy. -
"huggingface_hub[cli]"устанавливает инструменты командной строки huggingface, которые иногда требуются для загрузки (частично лицензированных) моделей, например Llama 3.
В каталоге huggingface и активном venv запустите jupyter lab и загрузите блокнот 00-SystemCheck.ipynb. Сначала блокнот проверит все фреймворки глубокого обучения и предоставит информацию, если они правильно установлены. После этого для простого эксперимента используется Pytorch.
Используйте <Shift>-Enter для запуска ячеек блокнота.
Если вы запустили Jupyter Lab до установки Huggingface, вам нужно либо перезапустить ядро python в Jupyter, либо просто перезапустить Jupyter Lab, иначе он не найдет библиотеку Transformers.
После различных тестов вы должны наконец увидеть что-то вроде этого:
Если вы получили классификацию метки ПОЛОЖИТЕЛЬНЫЙ с оценкой 0,99, то вы готовы начать экспериментировать с HuggingFace!
Вы увидите, что библиотеки
HuggingFaceзагружают всевозможные большие двоичные блоки, содержащие данные обученной модели. Эти данные хранятся в вашем домашнем каталоге по адресу:~/.cache/huggingface/hub. Вы можете удалить эти модели в любое время, удалив этот каталог или части его содержимого.
- Если самотестирование не удалось ('xyz не найден!'), убедитесь, что pytorch, jax (необязательно), MLX (необязательно), tensorflow (необязательно), jupyter и transformers by huggingface установлены в одной и той же активной виртуальной среде Python, иначе компоненты не будут 'видеть' друг друга!
Вы можете открыть блокнот 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}")This shows a (quite limited and repetitive) chatbot using Microsoft's DialoGPT models.
Things to try:
- By changing
use_model_indexbetween0..2, you can select either a small, medium or large language model. - To see the history that the model maintains you can uncomment the two
history_textrelated lines above. - To get rid of the downloaded models, clean up
~/.cache/huggingface/hub. Missing stuff is automatically re-downloaded when needed.
- Ваш Mac может запускать большие языковые модели, которые по производительности соперничают с коммерческими решениями. Прекрасным примером является проект
llama.cpp, который реализует код вывода, необходимый для запуска LLM в высокооптимизированном коде C++, поддерживающем ускорение Metal для Mac.
Пошаговое руководство по компиляции и запуску Llama 3 или Llama 2 сначала для бенчмаркинга, а затем для чата можно найти здесь:
Llama.cpp чат с использованием модели Llama 2, с первой поддержкой Llama 3. Кроме того, предоставляется первая версия для Llama 3.
- Один из лучших (на данный момент) источников информации о новых выпусках моделей на Huggingface — группа Reddit LocalLLama.
- Быстрый способ узнать, как на самом деле работают модели нейронных сетей и, в частности, больших языков, — это курс Андрея Карпати на Youtube: Подробное введение в нейронные сети и обратное распространение: создание микрограда. Если вы немного знаете Python и знаете, как умножать матрицы с помощью NumPy, этот курс поможет вам полностью научиться создавать собственную модель большого языка с нуля.


