قامت Google مؤخرًا بتوفير وصول مجاني إلى وحدة معالجة
الموتر (TPU) الخاصة بها على
منصة التعلم الآلي القائمة على السحابة من
Colaboratory . معالج الموتر هو دائرة متكاملة متخصصة (ASIC) طورتها Google لمهام التعلم الآلي باستخدام مكتبة TensorFlow. قررت أن أحاول تعلم الشبكة التلافيفية TPU على Keras ، التي تتعرف على الأشياء في صور CIFAR-10. يمكن عرض رمز الحل الكامل وتشغيله على
الكمبيوتر المحمول .
الصورة cloud.google.comمعالجات الموتر
على حبري كتب بالفعل كيف يتم ترتيب TPU (
هنا وهنا وهنا ) ، وكذلك
لماذا مناسبة TPU لتدريب الشبكات العصبية . لذلك ، لن أخوض في تفاصيل بنية TPU ، ولكن فقط النظر في الميزات التي يجب مراعاتها عند تدريب الشبكات العصبية.
الآن هناك ثلاثة أجيال من معالجات الموتر ، وأداء الجيل الثالث من أجهزة TPU هو 420 TFlops (تريليونات من عمليات النقطة العائمة في الثانية) ، ويحتوي على 128 جيجا بايت من ذاكرة النطاق الترددي العالي. ومع ذلك ، يتوفر الجيل الثاني فقط من TPU على Colaboratory ، مع 180 TFlops من الأداء و 64 GB من الذاكرة. في المستقبل ، سأفكر في هذه TPU.
يتكون معالج الموتر من أربع شرائح ، يحتوي كل منها على نواتين ، ما مجموعه ثمانية نوى في TPU. يُجرى تدريب TPU بالتوازي على جميع النوى باستخدام النسخ المتماثل: يقوم كل نواة بتشغيل نسخة من الرسم البياني TensorFlow مع ثُمن حجم البيانات.
أساس معالج الموتر هو وحدة مصفوفة (MXU). يستخدم بنية البيانات الماكرة لمجموعة 128x128
الانقباضية من أجل التنفيذ الفعال لعمليات المصفوفة. لذلك ، من أجل زيادة استخدام موارد معدات TPU إلى أقصى حد ، يجب أن يكون بُعد العينة المصغرة أو الميزات مضاعفًا لـ 128 (
مصدر ). أيضًا ، نظرًا لطبيعة نظام ذاكرة TPU ، من المستحسن أن يكون أبعاد العينة المصغرة والميزات مضاعفًا لـ 8.
منصة تعاونية
Colaboratory هو النظام الأساسي السحابي من Google لتطوير تكنولوجيا التعلم الآلي. يمكنك الحصول على جهاز افتراضي مع المكتبات الشهيرة المثبتة TensorFlow و Keras و sklearn و pandas وما إلى ذلك مجانًا. الشيء الأكثر ملاءمة هو أنه يمكنك تشغيل أجهزة الكمبيوتر المحمولة المشابهة لـ Jupyter في Colaboratory. يتم تخزين أجهزة الكمبيوتر المحمولة على Google Drive ، ويمكنك توزيعها وحتى تنظيم التعاون. هذا هو شكل الكمبيوتر المحمول في Colaboratory (
صورة قابلة للنقر ):

تكتب الرمز في متصفح على جهاز كمبيوتر محمول ، ويتم تشغيله على جهاز افتراضي في Google Cloud. تصدر السيارة لك لمدة 12 ساعة ، وتتوقف بعد ذلك. ومع ذلك ، لا شيء يمنعك من بدء تشغيل جهاز افتراضي آخر والعمل لمدة 12 ساعة أخرى. فقط ضع في اعتبارك أنه بعد توقف الجهاز الظاهري ، يتم حذف جميع البيانات منه. لذلك ، لا تنس حفظ البيانات اللازمة على جهاز الكمبيوتر الخاص بك أو Google Drive ، وبعد إعادة تشغيل الجهاز الظاهري ، قم بتنزيله مرة أخرى.
تعليمات مفصلة للعمل على منصة Colaboratory
هنا ،
هنا وهنا .
قم بتوصيل معالج الموتر في Colaboratory
بشكل افتراضي ، لا يستخدم Colaboratory مسرعات حساب GPU أو TPU. يمكنك توصيلها في قائمة وقت التشغيل -> تغيير نوع وقت التشغيل -> مسرع الأجهزة. في القائمة التي تظهر ، حدد "TPU":

