Na tej stronie opisujemy, jak korzystać z interfejsów API sfederowanego uczenia się udostępnianych przez usługę personalizacji na urządzeniu, aby trenować model za pomocą procesu sfederowanego uczenia się z uśrednianiem i stałym szumem gaussowskim.
Zanim zaczniesz
Zanim zaczniesz, wykonaj te czynności na urządzeniu testowym:
Upewnij się, że moduł personalizacji na urządzeniu jest zainstalowany. Moduł stał się dostępny jako automatyczna aktualizacja w kwietniu 2024 r.
# List the modules installed on the device adb shell pm list packages --apex-only --show-versioncode
Upewnij się, że wymieniony poniżej moduł ma kod wersji 341717000 lub nowszy:
package:com.google.android.ondevicepersonalization versionCode:341717000
Jeśli moduł nie jest widoczny, otwórz Ustawienia > Zabezpieczenia i prywatność > Aktualizacje > Aktualizacja systemu Google Play, aby sprawdzić, czy urządzenie jest aktualne. W razie potrzeby kliknij Zaktualizuj.
Włącz wszystkie nowe funkcje związane z nauczaniem federacyjnym.
# Enable On-Device Personalization apk. adb shell device_config put on_device_personalization global_kill_switch false # Enable On-Device Personalization APIs. adb shell device_config put on_device_personalization enable_ondevicepersonalization_apis true # Enable On-Device Personalization overriding. adb shell device_config put on_device_personalization enable_personalization_status_override true adb shell device_config put on_device_personalization personalization_status_override_value true # Enable Federated Compute apk. adb shell device_config put on_device_personalization federated_compute_kill_switch false
Tworzenie zadania sfederowanego uczenia się
Liczby na diagramie są opisane bardziej szczegółowo w 8 następnych krokach.
Konfigurowanie serwera obliczeniowego federacji
Sfederowane uczenie się to technika map-reduce, która działa na serwerze obliczeniowym federacji (reduktorze) i na zestawie klientów (maperów). Serwer Federated Compute przechowuje metadane i informacje o modelu dotyczące każdego zadania sfederowanego uczenia się. Ogólnie:
- Deweloperzy korzystający z federowanego uczenia maszynowego tworzą nowe zadanie i przesyłają na serwer metadane dotyczące jego wykonywania oraz informacje o modelu.
- Gdy klient usługi Federated Compute inicjuje na serwerze nowe żądanie przypisania zadania, serwer sprawdza, czy zadanie kwalifikuje się do wykonania, i zwraca informacje o kwalifikującym się zadaniu.
- Gdy klient usługi Federated Compute zakończy obliczenia lokalne, wysyła wyniki obliczeń na serwer. Następnie serwer agreguje te wyniki i dodaje do nich szum, a potem stosuje je w modelu końcowym.
Aby dowiedzieć się więcej o tych pojęciach, zapoznaj się z tymi materiałami:
- Sfederowane uczenie się: wspólne uczenie się maszynowe bez scentralizowanych danych treningowych
- Towards Federated Learning at Scale: System Design (SysML 2019)
ODP korzysta z ulepszonej wersji sfederowanego uczenia się, w której do agregatów przed zastosowaniem do modelu dodawany jest scentralizowany szum. Skala szumu zapewnia, że dane zbiorcze zachowują prywatność różnicową.
Krok 1. Tworzenie federacyjnego serwera obliczeniowego
Aby skonfigurować własny serwer federacyjnego przetwarzania, postępuj zgodnie z instrukcjami w projekcie federacyjnego przetwarzania.
Krok 2. Przygotowanie zapisanego modelu funkcjonalnego
Przygotuj zapisany plik „FunctionalModel”. Możesz użyć funkcji 'functional_model_from_keras', aby przekonwertować 'Model' na 'FunctionalModel', a funkcję 'save_functional_model', aby zakodować ten 'FunctionalModel' jako 'SavedModel'.
functional_model = tff.learning.models.functional_model_from_keras(keras_model=model)
tff.learning.models.save_functional_model(functional_model, saved_model_path)
Krok 3. Tworzenie konfiguracji serwera federacyjnego
Przygotuj fcp_server_config.json
, który zawiera zasady, konfigurację sfederowanego uczenia się i konfigurację prywatności różnicowej. Przykład:
# Identifies the set of client devices that will participate.
population_name: "my_new_population"
# Options you can choose:
# * TRAINING_ONLY: Only one training task will be generated under this
# population.
# * TRAINING_AND_EVAL: One training task and one evaluation task will be
# generated under this population.
# * EVAL_ONLY: Only one evaluation task will be generated under this
# population.
mode: TRAINING_AND_EVAL
policies {
# Policy for sampling on-device examples. It is checked every time a
# device attempts to start a new training.
min_separation_policy {
# The minimum number of rounds before the same client participated.
minimum_separation: 3
}
# Policy for releasing training results to developers. It is checked
# when uploading a new task to the Federated Compute Server.
model_release_policy {
# Server stops training when number of training rounds reaches this
# number.
num_max_training_rounds: 1000
}
}
# Federated learning setups. They are applied inside Task Builder.
federated_learning {
learning_process {
# Use FED_AVG to build federated learning process. Options you can
# choose:
# * FED_AVG: Federated Averaging algorithm
# (https://arxiv.org/abs/2003.00295)
# * FED_SDG: Federated SGD algorithm
# (https://arxiv.org/abs/1602.05629)
type: FED_AVG
# Optimizer used at client side training. Options you can choose:
# * ADAM
# * SGD
client_optimizer: SGD
# Learning rate used at client side training.
client_learning_rate: 0.01
# Optimizer used at server side training. Options you can choose:
# * ADAM
# * SGD
server_optimizer: ADAM
# Learning rate used at server side training.
sever_learning_rate: 1
runtime_config {
# Number of participating devices for each round of training.
report_goal: 2000
}
# List of metrics to be evaluated by the model during training and
# evaluation. Federated Compute Server provides a list of allowed
# metrics.
metrics {
name: "auc-roc"
}
metrics {
name: "binary_accuracy"
}
}
# Whether or not to generate a corresponding evaluation task under the same
# population. If this field isn't set, only one training task is
# generated under this population.
evaluation {
# The task id under the same population of the source training task that
# this evaluation task evaluates.
source_training_task_id: 1
# Decides how checkpoints from the training task are chosen for
# evaluation.
# * every_k_round: the evaluation task randomly picks one checkpoint
# from the past k rounds of training task checkpoints.
# * every_k_hour: the evaluation task randomly picks one checkpoint
# from the past k hours of training task checkpoints.
checkpoint_selector: "every_1_round"
# The traffic of this evaluation task in this population.
evaluation_traffic: 0.1
# Number of participating devices for each round of evaluation.
report_goal: 200
}
}
# Differential Privacy setups. They are applied inside the Task Builder.
differential_privacy {
# The DP aggregation algorithm you want to use. Options you can choose:
# * FIXED_GAUSSIAN: Federated Learning DP-SGD with fixed clipping norm
# described in "Learning Differentially Private Recurrent
# Language Models" (https://arxiv.org/abs/1710.06963).
# * ADAPTIVE_GAUSSIAN: Federated Learning DP-SGD with quantile-based clip
# norm estimation described in "Differentially Private
# Learning with Adaptive Clipping"
# (https://arxiv.org/abs/1905.03871).
# * TREE: DP-FTRL algorithm described in "Practical and Private (Deep)
# Learning without Sampling or Shuffling"
# (https://arxiv.org/abs/2103.00039).
# * ADADPTIVE_TREE: DP-FTRL with adaptive clipping norm descirbed in
# "Differentially Private Learning with Adaptive Clipping"
# (https://arxiv.org/abs/1905.03871).
type: FIXED_GAUSSIAN
# Noise multiplier for the Gaussian noise.
noise_multiplier: 0.1
# The value of the clipping norm.
clip_norm: 0.1
}
Krok 4. Prześlij skompresowaną konfigurację na serwer Federated Compute.
Prześlij plik ZIP i fcp_server_config.json
na serwer Federated Compute.
task_builder_client --task_builder_server='http://{federated_compute_server_endpoint}' --saved_model='saved_model' --task_config='fcp_server_config.json'
Punkt końcowy zfederowanego serwera Compute to serwer skonfigurowany w kroku 1.
Wbudowana biblioteka operatorów LiteRT obsługuje tylko ograniczoną liczbę operatorów TensorFlow (wybrane operatory TensorFlow). Zestaw obsługiwanych operatorów może się różnić w zależności od wersji modułu Personalizacja na urządzeniu. Aby zapewnić zgodność, w procesie tworzenia zadania w komponencie do tworzenia zadań przeprowadzany jest proces weryfikacji operatora.
Minimalna obsługiwana wersja modułu personalizacji na urządzeniu zostanie uwzględniona w metadanych zadania. Informacje te znajdziesz w wiadomości z informacjami w kreatorze zadań.
I1023 22:16:53.058027 139653371516736 task_builder_client.py:109] Success! Tasks are built, and artifacts are uploaded to the cloud. I1023 22:16:53.058399 139653371516736 task_builder_client.py:112] applied_algorithms { learning_algo: FED_AVG client_optimizer: SGD server_optimizer: SGD dp_aggregator: FIXED_GAUSSIAN } metric_results { accepted_metrics: "binary_accuracy, binary_crossentropy, recall, precision, auc-roc, auc-pr" } dp_hyperparameters { dp_delta: 0.000001 dp_epsilon: 6.4 noise_multiplier: 1.0 dp_clip_norm: 1.0 num_training_rounds: 10000 } I1023 22:16:53.058594 139653371516736 task_builder_client.py:113] training_task { min_client_version: "341912000" } eval_task { min_client_version: "341812000" }
Serwer Federated Compute przypisze to zadanie do wszystkich urządzeń wyposażonych w moduł personalizacji na urządzeniu z wersją wyższą niż 341812000.
Jeśli Twój model zawiera operacje, które nie są obsługiwane przez żadne moduły usługi Personalizacja na urządzeniu, podczas tworzenia zadania zostanie wygenerowany komunikat o błędzie.
common.TaskBuilderException: Cannot build the ClientOnlyPlan: Please contact Google to register these ops: {'L2Loss': 'L2LossOp<CPUDevice, float>'} . Stop building remaining artifacts.
Szczegółową listę obsługiwanych operacji elastycznych znajdziesz na GitHub.
Tworzenie pliku APK z usługą federacyjnej obsługi obliczeniowej na Androida
Aby utworzyć plik APK z usługą federacyjnego przetwarzania na Androida, musisz określić w AndroidManifest.xml
adres URL punktu końcowego serwera federacyjnego przetwarzania, z którym łączy się klient federacyjnego przetwarzania.
Krok 5. Określ adres URL punktu końcowego zfederowanego serwera obliczeniowego
W pliku AndroidManifest.xml
określ adres URL punktu końcowego serwera obliczeniowego federacji (skonfigurowany w kroku 1), z którym łączy się klient obliczeniowy federacji.
<!-- Contents of AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.odpsample" >
<application android:label="OdpSample">
<!-- XML resource that contains other ODP settings. -->
<property android:name="android.ondevicepersonalization.ON_DEVICE_PERSONALIZATION_CONFIG"
android:resource="@xml/OdpSettings"></property>
<!-- The service that ODP will bind to. -->
<service android:name="com.example.odpsample.SampleService"
android:exported="true" android:isolatedProcess="true" />
</application>
</manifest>
Plik zasobu XML określony w tagu <property>
musi też deklarować klasę usługi w tagu <service>
i określać adres URL punktu końcowego serwera obliczeniowego federacyjnego, z którym połączy się klient obliczeniowy federacyjny:
<!-- Contents of res/xml/OdpSettings.xml -->
<on-device-personalization>
<!-- Name of the service subclass -->
<service name="com.example.odpsample.SampleService">
<!-- If you want to use federated compute feature to train a model,
specify this tag. -->
<federated-compute-settings url="https://fcpserver.com/" />
</service>
</on-device-personalization>
Krok 6. Wdrażanie interfejsu IsolatedWorker#onTrainingExample
API
Wdroż interfejs publiczny API do personalizacji na urządzeniu IsolatedWorker#onTrainingExample
, aby generować dane szkoleniowe.
Kod działający w ramach IsolatedProcess
nie ma bezpośredniego dostępu do sieci, dysków lokalnych ani innych usług działających na urządzeniu. Dostępne są jednak te interfejsy API:
- „getRemoteData” – niezmienne dane par klucz-wartość pobrane z zewnętrznych serwerów, które są obsługiwane przez dewelopera (jeśli to możliwe).
- „getLocalData” – zmienne dane klucz-wartość zapisane lokalnie przez deweloperów (jeśli to możliwe).
- „UserData” – dane użytkownika podane przez platformę.
- 'getLogReader' – zwraca interfejs DAO dla tabel REQUESTS i EVENTS.
Przykład:
@Override public void onTrainingExample(
@NonNull TrainingExampleInput input,
@NonNull Consumer<TrainingExampleOutput> consumer) {
// Check if the incoming training task is the task we want.
if (input.getPopulationName() == "my_new_population") {
TrainingExampleOutput result = new TrainingExampleOutput.Builder():
RequestLogRecord record = this.getLogReader().getRequestLogRecord(1);
int count = 1;
// Iterate logging event table.
for (ContentValues contentValues: record.rows()) {
Features features = Features.newBuilder()
// Retrieve carrier from user info.
.putFeature("carrier", buildFeature(mUserData.getCarrier()))
// Retrieve features from logging info.
.putFeature("int_feature_1",
buildFeature(contentValues.get("int_feature_1")
result.addTrainingExample(
Example.newBuilder()
.setFeatures(features).build().toByteArray())
.addResumptionToken(
String.format("token%d", count).getBytes()))
.build();
count++;
}
consumer.accept(result.build());
}
}
Krok 7. Zaplanuj cykliczne zadanie treningowe.
Personalizacja na urządzeniu zapewnia FederatedComputeScheduler
dla programistów, aby mogli planować lub anulować zadania obliczeniowe w federacji. Istnieją różne opcje wywołania IsolatedWorker
, np. zgodnie z harmonogramem lub po zakończeniu asynchronicznego pobierania. Poniżej znajdziesz przykłady obu tych metod.
Opcja oparta na harmonogramie. Zadzwoń do firmy
FederatedComputeScheduler#schedule
–IsolatedWorker#onExecute
.@Override public void onExecute( @NonNull ExecuteInput input, @NonNull Consumer<ExecuteOutput> consumer ) { if (input != null && input.getAppParams() != null && input.getAppParams().getString("schedule_training") != null) { if (input.getAppParams().getString("schedule_training").isEmpty()) { consumer.accept(null); return; } TrainingInterval interval = new TrainingInterval.Builder() .setMinimumInterval(Duration.ofSeconds(10)) .setSchedulingMode(2) .build(); FederatedComputeScheduler.Params params = new FederatedComputeScheduler .Params(interval); FederatedComputeInput fcInput = new FederatedComputeInput.Builder() .setPopulationName( input.getAppParams().getString("schedule_training")).build(); mFCScheduler.schedule(params, fcInput); ExecuteOutput result = new ExecuteOutput.Builder().build(); consumer.accept(result); } }
Opcja Pobieranie zakończone. W funkcji
FederatedComputeScheduler#schedule
w funkcjiIsolatedWorker#onDownloadCompleted
, jeśli planowanie zadania treningowego zależy od danych lub procesów asynchronicznych.
Weryfikacja
Poniższe kroki opisują, jak sprawdzić, czy zadanie uczenia się rozproszonego działa prawidłowo.
Krok 8. Sprawdź, czy zadanie federacyjnego uczenia się działa prawidłowo.
W każdej rundzie agregacji po stronie serwera generowany jest nowy punkt kontrolny modelu i nowy plik danych.
Dane są w pliku w formacie JSON zawierającym pary klucz-wartość. Plik jest generowany na podstawie listy Metrics
zdefiniowanej w kroku 3. Przykład reprezentatywnego pliku JSON z danymi:
{"server/client_work/train/binary_accuracy":0.5384615659713745, "server/client_work/train/binary_crossentropy":0.694046676158905, "server/client_work/train/recall":0.20000000298023224, "server/client_work/train/precision":0.3333333432674408, "server/client_work/train/auc-roc":0.3500000238418579, "server/client_work/train/auc-pr":0.44386863708496094, "server/finalizer/update_non_finite":0.0}
Aby uzyskać dane o modelu i monitorować skuteczność trenowania, możesz użyć skryptu podobnego do tego:
import collections
import json
import matplotlib.pyplot as plt
from google.cloud import storage
# The population_name you set in fcp_server_config.json in Step 3.
POPULATION_NAME = 'my_new_population'
# The Google Cloud storage you set in Step 1.
GCS_BUCKET_NAME = 'fcp-gcs'
NUM_TRAINING_ROUND = 1000
storage_client = storage.Client()
bucket = storage_client.bucket(GCS_BUCKET_NAME)
metrics = collections.defaultdict(list)
for i in range(NUM_TRAINING_ROUND):
blob = bucket.blob('{}/{}/1/{}/s/0/metrics'.format(GCS_BUCKET_NAME, POPULATION_NAME, i+1))
with blob.open("r") as f:
metric = json.loads(f.read())
for metric_name in metric.keys():
metrics[metric_name].append(metric[metric_name])
for metric_name in metrics:
print(metric_name)
plt.plot(metrics[metric_name])
plt.show()

W poprzednim przykładzie wykresu:
- Oś X to liczba rund trenowania.
- Oś Y to wartość AUC-ROC w każdej rundzie.
Trenowanie modelu klasyfikacji obrazów na potrzeby personalizacji na urządzeniu
W tym samouczku do demonstracji uruchamiania zadania sfederowanego uczenia się w ODP używamy zbioru danych EMNIST.
Krok 1. Utwórz klasę tff.learning.models.FunctionalModel
def get_image_classification_input_spec():
return (
tf.TensorSpec([None, 28, 28, 1], tf.float32),
tf.TensorSpec([None, 1], tf.int64),
)
def create_and_save_image_classification_functional_model(
model_path: str,
) -> None:
keras_model = emnist_models.create_original_fedavg_cnn_model(
only_digits=True
)
functional_model = tff.learning.models.functional_model_from_keras(
keras_model=keras_model,
input_spec=get_image_classification_input_spec(),
loss_fn=tf.keras.losses.SparseCategoricalCrossentropy(),
)
tff.learning.models.save_functional_model(functional_model, model_path)
- Szczegóły modelu emnist keras znajdziesz w pliku emnist_models.
- TfLite nie obsługuje jeszcze dobrze funkcji tf.sparse.SparseTensor ani tf.RaggedTensor. Podczas tworzenia modelu staraj się jak najczęściej używać funkcji tf.Tensor.
- Kreator zadań ODP nadpisuje wszystkie dane podczas tworzenia procesu uczenia się, więc nie trzeba ich podawać. Ten temat zostanie dokładniej omówiony w kroku 2. Utwórz konfigurację kreatora zadań.
Obsługiwane są 2 typy danych wejściowych modelu:
Typ 1. Tuple(features_tensor, label_tensor).
- Podczas tworzenia modelu specyfikacja wejścia wygląda tak:
def get_input_spec(): return ( tf.TensorSpec([None, 28, 28, 1], tf.float32), tf.TensorSpec([None, 1], tf.int64), )
- Połącz to z implementacją interfejsu API publicznego ODP IsolatedWorker#onTrainingExamples, aby wygenerować dane treningowe na urządzeniu:
return tf.train.Example( features=tf.train.Features( feature={ 'x': tf.train.Feature( float_list=tf.train.FloatList(value=[1.0] * 784) ), 'y': tf.train.Feature( int64_list=tf.train.Int64List( value=[1] ) ), } ) ).SerializeToString()
Typ 2.
Tuple(Dict[feature_name, feature_tensor], label_tensor)
- Podczas tworzenia modelu specyfikacja wejścia wygląda tak:
def get_input_spec() -> ( Tuple[collections.OrderedDict[str, tf.TensorSpec], tf.TensorSpec] ): return ( collections.OrderedDict( [('feature-1', tf.TensorSpec([None, 1], tf.float32)), ('feature-2', tf.TensorSpec([None, 1], tf.float32))] ), tf.TensorSpec([None, 1], tf.int64), )
- Połącz to z implementacją interfejsu publicznego ODP IsolatedWorker#onTrainingExamples, aby wygenerować dane szkoleniowe:
return tf.train.Example( features=tf.train.Features( feature={ 'feature-1': tf.train.Feature( float_list=tf.train.FloatList(value=[1.0]) ), 'feature-2': tf.train.Feature( float_list=tf.train.FloatList(value=[2.0]) ), 'my_label': tf.train.Feature( int64_list=tf.train.Int64List( value=[1] ) ), } ) ).SerializeToString()
- Pamiętaj, aby zarejestrować parametr label_name w konfiguracji kreatora zadań.
mode: TRAINING_AND_EVAL # Task execution mode population_name: "my_example_model" label_name: "my_label"
ODP obsługuje DP automatycznie podczas tworzenia procesu nauki. Dlatego podczas tworzenia modelu funkcjonalnego nie trzeba dodawać żadnych zakłóceń.
Wyjście z zapisanego modelu funkcjonalnego powinno wyglądać jak przykład w naszym repozytorium GitHub.
Krok 2. Tworzenie konfiguracji kreatora zadań
Przykłady konfiguracji kreatora zadań znajdziesz w naszym repozytorium GitHub.
Wskaźniki trenowania i oceny
Dane mogą zawierać informacje o użytkownikach, dlatego w Kreatorze zadań będzie dostępna lista danych, które proces uczenia się może generować i publikować. Pełną listę znajdziesz w naszym repozytorium GitHub.
Oto przykładowa lista danych podczas tworzenia nowej konfiguracji kreatora zadań:
federated_learning { learning_process { metrics { name: "binary_accuracy" } metrics { name: "binary_crossentropy" } metrics { name: "recall" } metrics { name: "precision" } metrics { name: "auc-roc" } metrics { name: "auc-pr" } } }
Jeśli interesujących Cię danych nie ma na obecnej liście, skontaktuj się z nami.
Konfiguracje DP
Istnieje kilka konfiguracji związanych z DP, które należy określić:
policies { min_separation_policy { minimum_separation: 1 } model_release_policy { num_max_training_rounds: 1000 dp_target_epsilon: 10 dp_delta: 0.000001 } } differential_privacy { type: FIXED_GAUSSIAN clip_norm: 0.1 noise_multiplier: 0.1 }
- Aby przejść weryfikację, musi być obecna albo
dp_target_epsilon
, albonoise_mulitipiler
: (noise_to_epsilon
epislon_to_noise
). - Te ustawienia domyślne znajdziesz w naszym repozytorium GitHub.
- Aby przejść weryfikację, musi być obecna albo
Krok 3. Przesyłanie zapisanego modelu i konfiguracji kreatora zadań do dowolnego miejsca w chmurze dla deweloperów
Podczas przesyłania konfiguracji kreatora zadań pamiętaj, aby zaktualizować pola artifact_building.
Krok 4. (Opcjonalnie) Testowanie tworzenia artefaktu bez tworzenia nowego zadania
cd ${odp_fcp_github_repo}/python
bazel run //python/taskbuilder:task_builder_client -- --saved_model=${path_of_cloud_storage}/mnist_model/ --task_config=${path_of_cloud_storage}/mnist_cnn_task_config_build_artifact_only.pbtxt --build_artifact_only=true --task_builder_server=${task_builder_server_endpoint}
Przykładowy model jest weryfikowany za pomocą kontroli operacji elastycznych i kontroli dp. Możesz dodać skip_flex_ops_check
i skip_dp_check
, aby pominąć weryfikację (tego modelu nie można wdrożyć w bieżącej wersji klienta ODP z powodu braku kilku operacji elastycznych).
cd ${odp_fcp_github_repo}/python
bazel run //python/taskbuilder:task_builder_client -- --saved_model=${path_of_cloud_storage}/mnist_model/ --task_config=${path_of_cloud_storage}/mnist_cnn_task_config_build_artifact_only.pbtxt --build_artifact_only=true --task_builder_server=${task_builder_server_endpoint} --skip_flex_ops_check=True --skip_dp_check=True
flex_ops_check: wbudowana biblioteka operatorów TensorFlow Lite obsługuje tylko ograniczoną liczbę operatorów TensorFlow (zgodność operatorów TensorFlow Lite i TensorFlow). Wszystkie niezgodne operacje TensorFlow należy zainstalować za pomocą delegata flex (Android.bp). Jeśli model zawiera operacje, które nie są obsługiwane, skontaktuj się z nami, aby zarejestrować je:
Cannot build the ClientOnlyPlan: Please contact Google to register these ops: {...}
Najlepszym sposobem na debugowanie kreatora zadań jest uruchomienie go lokalnie:
# Starts a server at localhost:5000 bazel run //python/taskbuilder:task_builder # Links to a server at localhost:5000 by removing task_builder_server flag bazel run //python/taskbuilder:task_builder_client -- --saved_model=${path_of_cloud_storage}/mnist_model/ --task_config=${path_of_cloud_storage}/mnist_cnn_task_config_build_artifact_only.pbtxt --build_artifact_only=true --skip_flex_ops_check=True --skip_dp_check=True
Wygenerowane artefakty znajdziesz w chmurze wskazanej w konfiguracji. Powinna ona wyglądać mniej więcej tak jak przykład w naszym repozytorium GitHub.
Krok 5. Utwórz artefakty i nowy zestaw zadań szkoleniowych i oceny na serwerze FCP.
Usuń flagę build_artifact_only
, a zbudowane artefakty zostaną przesłane na serwer FCP. Sprawdź, czy udało się utworzyć parę zadań treningowych i ewaluacyjnych.
cd ${odp_fcp_github_repo}/python
bazel run //python/taskbuilder:task_builder_client -- --saved_model=${path_of_cloud_storage}/mnist_model/ --task_config=${path_of_cloud_storage}/mnist_cnn_task_config.pbtxt --task_builder_server=${task_builder_server_endpoint}
Krok 6. Przygotowanie po stronie klienta FCP
- Wdrożyć publiczny interfejs API ODP
IsolatedWorker#onTrainingExamples
, aby wygenerować dane treningowe. - Zadzwoń pod numer
FederatedComputeScheduler#schedule
. - W naszym repozytorium kodu źródłowego Androida znajdziesz kilka przykładów.
Krok 7. Monitorowanie
Dane serwera
Instrukcje konfiguracji znajdziesz w naszym repozytorium GitHub.



- Dane modelu

Dane z różnych przebiegów można porównać na jednym diagramie. Na przykład:
- Fioletowa linia to
noise_multiplier
0,1 - Różowa linia to
noise_multipiler
0,3