أدوات الذكاء الاصطناعي 101
إعداد التدريب والضبط والاستدلال على LLMs باستخدام وحدات معالجة الرسومات NVIDIA وCUDA
شهد مجال الذكاء الاصطناعي (AI) تطورات ملحوظة في السنوات الأخيرة، وفي قلبه يكمن المزيج القوي من وحدات معالجة الرسومات (GPUs) ومنصة الحوسبة المتوازية.
نماذج مثل جي بي تي، بيرتومؤخرا اللاما نوع من الجمال, الميسترال ريح شمالية قادرون على فهم وإنشاء نص يشبه الإنسان بطلاقة وتماسك غير مسبوقين. ومع ذلك، يتطلب تدريب هذه النماذج كميات هائلة من البيانات والموارد الحسابية، مما يجعل وحدات معالجة الرسومات وCUDA أدوات لا غنى عنها في هذا المسعى.
سيرشدك هذا الدليل الشامل خلال عملية إعداد NVIDIA GPU على Ubuntu، ويغطي تثبيت مكونات البرامج الأساسية مثل برنامج تشغيل NVIDIA، ومجموعة أدوات CUDA، وcuDNN، وPyTorch، والمزيد.
ظهور أطر الذكاء الاصطناعي المتسارعة من CUDA
تم تعزيز التعلم العميق المسرع بواسطة وحدة معالجة الرسومات من خلال تطوير أطر عمل الذكاء الاصطناعي الشائعة التي تستفيد من CUDA لإجراء عمليات حسابية فعالة. أطر مثل TensorFlow, PyTorchو MXNet لديها دعم مدمج لـ CUDA، مما يتيح التكامل السلس لتسريع GPU في مسارات التعلم العميق.
وفقًا دراسة أداء منتج التعلم العميق لمركز بيانات NVIDIA، يمكن لنماذج التعلم العميق المتسارعة بواسطة CUDA تحقيق أداء أسرع بما يصل إلى 100 مرة مقارنة بالتطبيقات المستندة إلى وحدة المعالجة المركزية.
تقنية وحدة معالجة الرسومات متعددة الحالات (MIG) من NVIDIA، المُقدمة مع بنية Ampere، تُتيح تقسيم وحدة معالجة رسومات واحدة إلى عدة حالات آمنة، لكل منها مواردها الخاصة. تُمكّن هذه الميزة من مشاركة موارد وحدة معالجة الرسومات بكفاءة بين عدة مستخدمين أو أحمال عمل، مما يُحسّن الاستخدام ويُقلل التكاليف الإجمالية.
تسريع الاستدلال LLM باستخدام NVIDIA TensorRT
في حين أن وحدات معالجة الرسومات لعبت دورًا أساسيًا في تدريب طلاب ماجستير القانون، فإن الاستدلال الفعال له نفس القدر من الأهمية لنشر هذه النماذج في بيئات الإنتاج. نفيديا تينسوررت، وهو مُحسِّن ووقت تشغيل عالي الأداء للتعلم العميق، يلعب دورًا حيويًا في تسريع استدلال LLM على وحدات معالجة الرسومات التي تدعم CUDA.
وفقًا لمعايير NVIDIA، يمكن لـ TensorRT توفير أداء استدلال أسرع بما يصل إلى 8 مرات وتكلفة إجمالية للملكية أقل بنحو 5 مرات مقارنة بالاستدلال المستند إلى وحدة المعالجة المركزية لنماذج اللغات الكبيرة مثل GPT-3.
كان التزام NVIDIA بمبادرات المصادر المفتوحة دافعًا قويًا وراء انتشار استخدام CUDA في مجتمع أبحاث الذكاء الاصطناعي. مشاريع مثل cuDNN, كوبلاسو NCCL متاحة كمكتبات مفتوحة المصدر، مما يمكّن الباحثين والمطورين من الاستفادة من الإمكانات الكاملة لـ CUDA في تعلمهم العميق.
التثبيت
عند إعداد تطوير الذكاء الاصطناعي، قد لا يكون استخدام أحدث برامج التشغيل والمكتبات هو الخيار الأفضل دائمًا. على سبيل المثال، في حين أن أحدث برنامج تشغيل NVIDIA (545.xx) يدعم CUDA 12.3، فإن PyTorch والمكتبات الأخرى قد لا تدعم هذا الإصدار حتى الآن. ولذلك، سوف نستخدم إصدار برنامج التشغيل 535.146.02 مع CUDA 12.2 لضمان التوافق.
خطوات التثبيت
1. قم بتثبيت برنامج تشغيل NVIDIA
أولاً، حدد طراز GPU الخاص بك. في هذا الدليل، نستخدم وحدة معالجة الرسومات NVIDIA. قم بزيارة صفحة تنزيل برنامج تشغيل NVIDIA، وحدد برنامج التشغيل المناسب لوحدة معالجة الرسومات الخاصة بك، ولاحظ إصدار برنامج التشغيل.
للتحقق من وجود حزم GPU المعدة مسبقًا على Ubuntu، قم بتشغيل:
sudo ubuntu-drivers list --gpgpu
أعد تشغيل جهاز الكمبيوتر الخاص بك وتحقق من التثبيت:
nvidia-smi
2. قم بتثبيت مجموعة أدوات CUDA
توفر مجموعة أدوات CUDA بيئة التطوير لإنشاء تطبيقات عالية الأداء ومسرعة بواسطة GPU.
بالنسبة لإعدادات التعلم العميق/غير LLM، يمكنك استخدام:
sudo apt install nvidia-cuda-toolkit However, to ensure compatibility with BitsAndBytes, we will follow these steps: [code language="BASH"] git clone https://github.com/TimDettmers/bitsandbytes.git cd bitsandbytes/ bash install_cuda.sh 122 ~/local 1
التحقق من التثبيت:
~/local/cuda-12.2/bin/nvcc --version
ضبط متغيرات البيئة:
export CUDA_HOME=/home/roguser/local/cuda-12.2/ export LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 export BNB_CUDA_VERSION=122 export CUDA_VERSION=122
3. قم بتثبيت cuDNN
تحميل حزمة cuDNN من موقع مطور NVIDIA. تثبيته مع:
sudo apt install ./cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb
اتبع التعليمات لإضافة حلقة المفاتيح:
sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-keyring.gpg /usr/share/keyrings/
تثبيت مكتبات cuDNN:
sudo apt update sudo apt install libcudnn8 libcudnn8-dev libcudnn8-samples
4. إعداد بيئة بايثون الافتراضية
يأتي Ubuntu 22.04 مع Python 3.10. تثبيت فينف:
sudo apt-get install python3-pip sudo apt install python3.10-venv
إنشاء وتفعيل البيئة الافتراضية:
cd mkdir test-gpu cd test-gpu python3 -m venv venv source venv/bin/activate
5. قم بتثبيت BitsAndBytes من المصدر
انتقل إلى دليل BitsAndBytes وقم بالبناء من المصدر:
cd ~/bitsandbytes CUDA_HOME=/home/roguser/local/cuda-12.2/ \ LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 \ BNB_CUDA_VERSION=122 \ CUDA_VERSION=122 \ make cuda12x CUDA_HOME=/home/roguser/local/cuda-12.2/ \ LD_LIBRARY_PATH=/home/roguser/local/cuda-12.2/lib64 \ BNB_CUDA_VERSION=122 \ CUDA_VERSION=122 \ python setup.py install
6. قم بتثبيت باي تورتش
قم بتثبيت PyTorch باستخدام الأمر التالي:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
7. تثبيت الوجه المعانق والمحولات
تثبيت المحولات وتسريع المكتبات:
pip install transformers pip install accelerate
قوة المعالجة المتوازية
في جوهرها، وحدات معالجة الرسومات هي معالجات متوازية للغاية مصممة للتعامل مع الآلاف من الخيوط المتزامنة بكفاءة. هذه البنية تجعلها مناسبة تمامًا للمهام الحسابية المكثفة التي ينطوي عليها تدريب نماذج التعلم العميق، بما في ذلك ماجستير إدارة الأعمال. توفر منصة CUDA، التي طورتها NVIDIA، بيئة برمجية تسمح للمطورين بتسخير الإمكانات الكاملة لوحدات معالجة الرسومات هذه، وتمكينهم من كتابة التعليمات البرمجية التي يمكنها الاستفادة من قدرات المعالجة المتوازية للأجهزة.
تسريع LLM التدريب مع وحدات معالجة الرسومات و CUDA.
يعد تدريب نماذج اللغة الكبيرة مهمة حسابية تتطلب معالجة كميات هائلة من البيانات النصية وتنفيذ العديد من عمليات المصفوفة. تعتبر وحدات معالجة الرسومات، بما تحتويه من آلاف النوى ونطاق ترددي عالي للذاكرة، مناسبة بشكل مثالي لهذه المهام. من خلال الاستفادة من CUDA، يمكن للمطورين تحسين التعليمات البرمجية الخاصة بهم للاستفادة من إمكانات المعالجة المتوازية لوحدات معالجة الرسومات، مما يقلل بشكل كبير من الوقت اللازم لتدريب LLMs.
على سبيل المثال، التدريب على GPT-3، أحد أكبر نماذج اللغات حتى الآن، أصبح ممكنًا من خلال استخدام الآلاف من وحدات معالجة الرسومات NVIDIA التي تعمل بنظام CUDA المحسّن. وقد سمح ذلك بتدريب النموذج على كمية غير مسبوقة من البيانات، مما أدى إلى أدائه المثير للإعجاب في مهام اللغة الطبيعية.
import torch
import torch.nn as nn
import torch.optim as optim
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# Load pre-trained GPT-2 model and tokenizer
model = GPT2LMHeadModel.from_pretrained('gpt2')
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
# Move model to GPU if available
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
# Define training data and hyperparameters
train_data = [...] # Your training data
batch_size = 32
num_epochs = 10
learning_rate = 5e-5
# Define loss function and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# Training loop
for epoch in range(num_epochs):
for i in range(0, len(train_data), batch_size):
# Prepare input and target sequences
inputs, targets = train_data[i:i+batch_size]
inputs = tokenizer(inputs, return_tensors="pt", padding=True)
inputs = inputs.to(device)
targets = targets.to(device)
# Forward pass
outputs = model(**inputs, labels=targets)
loss = outputs.loss
# Backward pass and optimization
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')
في هذا المثال لمقتطف التعليمات البرمجية، نعرض تدريب أ GPT-2 نموذج اللغة باستخدام PyTorch ووحدات معالجة الرسومات التي تدعم CUDA. يتم تحميل النموذج على وحدة معالجة الرسومات (إن وجدت)، وتستفيد حلقة التدريب من التوازي بين وحدات معالجة الرسومات لأداء تمريرات أمامية وخلفية فعالة، مما يؤدي إلى تسريع عملية التدريب.
مكتبات CUDA المعجلة للتعلم العميق
بالإضافة إلى منصة CUDA نفسها، قامت NVIDIA ومجتمع المصادر المفتوحة بتطوير مجموعة من المكتبات المعجلة بواسطة CUDA والتي تتيح التنفيذ الفعال لنماذج التعلم العميق، بما في ذلك LLMs. توفر هذه المكتبات تطبيقات محسنة للعمليات المشتركة، مثل ضرب المصفوفات والتلافيف ووظائف التنشيط، مما يسمح للمطورين بالتركيز على بنية النموذج وعملية التدريب بدلاً من التحسين على مستوى منخفض.
إحدى هذه المكتبات هي cuDNN (مكتبة الشبكة العصبية العميقة CUDA)، والتي توفر تطبيقات مضبوطة للغاية للإجراءات القياسية المستخدمة في الشبكات العصبية العميقة. من خلال الاستفادة من cuDNN، يمكن للمطورين تسريع التدريب والاستدلال على نماذجهم بشكل كبير، وتحقيق مكاسب في الأداء تصل إلى عدة أوامر من حيث الحجم مقارنة بالتطبيقات المستندة إلى وحدة المعالجة المركزية.
import torch import torch.nn as nn import torch.nn.functional as F from torch.cuda.amp import autocast class ResidualBlock(nn.Module): def __init__(self, in_channels, out_channels, stride=1): super().__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.shortcut = nn.Sequential() if stride != 1 or in_channels != out_channels: self.shortcut = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(out_channels)) def forward(self, x): with autocast(): out = F.relu(self.bn1(self.conv1(x))) out = self.bn2(self.conv2(out)) out += self.shortcut(x) out = F.relu(out) return out
في هذا المقطع البرمجي، نُعرّف كتلة متبقية لشبكة عصبية ملتوية (CNN) باستخدام PyTorch. يُستخدم مدير سياق البث التلقائي من PyTorch للدقة المختلطة التلقائية (AMP) لتمكين التدريب بدقة مختلطة، مما يُحسّن الأداء بشكل ملحوظ على وحدات معالجة الرسومات (GPUs) المُمكّنة بتقنية CUDA مع الحفاظ على دقة عالية. تُحسّن cuDNN دالة F.relu، مما يضمن كفاءة التنفيذ على وحدات معالجة الرسومات.
وحدات معالجة الرسومات المتعددة والتدريب الموزع لقابلية التوسع
مع استمرار نمو نماذج LLM والتعلم العميق من حيث الحجم والتعقيد، تزداد أيضًا المتطلبات الحسابية لتدريب هذه النماذج. ولمواجهة هذا التحدي، تحول الباحثون والمطورون إلى وحدات معالجة الرسومات المتعددة وتقنيات التدريب الموزعة، والتي تتيح لهم الاستفادة من قوة المعالجة المجمعة لوحدات معالجة الرسومات المتعددة عبر أجهزة متعددة.
توفر CUDA والمكتبات المرتبطة بها، مثل NCCL (مكتبة الاتصالات الجماعية NVIDIA)، أساسيات اتصال فعالة تتيح نقل البيانات ومزامنتها بسلاسة عبر وحدات معالجة الرسومات المتعددة، مما يتيح التدريب الموزع على نطاق غير مسبوق.
</pre> import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP # Initialize distributed training dist.init_process_group(backend='nccl', init_method='...') local_rank = dist.get_rank() torch.cuda.set_device(local_rank) # Create model and move to GPU model = MyModel().cuda() # Wrap model with DDP model = DDP(model, device_ids=[local_rank]) # Training loop (distributed) for epoch in range(num_epochs): for data in train_loader: inputs, targets = data inputs = inputs.cuda(non_blocking=True) targets = targets.cuda(non_blocking=True) outputs = model(inputs) loss = criterion(outputs, targets) optimizer.zero_grad() loss.backward() optimizer.step()
في هذا المثال، نستعرض التدريب الموزع باستخدام وحدة DistributedDataParallel (DDP) من PyTorch. يُغلّف النموذج بوحدة DDP، التي تُعالج تلقائيًا توازي البيانات، ومزامنة التدرج، والتواصل عبر وحدات معالجة رسوميات متعددة باستخدام NCCL. يُمكّن هذا النهج من توسيع نطاق عملية التدريب بكفاءة عبر أجهزة متعددة، مما يسمح للباحثين والمطورين بتدريب نماذج أكبر وأكثر تعقيدًا في وقت معقول.
نشر نماذج التعلم العميق مع CUDA
في حين تم استخدام وحدات معالجة الرسومات وCUDA في المقام الأول لتدريب نماذج التعلم العميق، إلا أنها ضرورية أيضًا للنشر والاستدلال بكفاءة. نظرًا لأن نماذج التعلم العميق أصبحت معقدة بشكل متزايد وتستهلك الكثير من الموارد، فإن تسريع وحدة معالجة الرسومات يعد أمرًا ضروريًا تحقيق الأداء في الوقت الحقيقي في بيئات الإنتاج.
TensorRT من NVIDIA هو مُحسِّن استدلال التعلم العميق عالي الأداء ووقت التشغيل الذي يوفر الكمون المنخفض والإنتاجية العالية الاستدلال على وحدات معالجة الرسومات التي تدعم CUDA. يمكن لـ TensorRT تحسين وتسريع النماذج المدربة في أطر عمل مثل TensorFlow وPyTorch وMXNet، مما يتيح النشر الفعال على منصات مختلفة، من الأنظمة المدمجة إلى مراكز البيانات.
import tensorrt as trt # Load pre-trained model model = load_model(...) # Create TensorRT engine logger = trt.Logger(trt.Logger.INFO) builder = trt.Builder(logger) network = builder.create_network() parser = trt.OnnxParser(network, logger) # Parse and optimize model success = parser.parse_from_file(model_path) engine = builder.build_cuda_engine(network) # Run inference on GPU context = engine.create_execution_context() inputs, outputs, bindings, stream = allocate_buffers(engine) # Set input data and run inference set_input_data(inputs, input_data) context.execute_async_v2(bindings=bindings, stream_handle=stream.ptr) # Process output # ...
في هذا المثال، نوضح استخدام TensorRT لنشر نموذج تعلم عميق تم تدريبه مسبقًا على وحدة معالجة الرسومات التي تدعم CUDA. تم تحليل النموذج وتحسينه لأول مرة بواسطة TensorRT، الذي يقوم بإنشاء محرك استدلال محسّن للغاية مصمم خصيصًا للطراز والأجهزة المحددة. يمكن بعد ذلك استخدام هذا المحرك لإجراء استدلال فعال على وحدة معالجة الرسومات، والاستفادة من CUDA لإجراء عمليات حسابية سريعة.
الخاتمة
لقد كان الجمع بين وحدات معالجة الرسومات وCUDA فعالاً في دفع التقدم في نماذج اللغات الكبيرة، ورؤية الكمبيوتر، والتعرف على الكلام، ومجالات أخرى متنوعة للتعلم العميق. من خلال تسخير قدرات المعالجة المتوازية لوحدات معالجة الرسومات والمكتبات المحسنة التي توفرها CUDA، يمكن للباحثين والمطورين تدريب ونشر نماذج متزايدة التعقيد بكفاءة عالية.
مع استمرار تطور مجال الذكاء الاصطناعي، ستزداد أهمية وحدات معالجة الرسومات وCUDA. ومع تحسينات الأجهزة والبرامج الأكثر قوة، يمكننا أن نتوقع رؤية المزيد من الإنجازات في تطوير ونشر أنظمة الذكاء الاصطناعي، مما يدفع حدود ما هو ممكن.












