الصورة الرمزية نيكو مارتن


ملخص

يسعدنا أن نعلن أن الإصدار الرابع من Transformers.js متوفر الآن على NPM! بعد عام من التطوير (بدأنا في مارس 2025 🤯)، أصبحنا جاهزين أخيرًا لاستخدامه.

npm i @huggingface/transformers

تحسينات الأداء ووقت التشغيل

التغيير الأكبر هو بلا شك اعتماد WebGPU Runtime الجديد، والذي تمت إعادة كتابته بالكامل بلغة C++. لقد عملنا بشكل وثيق مع فريق ONNX Runtime لاختبار وقت التشغيل هذا بشكل شامل عبر ما يقرب من 200 من البنى النموذجية المدعومة، بالإضافة إلى العديد من البنى الجديدة الحصرية للإصدار 4.

بالإضافة إلى دعم أفضل للمشغل (للأداء والدقة والتغطية)، يسمح وقت تشغيل WebGPU الجديد هذا باستخدام نفس رمز Transformers.js عبر مجموعة واسعة من بيئات JavaScript، بما في ذلك المتصفحات وأوقات التشغيل من جانب الخادم وتطبيقات سطح المكتب. هذا صحيح، يمكنك الآن تشغيل نماذج WebGPU المسرّعة مباشرةً في Node وBun وDeno!

نظرة عامة على WebGPU

لقد أثبتنا أنه من الممكن تشغيل أحدث نماذج الذكاء الاصطناعي محليًا بنسبة 100% في المتصفح، ونحن الآن نركز على الأداء: جعل هذه النماذج تعمل بأسرع ما يمكن، حتى في البيئات المحدودة الموارد. وقد تطلب ذلك إعادة التفكير بشكل كامل في استراتيجية التصدير لدينا، خاصة بالنسبة لنماذج اللغات الكبيرة. نحن نحقق ذلك من خلال إعادة تنفيذ نماذج جديدة للتشغيل عن طريق التشغيل، والاستفادة من مشغلي ONNX Runtime Contrib المتخصصين مثل com.microsoft.GroupQueryAttention، أو com.microsoft.MatMulNBits، أو com.microsoft.QMoE لتحقيق أقصى قدر من الأداء.

على سبيل المثال، من خلال اعتماد عامل التشغيل com.microsoft.MultiHeadAttention، تمكنا من تحقيق تسريع يصل إلى 4x تقريبًا لنماذج التضمين المستندة إلى BERT.

تحسين صادرات ONNX

إعادة هيكلة المستودع

لقد منحنا تطوير إصدار رئيسي جديد الفرصة للاستثمار في قاعدة التعليمات البرمجية ومعالجة جهود إعادة البناء التي طال انتظارها.

مساحات عمل PNPM

حتى الآن، كان مستودع GitHub بمثابة حزمة npm الخاصة بنا. لقد نجح هذا جيدًا طالما أن المستودع يعرض مكتبة واحدة فقط. ومع ذلك، وبالنظر إلى المستقبل، فقد رأينا الحاجة إلى حزم فرعية مختلفة تعتمد بشكل كبير على جوهر Transformers.js أثناء معالجة حالات الاستخدام المختلفة، مثل التطبيقات الخاصة بالمكتبة، أو الأدوات المساعدة الأصغر التي لا يحتاجها معظم المستخدمين ولكنها ضرورية للبعض.

لهذا السبب قمنا بتحويل المستودع إلى monorepo باستخدام مساحات عمل pnpm. وهذا يسمح لنا بشحن طرود أصغر تعتمد على @huggingface/transformers دون النفقات العامة للحفاظ على مستودعات منفصلة.

هيكل الطبقة المعيارية

استهدف جهد رئيسي آخر لإعادة البناء ملفmodels.js المتنامي باستمرار. في الإصدار الثالث، تم تحديد جميع النماذج المتاحة في ملف واحد يمتد لأكثر من 8000 سطر، مما أصبح من الصعب صيانته بشكل متزايد. بالنسبة للإصدار 4، قمنا بتقسيم ذلك إلى وحدات أصغر ومركزة مع تمييز واضح بين وظائف الأداة المساعدة والمنطق الأساسي والتطبيقات الخاصة بالنموذج. تعمل هذه البنية الجديدة على تحسين إمكانية القراءة وتسهل إضافة نماذج جديدة. يمكن للمطورين الآن التركيز على المنطق الخاص بالنموذج دون التنقل عبر آلاف الأسطر من التعليمات البرمجية غير ذات الصلة.

مستودع الأمثلة

