جولة إرشادية حول كيفية تثبيت pytorch
المُحسّن واختياريًا MLX
الجديد من Apple و/أو tensorflow
من Google أو JAX
على أجهزة Apple Silicon Mac وكيفية استخدام نماذج اللغة الكبيرة HuggingFace
لتجاربك الخاصة. تُظهر أجهزة Mac الحديثة أداءً جيدًا لمهام التعلم الآلي.
سنقوم بالخطوات التالية:
homebrew
pytorch
مع دعم MPS (تظليل الأداء المعدني) باستخدام وحدات معالجة الرسومات Apple Siliconmlx
الجديد من AppleJAX
باستخدام برامج التشغيل المعدنية من Apple (التجريبية في هذه المرحلة الزمنية (2024-07)، وليست محدثة دائمًا.)tensorflow
مع تحسينات برنامج التشغيل المعدني القابل للتوصيل من Applejupyter lab
لتشغيل دفاتر الملاحظاتhuggingface
وقم بتشغيل بعض نماذج اللغة المدربة مسبقًا باستخدام transformers
وبضعة أسطر من التعليمات البرمجية داخل Jupyter Lab.ثم نقدم HowTos إضافية لـ:
(انتقل إلى 1. الاستعدادات إذا كنت تعرف الإطار الذي ستستخدمه)
Tensorflow وJAX وPytorch وMLX هي أطر عمل للتعلم العميق توفر المكتبات المطلوبة لتنفيذ عمليات الموتر المحسنة المستخدمة في التدريب والاستدلال. على المستوى العالي، تكون وظائف الأربعة متكافئة. يعتمد Huggingface على أي من تلك الأطر ويوفر مكتبة كبيرة من النماذج المدربة مسبقًا للعديد من حالات الاستخدام المختلفة، جاهزة للاستخدام أو للتخصيص بالإضافة إلى عدد من المكتبات الملائمة ونماذج التعليمات البرمجية لسهولة البدء.
jax-metal
لا يتم تحديثه دائمًا بأحدث إصدارات JAX
.تنشر HuggingFace نظرة عامة على دعم النموذج لكل إطار عمل. حاليًا، Pytorch هو المعيار الفعلي، إذا كنت ترغب في الاستفادة من النماذج الموجودة.
للحصول على إجابة (ربما مبسطة للغاية) على السؤال "ما هو الأسرع؟" قم بإلقاء نظرة على Jupyter Notebook 02-Benchmarks، وبمجرد الانتهاء من التثبيت، يمكنك اختبار البيئة الخاصة بك. يسمح دفتر الملاحظات بمقارنة سرعة ضرب المصفوفات لأطر عمل مختلفة. ومع ذلك، فإن الفرق بين الأطر عند أداء تدريب النموذج "القياسي" أو مهام الاستدلال سيكون على الأرجح أقل وضوحًا.
إذا لم تكن قد قمت بذلك، فانتقل إلى https://brew.sh/ واتبع التعليمات لتثبيت برنامج homebrew. بمجرد الانتهاء، افتح الوحدة الطرفية واكتب brew --version
للتأكد من تثبيته بشكل صحيح.
استخدم الآن brew
لتثبيت الإصدارات الأحدث من python
و git
. التوصية هي استخدام Python 3.12 الافتراضي الخاص بـ Homebrew، إذا كنت لا تخطط لاستخدام Tensorflow مع تحسين المعدن (لا يزال يتطلب 3.11 (في 2024-04)).
brew install [email protected] git
brew install [email protected] git
يمكنك تثبيت كلا الإصدارين من Python ثم إنشاء بيئة افتراضية باستخدام إصدار Python المحدد الذي تحتاجه لكل حالة.
إذا كنت تخطط لاستخدام Linux أيضًا، فاعلم أن دعم إصدار Python يختلف أحيانًا بين إصداري Mac وLinux من أطر العمل.
لا تبذل شركة Apple الكثير من الطاقة للحفاظ على تحديث نظام التشغيل MacOS. إذا كنت تريد استخدام بايثون افتراضي محدث، فمن المنطقي أن تجعل بايثون البيرة هو بايثون النظام الافتراضي. لذا، إذا كنت تريد استخدام نظام Python 3.11 أو 3.12 الخاص بشركة Homebrew على مستوى العالم، فإن أسهل طريقة للقيام بذلك (بعد
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 القياسية للنظام.
(أعد تشغيل جهازك الطرفي لتنشيط تغييرات المسار، أو أدخل source ~/.zshrc
في جلسة العمل الطرفية الحالية.)
بغض النظر عن نظام بايثون المستخدم، عند إنشاء بيئة افتراضية، يمكنك دائمًا تحديد إصدار بايثون المحدد الذي تريد استخدامه في
venv
عن طريق إنشاءvenv
باستخدام هذا الثعبان بالضبط. على سبيل المثال/usr/bin/python3 -m venv my_venv_name
ينشئ بيئة افتراضية باستخدام macOS python من Apple (والذي في وقت كتابة هذه السطور، 2024-07، لا يزال عالقًا عند 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
):
البدائل: إذا كان لديك العديد من إصدارات بايثون المختلفة المثبتة، فيمكنك إنشاء بيئة تستخدم إصدارًا محددًا عن طريق تحديد مسار الثعبان المستخدم لإنشاء venv
، على سبيل المثال:
/opt/homebrew/opt/[email protected]/bin/python3.12 -m venv my_new_312_env
يستخدم لغة Python الخاصة بـ homebrew بشكل صريح لإنشاء 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
نشطًا عندما تغادر مجلد المشروع وتبدأ العمل على شيء مختلف تمامًا حتى تقوم بإلغاء تنشيط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
، وهو يدعم التمييز التلقائي بين "كل شيء" (لمشاكل التحسين) ويدعم التوجيه والتوازي لخوارزميات بايثون بما يتجاوز مجرد التعلم العميق. للحصول على الوظائف المتوقعة من أطر التعلم العميق الأخرى (الطبقات، ووظائف حلقة التدريب وما شابه ذلك "عالية المستوى")، فكر في تثبيت مكتبة شبكة عصبية إضافية مثل: flax
.
لسوء الحظ، بدأت برامج تشغيل JAX
المعدنية في التأخر عن إصدارات 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، لم يتم تحديث مسرع 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/، سنقوم بتثبيت 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 مصدرًا رائعًا لتجارب البرمجة اللغوية العصبية والتعلم العميق. يوفر عددًا كبيرًا من نماذج اللغة المدربة مسبقًا وواجهة برمجة تطبيقات بسيطة لاستخدامها. سيسمح لنا بالبدء بسرعة في تجارب التعلم العميق.
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
وactive venv
، ابدأ تشغيل jupyter lab
وقم بتحميل دفتر الملاحظات 00-SystemCheck.ipynb
. سيتحقق دفتر الملاحظات أولاً من جميع أطر التعلم العميق ويقدم المعلومات، إذا تم تثبيتها بشكل صحيح. وبعد ذلك، يتم استخدام Pytorch لإجراء تجربة بسيطة.
استخدم <Shift>-Enter
لتشغيل خلايا دفتر الملاحظات.
إذا قمت بتشغيل Jupyter Lab قبل تثبيت Huggingface، فستحتاج إما إلى إعادة تشغيل python kernel في Jupyter أو ببساطة إعادة تشغيل Jupyter Lab، وإلا فلن تجد مكتبة Transformers.
بعد الاختبارات المختلفة، يجب أن ترى أخيرًا شيئًا مثل هذا:
إذا حصلت على تصنيف POSITIVE
بدرجة 0.99
، فأنت مستعد لبدء تجربة HuggingFace!
سترى أن مكتبات
HuggingFace
تقوم بتنزيل جميع أنواع النقط الثنائية الكبيرة التي تحتوي على بيانات النموذج المُدرب. يتم تخزين هذه البيانات في الدليل الرئيسي الخاص بك على:~/.cache/huggingface/hub
. يمكنك إزالة هذه النماذج في أي وقت عن طريق حذف هذا الدليل أو أجزاء من محتواه.
يمكنك فتح دفتر الملاحظات 01-ChatBot.ipynb
لتجربة برنامج chatbot بسيط جدًا على جهاز Mac الخاص بك.
كود بايثون المستخدم هو:
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 } " )
يُظهر هذا برنامج chatbot (محدود ومتكرر جدًا) يستخدم نماذج DialoGPT من Microsoft.
الأشياء التي يجب تجربتها:
use_model_index
بين 0..2
، يمكنك تحديد نموذج لغة صغير أو متوسط أو كبير.history_text
أعلاه.~/.cache/huggingface/hub
. تتم إعادة تنزيل العناصر المفقودة تلقائيًا عند الحاجة. llama.cpp
الذي ينفذ كود الاستدلال الضروري لتشغيل LLMs في كود C++ محسّن للغاية، مما يدعم تسريع Metal في Mac.تهدف هذه الفقرة إلى إلغاء تثبيت conda الذي تم استخدامه في الإصدارات الأقدم من هذا الدليل:
brew uninstall miniconda
التعديلات الإضافية هي (جميعها غير نشطة، بمجرد إزالة 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.