نقاط التفتيش النموذجية

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

توفر هذه الوحدة واجهة عالية المستوى لتحميل وحفظ نقاط فحص تنسيق TensorFlow v2 ، بالإضافة إلى المكونات ذات المستوى الأدنى التي تكتب إلى تنسيق الملف هذا وتقرأ منه.

تحميل وحفظ النماذج البسيطة

من خلال التوافق مع بروتوكول Checkpointable ، يمكن إجراء تسلسل للعديد من النماذج البسيطة إلى نقاط التفتيش دون أي رمز إضافي:

import Checkpoints
import ImageClassificationModels

extension LeNet: Checkpointable {}

var model = LeNet()

...

try model.writeCheckpoint(to: directory, name: "LeNet")

وبعد ذلك يمكن قراءة نفس نقطة التفتيش باستخدام:

try model.readCheckpoint(from: directory, name: "LeNet")

سيستخدم هذا التنفيذ الافتراضي لتحميل النموذج وحفظه نظام تسمية يعتمد على المسار لكل موتر في النموذج يعتمد على أسماء الخصائص داخل بنيات النموذج. على سبيل المثال، سيتم حفظ الأوزان والتحيزات ضمن الالتواء الأول في نموذج LeNet-5 بالأسماء conv1/filter و conv1/bias على التوالي. عند التحميل، سيبحث قارئ نقطة التفتيش عن الموترات بهذه الأسماء.

تخصيص تحميل النموذج وحفظه

إذا كنت تريد التحكم بشكل أكبر في أي من الموترات يتم حفظها وتحميلها، أو في تسمية تلك الموترات، فإن بروتوكول Checkpointable يوفر بضع نقاط للتخصيص.

لتجاهل الخصائص في أنواع معينة، يمكنك توفير تطبيق ignoredTensorPaths على النموذج الخاص بك والذي يُرجع مجموعة من السلاسل في شكل Type.property . على سبيل المثال، لتجاهل خاصية scale في كل طبقة انتباه، يمكنك إرجاع ["Attention.scale"] .

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

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

يتم توفير بعض الوظائف المساعدة القياسية، مثل وظيفة CheckpointWriter.identityMap الافتراضية (التي تستخدم ببساطة اسم مسار الموتر الذي تم إنشاؤه تلقائيًا لنقاط التفتيش)، أو وظيفة CheckpointWriter.lookupMap(table:) ، والتي يمكنها إنشاء تخطيط من القاموس.

للحصول على مثال لكيفية إنجاز التعيين المخصص، يرجى الاطلاع على نموذج GPT-2 ، الذي يستخدم وظيفة التعيين لمطابقة نظام التسمية الدقيق المستخدم لنقاط فحص OpenAI.

مكونات CheckpointReader وCheckpointWriter

بالنسبة لكتابة نقاط التحقق، يستخدم الامتداد الذي يوفره بروتوكول Checkpointable الانعكاس ومسارات المفاتيح للتكرار على خصائص النموذج وإنشاء قاموس يعين مسارات موتر السلسلة إلى قيم Tensor. يتم توفير هذا القاموس إلى CheckpointWriter الأساسي، بالإضافة إلى الدليل الذي سيتم كتابة نقطة التحقق فيه. يتولى CheckpointWriter مهمة إنشاء نقطة تفتيش على القرص من هذا القاموس.

عكس هذه العملية هو القراءة، حيث يتم إعطاء CheckpointReader موقع دليل نقاط التفتيش على القرص. ثم يقرأ من نقطة التفتيش تلك ويشكل قاموسًا يعين أسماء الموترات داخل نقطة التفتيش بقيمها المحفوظة. يستخدم هذا القاموس لاستبدال الموترات الحالية في النموذج بتلك الموجودة في هذا القاموس.

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

إذا كان بروتوكول Checkpointable يفتقر إلى الوظائف المطلوبة، أو كان هناك حاجة إلى مزيد من التحكم في عملية تحميل وحفظ نقطة التفتيش، فيمكن استخدام فئتي CheckpointReader و CheckpointWriter بمفردهما.

تنسيق نقطة تفتيش TensorFlow v2

يعد تنسيق نقطة تفتيش TensorFlow v2، كما هو موضح بإيجاز في هذا الرأس ، هو تنسيق الجيل الثاني لنقاط فحص نموذج TensorFlow. تم استخدام تنسيق الجيل الثاني هذا منذ أواخر عام 2016، ويحتوي على عدد من التحسينات على تنسيق نقطة التفتيش v1. تستخدم TensorFlow SavedModels نقاط تفتيش v2 داخلها لحفظ معلمات النموذج.

