บทช่วยสอนนี้จะอธิบายวิธีตั้งค่าการจำลองประสิทธิภาพสูงโดยใช้รันไทม์ TFF ที่ทำงานบน Kubernetes รูปแบบที่เป็นเช่นเดียวกับในการกวดวิชาก่อนหน้านี้แบบจำลองที่มีประสิทธิภาพสูงกับฉิบหาย ข้อแตกต่างเพียงอย่างเดียวคือที่นี่เราใช้พูลผู้ปฏิบัติงานแทนตัวดำเนินการในเครื่อง
กวดวิชานี้จะหมายถึง Google Cloud ของ GKE การสร้างคลัสเตอร์ Kubernetes แต่ทุกขั้นตอนหลังจากที่กลุ่มจะถูกสร้างขึ้นสามารถนำมาใช้กับการติดตั้ง Kubernetes
ดูบน TensorFlow.org | ทำงานใน Google Colab | ดูแหล่งที่มาบน GitHub | ดาวน์โหลดโน๊ตบุ๊ค |
เปิดตัว TFF Workers บน GKE
สร้างคลัสเตอร์ Kubernetes
ขั้นตอนต่อไปนี้ต้องทำเพียงครั้งเดียว คลัสเตอร์สามารถนำกลับมาใช้ใหม่สำหรับปริมาณงานในอนาคต
ทำตามคำแนะนำ GKE เพื่อ สร้างคลัสเตอร์ภาชนะ ส่วนที่เหลือของการกวดวิชานี้อนุมานว่าคลัสเตอร์เป็นชื่อ tff-cluster
แต่ชื่อจริงนั้นไม่สำคัญ หยุดทำตามคำแนะนำเมื่อคุณได้รับ "ขั้นตอนที่ 5: การปรับใช้แอพลิเคชันของคุณ"
ปรับใช้แอปพลิเคชัน TFF Worker
คำสั่งในการโต้ตอบกับ GCP สามารถทำงาน ในประเทศ หรือใน ระบบคลาวด์ของ Google เชลล์ เราขอแนะนำ Google Cloud Shell เนื่องจากไม่ต้องตั้งค่าเพิ่มเติม
- เรียกใช้คำสั่งต่อไปนี้เพื่อเปิดแอปพลิเคชัน Kubernetes
$ kubectl create deployment tff-workers --image=gcr.io/tensorflow-federated/remote-executor-service:latest
- เพิ่มตัวโหลดบาลานซ์สำหรับแอปพลิเคชัน
$ kubectl expose deployment tff-workers --type=LoadBalancer --port 80 --target-port 8000
ค้นหาที่อยู่ IP ของตัวโหลดบาลานซ์บน Google Cloud Console คุณจะต้องใช้ในภายหลังเพื่อเชื่อมต่อลูปการฝึกอบรมกับแอปผู้ปฏิบัติงาน
(อีกทางหนึ่ง) เปิดตัว Docker Container ในเครื่อง
$ docker run --rm -p 8000:8000 gcr.io/tensorflow-federated/remote-executor-service:latest
ตั้งค่า TFF Environment
!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))
ตั้งค่า Remote Executors
โดยค่าเริ่มต้น 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