Formats de données courants à l'inférence - Amazon SageMaker

Formats de données courants à l'inférence

Les algorithmes Amazon SageMaker acceptent et produisent plusieurs types MIME pour les charges utiles http utilisées dans la récupération en ligne et les prédictions par mini-lots. Vous pouvez utiliser différents services AWS pour transformer ou prétraiter les enregistrements avant d'exécuter l'inférence. Au minimum, vous devez convertir les données pour les éléments suivants :

  • Sérialisation de demande d'inférence (géré par vous)

  • Désérialisation de demande d'inférence (géré par l'algorithme)

  • Sérialisation de réponse d'inférence (géré par l'algorithme)

  • Désérialisation de réponse d'inférence (géré par vous)

Conversion des données pour la sérialisation de demande d'inférence

Les options de type de contenu pour les demandes d'inférence d'algorithme Amazon SageMaker incluent : text/csv, application/json et application/x-recordio-protobuf. Les algorithmes qui ne prennent pas en charge tous ces types peuvent prendre en charge d'autres types. XGBoost, par exemple, prend en charge uniquement text/csv dans cette liste, mais prend en charge également text/libsvm.

Pour text/csv, la valeur de l'argument Body envoyé à invoke_endpoint doit être une chaîne avec des virgules entre les valeurs pour chaque fonction. Par exemple, un enregistrement pour un modèle ayant quatre fonctions peut ressembler à 1.5,16.0,14,23.0. Les transformations effectuées sur les données d'entraînement doivent également être exécutées sur les données avant d'obtenir l'inférence. L'ordre des fonctions est pris en compte et doit rester inchangé.

application/json est nettement plus flexible et offre plusieurs formats possibles pouvant être utilisés par les développeurs dans leurs applications. À un haut niveau, dans JavaScript, la charge utile peut ressembler à ce qui suit :

let request = { // Instances might contain multiple rows that predictions are sought for. "instances": [ { // Request and algorithm specific inference parameters. "configuration": {}, // Data in the specific format required by the algorithm. "data": { "<field name>": dataElement } } ] }

Vous avez les possibilités suivantes pour spécifier l'élément dataElement :

Équivalent des Protocol Buffers

// Has the same format as the protocol buffers implementation described for training. let dataElement = { "keys": [], "values": [], "shape": [] }

Vecteur numérique simple

// An array containing numeric values is treated as an instance containing a // single dense vector. let dataElement = [1.5, 16.0, 14.0, 23.0] // It will be converted to the following representation by the SDK. let converted = { "features": { "values": dataElement } }

Pour plusieurs enregistrements

let request = { "instances": [ // First instance. { "features": [ 1.5, 16.0, 14.0, 23.0 ] }, // Second instance. { "features": [ -2.0, 100.2, 15.2, 9.2 ] } ] }

Conversion des données pour la désérialisation de demande d'inférence

Les algorithmes Amazon SageMaker renvoient des données JSON dans plusieurs modèles. À un haut niveau, la structure est la suivante :

let response = { "predictions": [{ // Fields in the response object are defined on a per algorithm-basis. }] }

Les champs inclus dans les prédictions diffèrent d'un algorithme à l'autre. Voici des exemples de sorties pour l'algorithme des k-moyennes (k-means).

Inférence à enregistrement unique

let response = { "predictions": [{ "closest_cluster": 5, "distance_to_cluster": 36.5 }] }

Inférence à enregistrements multiples

let response = { "predictions": [ // First instance prediction. { "closest_cluster": 5, "distance_to_cluster": 36.5 }, // Second instance prediction. { "closest_cluster": 2, "distance_to_cluster": 90.3 } ] }

Inférence à enregistrements multiples avec entrée protobuf

{ "features": [], "label": { "closest_cluster": { "values": [ 5.0 ] // e.g. the closest centroid/cluster was 1.0 }, "distance_to_cluster": { "values": [ 36.5 ] } }, "uid": "abc123", "metadata": "{ "created_at": '2017-06-03' }" }

Les algorithmes SageMaker prennent également en charge le format JSONLINES, où le contenu de la réponse par enregistrement est identique à celui du format JSON. La structure à plusieurs enregistrements est une concaténation d'objets de réponse par enregistrement séparés par des caractères de saut de ligne. La réponse de l'algorithme k-moyennes (KMeans) intégré pour 2 points de données d'entrée présente le contenu suivant :

{"distance_to_cluster": 23.40593910217285, "closest_cluster": 0.0} {"distance_to_cluster": 27.250282287597656, "closest_cluster": 0.0}

Pendant l'exécution de la transformation par lots, nous recommandons d'utiliser la réponse du type jsonlines en définissant le champ Accept dans CreateTransformJobRequest sur application/jsonlines.

Formats de demande courants pour les algorithmes

La plupart des algorithmes utilisent plusieurs des formats de demande d'inférence suivants :

Format de demande JSON

Type de contenu : application/JSON

Format dense

let request = { "instances": [ { "features": [1.5, 16.0, 14.0, 23.0] } ] } let request = { "instances": [ { "data": { "features": { "values": [ 1.5, 16.0, 14.0, 23.0] } } } ] }

Format clairsemé

{ "instances": [ {"data": {"features": { "keys": [26, 182, 232, 243, 431], "shape": [2000], "values": [1, 1, 1, 4, 1] } } }, {"data": {"features": { "keys": [0, 182, 232, 243, 431], "shape": [2000], "values": [13, 1, 1, 4, 1] } } }, ] }

Format de demande JSONLINES

Type de contenu : application/JSONLINES

Format dense

Un seul enregistrement au format dense peut être représenté comme suit :

{ "features": [1.5, 16.0, 14.0, 23.0] }

ou:

{ "data": { "features": { "values": [ 1.5, 16.0, 14.0, 23.0] } }

Format clairsemé

Un seul enregistrement au format fragmenté est représenté comme suit :

{"data": {"features": { "keys": [26, 182, 232, 243, 431], "shape": [2000], "values": [1, 1, 1, 4, 1] } } }

Plusieurs enregistrements sont représentés sous la forme d'une concaténation des représentations à un seul enregistrement ci-dessus, séparées par des caractères de saut de ligne :

{"data": {"features": { "keys": [0, 1, 3], "shape": [4], "values": [1, 4, 1] } } } { "data": { "features": { "values": [ 1.5, 16.0, 14.0, 23.0] } } { "features": [1.5, 16.0, 14.0, 23.0] }

Format de demande CSV

Type de contenu : text/CSV; label_size=0

Note

La prise en charge du format CSV n'est pas disponible pour l'algorithme Factorization Machines.

Format de demande RECORDIO

Type de contenu : application/x-recordio-protobuf

Utiliser la transformation par lots avec les algorithmes intégrés

Lors de l'exécution de la transformation par lots, nous recommandons d'utiliser les réponses du type JSONLINES plutôt que JSON, si l'algorithme les prend en charge. Pour cela, définissez le champ Accept dans CreateTransformJobRequest sur application/jsonlines.

Lorsque vous créez une tâche de transformation, SplitType doit être défini en fonction du ContentType des données d'entrée. De même, selon le champ Accept dans CreateTransformJobRequest, AssembleWith doit être défini en conséquence. Utilisez le tableau suivant pour définir correctement ces champs :

ContentType SplitType recommandé
application/x-recordio-protobuf RecordIO
text/csv Line
application/jsonlines Line
application/json None
application/x-image None
image/* None
Accept AssembleWith recommandé
application/x-recordio-protobuf None
application/json None
application/jsonlines Line

Pour plus d'informations sur les formats de réponse pour les algorithmes spécifiques, consultez les éléments suivants :