احصل على استدلال سريع البرق، وتكميم سريع، torch.compile يعزز، وضبط جهد ل أي timm نموذج—كل ذلك ضمن ودية 🤗 transformers النظام البيئي.

يدخل TimmWrapper– أداة بسيطة لكنها قوية تطلق العنان لهذه الإمكانات.

في هذه التدوينة سنتناول:

  • كيف يعمل تكامل timm ولماذا يغير قواعد اللعبة.
  • كيفية التكامل timm الموديلات مع 🤗 transformers.
  • أمثلة عملية: خطوط الأنابيب، والتكميم، والضبط الدقيق، وأكثر من ذلك.

لمتابعة منشور المدونة هذا، قم بتثبيت أحدث إصدار من transformers و timm عن طريق تشغيل:

pip install -Uq transformers timm

تحقق من المستودع الكامل لجميع أمثلة التعليمات البرمجية والدفاتر: 🔗 أمثلة TimmWrapper

ما هو تيم؟

نماذج الصور PyTorch (timm) تقدم المكتبة مجموعة غنية من أحدث نماذج رؤية الكمبيوتر، إلى جانب الطبقات والأدوات المساعدة والمحسنات وزيادة البيانات المفيدة. مع وجود أكثر من 32 ألف نجمة على GitHub وأكثر من 200 ألف عملية تنزيل يومية في وقت كتابة هذا التقرير، يعد مصدرًا مفضلاً لتصنيف الصور واستخراج الميزات لاكتشاف الكائنات وتقسيمها والبحث عن الصور ومهام أخرى.

مع نماذج مدربة مسبقًا تغطي مجموعة واسعة من البنى، timm يبسط سير العمل لممارسي رؤية الكمبيوتر.

لماذا استخدام التكامل تيم؟

بينما 🤗 transformers يدعم العديد من نماذج الرؤية، timm يقدم مجموعة أوسع، بما في ذلك العديد من النماذج الفعالة والمتوافقة مع الأجهزة المحمولة والتي لا تتوفر في المحولات.

ال timm التكامل يسد هذه الفجوة، ويجلب أفضل ما في العالمين:

  • دعم API لخط الأنابيب: توصيل أي بسهولة timm نموذج إلى مستوى عال transformers خط أنابيب للاستدلال المبسط.
  • 🧩 التوافق مع فئات السيارات: بينما timm النماذج غير متوافقة أصلاً مع transformers، التكامل يجعلهم يعملون بسلاسة مع Auto واجهة برمجة التطبيقات للفصول.
  • التكميم السريع: مع ما يقرب من 5 أسطر فقط من التعليمات البرمجية، يمكنك القياس الكمي أي timm نموذج للاستدلال الفعال.
  • 🎯 الضبط الدقيق باستخدام Trainer API: ضبط دقيق timm النماذج باستخدام Trainer API وحتى التكامل مع المحولات مثل التكيف ذو الرتبة المنخفضة (LoRA).
  • 🔁 رحلة ذهابًا وإيابًا إلى تيم: استخدم النماذج المضبوطة مرة أخرى timm.
  • 🚀 الشعلة تجميع للسرعة: تَأثِير torch.compile لتحسين وقت الاستدلال.

API لخط الأنابيب: استخدام نماذج timm لتصنيف الصور

واحدة من الميزات البارزة في timm التكامل هو أنه يسمح لك بالاستفادة من 🤗 pipeline واجهة برمجة التطبيقات. ال pipeline واجهة برمجة التطبيقات يزيل الملخص الكثير من التعقيد، مما يجعل من السهل تحميل نموذج تم تدريبه مسبقًا وإجراء الاستدلال وعرض النتائج باستخدام بضعة أسطر من التعليمات البرمجية.

دعونا نرى كيفية استخدام خط أنابيب المحولات مع موبايل نتV4. هذه الهندسة المعمارية ليس لديها مواطن transformers التنفيذ، ولكن يمكن استخدامها بسهولة من timm:

from transformers import pipeline
import requests


image_classifier = pipeline(model="timm/mobilenetv4_conv_medium.e500_r256_in1k")


url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/timm/cat.jpg"


outputs = image_classifier(url)


for output in outputs:
    print(f"Label: output['label'] :20 Score: output['score'] :0.2f")

النواتج:

