محاكاة عالية الأداء مع Kubernetes

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

يشير هذا البرنامج التعليمي إلى Google السحابة GKE لخلق الكتلة Kubernetes، ولكن كل الخطوات بعد الكتلة يتم إنشاؤه يمكن استخدامها مع أي تركيب Kubernetes.

عرض على TensorFlow.org تشغيل في Google Colab عرض المصدر على جيثب تحميل دفتر

قم بتشغيل TFF Workers على GKE

قم بإنشاء مجموعة Kubernetes

يجب القيام بالخطوة التالية مرة واحدة فقط. يمكن إعادة استخدام الكتلة لأحمال العمل في المستقبل.

اتبع الإرشادات GKE ل إنشاء كتلة الحاويات . ما تبقى من هذا البرنامج التعليمي يفترض أن الكتلة يدعى tff-cluster ، ولكن الاسم الفعلي ليس مهما. توقف اتباع التعليمات عند الوصول إلى "الخطوة 5: نشر التطبيق الخاص بك".

انشر تطبيق TFF Worker

الأوامر للتفاعل مع GCP يمكن تشغيل محليا أو في الغيمة شل جوجل . نوصي باستخدام Google Cloud Shell نظرًا لأنه لا يتطلب إعدادًا إضافيًا.

  1. قم بتشغيل الأمر التالي لبدء تشغيل تطبيق Kubernetes.
$ kubectl create deployment tff-workers --image=gcr.io/tensorflow-federated/remote-executor-service:latest
  1. أضف موازن تحميل للتطبيق.
$ kubectl expose deployment tff-workers --type=LoadBalancer --port 80 --target-port 8000

ابحث عن عنوان IP الخاص بـ loadbalancer على Google Cloud Console. ستحتاج إليه لاحقًا لتوصيل حلقة التدريب بتطبيق العمال.

(بالتناوب) قم بتشغيل Docker Container محليًا

$ docker run --rm -p 8000:8000 gcr.io/tensorflow-federated/remote-executor-service:latest

قم بإعداد بيئة TFF

!pip install --quiet --upgrade tensorflow-federated-nightly
!pip install --quiet --upgrade nest-asyncio

import nest_asyncio
nest_asyncio.apply()

حدد النموذج المطلوب تدريبه

import collections
import time

import tensorflow as tf
import tensorflow_federated as tff

source, _ = tff.simulation.datasets.emnist.load_data()


def map_fn(example):
  return collections.OrderedDict(
      x=tf.reshape(example['pixels'], [-1, 784]), y=example['label'])


def client_data(n):
  ds = source.create_tf_dataset_for_client(source.client_ids[n])
  return ds.repeat(10).batch(20).map(map_fn)


train_data = [client_data(n) for n in range(10)]
input_spec = train_data[0].element_spec


def model_fn():
  model = tf.keras.models.Sequential([
      tf.keras.layers.InputLayer(input_shape=(784,)),
      tf.keras.layers.Dense(units=10, kernel_initializer='zeros'),
      tf.keras.layers.Softmax(),
  ])
  return tff.learning.from_keras_model(
      model,
      input_spec=input_spec,
      loss=tf.keras.losses.SparseCategoricalCrossentropy(),
      metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])


trainer = tff.learning.build_federated_averaging_process(
    model_fn, client_optimizer_fn=lambda: tf.keras.optimizers.SGD(0.02))


def evaluate(num_rounds=10):
  state = trainer.initialize()
  for round in range(num_rounds):
    t1 = time.time()
    state, metrics = trainer.next(state, train_data)
    t2 = time.time()
    print('Round {}: loss {}, round time {}'.format(round, metrics.loss, t2 - t1))

قم بإعداد المنفذين عن بعد

بشكل افتراضي ، ينفذ TFF جميع العمليات الحسابية محليًا. في هذه الخطوة ، نطلب من TFF الاتصال بخدمات Kubernetes التي أنشأناها أعلاه. تأكد من نسخ عنوان IP الخاص بخدمتك هنا.

import grpc

ip_address = '0.0.0.0' 
port = 80 

channels = [grpc.insecure_channel(f'{ip_address}:{port}') for _ in range(10)]

tff.backends.native.set_remote_execution_context(channels)

تشغيل التدريب

evaluate()
Round 0: loss 4.370407581329346, round time 4.201097726821899
Round 1: loss 4.1407670974731445, round time 3.3283166885375977
Round 2: loss 3.865147590637207, round time 3.098310947418213
Round 3: loss 3.534019708633423, round time 3.1565616130828857
Round 4: loss 3.272688388824463, round time 3.175067663192749
Round 5: loss 2.935391664505005, round time 3.008434534072876
Round 6: loss 2.7399251461029053, round time 3.31435227394104
Round 7: loss 2.5054931640625, round time 3.4411356449127197
Round 8: loss 2.290508985519409, round time 3.158798933029175
Round 9: loss 2.1194536685943604, round time 3.1348156929016113