شبیه سازی با عملکرد بالا با Kubernetes

این آموزش نحوه راه اندازی شبیه سازی با کارایی بالا با استفاده از زمان اجرا TFF در Kubernetes را توضیح می دهد. مدل همان است که در آموزش قبلی، شبیه سازی عملکرد بالا با TFF است. تنها تفاوت این است که در اینجا ما به جای یک مجری محلی از یک worker pool استفاده می کنیم.

این آموزش اشاره به Google Cloud را GKE به ایجاد خوشه Kubernetes، اما تمام مراحل پس از خوشه ایجاد شده است می تواند با هر نصب و راه اندازی Kubernetes استفاده می شود.

مشاهده در TensorFlow.org در Google Colab اجرا شود مشاهده منبع در GitHub دانلود دفترچه یادداشت

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 جستجو کنید. بعداً برای اتصال حلقه آموزشی به برنامه worker به آن نیاز خواهید داشت.

(به طور متناوب) 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