تتكون نقطة تفتيش TensorFlow v2 من دليل ببنية مثل ما يلي:

checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002

حيث يقوم الملف الأول بتخزين البيانات التعريفية لنقطة التفتيش والملفات المتبقية عبارة عن أجزاء ثنائية تحتوي على المعلمات المتسلسلة للنموذج.

يحتوي ملف بيانات تعريف الفهرس على الأنواع والأحجام والمواقع وأسماء السلسلة لجميع الموترات المتسلسلة الموجودة في القطع. يعد ملف الفهرس هذا هو الجزء الأكثر تعقيدًا من الناحية الهيكلية في نقطة التفتيش، ويعتمد على tensorflow::table ، والذي يعتمد في حد ذاته على SSTable / LevelDB. يتكون ملف الفهرس هذا من سلسلة من أزواج المفاتيح والقيمة، حيث تكون المفاتيح عبارة عن سلاسل والقيم عبارة عن مخازن مؤقتة للبروتوكول. يتم فرز السلاسل وضغطها بالبادئة. على سبيل المثال: إذا كان الإدخال الأول هو conv1/weight و conv1/bias التالي، فإن الإدخال الثاني يستخدم الجزء bias فقط.

يتم أحيانًا ضغط ملف الفهرس الإجمالي هذا باستخدام ضغط Snappy . يوفر ملف SnappyDecompression.swift تطبيق Swift أصلي لإلغاء الضغط Snappy من مثيل بيانات مضغوطة.

يتم تشفير البيانات التعريفية لرأس الفهرس والبيانات التعريفية للموتر كمخزن مؤقت للبروتوكول ويتم تشفيرها/فك تشفيرها مباشرة عبر Swift Protobuf .

تتعامل فئتا CheckpointIndexReader و CheckpointIndexWriter مع تحميل ملفات الفهرس هذه وحفظها كجزء من فئتي CheckpointReader و CheckpointWriter الشاملتين. يستخدم الأخير ملفات الفهرس كأساس لتحديد ما يجب القراءة منه والكتابة إلى الأجزاء الثنائية الأبسط من الناحية الهيكلية التي تحتوي على بيانات الموتر.

,

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

توفر هذه الوحدة واجهة عالية المستوى لتحميل وحفظ نقاط فحص تنسيق TensorFlow v2 ، بالإضافة إلى المكونات ذات المستوى الأدنى التي تكتب إلى تنسيق الملف هذا وتقرأ منه.

تحميل وحفظ النماذج البسيطة

من خلال التوافق مع بروتوكول Checkpointable ، يمكن إجراء تسلسل للعديد من النماذج البسيطة إلى نقاط التفتيش دون أي رمز إضافي:

import Checkpoints
import ImageClassificationModels

extension LeNet: Checkpointable {}

var model = LeNet()

...

try model.writeCheckpoint(to: directory, name: "LeNet")

وبعد ذلك يمكن قراءة نفس نقطة التفتيش باستخدام:

try model.readCheckpoint(from: directory, name: "LeNet")

سيستخدم هذا التنفيذ الافتراضي لتحميل النموذج وحفظه نظام تسمية يعتمد على المسار لكل موتر في النموذج يعتمد على أسماء الخصائص داخل بنيات النموذج. على سبيل المثال، سيتم حفظ الأوزان والتحيزات ضمن الالتواء الأول في نموذج LeNet-5 بالأسماء conv1/filter و conv1/bias على التوالي. عند التحميل، سيبحث قارئ نقطة التفتيش عن الموترات بهذه الأسماء.

تخصيص تحميل النموذج وحفظه

إذا كنت تريد التحكم بشكل أكبر في أي من الموترات يتم حفظها وتحميلها، أو في تسمية تلك الموترات، فإن بروتوكول Checkpointable يوفر بضع نقاط للتخصيص.

لتجاهل الخصائص في أنواع معينة، يمكنك توفير تطبيق ignoredTensorPaths على النموذج الخاص بك والذي يُرجع مجموعة من السلاسل في شكل Type.property . على سبيل المثال، لتجاهل خاصية scale في كل طبقة انتباه، يمكنك إرجاع ["Attention.scale"] .

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

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

يتم توفير بعض الوظائف المساعدة القياسية، مثل وظيفة CheckpointWriter.identityMap الافتراضية (التي تستخدم ببساطة اسم مسار الموتر الذي تم إنشاؤه تلقائيًا لنقاط التفتيش)، أو وظيفة CheckpointWriter.lookupMap(table:) ، والتي يمكنها إنشاء تخطيط من القاموس.

