لمحة عن هذا الدرس التطبيقي حول الترميز
1. نظرة عامة
فوحدات معالجة الموتّرات سريعة جدًا. يجب أن يكون تدفق بيانات التدريب متناسبًا مع سرعة تدريبهم. ستتعلّم في هذا التمرين المعملي كيفية تحميل البيانات من GCS باستخدام tf.data.Dataset API لخلاصة وحدة معالجة الموتّرات.
هذا التمرين هو الجزء 1 من "Keras on TPU" السلسلة. يمكنك القيام بها بالترتيب التالي أو بشكل مستقل.
- [THIS LAB] مسارات نقل البيانات بسرعة TPU: tf.data.Dataset وTFRecords
- استخدام نموذج Keras الأول مع تقنيات التعلُّم المتنقلة
- الشبكات العصبونية الالتفافية، مثل Keras ووحدات معالجة الموتّرات
- وسائل تحويل حديثة، squeezenet، وXception، مع وحدات معالجة الموتّرات ووحدات معالجة الموتّرات
ما ستتعرَّف عليه
- لاستخدام واجهة برمجة التطبيقات tf.data.Dataset API لتحميل بيانات التدريب
- لاستخدام تنسيق TFRecord لتحميل بيانات التدريب بكفاءة من GCS
الملاحظات
إذا لاحظت أي أخطاء في التمرين المعملي الخاص بالرموز، يُرجى إخبارنا بذلك. يمكن تقديم الملاحظات من خلال مشاكل GitHub [ رابط الملاحظات].
2. دليل البدء السريع لخدمة Google Colaboratory
يستخدم هذا التمرين المعملي متعاون Google ولا يتطلب أي إعداد من جانبك. Colaboratory هي منصة لأوراق الملاحظات على الإنترنت مخصَّصة لأغراض التعليم. وهو يوفر تدريبًا مجانيًا على استخدام وحدة المعالجة المركزية (CPU) ووحدة معالجة الرسومات ووحدة معالجة الموتّرات.
يمكنك فتح نموذج ورقة الملاحظات هذا وتشغيله في خليتين للتعرّف على Colaboratory.
اختيار إحدى خلفيات وحدة معالجة الموتّرات
في قائمة Colab، اختَر وقت التشغيل >. غيِّر نوع بيئة التشغيل ثم اختَر "وحدة معالجة الموتّرات". سوف تستخدم في هذا التمرين المعملي وحدة معالجة بيانات (TPU) قوية للتدريب الذي يتم تسريعه باستخدام الأجهزة. سيتم الاتصال ببيئة التشغيل تلقائيًا عند التنفيذ الأول، أو يمكنك استخدام الزر "اتصال" في أعلى الجانب الأيسر.
تنفيذ ورقة الملاحظات
نفِّذ الخلايا واحدة تلو الأخرى عن طريق النقر على خلية واستخدام Shift-ENTER. يمكنك أيضًا تشغيل ورقة الملاحظات بالكامل باستخدام "بيئة التشغيل" > تنفيذ الكل
جدول المحتويات
تحتوي جميع أوراق الملاحظات على جدول محتويات. يمكنك فتحه باستخدام السهم الأسود على اليمين.
الخلايا المخفية
لن تعرض بعض الخلايا إلا عناوينها. هذه ميزة خاصة بأوراق الملاحظات في Colab. يمكنك النقر مرّتين عليها لرؤية الرمز بداخلها، ولكن عادةً لا يكون ذلك مثيرًا للاهتمام. عادةً ما تكون دوال الدعم أو التصورات. لا تزال بحاجة إلى تشغيل هذه الخلايا حتى يتم تحديد الدوال داخلها.
المصادقة
يمكن لخدمة Colab الوصول إلى حِزم Google Cloud Storage الخاصة بك بشرط المصادقة باستخدام حساب معتمَد. سيؤدي مقتطف الرمز أعلاه إلى بدء عملية مصادقة.
3. [INFO] ما هي وحدات معالجة Tensor (TPU)؟
باختصار
رمز تدريب نموذج على وحدة معالجة الموتّرات في Keras (واستخدام وحدة معالجة الرسومات أو وحدة المعالجة المركزية (CPU) في حال عدم توفّر وحدة معالجة الموتّرات):
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
سنستخدم اليوم وحدات معالجة الموتّرات لإنشاء مصنِّف زهور وتحسينه بالسرعات التفاعلية (دقائق لكل تمرين تدريبي).
ما هي أسباب استخدام وحدات معالجة الموتّرات؟
يتم تنظيم وحدات معالجة الرسومات الحديثة استنادًا إلى "النواة" القابلة للبرمجة، وهي بنية مرنة للغاية تتيح لها معالجة مجموعة من المهام، مثل العرض الثلاثي الأبعاد والتعلّم المعمّق والمحاكاة المادية وما إلى ذلك. من ناحية أخرى، تقوم وحدات معالجة الموتّرات بإقران معالج متجه كلاسيكي بوحدة ضرب مصفوفة مخصصة وتتفوّق في أي مهمة تهيمن عليها عمليات ضرب المصفوفة الكبيرة، مثل الشبكات العصبونية.
صورة توضيحية: طبقة شبكة عصبية كثيفة كضرب مصفوفة، مع معالجة مجموعة من ثماني صور من خلال الشبكة العصبونية في وقت واحد يُرجى تنفيذ عملية ضرب العمود في سطر واحد للتأكد من أنها تُخرِج مجموع ترجيح لجميع قيم وحدات البكسل في الصورة. ويمكن تمثيل الطبقات الالتفافية في صورة عمليات ضرب المصفوفات أيضًا على الرغم من تعقيدها بعض الشيء ( الشرح هنا في القسم 1).
الأجهزة
MXU وVPU
يتكوّن الإصدار الثاني من وحدة معالجة الموتّرات من وحدة مصفوفة مصفوفة (MXU) تعمل على تنفيذ عمليات ضرب المصفوفة ووحدة معالجة المتّجهات (VPU) لجميع المهام الأخرى مثل عمليات التفعيل وsoftmax وغير ذلك. ويعالج VPU العمليات الحسابية float32 وint32. من ناحية أخرى، تعمل وحدة قياس الأداء (MXU) بتنسيق نقطة عائمة بدقة مختلطة 16-32 بت.
نقطة عائمة بدقة مختلطة وbfloat16
تحسب MXU عمليات ضرب المصفوفة باستخدام مدخلات bfloat16 ومخرجات float32. ويتم تنفيذ التراكمات المتوسطة بدقة float32.
عادةً ما يكون التدريب على الشبكة العصبية مقاومًا للضوضاء الناتجة عن تقليل دقة النقاط العائمة. هناك حالات يساعد فيها الضجيج في التقارب أيضًا. عادةً ما يتم استخدام دقة النقطة العائمة بتنسيق 16 بت لتسريع العمليات الحسابية، غير أنّ النطاقَين float16 وfloat32 يحتويان على نطاقات مختلفة جدًا. عادةً ما يؤدي خفض الدقة من العدد العشري 32 إلى العدد العشري 16 إلى حدوث تدفقات أعلى وتدفق منخفض. توجد حلول ولكن يلزم عمل إضافي عادةً لعمل float16.
ولهذا السبب قدّمت Google تنسيق bfloat16 في وحدات معالجة الموتّرات. bfloat16 هو عدد عائم 32 تم اقتطاعه بنفس وحدات بت الأس ونطاقه مثل float32. هذا بالإضافة إلى حقيقة أنّ وحدات معالجة الموتّرات تحتسب عمليات ضرب المصفوفات بدقة مختلطة مع مخرجات bfloat16 والمخرجات float32، وهو ما يعني أنّه لا يلزم عادةً إجراء أي تغييرات في الرموز للاستفادة من نتائج الدقة المنخفضة في الأداء.
المصفوفة الانسيابية
تنفذ MXU عمليات ضرب المصفوفة في الأجهزة باستخدام ما يُعرف باسم "الصفيفة الانقباضية" البنية التي تتدفق فيها عناصر البيانات من خلال صفيف من وحدات الحوسبة للأجهزة. (في المجال الطبي، تشير كلمة "انقباضي" إلى انقباضات القلب وتدفق الدم، هنا لتدفق البيانات).
العنصر الأساسي لعملية ضرب المصفوفة هو ناتج الضرب النقطي بين خط من مصفوفة واحدة وعمود من المصفوفة الأخرى (راجع الرسم التوضيحي أعلى هذا القسم). بالنسبة لعملية ضرب المصفوفة Y=X*W، سيكون أحد عناصر النتيجة هو:
Y[2,0] = X[2,0]*W[0,0] + X[2,1]*W[1,0] + X[2,2]*W[2,0] + ... + X[2,n]*W[n,0]
على وحدة معالجة الرسومات، يمكن للمرء برمجة هذا الناتج النقطي إلى "نواة" في وحدة معالجة الرسومات ثم تنفيذها على أكبر عدد ممكن من "النواة" كما هي بالتوازي لمحاولة حساب كل قيمة للمصفوفة الناتجة دفعة واحدة. إذا كانت المصفوفة الناتجة كبيرة بحجم 128×128، فسيتطلب ذلك 128x128=16K "نواة" متاحة وهو ما لا يكون ممكنًا عادةً. تحتوي أكبر وحدات معالجة الرسومات على 4,000 نواة تقريبًا. من ناحية أخرى، تستخدم وحدة معالجة الموتّرات الحدّ الأدنى من الأجهزة لوحدات الحوسبة في وحدة معالجة الموتّرات (MXU)، وهي تشمل فقط bfloat16 x bfloat16 => float32
مراكمات مضاعفة، ولا ينطبق أي إجراء آخر. وهي صغيرة للغاية لدرجة أنّ وحدة معالجة الموتّرات يمكنها تنفيذ 16 كيلوبايت في وحدة MXU128 × 128 بكسل ومعالجة عملية ضرب المصفوفة هذه دفعة واحدة.
صورة توضيحية: صفيفة MXU الانقباضية. عناصر الحوسبة هي مراكمات الضربات. يتم تحميل قيم مصفوفة واحدة في الصفيف (النقاط الحمراء). تتدفق قيم المصفوفة الأخرى من خلال الصفيف (نقاط رمادية). تنشر الخطوط العمودية القيم لأعلى. تنشر الخطوط الأفقية المجاميع الجزئية. ويُترك تمرينًا للمستخدم للتحقّق من أنّه عند تدفق البيانات من خلال الصفيف، ستحصل على نتيجة ضرب المصفوفة الناتجة من الجانب الأيمن.
علاوة على ذلك، أثناء احتساب حاصل الضرب النقطي (MXU)، تتدفق المجاميع المتوسطة ببساطة بين وحدات الحوسبة المتجاورة. لا حاجة إلى تخزينها واستردادها إلى/من الذاكرة أو حتى ملف تسجيل. والنتيجة النهائية هي أن بنية المصفوفة الانقباضية (TPU) لها كثافة ملحوظة وفائدة كبيرة، فضلاً عن مزايا سرعة غير تُذكر على وحدة معالجة الرسومات، عند حساب ضربات المصفوفة.
وحدة معالجة الموتّرات في السحابة الإلكترونية
عند طلب " Cloud TPU الإصدار 2" في Google Cloud Platform، ستحصل على جهاز افتراضي (VM) يحتوي على لوحة TPU مرفقة بمنفذ PCI. تحتوي لوحة TPU على أربع شرائح TPU ثنائية النواة. يتميز كل نواة من وحدات معالجة الموتّرات بوحدة معالجة المتجهات (VPU) وبحجم 128×128 MXU (وحدة ضرب MatriX). إنّ "وحدة معالجة الموتّرات" (Cloud TPU) هذه عادةً ما يتم توصيله من خلال الشبكة بالجهاز الافتراضي الذي يطلبه. لكي تبدو الصورة الكاملة على النحو التالي:
صورة توضيحية: جهاز افتراضي (VM) مزوّد بـ "وحدة معالجة الموتّرات" (Cloud TPU) المرتبطة بالشبكة مسرِّعة أعمال. "وحدة معالجة الموتّرات في السحابة الإلكترونية" الجهاز نفسه مكوَّن من جهاز افتراضي (VM) مزوّد بلوحة TPU متصلة بمنفذ PCI ومزوَّدة بأربع شرائح TPU ثنائية النواة.
لوحات TPU
يتم ربط وحدات معالجة الموتّرات في مراكز بيانات Google بشبكة حوسبة عالية الأداء (HPC) يمكن أن تجعلها تظهر كمُسرّع كبير جدًا. تطلق عليها Google أجهزة pod pods التي يمكن أن تضم ما يصل إلى 512 وحدة معالجة مركزية من TPU الإصدار 2 أو 2048 TPU v3.
صورة توضيحية: لوحة TPU v3 يتم توصيل لوحات ورفوف وحدة معالجة الموتّرات من خلال وصلة HPC.
أثناء التدريب، يتم تبادل التدرجات بين نوى وحدة معالجة الموتّرات باستخدام الخوارزمية الخالية الكل ( شرح جيد لاستنتاج الكل هنا). يمكن للنموذج الذي يتم تدريبه الاستفادة من الأجهزة عن طريق التدريب على أحجام الدفعات الكبيرة.
صورة توضيحية: مزامنة التدرجات أثناء التدريب باستخدام خوارزمية التقليل على مستوى شبكة HPC ثنائية الأبعاد (TPU) الخاصة بالطاقة الحلقية المتشابكة (TPU) من Google.
البرامج
تدريب كبير الحجم
إنّ حجم الدُفعة المثالي لوحدات معالجة الموتّرات هو 128 عنصر بيانات لكل وحدة معالجة مركزية (TPU) أساسية، ولكن يمكن أن تُظهر الأجهزة استخدامًا جيدًا من 8 عناصر بيانات لكل وحدة معالجة معالجة مركزية (TPU). تذكَّر أنّ وحدة معالجة الموتّرات في السحابة الإلكترونية تضمّ 8 أنوية.
في هذا التمرين المعملي عن الترميز، سنستخدم واجهة برمجة تطبيقات Keras. في Keras، تكون الدُفعة التي تحدِّدها هي الحجم العمومي لوحدة معالجة الموتّرات بالكامل. وسيتم تقسيم دُفعاتك تلقائيًا إلى 8 نوى وتشغيلها على 8 نوى لوحدة معالجة الموتّرات.
للحصول على نصائح إضافية بشأن الأداء، يمكنك الاطّلاع على دليل أداء TPU. بالنسبة إلى أحجام الدُفعات الكبيرة جدًا، قد يلزم توخي الحذر في بعض الطُرز، ويمكنك الاطّلاع على LARSOptimizer للحصول على مزيد من التفاصيل.
مزيد من المعلومات: XLA
تحدد برامج Tensorflow الرسوم البيانية الحسابية. لا تُشغِّل وحدة معالجة الموتّرات رمز Python مباشرةً، بل تشغِّل الرسم البياني الحسابي المحدّد في برنامج Tensorflow. في الخيارات المتقدمة، يعمل المحول البرمجي المسمى XLA (محول الجبر الخطي المسرّع) على تحويل الرسم البياني TensorFlow لعقد العملية الحاسوبية إلى رمز وحدة معالجة الموتّرات. ينفذ هذا المحول البرمجي أيضًا العديد من التحسينات المتقدمة على الرمز البرمجي وتنسيق الذاكرة. وتتم عملية التجميع تلقائيًا أثناء إرسال العمل إلى وحدة معالجة الموتّرات. ليس عليك تضمين XLA في سلسلة الإصدار بشكل صريح.
صورة توضيحية: للتشغيل على وحدة معالجة الموتّرات، تتم أولاً ترجمة الرسم البياني للاحتساب الذي حدّده برنامج Tensorflow إلى تمثيل مجمِّع الجبر الخطي المسرّع XLA، ثم تجميعه في رمز XLA إلى رمز جهاز TPU.
استخدام وحدات معالجة الموتّرات في Keras
تتوفّر وحدات معالجة الموتّرات من خلال واجهة برمجة التطبيقات Keras اعتبارًا من الإصدار 2.1 من Tensorflow. تتوافق تقنية Keras مع وحدات معالجة الموتّرات ووحدات معالجة الموتّرات. في ما يلي مثال يعمل مع وحدات معالجة الموتّرات ووحدات معالجة الرسومات ووحدة المعالجة المركزية(CPU):
try: # detect TPUs
tpu = tf.distribute.cluster_resolver.TPUClusterResolver.connect()
strategy = tf.distribute.TPUStrategy(tpu)
except ValueError: # detect GPUs
strategy = tf.distribute.MirroredStrategy() # for CPU/GPU or multi-GPU machines
# use TPUStrategy scope to define model
with strategy.scope():
model = tf.keras.Sequential( ... )
model.compile( ... )
# train model normally on a tf.data.Dataset
model.fit(training_dataset, epochs=EPOCHS, steps_per_epoch=...)
في مقتطف الرمز هذا:
- يعثر محرّك البحث
TPUClusterResolver().connect()
على وحدة معالجة الموتّرات على الشبكة. وتعمل بدون معلَمات على معظم أنظمة Google Cloud (وظائف AI Platform وColloratory وKubeflow والأجهزة الافتراضية للتعلُّم المحسَّن التي تم إنشاؤها باستخدام أداة "ctpu up"). تعرف هذه الأنظمة مكان وحدة معالجة الموتّرات الخاصة بها بفضل متغيّر بيئة TPU_NAME. إذا أنشأت وحدة معالجة الموتّرات يدويًا، يمكنك ضبط بيئة TPU_NAME. var. أو على الجهاز الافتراضي الذي تستخدمه منه، أو يمكنك طلب الرقمTPUClusterResolver
باستخدام المَعلمات الصريحة:TPUClusterResolver(tp_uname, zone, project)
. TPUStrategy
هو الجزء الذي ينفّذ التوزيع و"all-reduce" خوارزمية مزامنة التدرج.- يتم تطبيق الإستراتيجية من خلال نطاق. يجب تحديد النموذج ضمن نطاق الإستراتيجية().
- تتوقع الدالة
tpu_model.fit
وجود عنصر tf.data.Dataset لإدخال تدريب وحدة معالجة الموتّرات.
المهام الشائعة لنقل بيانات وحدة معالجة الموتّرات
- في حين أنّ هناك العديد من الطرق لتحميل البيانات في نموذج Tensorflow، إلا أنّه يجب استخدام واجهة برمجة التطبيقات
tf.data.Dataset
API بالنسبة إلى وحدات معالجة الموتّرات. - فوحدات معالجة الموتّرات سريعة جدًا وغالبًا ما يصبح نقل البيانات العائق عند تشغيلها. تتوفّر أدوات يمكنك استخدامها لرصد المؤثِّرات السلبية على البيانات ونصائح الأداء الأخرى في دليل أداء TPU.
- يتم التعامل مع أرقام int8 أو int16 على أنها int32. لا تشتمل وحدة معالجة الموتّرات على أجهزة صحيحة تعمل على أقل من 32 بت.
- بعض عمليات Tensorflow غير متاحة. القائمة هنا. الخبر السار هو أن هذا القيد لا ينطبق إلا على التعليمات البرمجية للتدريب، أي الانتقال للأمام والخلف من خلال نموذجك. لا يزال بإمكانك استخدام جميع عمليات Tensorflow في مسار إدخال البيانات لأنّه سيتم تنفيذها على وحدة المعالجة المركزية (CPU).
- لا يمكن استخدام
tf.py_func
مع وحدة معالجة الموتّرات.
4. جارٍ تحميل البيانات
سوف نعمل على مجموعة بيانات لصور الزهور. والهدف هو معرفة تصنيفها إلى 5 أنواع من الزهور. يتم تحميل البيانات باستخدام واجهة برمجة تطبيقات tf.data.Dataset
. أولاً، نعرّفك على واجهة برمجة التطبيقات
التدريب العملي
يُرجى فتح ورقة الملاحظات التالية وتنفيذ الخلايا (Shift-ENTER) واتّباع التعليمات أينما تظهر لك رسالة "مطلوب العمل" التصنيف.
Fun with tf.data.Dataset (playground).ipynb
معلومات إضافية
لمحة عن "الزهور" مجموعة البيانات
يتم تنظيم مجموعة البيانات في 5 مجلدات. يحتوي كل مجلد على زهور من نوع واحد. وهذه المجلدات تُسمى زهور دوار الشمس، وأقحوانه، والهندباء البرية، والتوليب، والورود. تتم استضافة البيانات في حزمة عامة على Google Cloud Storage. مقتطف:
gs://flowers-public/sunflowers/5139971615_434ff8ed8b_n.jpg
gs://flowers-public/daisy/8094774544_35465c1c64.jpg
gs://flowers-public/sunflowers/9309473873_9d62b9082e.jpg
gs://flowers-public/dandelion/19551343954_83bb52f310_m.jpg
gs://flowers-public/dandelion/14199664556_188b37e51e.jpg
gs://flowers-public/tulips/4290566894_c7f061583d_m.jpg
gs://flowers-public/roses/3065719996_c16ecd5551.jpg
gs://flowers-public/dandelion/8168031302_6e36f39d87.jpg
gs://flowers-public/sunflowers/9564240106_0577e919da_n.jpg
gs://flowers-public/daisy/14167543177_cd36b54ac6_n.jpg
ما سبب أهمية tf.data.Dataset؟
يقبل كل من Keras وTensorflow مجموعات البيانات في جميع وظائف التدريب والتقييم التابعة لهما. بمجرد تحميل البيانات في مجموعة بيانات، توفر واجهة برمجة التطبيقات جميع الوظائف الشائعة المفيدة لبيانات تدريب الشبكة العصبية:
dataset = ... # load something (see below)
dataset = dataset.shuffle(1000) # shuffle the dataset with a buffer of 1000
dataset = dataset.cache() # cache the dataset in RAM or on disk
dataset = dataset.repeat() # repeat the dataset indefinitely
dataset = dataset.batch(128) # batch data elements together in batches of 128
AUTOTUNE = tf.data.AUTOTUNE
dataset = dataset.prefetch(AUTOTUNE) # prefetch next batch(es) while training
يمكنك العثور على نصائح بشأن الأداء وأفضل ممارسات مجموعات البيانات في هذه المقالة. يمكنك العثور على المستندات المرجعية هنا.
أساسيات tf.data.Dataset
عادة ما تأتي البيانات في ملفات متعددة، هنا الصور. يمكنك إنشاء مجموعة بيانات لأسماء الملفات عن طريق استدعاء:
filenames_dataset = tf.data.Dataset.list_files('gs://flowers-public/*/*.jpg')
# The parameter is a "glob" pattern that supports the * and ? wildcards.
يمكنك بعد ذلك "تعيين" دالة لكل اسم ملف تعمل عادةً على تحميل الملف وفك ترميزه إلى بيانات فعلية في الذاكرة:
def decode_jpeg(filename):
bits = tf.io.read_file(filename)
image = tf.io.decode_jpeg(bits)
return image
image_dataset = filenames_dataset.map(decode_jpeg)
# this is now a dataset of decoded images (uint8 RGB format)
للتكرار التحسيني في مجموعة بيانات:
for data in my_dataset:
print(data)
مجموعات بيانات الصفوف
في التعلّم الخاضع للإشراف، تتكون مجموعة بيانات التدريب عادةً من أزواج من بيانات التدريب والإجابات الصحيحة. وللسماح بذلك، يمكن لدالة فك الترميز عرض الصفوف. سيكون لديك بعد ذلك مجموعة بيانات من الصفوف وسيتم إرجاع الصفوف عند التكرار التحسيني. القيم التي يتم عرضها هي موتّرات Tensorflow جاهزة لاستهلاكها في النموذج. يمكنك طلب .numpy()
عليها للاطّلاع على القيم الأولية:
def decode_jpeg_and_label(filename):
bits = tf.read_file(filename)
image = tf.io.decode_jpeg(bits)
label = ... # extract flower name from folder name
return image, label
image_dataset = filenames_dataset.map(decode_jpeg_and_label)
# this is now a dataset of (image, label) pairs
for image, label in dataset:
print(image.numpy().shape, label.numpy())
الخاتمة:عملية تحميل الصور واحدة تلو الأخرى بطيئة.
أثناء التكرار التحسيني لمجموعة البيانات هذه، سترى أنه يمكنك تحميل شيء مثل صورة واحدة أو اثنتين في الثانية. هذا بطيء جدًا! ويمكن لمسرِّعات الأجهزة التي سنستخدمها للتدريب أن تظل مضاعفة بهذا المعدّل. انتقِل إلى القسم التالي لمعرفة كيف سنحقّق ذلك.
الحلّ
ها هو دفتر الحل. يمكنك استخدامه إذا واجهتك مشكلة.
Fun with tf.data.Dataset (solution).ipynb
النقاط التي تناولناها
- 👀 tf.data.Dataset.list_files
- 🎉 tf.data.Dataset.map
- 🎉 مجموعات بيانات الصفوف
- 😀 التكرار من خلال مجموعات البيانات
يرجى تخصيص بعض الوقت لاستعراض قائمة التحقق هذه في ذهنك.
5. تحميل البيانات بسرعة
تتميز مسرِّعات الأجهزة لوحدة معالجة Tensor (TPU) التي سنستخدمها في هذا التمرين بالسرعة الكبيرة جدًا. غالبًا ما يتمثل التحدي في إطعامهم البيانات بسرعة كافية لإبقائهم مشغولين. يمكن لخدمة Google Cloud Storage الحفاظ على سرعة معالجة بيانات عالية جدًا، ولكن كما هو الحال مع جميع أنظمة التخزين في السحابة الإلكترونية، فإنّ بدء الاتصال يكلف بعض الشبكة ذهابًا وإيابًا. ولذلك، ليس من المثالي تخزين بياناتنا كآلاف من الملفات الفردية. سنقوم بتجميعها في عدد أقل من الملفات واستخدام قوة tf.data.Dataset للقراءة من ملفات متعددة بالتوازي.
القراءة السلسة
يتوفّر في ورقة الملاحظات التالية الرمز الذي يحمّل ملفات الصور ويغيّر حجمها إلى حجم شائع ثم يخزّنها في 16 ملف TFRecord. يرجى قراءته بسرعة. ليس من الضروري تنفيذ هذا الإجراء لأنّه سيتم توفير بيانات بتنسيق TFRecord بشكل صحيح لبقية الدرس التطبيقي حول الترميز.
Flower pictures to TFRecords.ipynb
تنسيق مثالي للبيانات لضمان سرعة معالجة البيانات في GCS
تنسيق ملف TFRecord
إنّ تنسيق الملف المفضّل لمنصة Tensorflow لتخزين البيانات هو تنسيق TFRecord المستند إلى protobuf. يمكنك أيضًا استخدام تنسيقات التسلسل الأخرى، ولكن يمكنك تحميل مجموعة بيانات من ملفات TFRecord مباشرةً عن طريق كتابة:
filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(...) # do the TFRecord decoding here - see below
للحصول على الأداء الأمثل، ننصحك باستخدام الرمز البرمجي الأكثر تعقيدًا للقراءة من ملفات TFRecord متعددة في الوقت نفسه. ستتم قراءة هذا الرمز من ملفات N بالتوازي مع تجاهل ترتيب البيانات لصالح سرعة القراءة.
AUTOTUNE = tf.data.AUTOTUNE
ignore_order = tf.data.Options()
ignore_order.experimental_deterministic = False
filenames = tf.io.gfile.glob(FILENAME_PATTERN)
dataset = tf.data.TFRecordDataset(filenames, num_parallel_reads=AUTOTUNE)
dataset = dataset.with_options(ignore_order)
dataset = dataset.map(...) # do the TFRecord decoding here - see below
ورقة الملاحظات الموجزة عن TFRecord
يمكن تخزين ثلاثة أنواع من البيانات في TFRecords: سلاسل بايت (قائمة بالبايت)، وأعداد صحيحة بحجم 64 بت، وعدد عائم 32 بت. يتم تخزينها دائمًا كقوائم، وسيكون عنصر البيانات المفرد قائمة بحجم 1. يمكنك استخدام الدوال المساعدة التالية لتخزين البيانات في TFRecords.
كتابة سلاسل البايت
# warning, the input is a list of byte strings, which are themselves lists of bytes
def _bytestring_feature(list_of_bytestrings):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=list_of_bytestrings))
كتابة الأعداد الصحيحة
def _int_feature(list_of_ints): # int64
return tf.train.Feature(int64_list=tf.train.Int64List(value=list_of_ints))
كتابة الأعداد العشرية
def _float_feature(list_of_floats): # float32
return tf.train.Feature(float_list=tf.train.FloatList(value=list_of_floats))
كتابة TFRecord باستخدام وسائل المساعدة المذكورة أعلاه
# input data in my_img_bytes, my_class, my_height, my_width, my_floats
with tf.python_io.TFRecordWriter(filename) as out_file:
feature = {
"image": _bytestring_feature([my_img_bytes]), # one image in the list
"class": _int_feature([my_class]), # one class in the list
"size": _int_feature([my_height, my_width]), # fixed length (2) list of ints
"float_data": _float_feature(my_floats) # variable length list of floats
}
tf_record = tf.train.Example(features=tf.train.Features(feature=feature))
out_file.write(tf_record.SerializeToString())
لقراءة البيانات من TFRecords، يجب أولاً الإفصاح عن تنسيق السجلّات التي خزّنتها. في البيان، يمكنك الوصول إلى أي حقل مُسمّى كقائمة طول ثابتة أو قائمة طول متغيرة:
القراءة من TFRecords
def read_tfrecord(data):
features = {
# tf.string = byte string (not text string)
"image": tf.io.FixedLenFeature([], tf.string), # shape [] means scalar, here, a single byte string
"class": tf.io.FixedLenFeature([], tf.int64), # shape [] means scalar, i.e. a single item
"size": tf.io.FixedLenFeature([2], tf.int64), # two integers
"float_data": tf.io.VarLenFeature(tf.float32) # a variable number of floats
}
# decode the TFRecord
tf_record = tf.io.parse_single_example(data, features)
# FixedLenFeature fields are now ready to use
sz = tf_record['size']
# Typical code for decoding compressed images
image = tf.io.decode_jpeg(tf_record['image'], channels=3)
# VarLenFeature fields require additional sparse.to_dense decoding
float_data = tf.sparse.to_dense(tf_record['float_data'])
return image, sz, float_data
# decoding a tf.data.TFRecordDataset
dataset = dataset.map(read_tfrecord)
# now a dataset of triplets (image, sz, float_data)
مقتطفات الرموز المفيدة:
قراءة عناصر البيانات الفردية
tf.io.FixedLenFeature([], tf.string) # for one byte string
tf.io.FixedLenFeature([], tf.int64) # for one int
tf.io.FixedLenFeature([], tf.float32) # for one float
قراءة قوائم العناصر الثابتة الحجم
tf.io.FixedLenFeature([N], tf.string) # list of N byte strings
tf.io.FixedLenFeature([N], tf.int64) # list of N ints
tf.io.FixedLenFeature([N], tf.float32) # list of N floats
قراءة عدد متغيّر لعناصر البيانات
tf.io.VarLenFeature(tf.string) # list of byte strings
tf.io.VarLenFeature(tf.int64) # list of ints
tf.io.VarLenFeature(tf.float32) # list of floats
تعرض VarLenFeature متجهًا متفرقًا ويجب تنفيذ خطوة إضافية بعد فك ترميز TFRecord:
dense_data = tf.sparse.to_dense(tf_record['my_var_len_feature'])
من الممكن أيضًا أن تكون هناك حقول اختيارية في TFRecords. في حال تحديد قيمة تلقائية عند قراءة حقل، سيتم عرض القيمة التلقائية بدلاً من خطأ في حال عدم توفّر الحقل.
tf.io.FixedLenFeature([], tf.int64, default_value=0) # this field is optional
النقاط التي تناولناها
- 🎉 تقسيم ملفات البيانات للوصول السريع من GCS
- ذات كيفية كتابة سجلّات TFRecords. (هل نسيت بناء الجملة بالفعل؟ لا بأس، يُرجى وضع إشارة مرجعية على هذه الصفحة كورقة ملاحظات مرجعية)
- 🎉 جارٍ تحميل مجموعة بيانات من TFRecords باستخدام TFRecordDataset
يرجى تخصيص بعض الوقت لاستعراض قائمة التحقق هذه في ذهنك.
6. تهانينا!
يمكنك الآن إضافة البيانات إلى وحدة معالجة الموتّرات. يُرجى المتابعة إلى التمرين المعملي التالي
- [THIS LAB] مسارات نقل البيانات بسرعة TPU: tf.data.Dataset وTFRecords
- استخدام نموذج Keras الأول مع تقنيات التعلُّم المتنقلة
- الشبكات العصبونية الالتفافية، مثل Keras ووحدات معالجة الموتّرات
- وسائل تحويل حديثة، squeezenet، وXception، مع وحدات معالجة الموتّرات ووحدات معالجة الموتّرات
استخدام وحدات معالجة الموتّرات عمليًا
تتوفّر وحدات معالجة الموتّرات ووحدات معالجة الرسومات على Cloud AI Platform:
- على الأجهزة الافتراضية التي تستخدم ميزة Deep Learning VM
- في دفاتر الملاحظات حول AI Platform (AI Platform)
- في وظائف تدريب منصة الذكاء الاصطناعي
وأخيرًا، نرحِّب بملاحظاتك. يُرجى إخبارنا بما إذا لاحظت أمرًا غير صحيح في هذا التمرين المعملي أو إذا كنت تعتقد أنه ينبغي تحسينه. يمكن تقديم الملاحظات من خلال مشاكل GitHub [ رابط الملاحظات].
|