Apple Silicon Mac에 최적화된 pytorch
와 선택적으로 Apple의 새로운 MLX
및/또는 Google의 tensorflow
또는 JAX
설치하는 방법과 HuggingFace
대규모 언어 모델을 자신의 실험에 사용하는 방법에 대한 가이드 투어입니다. 최근 Mac은 기계 학습 작업에 좋은 성능을 보여줍니다.
우리는 다음 단계를 수행할 것입니다:
homebrew
설치pytorch
설치mlx
프레임워크 설치JAX
설치합니다(실험적은 이 시점(2024-07)이며 항상 최신 상태는 아닙니다.)tensorflow
설치합니다.jupyter lab
설치하세요.huggingface
설치하고 jupyter lab 내에서 transformers
와 단 몇 줄의 코드를 사용하여 사전 훈련된 언어 모델을 실행하세요.그런 다음 다음에 대한 추가 HowTo를 제공합니다.
(어떤 프레임워크를 사용할지 알고 있다면 1. 준비 로 건너뛰세요)
Tensorflow, JAX, Pytorch 및 MLX는 훈련 및 추론에 사용되는 최적화된 텐서 작업을 수행하는 데 필요한 라이브러리를 제공하는 딥 러닝 프레임워크입니다. 높은 수준에서는 네 가지 기능 모두 동일합니다. Huggingface는 이러한 프레임워크를 기반으로 구축되며 다양한 사용 사례에 대해 사전 훈련된 모델의 대규모 라이브러리를 제공하며 즉시 사용하거나 사용자 정의할 수 있으며 쉽게 시작할 수 있도록 다양한 편의 라이브러리 및 샘플 코드도 제공합니다.
jax-metal
드라이버 개발이 항상 최신 버전의 JAX
와 최신 상태를 유지하는 것은 아닙니다.HuggingFace는 각 프레임워크에 대한 모델 지원 개요를 게시합니다. 현재 기존 모델을 활용하려는 경우 Pytorch가 사실상의 표준입니다.
"가장 빠른 것은 무엇입니까?"라는 질문에 대한 (아마도 너무 단순화된) 답변입니다. Jupyter 노트북 02-벤치마크를 살펴보고 설치가 완료되면 자신의 환경을 테스트할 수 있습니다. 노트북을 사용하면 다양한 프레임워크의 행렬 곱셈 속도를 비교할 수 있습니다. 그러나 '표준' 모델 훈련이나 추론 작업을 수행할 때 프레임워크 간의 차이는 덜 뚜렷할 가능성이 높습니다.
아직 설치하지 않았다면 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을 사용하려면 홈브루의 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
가상 Python 환경에 필요한 파일(Python 바이너리, 라이브러리, 구성)을 생성하면 동일한 디렉터리 HuggingFaceGuidedTourForMac
을 다시 사용하여 방금 복제한 프로젝트 폴더에 추가됩니다. 디렉터리를 입력하고 가상 환경을 활성화합니다.
cd HuggingFaceGuidedTourForMac
source bin/activate
이제 HuggingFaceGuidedTourForMac
디렉터리에는 github 저장소의 내용(예: 00-SystemCheck.ipynb
) 과 가상 환경용 파일(예: bin
, lib
, etc
, include
, share
, pyvenv.cfg
)이 포함되어 있습니다.
대안: 다양한 Python 버전이 설치되어 있는 경우 venv
를 생성하는 데 사용되는 Python의 경로를 지정하여 특정 버전을 사용하는 환경을 생성할 수 있습니다. 예:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
새로운 venv
생성하기 위해 명시적으로 homebrew의 python을 사용하는 반면,
/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를 설치하겠습니다. Apple Silicon에서 상당한 성능 이점을 제공하는 Pytorch 내에서 MPS(Metal Performance Shaders) 지원을 받으려면 버전 2.x(2023년 이후 기본값) 이상이 필요합니다.
venv
에 pytorch
설치하려면:
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
메탈 드라이버는 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
설치 Huggingface 설치 지침에서 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 라이브러리를 찾을 수 없습니다.
다양한 테스트를 마친 후 마침내 다음과 같은 내용이 표시됩니다.
POSITIVE
인 라벨 분류와 0.99
점을 받았다면 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
로 대체할 수 있습니다. MPS 지원에는 pytorch-nightly
채널이 더 이상 필요하지 않습니다.