最適化されたpytorch
と、オプションで Apple の新しいMLX
および/または Google のtensorflow
またはJAX
Apple Silicon Mac にインストールする方法、および独自の実験でHuggingFace
大規模言語モデルを使用する方法に関するガイド付きツアー。最近の Mac は機械学習タスクに優れたパフォーマンスを示します。
次の手順を実行します。
homebrew
をインストールするpytorch
のインストールmlx
フレームワークをインストールするJAX
インストールします (実験的なのは現時点 (2024 年 7 月) であり、常に最新であるとは限りません)。tensorflow
インストールしますjupyter lab
をインストールしますhuggingface
をインストールし、 transformers
と jupyter lab 内のわずか数行のコードを使用して、いくつかの事前トレーニング済み言語モデルを実行します。次に、次の追加の HowTo を提供します。
(使用するフレームワークがわかっている場合は、 1. 準備に進んでください)
Tensorflow、JAX、Pytorch、および MLX は、トレーニングと推論で使用される最適化されたテンソル演算を実行するために必要なライブラリを提供する深層学習フレームワークです。大まかに言えば、4 つの機能はすべて同等です。 Huggingface は、これらのフレームワークのいずれかの上に構築されており、さまざまなユースケースに対応する、すぐに使用またはカスタマイズできる事前トレーニング済みモデルの大規模なライブラリに加えて、簡単に開始できる多数の便利なライブラリとサンプル コードを提供します。
jax-metal
ドライバーの開発は、最新バージョンのJAX
に常に最新であるとは限りません。HuggingFace は、各フレームワークのモデル サポートの概要を公開しています。現在、既存のモデルを利用したい場合は、Pytorch が事実上の標準です。
「最も速いものは何ですか?」という質問に対する (おそらく単純化しすぎた) 答えについては、 Jupyter Notebook 02-Benchmarks を見て、インストールが完了したら、独自の環境をテストできます。ノートブックを使用すると、さまざまなフレームワークの行列乗算の速度を比較できます。ただし、「標準」モデルのトレーニングまたは推論タスクを実行する場合、フレームワーク間の違いはそれほど顕著ではないでしょう。
まだ行っていない場合は、https://brew.sh/ にアクセスし、指示に従って homebrew をインストールします。完了したら、ターミナルを開いてbrew --version
と入力し、正しくインストールされていることを確認します。
次に、 brew
使用して、より新しいバージョンのpython
とgit
インストールします。 Metal 最適化で Tensorflow を使用する予定がない場合は、Homebrew のデフォルトの Python 3.12 を使用することをお勧めします (依然として 3.11 (2024-04) が必要です)。
brew install [email protected] git
brew install [email protected] git
両方のバージョンの Python をインストールし、それぞれのケースに必要な特定の Python バージョンを使用して仮想環境を作成できます。
Linux も使用する予定がある場合は、Python バージョンのサポートが Mac バージョンと Linux バージョンのフレームワークで異なる場合があることに注意してください。
Apple は MacOS の Python を最新の状態に保つことにあまり力を入れていません。最新のデフォルト Python を使用したい場合は、Homebrew の 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
Homebrew の Python 3.11 システム標準の Python を作成したい場合は、 3.12
の参照をすべて3.11
に変更します。
(ターミナルを再起動してパスの変更を有効にするか、現在のターミナル セッションでsource ~/.zshrc
と入力します。)
使用しているシステム Python に関係なく、仮想環境を作成するときは、その Python で
venv
作成することで、いつでもvenv
で使用する特定の Python バージョンを選択できます。たとえば、/usr/bin/python3 -m venv my_venv_name
は、Apple の macOS Python (この記事の執筆時点、2024-07 ではまだ 3.9.6 のままです) を使用して仮想環境を作成します。詳細については、以下の「仮想環境」を参照してください。
次に、このプロジェクトをテスト プロジェクトとしてクローンします。
git clone https://github.com/domschl/HuggingFaceGuidedTourForMac
これにより、テスト プロジェクトがディレクトリHuggingFaceGuidedTourForMac
に複製されます。
次に、このプロジェクト用の Python 3.12 環境を作成し、アクティブ化します。
(繰り返します: 必要に応じて3.11
に置き換えてください)
python3.12 -m venv HuggingFaceGuidedTourForMac
venv を作成すると、同じディレクトリHuggingFaceGuidedTourForMac
を再度使用して、仮想 Python 環境に必要なファイル (Python バイナリ、ライブラリ、構成) が複製したばかりのプロジェクト フォルダーに追加されます。ディレクトリに入り、仮想環境をアクティブ化します。
cd HuggingFaceGuidedTourForMac
source bin/activate
これで、 etc
HuggingFaceGuidedTourForMac
には、github リポジトリのコンテンツ (例: 00-SystemCheck.ipynb
)と仮想環境のファイル (例: bin
、 lib
、 include
、 share
、 pyvenv.cfg
) が含まれています。
代替案:多数の異なる Python バージョンがインストールされている場合は、 venv
の作成に使用される Python のパスを指定することで、特定のバージョンを使用する環境を作成できます。例:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
homebrew の Python を明示的に使用して新しいvenv
を作成しますが、
/usr/bin/python3 -m venv my_old_system_venv
新しい環境には Apple の macOS Python バージョンを使用します。
この仮想環境を非アクティブ化するには、次のコマンドを使用します。
deactivate
再度アクティブ化するには、 venv
含まれるディレクトリ (ここではHuggingFaceGuidedTourForMac
を入力し、次を使用します。
source bin/activate
venv
に関する追加メモ
venv
の非常に直感的ではない特性は、プロジェクトのサブディレクトリで (source bin/activate
を使用して) 環境をアクティブ化して環境に入る間、プロジェクト フォルダーから離れてまったく別の作業を開始するまでvenv
アクティブなままであるという事実です。deactivate
使用してvenv
明示的に非アクティブ化します。現在アクティブな
venv
表示するようにターミナル システム プロンプトを変更するツールが多数あり、これは非常に便利です。 Starship (推奨) をチェックするか、装飾が好きならOh My Zsh
チェックしてください。
powerlevel10k
がインストールされている例。システム プロンプトの左側には現在のディレクトリが表示され、右側にはvenv
の名前が表示されます。現在、アクティブなvenv
はありません。
HuggingFaceGuidedTourForMac
でvenv
をアクティブ化した後:
作業ディレクトリが変更されても (ここからhome
に)、 venv
まだアクティブなので、その名前がpowerlevel10k
によって右側に表示されます。とても便利です。
Python 仮想環境の詳細については、https://docs.python.org/3/tutorial/venv.html を参照してください。
pytorch
をインストールするpip -V
(大文字の V) を使用して仮想環境がアクティブであることを確認します。これにより、プロジェクト内のpip
のパスが表示されるはずです。
<your-path>/HuggingFaceGuidedTourForMac/lib/python3.12/site-packages/pip (python 3.12)
https://pytorch.org
に従って、 pip
を使用して Pytorch をインストールします。 pytorch 内で MPS (Metal Performance Shaders) のサポートを取得するには、少なくともバージョン 2.x (2023 年以降のデフォルト) が必要です。これにより、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-metal
ドライバーと一致するサポートされているJAX
バージョンの互換性テーブルを確認する必要があります。
特定のバージョンのJAX
とpip
を使用した最新のjax-metal
アクティブな環境にインストールするには、次のようにします。
# 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 は 2.16 以降 Python 3.12 をサポートしていますが、macOS
tensorflow-metal
アクセラレータは 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/ に従って、 venv
内にpip
を使用してtensorflow
インストールします。
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 は、Apple Metal フレームワークを使用して、ハードウェア アクセラレーション サポートを備えたpytorch
と、オプションでMLX
および/またはJAX
またはtensorflow
実行する準備ができているはずです。
これをテストするには、 jupyter lab
使用していくつかのノートブックを実行します。 jupyter lab
をインストールするには、まず使用する仮想環境がアクティブであることを確認し ( pip -V
)、次のように入力します。
pip install -U jupyterlab ipywidgets
他の Jupyter バージョンがインストールされている場合、
venv
内に新しくインストールされた jupyter バージョンへのパスが正しく更新されないことがよくあります。環境を再アクティブ化して、正しいローカル Jupyter バージョンが使用されていることを確認します。
deactivate
source bin/activate
Jupyter ラボを開始するには、次のように入力します。
jupyter lab
これにより、 jupyter lab
が実行されたブラウザ ウィンドウが開きます。次に、新しい Python ノートブックを作成し、いくつかのコードを実行して、 tensorflow
とpytorch
が正しく動作していることをテストできます。
import torch
print ( "Pytorch version:" , torch . __version__ )
これが正常に完了すると、Mac でディープ ラーニング実験を行う準備が整います。
HuggingFace は、NLP と深層学習の実験に最適なリソースです。多数の事前トレーニング済み言語モデルと、それらを使用するためのシンプルな API が提供されます。これにより、ディープラーニングの実験をすぐに開始できるようになります。
transformers
の設置ハグフェイスのインストール手順から、 pip
使用してtransformers
をインストールします。
pip install -U transformers accelerate " huggingface_hub[cli] "
HuggingFace を実験するときは、ホーム ディレクトリ
~/.cache/huggingface/hub
に保存される大きなモデルをダウンロードします。このディレクトリまたはそのコンテンツの一部を削除することで、いつでもこれらのモデルを削除できます。
accelerate
はオプションですが、いくつかの大規模なモデルを実行するために使用されます。 accelerate
インストールすると、 numpy
などの他のモジュールがダウングレードされる可能性があります。"huggingface_hub[cli]"
Llama 3 などの (部分的に独自ライセンスを取得した) モデルをダウンロードするために必要になる場合がある、huggingface コマンド ライン ツールをインストールします。 HuggingFaceGuidedTourForMac
ディレクトリとアクティブなvenv
内で、 jupyter lab
を起動し、 00-SystemCheck.ipynb
ノートブックをロードします。ノートブックは最初にすべての深層学習フレームワークをチェックし、正しくインストールされている場合は情報を提供します。その後、Pytorch を使用して簡単な実験を行います。
<Shift>-Enter
を使用してノートブックのセルを実行します。
Huggingface をインストールする前に Jupyter Lab を起動した場合は、Jupyter で Python カーネルを再起動するか、単純に Jupyter Lab を再起動する必要があります。そうしないと、Transformers ライブラリが見つかりません。
さまざまなテストを行った後、最終的に次のような結果が表示されるはずです。
スコア0.99
でPOSITIVE
のラベル分類を受け取った場合は、HuggingFace の実験を開始する準備ができています。
HuggingFace
ライブラリが、トレーニングされたモデル データを含むあらゆる種類の大きなバイナリ BLOB をダウンロードしていることがわかります。そのデータは、ホーム ディレクトリ~/.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
プロジェクトです。この段落では、このガイドの古いバージョンで使用されていた conda をアンインストールします。
brew uninstall miniconda
追加の変更は次のとおりです (miniconda が削除されると、それらはすべて非アクティブになります)。
~/.condarc
(チャネルのリスト)、および~/.conda
。~/.zshrc
(または.bashrc
) パスと環境のセットアップ用。~/.cache/huggingface/hub
に存在する可能性があります。ディレクトリを削除するだけです。 conda
からpip
およびvenv
に切り替えられ、インストールがはるかに簡単になりました。pytorch
v2.0 がリリースされたため、インストール手順でチャネルpytorch-nightly
pytorch
に置き換えることができるようになりました。 pytorch-nightly
チャネルは、MPS サポートには必要なくなりました。