في الإصدار 3، كانت العديد من مشاريع أمثلة Transformers.js موجودة مباشرة في المستودع الرئيسي. بالنسبة للإصدار 4، قمنا بنقلها إلى مستودع مخصص، مما يسمح لنا بالحفاظ على قاعدة تعليمات برمجية أكثر نظافة تركز على المكتبة الأساسية. وهذا أيضًا يسهل على المستخدمين العثور على الأمثلة والمساهمة فيها دون غربلة المستودع الرئيسي.

أجمل

لقد قمنا بتحديث تكوين Prettier وأعدنا تنسيق جميع الملفات الموجودة في المستودع. وهذا يضمن التنسيق المتسق في جميع أنحاء قاعدة التعليمات البرمجية، مع اتباع جميع العلاقات العامة المستقبلية تلقائيًا نفس النمط. لا مزيد من المناقشات حول التنسيق… تتولى شركة Prettier كل شيء، وتحافظ على نظافة الكود وقابليته للقراءة للجميع.

نماذج ومعمارية جديدة

بفضل إستراتيجية التصدير الجديدة لدينا ودعم ONNX Runtime الموسع للمشغلين المخصصين، تمكنا من إضافة العديد من النماذج والبنيات الجديدة إلى Transformers.js v4. وتشمل هذه النماذج الشائعة مثل GPT-OSS، وChatterbox، وGraniteMoeHybrid، وLFM2-MoE، وHunYuanDenseV1، وApertus، وOlmo3، وFalconH1، وYoutu-LLM. تطلب منا العديد من هذه العناصر تنفيذ الدعم للأنماط المعمارية المتقدمة، بما في ذلك Mamba (نماذج مساحة الحالة)، وMulti-head Lant Attention (MLA)، وMixture of Experts (MoE). ولعل الأهم من ذلك هو أن هذه النماذج جميعها متوافقة مع WebGPU، مما يسمح للمستخدمين بتشغيلها مباشرة في المتصفح أو بيئات JavaScript من جانب الخادم مع تسريع الأجهزة. لقد أصدرنا العديد من العروض التوضيحية للإصدار الرابع من Transformers.js حتى الآن… وسنستمر في إصدار المزيد!

نظام البناء الجديد

لقد قمنا بنقل نظام البناء الخاص بنا من Webpack إلى esbuild، وكانت النتائج مذهلة. انخفضت أوقات البناء من ثانيتين إلى 200 مللي ثانية فقط، وهو تحسن بمقدار 10 أضعاف يجعل تكرار التطوير أسرع بشكل ملحوظ. ومع ذلك، فإن السرعة ليست هي الميزة الوحيدة: فقد انخفضت أيضًا أحجام الحزم بمعدل 10% في جميع الإصدارات. التحسن الأكثر بروزًا هو في Transformers.web.js، التصدير الافتراضي لدينا، والذي أصبح الآن أصغر بنسبة 53%، مما يعني تنزيلات أسرع وأوقات بدء تشغيل أسرع للمستخدمين.

ميزات المكتبة الجديدة

يضيف الإصدار 4 أيضًا ميزات مكتبة جديدة تسهل إنشاء تطبيقات قوية وجاهزة للإنتاج.

تسجيل النموذج

الجديد ModelRegistry تم تصميم API لسير عمل الإنتاج. يوفر رؤية واضحة لأصول خطوط الأنابيب قبل تحميل أي شيء: قم بإدراج الملفات المطلوبة بها get_pipeline_files، قم بفحص البيانات التعريفية لكل ملف باستخدام get_file_metadata (مفيد جدًا لحساب إجمالي حجم التنزيل)، تحقق من حالة ذاكرة التخزين المؤقت باستخدام is_pipeline_cached، ومسح العناصر المخزنة مؤقتًا باستخدام clear_pipeline_cache. يمكنك أيضًا الاستعلام عن أنواع الدقة المتوفرة لنموذج به get_available_dtypes. واستنادا إلى واجهة برمجة التطبيقات الجديدة هذه، progress_callback يتضمن الآن أ progress_total الحدث، مما يجعل من السهل عرض تقدم التحميل الشامل دون تجميع التحديثات يدويًا لكل ملف.

راجع أمثلة “ModelRegistry”.
import { ModelRegistry, pipeline } from "@huggingface/transformers";

const modelId = "onnx-community/all-MiniLM-L6-v2-ONNX";
const modelOptions = { dtype: "fp32" };

const files = await ModelRegistry.get_pipeline_files(
  "feature-extraction",
  modelId,
  modelOptions
);


const metadata = await Promise.all(
  files.map(file => ModelRegistry.get_file_metadata(modelId, file))
);

const downloadSize = metadata.reduce((total, item) => total + item.size, 0);

const cached = await ModelRegistry.is_pipeline_cached(
  "feature-extraction",
  modelId,
  modelOptions
);