بعد اختيار نوع المسرّع ، سيتم إعادة تشغيل الجهاز الظاهري الذي يتصل به الكمبيوتر المحمول Colaboratory وستتوفر TPU.
إذا قمت بتنزيل أي بيانات إلى الجهاز الظاهري ، فسيتم حذفها أثناء عملية إعادة التشغيل. يجب عليك تنزيل البيانات مرة أخرى.
شبكة Keras العصبية للتعرف على CIFAR-10
كمثال ، دعنا نحاول تدريب شبكة Keras العصبية على TPU التي تتعرف على الصور من
مجموعة بيانات CIFAR-10 . هذه مجموعة بيانات شائعة تحتوي على صور صغيرة لأشياء من 10 فئات: طائرة ، سيارة ، طائر ، قطة ، أيل ، كلب ، ضفدع ، حصان ، سفينة ، وشاحنة. لا تتقاطع الطبقات ، ينتمي كل كائن في الصورة إلى فئة واحدة فقط.
قم بتنزيل مجموعة بيانات CIFAR-10 باستخدام Keras:
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
لإنشاء شبكة عصبية ، حصلت على وظيفة منفصلة. سنقوم بإنشاء نفس النموذج مرتين: الإصدار الأول من النموذج لـ TPU ، والذي سنتدرب عليه ، والثاني لوحدة المعالجة المركزية ، حيث سنتعرف على الكائنات.
def create_model(): input_layer = Input(shape=(32, 32, 3), dtype=tf.float32, name='Input') x = BatchNormalization()(input_layer) x = Conv2D(32, (3, 3), padding='same', activation='relu')(x) x = Conv2D(32, (3, 3), activation='relu', padding='same')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Dropout(0.25)(x) x = BatchNormalization()(x) x = Conv2D(64, (3, 3), padding='same', activation='relu')(x) x = Conv2D(64, (3, 3), activation='relu')(x) x = MaxPooling2D(pool_size=(2, 2))(x) x = Dropout(0.25)(x) x = Flatten()(x) x = Dense(512, activation='relu')(x) x = Dropout(0.5)(x) output_layer = Dense(10, activation='softmax')(x) model = Model(inputs=[input_layer], outputs=[output_layer]) model.compile( optimizer=tf.train.AdamOptimizer(0.001), loss=tf.keras.losses.sparse_categorical_crossentropy, metrics=['sparse_categorical_accuracy']) return model
حتى الآن ، لا يمكن استخدام محسنات Keras على TPU ، لذلك ، عند تجميع نموذج ، يتم تحديد المحسن من TensorFlow.
نقوم بإنشاء نموذج Keras لوحدة المعالجة المركزية ، والذي سنحوله في الخطوة التالية إلى نموذج لـ TPU:
cpu_model = create_model()
تحويل الشبكة العصبية Keras إلى نموذج TPU
يمكن تدريب النماذج على Keras و TensorFlow على GPU دون أي تغييرات. لا يمكنك القيام بذلك على TPU حتى الآن ، لذلك عليك تحويل النموذج الذي أنشأناه إلى نموذج لـ TPU.
تحتاج أولاً إلى معرفة مكان تواجد TPU المتاح لنا. على منصة Colaboratory ، يمكن القيام بذلك باستخدام الأمر التالي:
TPU_WORKER = 'grpc://' + os.environ['COLAB_TPU_ADDR']
في حالتي ، تبين أن عنوان TPU هو
grpc://10.102.233.146:8470
-
grpc://10.102.233.146:8470
. كانت العناوين مختلفة لعمليات الإطلاق المختلفة.
يمكنك الآن الحصول على نموذج TPU باستخدام وظيفة
keras_to_tpu_model
:
tf.logging.set_verbosity(tf.logging.INFO) tpu_model = tf.contrib.tpu.keras_to_tpu_model( cpu_model, strategy=tf.contrib.tpu.TPUDistributionStrategy( tf.contrib.cluster_resolver.TPUClusterResolver(TPU_WORKER)))
يتضمن السطر الأول تسجيل الدخول على مستوى المعلومات. هنا سجل تحويل النموذج:
INFO:tensorflow:Querying Tensorflow master (b'grpc://10.102.233.146:8470') for TPU system metadata.
INFO:tensorflow:Found TPU system:
INFO:tensorflow:*** Num TPU Cores: 8
INFO:tensorflow:*** Num TPU Workers: 1
INFO:tensorflow:*** Num TPU Cores Per Worker: 8
...
WARNING:tensorflow:tpu_model (from tensorflow.contrib.tpu.python.tpu.keras_support) is experimental and may change or be removed at any time, and without warning.
يمكنك أن ترى أنه تم العثور على TPU في العنوان الذي حددناه سابقًا ، فهو يحتوي على 8 نوى. نرى أيضًا تحذيرًا بأن
tpu_model
تجريبي ويمكن تغييره أو حذفه في أي وقت. آمل أنه بمرور الوقت سيكون من الممكن تدريب نماذج Keras مباشرة على TPU دون أي تحويل.
ندرب النموذج على TPU
يمكن تدريب نموذج TPU بالطريقة المعتادة ل Keras عن طريق استدعاء طريقة
fit
:
history = tpu_model.fit(x_train, y_train, batch_size=128*8, epochs=50, verbose=2)
ما هي الميزات هنا. نتذكر أنه من أجل استخدام TPU بشكل فعال ، يجب أن يكون حجم العينة المصغرة من مضاعفات 128. بالإضافة إلى ذلك ، يتم التدريب على ثُمن جميع البيانات في العينة المصغرة على كل نواة TPU. لذلك ، قمنا بتعيين حجم العينة المصغرة أثناء التدريب إلى 128 * 8 ، ونحصل على 128 صورة لكل نواة TPU. يمكنك استخدام حجم أكبر ، على سبيل المثال ، 256 أو 512 ، ثم سيكون الأداء أعلى.
في حالتي ، يتطلب تدريب عصر واحد متوسط 6 ثوانٍ.
جودة التعليم في العصر الخمسين:
Epoch 50/50
- 6s - loss: 0.2727 - sparse_categorical_accuracy: 0.9006
بلغت نسبة الإجابات الصحيحة على بيانات التدريب 90.06٪. نتحقق من الجودة في بيانات الاختبار باستخدام TPU:
scores = tpu_model.evaluate(x_test, y_test, verbose=0, batch_size=batch_size * 8) print(" : %.2f%%" % (scores[1]*100))
: 80.79%
الآن احفظ أوزان النموذج المدرب:
tpu_model.save_weights("cifar10_model.h5")
سيقدم لنا TensorFlow رسالة مفادها أن الأوزان يتم نقلها من TPU إلى وحدة المعالجة المركزية:
INFO:tensorflow:Copying TPU weights to the CPU
وتجدر الإشارة إلى أن أوزان الشبكة المدربة تم حفظها على قرص الجهاز الظاهري التعاوني. عندما يتم إيقاف الجهاز الظاهري ، سيتم مسح جميع البيانات منه. إذا كنت لا تريد فقدان أوزان مدربة ، فقم بحفظها على جهاز الكمبيوتر الخاص بك:
from google.colab import files files.download("cifar10_model.h5")
التعرف على الأشياء على وحدة المعالجة المركزية
الآن دعنا نحاول استخدام نموذج تم تدريبه على TPU من أجل التعرف على الكائنات في الصور باستخدام وحدة المعالجة المركزية. للقيام بذلك ، قم بإنشاء النموذج مرة أخرى وتحميل الأوزان المدربة على TPU في ذلك:
model = create_model() model.load_weights("cifar10_model.h5")
النموذج جاهز للاستخدام على المعالج المركزي. دعنا نحاول التعرف على إحدى صور مجموعة اختبار CIFAR-10 بمساعدتها:
index=111 plt.imshow(toimage(x_test[index])) plt.show()