للحصول على مثال لكيفية إنجاز التعيين المخصص، يرجى الاطلاع على نموذج GPT-2 ، الذي يستخدم وظيفة التعيين لمطابقة نظام التسمية الدقيق المستخدم لنقاط فحص OpenAI.

مكونات CheckpointReader وCheckpointWriter

بالنسبة لكتابة نقاط التحقق، يستخدم الامتداد الذي يوفره بروتوكول Checkpointable الانعكاس ومسارات المفاتيح للتكرار على خصائص النموذج وإنشاء قاموس يعين مسارات موتر السلسلة إلى قيم Tensor. يتم توفير هذا القاموس إلى CheckpointWriter الأساسي، بالإضافة إلى الدليل الذي سيتم كتابة نقطة التحقق فيه. يتولى CheckpointWriter مهمة إنشاء نقطة تفتيش على القرص من هذا القاموس.

عكس هذه العملية هو القراءة، حيث يتم إعطاء CheckpointReader موقع دليل نقاط التفتيش على القرص. ثم يقرأ من نقطة التفتيش تلك ويشكل قاموسًا يعين أسماء الموترات داخل نقطة التفتيش بقيمها المحفوظة. يستخدم هذا القاموس لاستبدال الموترات الحالية في النموذج بتلك الموجودة في هذا القاموس.

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

إذا كان بروتوكول Checkpointable يفتقر إلى الوظائف المطلوبة، أو كان هناك حاجة إلى مزيد من التحكم في عملية تحميل وحفظ نقطة التفتيش، فيمكن استخدام فئتي CheckpointReader و CheckpointWriter بمفردهما.

تنسيق نقطة تفتيش TensorFlow v2

يعد تنسيق نقطة تفتيش TensorFlow v2، كما هو موضح بإيجاز في هذا الرأس ، هو تنسيق الجيل الثاني لنقاط فحص نموذج TensorFlow. تم استخدام تنسيق الجيل الثاني هذا منذ أواخر عام 2016، ويحتوي على عدد من التحسينات على تنسيق نقطة التفتيش v1. تستخدم TensorFlow SavedModels نقاط تفتيش v2 داخلها لحفظ معلمات النموذج.

تتكون نقطة تفتيش TensorFlow v2 من دليل ببنية مثل ما يلي:

checkpoint/modelname.index
checkpoint/modelname.data-00000-of-00002
checkpoint/modelname.data-00001-of-00002

حيث يقوم الملف الأول بتخزين البيانات التعريفية لنقطة التفتيش والملفات المتبقية عبارة عن أجزاء ثنائية تحتوي على المعلمات المتسلسلة للنموذج.

يحتوي ملف بيانات تعريف الفهرس على الأنواع والأحجام والمواقع وأسماء السلسلة لجميع الموترات المتسلسلة الموجودة في القطع. يعد ملف الفهرس هذا هو الجزء الأكثر تعقيدًا من الناحية الهيكلية في نقطة التفتيش، ويعتمد على tensorflow::table ، والذي يعتمد في حد ذاته على SSTable / LevelDB. يتكون ملف الفهرس هذا من سلسلة من أزواج المفاتيح والقيمة، حيث تكون المفاتيح عبارة عن سلاسل والقيم عبارة عن مخازن مؤقتة للبروتوكول. يتم فرز السلاسل وضغطها بالبادئة. على سبيل المثال: إذا كان الإدخال الأول هو conv1/weight و conv1/bias التالي، فإن الإدخال الثاني يستخدم الجزء bias فقط.

يتم أحيانًا ضغط ملف الفهرس الإجمالي هذا باستخدام ضغط Snappy . يوفر ملف SnappyDecompression.swift تطبيق Swift أصلي لإلغاء الضغط Snappy من مثيل بيانات مضغوطة.

يتم تشفير البيانات التعريفية لرأس الفهرس والبيانات التعريفية للموتر كمخزن مؤقت للبروتوكول ويتم تشفيرها/فك تشفيرها مباشرة عبر Swift Protobuf .

تتعامل فئتا CheckpointIndexReader و CheckpointIndexWriter مع تحميل ملفات الفهرس هذه وحفظها كجزء من فئتي CheckpointReader و CheckpointWriter الشاملتين. يستخدم الأخير ملفات الفهرس كأساس لتحديد ما يجب القراءة منه والكتابة إلى الأجزاء الثنائية الأبسط من الناحية الهيكلية التي تحتوي على بيانات الموتر.