Transformers documentation

تحميل النماذج

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

تحميل النماذج

توفر مكتبة Transformers العديد من النماذج المُسبقة التدريب الجاهزة للاستخدام بسطر واحد من الكود. ويتطلب الأمر فئة نموذج وطريقة from_pretrained().

استدعِ from_pretrained() لتنزيل أوزان النموذج وإعداداته وتحميلها المخزنة على Hub في Hugging Face.

The from_pretrained() method loads weights stored in the safetensors file format if they’re available. Traditionally, PyTorch model weights are serialized with the pickle utility which is known to be insecure. Safetensor files are more secure and faster to load.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf", device_map="auto")

يشرح هذا الدليل كيفية تحميل النماذج، والطرق المختلفة التي يمكنك من خلالها تحميل نموذج، وكيفية التغلب على مشاكل الذاكرة للنماذج الكبيرة جداً، وكيفية تحميل نماذج مخصصة.

النماذج والإعدادات

تحتوي جميع النماذج على ملف configuration.py يضم سمات محددة مثل عدد الطبقات المخفية، وحجم المفردات، ودالة التنشيط، وغيرها. كما ستجد ملف modeling.py الذي يعرّف الطبقات والعمليات الرياضية التي تتم داخل كل طبقة. يستقبل ملف modeling.py سمات النموذج من configuration.py ويبني النموذج بناءً عليها. في هذه المرحلة، يكون لديك نموذج بأوزان عشوائية يحتاج إلى تدريب لإنتاج نتائج ذات معنى.

يشير مصطلح البنية إلى هيكل النموذج، بينما يشير مصطلح نقطة التفتيش إلى أوزان النموذج لبنية محددة. على سبيل المثال، BERT هي بنية، بينما google-bert/bert-base-uncased هي نقطة تفتيش. ستجد أن مصطلح النموذج يُستخدم بالتبادل مع مصطلحي البنية ونقطة التفتيش.

هناك نوعان عامّان من النماذج التي يمكنك تحميلها:

  1. نموذج أساسي، مثل AutoModel أو LlamaModel، يُخرج حالات مخفية.
  2. نموذج مرفق برأس head محدد، مثل AutoModelForCausalLM أو LlamaForCausalLM، لأداء مهام محددة.

فئات النماذج

لحصول على نموذج مُدرَّب مسبقًا، يجب عليك تحميل الأوزان إلى النموذج. يتم ذلك عن طريق استدعاء from_pretrained() الذي يقبل الأوزان من Hugging Face Hub أو من مجلد محلي.

توجد فئتان من النماذج، فئة AutoModel وفئة محددة لنموذج معين.

AutoModel
فئة محددة للنموذج

تُعد فئة AutoModel طريقة مريحة لتحميل بنية نموذج دون الحاجة إلى معرفة اسم فئة النموذج الدقيقة، نظراً لتوفر العديد من النماذج. حيث تختار الفئة تلقائياً فئة النموذج الصحيحة بناءً على ملف الإعداد. كل ما عليك فعله هو معرفة المهمة ونقطة التفتيش (checkpoint) التي ترغب في استخدامها.

يمكنك التبديل بسهولة بين النماذج أو المهام، طالما أن البنية مدعومة للمهمة المعينة.

على سبيل المثال، يمكن استخدام النموذج نفسه لمهام منفصلة.

from transformers import AutoModelForCausalLM, AutoModelForSequenceClassification, AutoModelForQuestionAnswering

# use the same API for 3 different tasks
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
model = AutoModelForSequenceClassification.from_pretrained("meta-llama/Llama-2-7b-hf")
model = AutoModelForQuestionAnswering.from_pretrained("meta-llama/Llama-2-7b-hf")

في حالات أخرى، قد ترغب في تجربة عدة نماذج مختلفة بسرعة لمهمة معينة.

from transformers import AutoModelForCausalLM

# use the same API to load 3 different models
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b")

النماذج الكبيرة

تتطلب النماذج المُسبقة التدريب الكبيرة قدرًا كبيرًا من الذاكرة لتحميلها. ويتضمن عملية التحميل ما يلي:

  1. إنشاء نموذج بأوزان عشوائية
  2. تحميل الأوزان المُسبقة التدريب
  3. وضع الأوزان المُسبقة التدريب على النموذج

تحتاج إلى ذاكرة كافية لاستيعاب نسختين من أوزان النموذج (عشوائية ومُدرَّبة مسبقًا)، وقد لا يكون ذلك ممكنًا اعتمادًا على عتادك. في بيئات التدريب الموزَّع، يصبح الأمر أكثر تحديًا لأن كل عملية تُحمِّل نموذجًا مُدرَّبًا مسبقًا.