الصورة صغيرة ، لكن يمكنك أن تفهم أن هذه طائرة. نبدأ الاعتراف:
نحصل على قائمة بقيم الإخراج للخلايا العصبية ، كلها تقريبًا قريبة من الصفر ، باستثناء القيمة الأولى ، التي تتوافق مع المستوى.
[[9.81738389e-01 2.91262069e-07 1.82225723e-02 9.78524668e-07
5.89265142e-07 6.76223244e-10 1.03252004e-10 9.23009047e-09
3.71878523e-05 3.16599618e-08]]
كان الاعتراف بنجاح!
الملخص
كان من الممكن إظهار قابلية تشغيل TPU على منصة Colaboratory ، ويمكن استخدامه لتدريب الشبكات العصبية على Keras. ومع ذلك ، فإن مجموعة بيانات CIFAR-10 صغيرة جدًا ؛ ولا يكفي تحميل موارد TPU بالكامل. تبين أن التسارع مقارنة بوحدة معالجة الرسومات (GPU) صغير (يمكنك التحقق من نفسك باختيار GPU كمُسرع بدلاً من TPU وإعادة تدريب النموذج مرة أخرى).
يوجد في حبري مقال
يقاس فيه أداء الـ TPUs و GPUs V100 على تدريب الشبكة ResNet-50 . في هذه المهمة ، أظهرت TPU نفس الأداء مثل وحدات معالجة الرسومات V100 الأربعة. من الجميل أن توفر Google مسرعًا قويًا لتعلم الشبكة العصبية مجانًا!
فيديو يوضح تدريب شبكة Keras العصبية على TPU.
روابط مفيدة
- كمبيوتر محمول تعاوني مع كود تعلم نموذج Keras TPU الكامل .
- دفتر ملاحظات تعاوني مع مثال تدريب Keras TPU للتعرف على الملابس والأحذية من Fashion MNIST .
- معالجات Tensor في Google Cloud .
- ملامح العمارة واستخدام معالجات الموتر .