Device set to use cpu
Label: tabby, tabby cat     Score: 0.69
Label: tiger cat            Score: 0.21
Label: Egyptian cat         Score: 0.02
Label: bee                  Score: 0.00
Label: marmoset             Score: 0.00

تكامل Gradio: إنشاء عرض توضيحي لمصنف الأغذية 🍣

هل تريد إنشاء تطبيق ويب تفاعلي لتصنيف الصور بسرعة؟ غراديو يجعل من السهل إنشاء واجهة سهلة الاستخدام بأقل قدر من التعليمات البرمجية. دعونا نتحد غراديو مع pipeline واجهة برمجة التطبيقات (API) لتصنيف صور الطعام باستخدام نموذج timm ViT المضبوط بدقة (سنغطي الضبط الدقيق في قسم لاحق).

إليك كيفية إعداد عرض توضيحي سريع باستخدام ملف timm نموذج:

import gradio as gr
from transformers import pipeline


pipe = pipeline(
    "image-classification",
    model="ariG23498/vit_base_patch16_224.augreg2_in21k_ft_in1k.ft_food101"
)

def classify(image):
    return pipe(image)[0]["label"]

demo = gr.Interface(
    fn=classify,
    inputs=gr.Image(type="pil"),
    outputs="text",
    examples=[["./sushi.png", "sushi"]]
)

demo.launch()

إليك مثال حي مستضاف على Hugging Face Spaces. يمكنك اختباره مباشرة في متصفحك!

الفئات التلقائية: تبسيط تحميل النموذج

🤗 transformers توفر المكتبة دروس السيارات لتجريد تعقيد تحميل النماذج والمعالجات. مع TimmWrapper، يمكنك استخدام AutoModelForImageClassification

و AutoImageProcessor لتحميل أي timm نموذج دون عناء.

إليك مثال سريع:

from transformers import (
    AutoModelForImageClassification,
    AutoImageProcessor,
)
from transformers.image_utils import load_image

image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/timm/cat.jpg"
image = load_image(image_url)


checkpoint = "timm/mobilenetv4_conv_medium.e500_r256_in1k"
image_processor = AutoImageProcessor.from_pretrained(checkpoint)
model = AutoModelForImageClassification.from_pretrained(checkpoint).eval()


print(type(image_processor))  
print(type(model))            

تشغيل نماذج timm الكمية

التكميم هو أسلوب قوي ل تقليل حجم النموذج وتسريع الاستدلال، خاصة عند النشر على الأجهزة ذات الموارد المحدودة. مع timm التكامل، يمكنك تكميم أي timm نموذج سريع باستخدام بضعة أسطر من التعليمات البرمجية
BitsAndBytesConfig من bitsandbytes.

وإليك مدى سهولة تحديد حجم أ timm نموذج:

from transformers import TimmWrapperForImageClassification, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(load_in_8bit=True)
checkpoint = "timm/vit_base_patch16_224.augreg2_in21k_ft_in1k"

model = TimmWrapperForImageClassification.from_pretrained(checkpoint).to("cuda")
model_8bit = TimmWrapperForImageClassification.from_pretrained(
    checkpoint,
    quantization_config=quantization_config,
    low_cpu_mem_usage=True,
)
original_footprint = model.get_memory_footprint()
quantized_footprint = model_8bit.get_memory_footprint()

print(f"Original model size: original_footprint / 1e6:.2f MB")
print(f"Quantized model size: quantized_footprint / 1e6:.2f MB")
print(f"Reduction: (original_footprint - quantized_footprint) / original_footprint * 100:.2f%")

الإخراج:

Original model size: 346.27 MB  
Quantized model size: 88.20 MB  
Reduction: 74.53%  

أداء النماذج الكمية متطابقة تقريبا لنماذج الدقة الكاملة أثناء الاستدلال:

نموذج ملصق دقة
النموذج الأصلي التحكم عن بعد، عن بعد 0.35%
النموذج الكمي التحكم عن بعد، عن بعد 0.33%

الضبط الدقيق للإشراف timm نماذج