تقلل مكتبة Transformers بعض التحديات المتعلقة بالذاكرة من خلال التهيئة السريعة، ونقاط التفتيش المجزأة، وميزة Big Model Inference في Accelerate، ودعم أنواع بيانات ذات عدد بتات أقل.

نقاط التفتيش المجزأة

يقوم save_pretrained() تلقائيًا بتقسيم نقاط التفتيش التي يتجاوز حجمها 50 غيغابايت. وهذا يُبقي عدد الأجزاء منخفضًا للنماذج الكبيرة ويُبسّط إدارة الملفات.

تُحمَّل المعاملات بالتوازي، ويعتمد الذروة في الذاكرة فقط على حجم النموذج. استخدم max_shard_size في save_pretrained() لضبط الحد الأقصى لحجم نقطة التفتيش قبل التقسيم.

يعتمد استهلاك الذاكرة للنماذج التي تتطلب تحويلًا ديناميكيًا للأوزان على حجم النموذج وحجم أكبر المعاملات في عملية تحويل واحدة. وينطبق هذا عادةً على نماذج خليط الخبراء (MoE)، حيث يكون استهلاك الذاكرة مساويًا لحجم النموذج مضافًا إليه عدد الخبراء في طبقة واحدة. راجع دليل dynamic weight loader لمعرفة المزيد حول كيفية تحميل النماذج.

يُنشئ save_pretrained() أيضاً ملف فهرسة يربط أسماء المعاملات بملفات الأجزاء الخاصة بها. يحتوي الفهرس على مفتاحين، هما metadata وweight_map.

import json
import os
import tempfile

with tempfile.TemporaryDirectory() as tmp_dir:
    model.save_pretrained(tmp_dir, max_shard_size="50GB")
    with open(os.path.join(tmp_dir, "model.safetensors.index.json"), "r") as f:
        index = json.load(f)

print(index.keys())

metadata يخزّن حجم النموذج الكلي.

index["metadata"]
{'total_size': 28966928384}

weight_map يربط كل معامل بملف شرايته الخاص.

index["weight_map"]
{'lm_head.weight': 'model-00006-of-00006.safetensors',
 'model.embed_tokens.weight': 'model-00001-of-00006.safetensors',
 'model.layers.0.input_layernorm.weight': 'model-00001-of-00006.safetensors',
 'model.layers.0.mlp.down_proj.weight': 'model-00001-of-00006.safetensors',
 ...
}

استدلال النماذج الكبيرة

تأكد من تثبيت Accelerate v0.9.0 وPyTorch v1.9.0 أو إصدار أحدث لاستخدام هذه الميزة!

from_pretrained() is supercharged with Accelerate’s Big Model Inference feature.

ينشئ Big Model Inference هيكلًا للنموذج على جهاز meta في PyTorch. لا يخزّن جهاز meta أي بيانات حقيقية، بل يخزّن البيانات الوصفية فقط.

تُنشأ الأوزان المُهيّأة عشوائياً فقط عند تحميل الأوزان المُسبقة التدريب، وذلك لتجنّب الاحتفاظ بنسختين من النموذج في الذاكرة في الوقت نفسه. أقصى استهلاك للذاكرة هو حجم النموذج فقط.

تعرّف على المزيد حول توزيع الأجهزة في تصميم خريطة الأجهزة.

يتعلق الميزة الثانية في Big Model Inference بطريقة تحميل الأوزان وتوزيعها في هيكل النموذج. يتم توزيع أوزان النموذج عبر جميع الأجهزة المتاحة، بدءًا من أسرع جهاز (وهو عادةً GPU)، ثم يتم نقل الأوزان المتبقية إلى أجهزة أبطأ (CPU وقرص التخزين الصلب).

يُقلّل الجمع بين الميزتين من استهلاك الذاكرة وأوقات التحميل للنماذج المُسبقة التدريب الكبيرة.

اضبط device_map على "auto" لتفعيل Big Model Inference.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("google/gemma-7b", device_map="auto")

يمكنك أيضًا تعيين الطبقات يدويًا إلى جهاز في device_map. يجب أن يُخضع جميع معاملات النموذج إلى جهاز، لكنك لا تحتاج إلى تحديد مكان وجود جميع الوحدات الفرعية لطبقة ما إذا كانت الطبقة بأكملها على نفس الجهاز.

