[200] SERVERAPP_STRATEGY_PRECONDITION_UNMET

Description

La stratégie a reçu des réponses qui ne peuvent pas être agrégées car soit toutes les réponses n’ont pas un nombre de records supporté, soit les clés utilisées dans chaque enregistrement ne correspondent pas à celles d’autres réponses, ou encore la clé requise par la stratégie pour effectuer une moyenne pondérée est manquante.

Comment Résoudre

Veuillez vous assurer que toutes les réponses retournées par les applications Client ont un ArrayRecord (aucun lorsque les réponses proviennent d’une ronde d’évaluation fédéré, c’est-à-dire lorsqu’on utilise le type de message MessageType.EVALUATE) et un MetricRecord.

Les enregistrements dans toutes les réponses doivent utiliser des clés identiques. De plus, si la stratégie s’attend à une clé pour effectuer une moyenne pondérée (par exemple, dans FedAvg) veuillez vous assurer que le MetricRecord retourné par les applications Client inclut cette clé.

Voici quelques exemples de payloads (RecordDict) qui peuvent et ne peuvent pas être agrégés. Supposons que l’application Server ait été configurée pour utiliser FedAvg avec num-examples comme clé pour effectuer une moyenne pondérée :

Ces deux payloads peuvent être agrégés car toutes les clés correspondent, il y a un enregistrement de chaque type et la clé pour la moyenne pondérée est présente.

payload1 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),  # no ArrayRecord if in an evaluate round
        "metrics": MetricRecord({"loss": 0.123, "num-examples": 1234}),
    }
)
payload2 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),  # no ArrayRecord if in an evaluate round
        "metrics": MetricRecord({"loss": 0.01, "num-examples": 1234}),
    }
)

Ces payloads ne peuvent pas être agrégés car ils ont des clés non correspondantes (voir l’un d’eux a loss, l’autre a loss et accuracy)

payload1 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),
        "metrics": MetricRecord({"loss": 0.123, "num-examples": 1234}),
    }
)
payload2 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),
        "metrics": MetricRecord({"loss": 0.01, "accuracy": 0.99, "num-examples": 1234}),
    }
)

Ces deux payloads ne peuvent pas être agrégés (l’un manque un ArrayRecord)

payload1 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),
        "metrics": MetricRecord({"loss": 0.123, "num-examples": 1234}),
    }
)
payload2 = RecordDict({"metrics": MetricRecord({"loss": 0.01, "num-examples": 1234})})

Ces payloads ne peuvent pas être agrégés car il n’y a pas de clé pour l’agrégation pondérée

payload1 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),
        "metrics": MetricRecord({"loss": 0.123, "accuracy": 0.83}),
    }
)
payload2 = RecordDict(
    {
        "model-parameters": ArrayRecord(...),
        "metrics": MetricRecord({"loss": 0.01, "accuracy": 0.99}),
    }
)