الضبط أ timm نموذج مع Trainer واجهة برمجة التطبيقات من 🤗 transformers يكون واضحة ومرنة للغاية. يمكنك ضبط النموذج الخاص بك على مجموعات البيانات المخصصة باستخدام Trainer class، الذي يتعامل مع حلقة التدريب والتسجيل والتقييم. بالإضافة إلى ذلك، يمكنك ضبط استخدام LoRA (التكيف ذو الرتبة المنخفضة) للتدريب بكفاءة مع عدد أقل من المعلمات.

يعطي هذا القسم أ نظرة سريعة لكل من الضبط الدقيق القياسي وضبط LoRA، مع روابط للكود الكامل.

الضبط الدقيق القياسي باستخدام Trainer واجهة برمجة التطبيقات

ال Trainer تعمل واجهة برمجة التطبيقات (API) على تسهيل إعداد التدريب باستخدام الحد الأدنى من التعليمات البرمجية. فيما يلي مخطط تفصيلي لما يبدو عليه إعداد الضبط الدقيق:

from transformers import TrainingArguments, Trainer


training_args = TrainingArguments(
    output_dir="my_model_output",
    evaluation_strategy="epoch",
    save_strategy="epoch",
    learning_rate=5e-5,
    per_device_train_batch_size=16,
    num_train_epochs=3,
    load_best_model_at_end=True,
    push_to_hub=True,
)


trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_ds,
    eval_dataset=val_ds,
    data_collator=data_collator,
    compute_metrics=compute_metrics,
)


trainer.train()

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

هذا يعني أنه يمكنك استخدام المألوف Trainer واجهة برمجة التطبيقات (API) لضبط ليس فقط نماذج المحولات، ولكن أيضًا أي timm نموذج—جلب نماذج قوية من timm مكتبة في النظام البيئي Hugging Face مع الحد الأدنى من التعديلات. يؤدي هذا إلى توسيع نطاق النماذج التي يمكنك تحسينها بشكل كبير باستخدام نفس الأدوات وسير العمل الموثوق بها.

مثال النموذج:
تشغيل ViT المضبوط بدقة الغذاء-101: vit_base_patch16_224.augreg2_in21k_ft_in1k.ft_food101

ضبط LoRA لتدريب فعال

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

إليك كيفية إعداده:

from peft import LoraConfig, get_peft_model

model = AutoModelForImageClassification.from_pretrained(checkpoint, num_labels=num_labels)
lora_config = LoraConfig(
    r=16,
    lora_alpha=16,
    target_modules=["qkv"],
    lora_dropout=0.1,
    bias="none",
    modules_to_save=["head"],
)


lora_model = get_peft_model(model, lora_config)

lora_model.print_trainable_parameters()

المعلمات القابلة للتدريب مع LoRA:

trainable params: 667,493 || all params: 86,543,818 || trainable%: 0.77%

مثال النموذج:
تشغيل LoRA Fine-Tuned ViT الغذاء-101: vit_base_patch16_224.augreg2_in21k_ft_in1k.lora_ft_food101

يعد LoRA مجرد مثال واحد على أساليب الضبط الدقيق المعتمدة على المحول والتي يمكنك تطبيقها عليها timm نماذج. التكامل timm مع النظام البيئي 🤗 يفتح مجموعة واسعة من الضبط الدقيق ذو كفاءة المعلمة (PEFT) التقنيات، مما يسمح لك باختيار الطريقة التي تناسب حالة الاستخدام الخاصة بك.

الاستدلال باستخدام نموذج LoRA الدقيق

بمجرد ضبط النموذج بشكل دقيق على LoRA، نقوم فقط بدفع أوزان المحول إلى Hugging Face Hub. يساعدك هذا القسم على تنزيل أوزان المحول، ودمج أوزان المحول مع النموذج الأساسي، ثم إجراء الاستدلال.

from peft import PeftModel, PeftConfig

repo_name = "ariG23498/vit_base_patch16_224.augreg2_in21k_ft_in1k.lora_ft_food101"
config = PeftConfig.from_pretrained(repo_name)

model = AutoModelForImageClassification.from_pretrained(
    config.base_model_name_or_path,
    label2id=label2id,
    num_labels=num_labels,
    id2label=id2label,
    ignore_mismatched_sizes=True,
)
inference_model = PeftModel.from_pretrained(model, repo_name)


التكامل ذهابا وإيابا

