How to run with Endpoints for Compute Engine with ESP#
This describes how to deploy a simple example gRPC server with the Extensible Server Proxy (ESP) through a Docker container in Google Compute Engine.
This page is based on this Google’s documentation with more detailed references. In this page we describes the steps specific for the example with appfl
.
As prerequisites, we need create a Compute Engine instance
Configuring Endpoints#
As this service requires .proto file, we first clone the package repository:
git clone git@github.com:APPFL/APPFL.git
The example we use in this page is located in APPFL/examples/gcloud
.
cd APPFL/examples/gcloud
Creating a self-contained protobuf descriptor file#
We create a protobuf descriptor file from ../../src/appfl/protos/federated_learning.proto
file.
To this end, we create the following directory
mkdir generated_pb2
and create the descriptor file api_descriptor.pb
by running the command below:
python -m grpc_tools.protoc \
--include_imports \
--include_source_info \
--proto_path=../../src/appfl/protos \
--descriptor_set_out=api_descriptor.pb \
--python_out=generated_pb2 \
--grpc_python_out=generated_pb2 \
federated_learning.proto
Creating a gRPC API configuration YAML file#
We need to create the configuration file api_config.yaml
. We provide the simple working example below:
type: google.api.Service
config_version: 3
name: appfl.endpoints.<YOUR_PROJECT_ID>.cloud.goog
title: APPFL gRPC API
apis:
- name: FederatedLearning
The value of name
becomes the API service name, and the value of apis.name
should match with the service name defined in .proto
file.
Deploying the Endpoints configuration#
Follow the steps in this page.
Deploying the API backend#
Follow the steps to install Docker on the VM instance.
We provide the the Docker commands below to run the example API and ESP in a Docker container, customized from the Google documentation. The following commands are run on the Google Compute Engine VM instance.
On the VM instance, create a container network
sudo docker network create --driver bridge esp_net
Run the APPFL gRPC server Docker container with the name of
appfl-test
on the networkesp_net
. The last line replaces the defaultCMD
value defined in the Docker container.sudo docker run \ --detach \ --name=appfl-test \ --net=esp_net \ gcr.io/$GCP_PROJECT/appfl-test:latest \ python3 grpc_mnist_server.py --nclients=3
Run the ESP Docker container provided by Google. By
--publish
, port 80 will be exposed and connected to HTTP2 port 9000.sudo docker run \ --detach \ --name=esp \ --publish=80:9000 \ --net=esp_net \ gcr.io/endpoints-release/endpoints-runtime:1 \ --service=appfl.endpoints.<YOUR_PROJECT_ID>.cloud.goog \ --rollout_strategy=managed \ --http2_port=9000 \ --backend=grpc://appfl-test:50051
Launching a client#
Find the external IP address for the gRPC Endpoints:
gcloud compute instances list
Launching a client to connect to the Endpoints requires to use API key. Follow the steps to create an API key to run a client.
A client can start the federated learning by running the command below with the API key copyandpasteyourapikeyhere
:
python grpc_mnist_client.py \
--host=<EXTERNAL_IP_ADDRESS> \
--port=80 \
--client_id=1 \
--nclients=3 \
--api_key=copyandpasteyourapikeyhere