PyTorch دليل المبتدئين: من الصفر إلى Deep Learning بطل
٢ فبراير ٢٠٢٦
ملخص
- PyTorch هو إطار عمل مرن وPythonic للتعلم العميق ويُستخدم على نطاق واسع في البحث والإنتاج.
- ستتعلم كيفية بناء وتدريب وتقييم الشبكات العصبية من الصفر.
- سنغطي التنسورات، autograd، optimizers، وأساسيات نشر النماذج.
- يحتوي على أمثلة قابلة للتنفيذ، نصائح أداء، والأخطاء الشائعة.
- مثالي لمطوري بايثون الذين يبدأون رحلتهم في التعلم العميق.
ما ستتعلمه
- فهم أساسيات PyTorch وكيفية اختلافه عن الإطارات الأخرى.
- إنشاء ومعالجة التنسورات للحساب العددي.
- بناء شبكات عصبية بسيطة وعميقة باستخدام
torch.nn. - تدريب النماذج باستخدام انحدار التدرج ومراقبة الأداء.
- تصحيح الأخطاء، تحسين، ونشر نماذج PyTorch بفعالية.
المتطلبات الأساسية
قبل البدء، تأكد من وجود:
- معرفة أساسية ببايثون (دوال، فئات، التحكم في التدفق)
- الاطلاع على NumPy أو مفاهيم الجبر الخطي الأساسية
- تم تثبيت Python 3.8+ وPyTorch (استخدم
pip install torch torchvision torchaudio)
للتحقق من التثبيت:
python -c "import torch; print(torch.__version__)"
النتيجة المتوقعة:
2.2.0
(قد تختلف الإصدارة حسب تاريخ الإصدار.)
مقدمة: لماذا PyTorch؟
PyTorch هو إطار عمل للتعلم الآلي مفتوح المصدر تم تطويره بواسطة مختبر أبحاث الذكاء الاصطناعي التابع لفيسبوك (FAIR)1. يُعرف باستخدام رسم حسابي ديناميكي — حيث تُبنى النماذج وتُعدل أثناء التشغيل، مما يجعل التجربة بديهية واستكشاف الأخطاء سهلًا. على عكس الإطارات ذات الرسومات الثابتة التي تتطلب تعريف الحساب بالكامل قبل التنفيذ، ينفذ PyTorch العمليات فورًا (eager execution)، مما يتماشى بشكل وثيق مع دلالات بايثون الأصلية.
المزايا الرئيسية
- Pythonic و بديهي: يشعرك بلغة بايثون العادية، مع تكامل قوي مع NumPy.
- رسومات حسابية ديناميكية: ممتازة للبحث والprototyping.
- دعم قوي لـ GPU: تسريع CUDA مدمج للتدريب عالي الأداء.
- تكامل النظام البيئي: يعمل بسلاسة مع TorchVision وTorchText وTorchAudio.
- جاهز للإنتاج: TorchScript وTorchServe يمكّنان نشر النماذج على نطاق واسع.
مقارنة: PyTorch مقابل TensorFlow
| الخاصية | PyTorch | TensorFlow |
|---|---|---|
| وضع التنفيذ | ديناميكي (eager افتراضيًا) | ثابت (قائم على الرسم الحسابي، eager اختياري) |
| البنية | بايثوني، أقل كود مكرر | أكثر تفصيلاً، API heavy |
| استكشاف الأخطاء وإصلاحها | استكشاف الأخطاء باستخدام بايثون الأصلي | يتطلب أدوات خاصة |
| النشر | TorchScript، TorchServe | TensorFlow Serving، TFLite |
| النظام البيئي | TorchVision، TorchAudio | Keras، TF Hub |
| مثالي لـ | البحث، البروتotyping | الإنتاج على نطاق واسع |
البدء: التنسورات والعمليات
التنسورات هي البنية الأساسية للبيانات في PyTorch — مصفوفات متعددة الأبعاد تشبه مصفوفات NumPy، ولكن مع تسريع GPU.
إنشاء التنسورات
import torch
# From data
data = [[1, 2], [3, 4]]
tensor = torch.tensor(data)
# From NumPy array
import numpy as np
np_array = np.array(data)
tensor_from_np = torch.from_numpy(np_array)
# Random tensor
tensor_rand = torch.rand((2, 3))
print(tensor)
print(tensor_rand)
نقل التنسورات إلى GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
tensor = tensor.to(device)
print(f"Tensor device: {tensor.device}")
مثال للنتيجة:
Tensor device: cuda
عمليات التنسورات
PyTorch يدعم مجموعة واسعة من العمليات:
a = torch.tensor([[1, 2], [3, 4]], dtype=torch.float32)
b = torch.tensor([[5, 6], [7, 8]], dtype=torch.float32)
print(torch.add(a, b))
print(torch.matmul(a, b))
print(a * b) # element-wise
التفاضل التلقائي مع Autograd
Autograd هو محرك التفاضل التلقائي لـ PyTorch2. يتعقب العمليات على tensors مع requires_grad=True ويحسب التدرجات تلقائيًا أثناء المرور العكسي.
مثال: حساب التدرج البسيط
x = torch.ones(2, 2, requires_grad=True)
y = x + 2
z = y * y * 3
out = z.mean()
out.backward()
print(x.grad)
الإخراج المتوقع:
tensor([[4.5000, 4.5000], [4.5000, 4.5000]])
يتم حساب تدرج كل عنصر تلقائيًا — لا حاجة للحساب اليدوي.
بناء شبكتك العصبية الأولى
دعونا نمر عبر مثال بسيط: تدريب شبكة عصبية أمامية على مجموعة بيانات MNIST.
الخطوة 1: استيراد المكتبات
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
الخطوة 2: تعريف التحويلات و DataLoader
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
])
train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
الخطوة 3: تعريف النموذج
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(28*28, 128)
self.fc2 = nn.Linear(128, 64)
self.fc3 = nn.Linear(64, 10)
def forward(self, x):
x = x.view(-1, 28*28)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return F.log_softmax(x, dim=1)
الخطوة 4: تدريب النموذج
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = Net().to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)
for epoch in range(1, 4):
model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()
optimizer.step()
print(f"Epoch {epoch}: Loss = {loss.item():.4f}")
Terminal output مثال:
Epoch 1: Loss = 0.1873
Epoch 2: Loss = 0.0921
Epoch 3: Loss = 0.0654
متى تستخدم PyTorch مقابل متى لا تستخدمها
| عندما تستخدم PyTorch | عندما لا تستخدم PyTorch |
|---|---|
| تحتاج إلى رسوم حسابية ديناميكية | تتطلب تحسينًا صارمًا للرسم الحسابي الثابت |
| أنت تقوم ببحث أو نمذجة سريعة | أنت تقوم بنشر على أجهزة محمولة منخفضة الطاقة |
| تفضل البنية النحوية البايثونية | تحتاج إلى API عالي المستوى مثل Keras |
| تحتاج إلى تسريع GPU ومرونة | تريد إعدادًا بسيطًا للمهام البسيطة ML |
الأخطاء الشائعة & الحلول
| الخطأ | السبب | الحل |
|---|---|---|
نسيان .to(device) |
التينسورات على CPU بينما النموذج على GPU | نقل كلا التينسورات والنموذج إلى نفس الجهاز |
| تلاشي التدرجات | شبكات عميقة مع تهيئة سيئة | استخدام تنشيطات ReLU، تطبيع الدُفعات |
| الإفراط في التخصيص | مجموعة بيانات صغيرة | إضافة dropout، زيادة البيانات |
| انفجار التدرجات | معدل تعلم مرتفع | قص التدرجات، تقليل معدل التعلم |
| تسريب الذاكرة | الحفاظ على الرسم الحسابي نشطًا | استخدم .detach() أو with torch.no_grad() |
تحسين الأداء
1. استخدام GPU بكفاءة
- استخدم
torch.cuda.ampللتدريب بدقة مختلطة3. - معالجة البيانات في دفعات بكفاءة لتعظيم استخدام GPU.
- قم بتحليل الأداء باستخدام
torch.utils.benchmarkلتحديد نقاط الاختناق.
2. تحميل البيانات
- استخدم
num_workersفيDataLoaderلتحميل البيانات بالتوازي. - تخزين البيانات المُعدَّة مسبقًا في الذاكرة المؤقتة عند الإمكان.
3. تحسين النموذج
- استخدم
torch.jit.trace()أوtorch.jit.script()لتجميع النماذج لاستدلال أسرع. - التكميم والتقليم يمكن أن يقللا حجم النموذج بشكل كبير.
اعتبارات الأمان
- تسلسل النموذج: قم بتحميل النماذج فقط من مصادر موثوقة.
torch.load()في PyTorch يمكنه تنفيذ كود عشوائي4. - التحقق من المدخلات: تحقق دائمًا من المدخلات ونظفها لمنع الهجمات الخبيثة.
- القابلية للتكرار: اضبط البذور العشوائية واستخدم خوارزميات حتمية للحصول على نتائج قابلة للتنبؤ.
torch.manual_seed(42)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
الاختبار والتحقق
الاختبار يضمن أن نموذجك يُعمِّم بشكل جيد.
model.eval()
correct = 0
with torch.no_grad():
for data, target in train_loader:
data, target = data.to(device), target.to(device)
output = model(data)
pred = output.argmax(dim=1)
correct += pred.eq(target.view_as(pred)).sum().item()
print(f'Accuracy: {100. * correct / len(train_loader.dataset):.2f}%')
المراقبة والقابلية للملاحظة
- استخدم تكامل TensorBoard (
torch.utils.tensorboard) لتتبع الخسائر والمقاييس. - سجل مقاييس التدريب وإصدارات النموذج ومعاملات الفائقة.
- راقب استخدام GPU باستخدام
nvidia-smiأوtorch.cuda.memory_summary()في PyTorch.
دراسة حالة واقعية: PyTorch في الإنتاج
تستخدم شركات التكنولوجيا الكبرى والمؤسسات البحثية PyTorch لكل من التجريب والنشر على نطاق واسع5. على سبيل المثال:
- Meta (Facebook): تستخدم PyTorch داخليًا لأبحاث الرؤية الحاسوبية ومعالجة اللغة الطبيعية.
- OpenAI: استخدمت PyTorch في البداية لبروتايب النماذج قبل التوسع إلى أطر العمل الإنتاجية.
- Tesla: أعلنت عن استخدام PyTorch لنماذج إدراك القيادة الذاتية.
تُبرز هذه الحالات مرونة PyTorch من البيئات البحثية إلى الإنتاج.
القابلية للتوسع والنشر
تقدم PyTorch عدة مسارات نشر:
- TorchScript: تحويل النماذج إلى شكل مسلسل لبيئة تشغيل C++.
- TorchServe: استضافة النماذج عبر REST APIs للتنبؤ في الإنتاج.
- ONNX Export: تحويل النماذج إلى صيغة ONNX للتوافق بين الإطارات.
رسم Mermaid: تدفق النشر
graph TD
A[PyTorch Model] --> B[TorchScript Conversion]
B --> C[TorchServe API]
C --> D[Production Clients]
الأخطاء الشائعة التي يرتكبها الجميع
- نسيان استدعاء
.eval()أثناء التقييم. - عدم فصل التنسورات أثناء تسجيل البيانات.
- الخلط بين
torch.Tensor(المُنشئ) معtorch.tensor()(دالة الإنشاء). - استخدام
torch.save()مع ملفات غير موثوقة. - تجاهل تسرب ذاكرة CUDA بعدم مسح ذاكرة التخزين المؤقت باستخدام
torch.cuda.empty_cache().
تحدي جربه بنفسك
قم بتعديل مثال MNIST لـ:
- إضافة طبقات dropout لتقليل الإفراط في التخصيص.
- تجربة مُحسّن
SGDبدلاً منAdam. - رسم خسارة التدريب باستخدام TensorBoard.
دليل استكشاف الأخطاء وإصلاحها
| الخطأ | السبب المحتمل | الحل |
|---|---|---|
RuntimeError: Expected all tensors on same device |
تنسورات مختلطة من CPU/GPU | نقل جميع التنسورات إلى نفس الجهاز |
CUDA out of memory |
حجم الدفعة كبير جدًا | تقليل حجم الدفعة أو استخدام تراكم التدرجات |
nan loss values |
انفجار التدرجات | خفض معدل التعلم، تقطيع التدرجات |
ImportError: No module named torch |
PyTorch غير مثبت | إعادة التثبيت عبر pip install torch |
الاستنتاجات الرئيسية
PyTorch يمكّن المطورين من بناء وتدريب ونشر نماذج التعلم العميق بسهولة ومرونة.
- ابدأ صغيرًا مع التنسورات والـ autograd.
- جرّب نماذج بسيطة قبل التوسع.
- استخدم تسريع GPU وأدوات التحليل.
- تحقق دائمًا من المدخلات وراقب الأداء.
الأسئلة الشائعة
س1: هل PyTorch أفضل من TensorFlow؟
ج: يعتمد على ذلك — يُفضّل PyTorch غالبًا للبحث بسبب مرونته، بينما TensorFlow شائع في خطوط أنابيب الإنتاج6.
س2: هل يمكن لـ PyTorch العمل على المعالجات المركزية؟
ج: نعم، يعمل PyTorch على المعالجات المركزية والرسومية بسلاسة. يمكنك التبديل باستخدام .to('cpu') أو .to('cuda').
س3: كيف أحفظ وأحمّل النماذج؟
ج: استخدم torch.save(model.state_dict(), 'model.pth') و model.load_state_dict(torch.load('model.pth')).
س4: هل PyTorch مناسب للمبتدئين؟
ج: بالتأكيد — تصميمه البايثوني يجعله سهل الاستخدام لأي شخص يعرف Python وNumPy.
س5: كيف أنشر نموذج PyTorch؟
ج: يمكنك تصديره باستخدام TorchScript وتقديمه عبر TorchServe أو تحويله إلى ONNX للنشر عبر المنصات.
الخطوات التالية / قراءات إضافية
Footnotes
-
PyTorch Official Documentation – About PyTorch: https://pytorch.org/docs/stable/index.html ↩
-
PyTorch Autograd Mechanics: https://pytorch.org/docs/stable/aut