أحد روس (مبتكر timm) الميزات المفضلة هي أن هذا التكامل يحافظ على التوافق الكامل “ذهابًا وإيابًا”. على وجه التحديد، باستخدام المجمع يمكن للمرء ضبط نموذج timm على مجموعة بيانات جديدة باستخدام transformer‘s Trainer، وقم بنشر النموذج الناتج على مركز Hugging Face، ثم قم بتحميل النموذج الذي تم ضبطه بدقة timm مرة أخرى باستخدام timm.create_model('hf-hub:my_org/my_fine_tuned_model', pretrained=True).

دعونا نرى كيف يمكننا تحميل نموذجنا المضبوط جيدًا ariG23498/vit_base_patch16_224.augreg2_in21k_ft_in1k.ft_food101 مع timm

checkpoint = "ariG23498/vit_base_patch16_224.augreg2_in21k_ft_in1k.ft_food101"

config = AutoConfig.from_pretrained(checkpoint)

model = timm.create_model(f"hf_hub:checkpoint", pretrained=True) 
model = model.eval()

image = load_image("https://cdn.britannica.com/52/128652-050-14AD19CA/Maki-zushi.jpg")

data_config = timm.data.resolve_model_data_config(model)
transforms = timm.data.create_transform(**data_config, is_training=False)

output = model(transforms(image).unsqueeze(0))

top5_probabilities, top5_class_indices = torch.topk(output.softmax(dim=1) * 100, k=5)

for prob, idx in zip(top5_probabilities[0], top5_class_indices[0]):
    print(f"Label: config.id2label[idx.item()] :20 Score: prob/100 :0.2f%")

النواتج

Label: sushi                Score: 0.98%
Label: spring_rolls         Score: 0.01%
Label: sashimi              Score: 0.00%
Label: club_sandwich        Score: 0.00%
Label: cannoli              Score: 0.00%

تجميع الشعلة: تسريع فوري

مع torch.compile في PyTorch 2.0، يمكنك تحقيق ذلك استنتاج أسرع عن طريق تجميع النموذج الخاص بك باستخدام سطر واحد فقط من التعليمات البرمجية. ال timm التكامل متوافق تماما مع torch.compile. فيما يلي معيار سريع لمقارنة وقت الاستدلال مع وبدون torch.compile باستخدام TimmWrapper.


model = TimmWrapperForImageClassification.from_pretrained(checkpoint).to(device)
processed_input = image_processor(image, return_tensors="pt").to(device)


def run_benchmark(model, input_data, warmup_runs=5, benchmark_runs=300):
    
    model.eval()
    with torch.no_grad():
        for _ in range(warmup_runs):
            _ = model(**input_data)

    
    times = []
    with torch.no_grad():
        for _ in range(benchmark_runs):
            start_time = time.perf_counter()
            _ = model(**input_data)
            if device.type == "cuda":
                torch.cuda.synchronize(device=device)  
            times.append(time.perf_counter() - start_time)

    avg_time = sum(times) / benchmark_runs
    return avg_time


time_no_compile = run_benchmark(model, processed_input)
compiled_model = torch.compile(model).to(device)
time_compile = run_benchmark(compiled_model, processed_input)


print(f"Without torch.compile: time_no_compile:.4f s")
print(f"With torch.compile: time_compile:.4f s")

تجميع التوقيت

التفاف

timmإن تكامل s مع المحولات يفتح أبوابًا جديدة للاستفادة من نماذج الرؤية الحديثة بأقل جهد. سواء كنت تتطلع إلى ضبط الاستدلال أو قياسه أو تشغيله ببساطة، فإن هذا التكامل يوفر واجهة برمجة تطبيقات موحدة لتبسيط سير عملك.

ابدأ الاستكشاف اليوم وافتح إمكانيات جديدة في رؤية الكمبيوتر!

شكر وتقدير

نريد أن نقدم تحية كبيرة للأشخاص الذين قاموا بهذا التكامل في Transformers PR #34564. بدون ترتيب معين، شكرًا جزيلاً لبافيل ياكوبوفسكي، وروس وايتمان، وليساندر ديبوت، وبابلو مونتالفو، وآرثر زوكر، وإيمي روبرتس على كل أعمالكم الرائعة. لقد حولت جهودك المشتركة هذه الميزة من فكرة إلى شيء يمكن للجميع الاستمتاع به الآن!

شاركها.
اترك تعليقاً