const dtypes = await ModelRegistry.get_available_dtypes(modelId);


if (cached) {
  await ModelRegistry.clear_pipeline_cache(
    "feature-extraction",
    modelId,
    modelOptions
  );
}

const pipe = await pipeline(
  "feature-extraction",
  modelId,
  {
    progress_callback: e => {
      if (e.status === "progress_total") {
        console.log(`${Math.round(e.progress)}%`);
      }
    },
  }
);

إعدادات البيئة الجديدة

أضفنا أيضًا عناصر تحكم جديدة في البيئة لتحميل النموذج. env.useWasmCache يتيح التخزين المؤقت لملفات وقت تشغيل WASM (عندما يكون تخزين ذاكرة التخزين المؤقت متاحًا)، مما يسمح للتطبيقات بالعمل بشكل كامل دون اتصال بالإنترنت بعد التحميل الأولي.

env.fetch يتيح لك توفير تنفيذ جلب مخصص لحالات الاستخدام مثل الوصول إلى النموذج المصادق عليه، والرؤوس المخصصة، والطلبات القابلة للإجهاض.

انظر الأمثلة البيئية
import { env } from "@huggingface/transformers";

env.useWasmCache = true;

env.fetch = (url, options) =>
  fetch(url, {
    ...options,
    headers: {
      ...options?.headers,
      Authorization: `Bearer ${MY_TOKEN}`,
    },
  });

تحسين ضوابط التسجيل

وأخيرًا، تعد إدارة التسجيل أسهل في عمليات النشر في العالم الحقيقي. أصبحت تحذيرات ONNX Runtime WebGPU مخفية الآن بشكل افتراضي، ويمكنك تعيين مستويات تفصيلية واضحة لكل من Transformers.js وONNX Runtime. هذا التحديث، المدفوع أيضًا بتعليقات المجتمع، يحافظ على تركيز مخرجات وحدة التحكم على الإشارات القابلة للتنفيذ بدلاً من الضوضاء ذات القيمة المنخفضة.

راجع مثال `logLevel`
import { env, LogLevel } from "@huggingface/transformers";







env.logLevel = LogLevel.WARNING;

مكتبة Tokenizers.js المستقلة

كان الطلب المتكرر من المستخدمين هو استخراج منطق الترميز في مكتبة منفصلة، ​​ومع الإصدار الرابع، هذا بالضبط ما فعلناه. يعد @huggingface/tokenizers بمثابة إعادة بناء كاملة لمنطق الترميز، وهو مصمم للعمل بسلاسة عبر المتصفحات وأوقات التشغيل من جانب الخادم. بحجم 8.8 كيلو بايت فقط (مضغوط بالضغط) بدون أي تبعيات، فهو خفيف الوزن بشكل لا يصدق بينما يظل آمنًا تمامًا للكتابة.

انظر رمز المثال
import { Tokenizer } from "@huggingface/tokenizers";


const modelId = "HuggingFaceTB/SmolLM3-3B";
const tokenizerJson = await fetch(
  `https://huggingface.co/${modelId}/resolve/main/tokenizer.json`
).then(res => res.json());

const tokenizerConfig = await fetch(
  `https://huggingface.co/${modelId}/resolve/main/tokenizer_config.json`
).then(res => res.json());


const tokenizer = new Tokenizer(tokenizerJson, tokenizerConfig);


const tokens = tokenizer.tokenize("Hello World");


const encoded = tokenizer.encode("Hello World");

يحافظ هذا الفصل على تركيز وسلاسة جوهر Transformers.js مع تقديم أداة مستقلة ومتعددة الاستخدامات يمكن لأي مشروع WebML استخدامها بشكل مستقل.

تحسينات متنوعة

لقد أجرينا العديد من التحسينات على جودة الحياة عبر المكتبة. تم تحسين نظام الكتابة بأنواع خطوط الأنابيب الديناميكية التي تتكيف بناءً على المدخلات، مما يوفر تجربة أفضل للمطورين وأمانًا للكتابة.

تحسينات النوع

بالإضافة إلى ذلك، أضفنا دعمًا للنماذج الأكبر التي تتجاوز معلمات 8B. في اختباراتنا، تمكنا من تشغيل GPT-OSS 20B (q4f16) بمعدل 60 رمزًا في الثانية تقريبًا على M4 Pro Max.

شكر وتقدير

نريد أن نعرب عن شكرنا الجزيل لكل من ساهم في هذا الإصدار الرئيسي، وخاصة فريق ONNX Runtime لعملهم الرائع في وقت تشغيل WebGPU الجديد ودعمهم طوال عملية التطوير، بالإضافة إلى جميع المساهمين الخارجيين والمختبرين الأوائل.

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