الوصول إلى خاصية hf_device_map لمعرفة كيفية توزيع النموذج على الأجهزة.

device_map = {"model.layers.1": 0, "model.layers.14": 1, "model.layers.31": "cpu", "lm_head": "disk"}
model.hf_device_map

تفريغ البيانات على القرص

عندما يكون حجم النموذج أكبر من إجمالي ذاكرة وحدات معالجة الرسوميات (GPUs) وذاكرة الوصول العشوائي (CPU RAM)، يقوم Big Model Inference بتفريغ الأوزان المتبقية إلى القرص. اضبط offload_folder على مجلد ما، في حال كان أي من الأوزان يُعيَّن إلى "disk"، لأن ذلك هو المكان الذي يخزّن فيه Transformers الأوزان المُفرَّغة.

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-7b",
    device_map="auto",
    offload_folder="./offload",
)

استخدم max_memory لتحديد الحد الأقصى لكمية البيانات التي يحتفظ بها كل جهاز. يملأ Transformers الأجهزة حسب ترتيب سرعتها، وينقل ما لا يتسع إلى القرص. يحدد المثال أدناه حدًا لجهاز GPU بمقدار 10GB وحدًا لجهاز CPU بمقدار 30GB، بحيث تُحفظ الأوزان المتبقية في offload_folder.

model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-7b",
    device_map="auto",
    max_memory={0: "10GB", "cpu": "30GB"},
    offload_folder="./offload",
)

اضبط max_memory={} لتحديد عدم توفر ذاكرة وحدة معالجة الرسوميات أو المعالج، ولإجبار نقل النموذج بالكامل إلى القرص.

model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-7b",
    device_map="auto",
    max_memory={},
    offload_folder="./offload",
)

يعتمد تفريغ القرص على استبدال الذاكرة بالسرعة. فقراءة الأوزان من القرص في كل تمريرة أمامية أبطأ من قراءتها من ذاكرة المعالج المركزي أو ذاكرة وحدة معالجة الرسوميات. يتطلب التفريغ الكامل إلى القرص accelerate>1.14.0

نوع بيانات النموذج

يتحكم معامل dtype في dtype الخاص بـ PyTorch المستخدم لتوليد أوزان النموذج. افتراضيًا، يحمّل Transformers الأوزان باستخدام قيمة dtype أو القيمة القديمة torch_dtype من config.json. إذا لم تتضمن config.json أيًا من هاتين القيمتين، يستخدم Transformers نوع dtype لأول وزن من نوع الفاصلة العائمة في نقطة التفتيش.

تجاوز الإعداد الافتراضي عن طريق تمرير dtype محدد.

import torch
from transformers import AutoModelForCausalLM

# specific dtype
model = AutoModelForCausalLM.from_pretrained("google/gemma-3-1b-it", dtype=torch.float16)

يقبل AutoConfig أيضًا dtype للنماذج التي يتم إنشاؤها من الصفر.

import torch
from transformers import AutoConfig, AutoModel

my_config = AutoConfig.from_pretrained("google/gemma-2b", dtype=torch.float16)
model = AutoModel.from_config(my_config)

نماذج مخصصة

تُبنى النماذج المخصصة على فئات التهيئة والنمذجة في Transformers، وتدعم واجهة AutoClass، وتُحمَّل باستخدام from_pretrained(). والفرق هو أن كود النمذجة ليس من Transformers.

توخَّ الحذر الشديد عند تحميل نموذج مخصص. على الرغم من أن المسح بحثًا عن البرمجيات الخبيثة مفعّل لكل مستودع في Hub، إلا أنه يجب عليك أن تكون حريصًا لتجنب تنفيذ أكواد خبيثة عن غير قصد.

اضبط trust_remote_code=True في from_pretrained() لتحميل نموذج مخصص.

from transformers import AutoModelForImageClassification

model = AutoModelForImageClassification.from_pretrained("sgugger/custom-resnet50d", trust_remote_code=True)

كمستوى إضافي من الأمان، حمّل نموذجًا مخصصًا من نسخة محددة لتجنب تحميل كود النموذج الذي قد يكون قد تغيّر. يمكن نسخ تجزئة الالتزام (commit hash) من سجل الالتزامات الخاصة بالنماذج.

commit_hash = "ed94a7c6247d8aedce4647f00f20de6875b5b292"
model = AutoModelForImageClassification.from_pretrained(
    "sgugger/custom-resnet50d", trust_remote_code=True, revision=commit_hash
)

راجع دليل تخصيص النماذج لمزيد من المعلومات.

Update on GitHub