En esta publicación continuaremos trabajando en la predicción de enlaces con el conjunto de datos de Twitch.
Ya tenemos los datos del gráfico exportados desde Neptune utilizando la utilidad neptune-export y el perfil 'neptune_ml'. Los pasos anteriores se describen en las partes 2 y 1 de esta guía.
Lea la parte 1 aquí y la parte 2 aquí.
Los datos actualmente están almacenados en S3 y tienen este aspecto:
Vértices CSV (nodos/usuario.consolidado.csv):
~id,~label,days,mature,views,partner "6980","user",771,true,2935,false "547","user",2602,true,18099,false "2173","user",1973,false,3939,false ...
CSV de bordes (edges/user-follows-user.consolidated.csv):
~id,~label,~from,~to,~fromLabels,~toLabels "3","follows","6194","2507","user","user" "19","follows","3","3739","user","user" "35","follows","6","2126","user","user" ...
La utilidad de exportación también generó este archivo de configuración para nosotros:
configuración-de-datos-de-entrenamiento.json:
{ "version" : "v2.0", "query_engine" : "gremlin", "graph" : { "nodes" : [ { "file_name" : "nodes/user.consolidated.csv", "separator" : ",", "node" : [ "~id", "user" ], "features" : [ { "feature" : [ "days", "days", "numerical" ], "norm" : "min-max", "imputer" : "median" }, { "feature" : [ "mature", "mature", "auto" ] }, { "feature" : [ "views", "views", "numerical" ], "norm" : "min-max", "imputer" : "median" }, { "feature" : [ "partner", "partner", "auto" ] } ] } ], "edges" : [ { "file_name" : "edges/%28user%29-follows-%28user%29.consolidated.csv", "separator" : ",", "source" : [ "~from", "user" ], "relation" : [ "", "follows" ], "dest" : [ "~to", "user" ], "features" : [ ] } ] }, "warnings" : [ ] }
Nuestro objetivo actual es realizar el procesamiento de datos, lo que significa convertir los datos que tenemos en un formato que el marco de la biblioteca Deep Graph pueda usar para el entrenamiento de modelos. (Para obtener una descripción general de la predicción de enlaces con solo DGL, consulte esta publicación ). Eso incluye la normalización de características numéricas, la codificación de características categóricas, la creación de listas de pares de nodos con enlaces existentes y no existentes para habilitar el aprendizaje supervisado para nuestra tarea de predicción de enlaces y la división de los datos en conjuntos de entrenamiento, validación y prueba.
Como puede ver en el archivo training-data-configuration.json , las características del nodo 'días' (antigüedad de la cuenta) y 'vistas' se reconocieron como numéricas, y se sugirió la normalización mínima-máxima. La normalización mínima-máxima escala valores arbitrarios a un rango de [0; 1] de la siguiente manera: x_normalized = (x - x_min) / (x_max - x_min). E imputer = median significa que los valores faltantes se completarán con el valor de la mediana.
Las características de nodo 'mature' y 'partner' están etiquetadas como 'auto' y, como esas columnas contienen solo valores booleanos, esperamos que se las reconozca como características categóricas y se las codifique durante la etapa de procesamiento de datos. La división de entrenamiento-validación-prueba no está incluida en este archivo generado automáticamente y la división predeterminada para la tarea de predicción de vínculos es 0,9, 0,05, 0,05.
Puede ajustar la configuración de normalización y codificación, y puede elegir una división personalizada de entrenamiento, validación y prueba. Si elige hacerlo, simplemente reemplace el archivo training-data-configuration.json original en S3 con la versión actualizada. La lista completa de campos admitidos en ese JSON está disponible aquí . En esta publicación, dejaremos este archivo sin cambios.
Al igual que en la etapa de carga de datos (que se describe en la Parte 1 de este tutorial), necesitamos crear roles de IAM que permitan el acceso a los servicios que usaremos, y también necesitamos agregar esos roles a nuestro clúster de Neptune. Necesitamos dos roles para la etapa de procesamiento de datos. El primero es un rol de Neptune que proporciona acceso de Neptune a SageMaker y S3. El segundo es un rol de ejecución de SageMaker que SageMaker usa mientras ejecuta la tarea de procesamiento de datos y permite el acceso a S3.
Estos roles deben tener políticas de confianza que permitan a los servicios Neptune y SageMaker asumirlos:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "sagemaker.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Sid": "", "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Después de crear los roles y actualizar sus políticas de confianza, los agregaremos al clúster Neptune (Neptune -> Bases de datos -> YOUR_NEPTUNE_CLUSTER_ID -> Conectividad y seguridad -> Roles de IAM -> Agregar rol).
Ahora que hemos actualizado el archivo training-data-configuration.json y hemos agregado los roles de IAM al clúster de Neptune, estamos listos para iniciar el trabajo de procesamiento de datos. Para ello, debemos enviar una solicitud a la API HTTP del clúster de Neptune desde dentro de la VPC donde se encuentra el clúster. Usaremos una instancia de EC2 para hacerlo.
Usaremos curl para iniciar el trabajo de procesamiento de datos:
curl -XPOST https://(YOUR_NEPTUNE_ENDPOINT):8182/ml/dataprocessing \ -H 'Content-Type: application/json' \ -d '{ "inputDataS3Location" : "s3://SOURCE_BUCKET/neptune-export/...", "processedDataS3Location" : "s3://OUTPUT_BUCKET/neptune-export-processed/...", "neptuneIamRoleArn": "arn:aws:iam::123456789012:role/NeptuneMLDataProcessingNeptuneRole", "sagemakerIamRoleArn": "arn:aws:iam::123456789012:role/NeptuneMLDataProcessingSagemakerRole" }'
Solo se requieren estos 4 parámetros: ubicación de los datos de entrada en S3, ubicación de los datos procesados en S3, rol de Neptune, rol de Sagemaker. Hay muchos parámetros opcionales: por ejemplo, podemos seleccionar manualmente el tipo de instancia EC2 que se creará para nuestra tarea de procesamiento de datos con processingInstanceType
y configurar su tamaño de volumen de almacenamiento con processingInstanceVolumeSizeInGB
. La lista completa de parámetros se puede encontrar aquí .
El clúster responde con un JSON que contiene el ID del trabajo de procesamiento de datos que acabamos de crear:
{"id":"d584f5bc-d90e-4957-be01-523e07a7562e"}
Podemos usarlo para obtener el estado del trabajo con este comando (use el mismo neptuneIamRoleArn que en la solicitud anterior):
curl https://YOUR_NEPTUNE_CLUSTER_ENDPOINT:8182/ml/dataprocessing/YOUR_JOB_ID?neptuneIamRoleArn='arn:aws:iam::123456789012:role/NeptuneMLDataProcessingNeptuneRole'
Una vez que responde con algo como esto,
{ "processingJob": {...}, "id":"d584f5bc-d90e-4957-be01-523e07a7562e", "status":"Completed" }
Podemos comprobar el resultado. Estos archivos se crearon en el depósito S3 de destino:
Los archivos graph.* contienen los datos del gráfico procesados.
El archivo features.json contiene las listas de características de nodos y bordes:
{ "nodeProperties": { "user": [ "days", "mature", "views", "partner" ] }, "edgeProperties": {} }
Los detalles sobre cómo se procesaron los datos y cómo se codificaron las características se pueden encontrar en el archivo updated_training_config.json :
{ "graph": { "nodes": [ { "file_name": "nodes/user.consolidated.csv", "separator": ",", "node": [ "~id", "user" ], "features": [ { "feature": [ "days", "days", "numerical" ], "norm": "min-max", "imputer": "median" }, { "feature": [ "mature", "mature", "category" ] }, { "feature": [ "views", "views", "numerical" ], "norm": "min-max", "imputer": "median" }, { "feature": [ "partner", "partner", "category" ] } ] } ], "edges": [ { "file_name": "edges/%28user%29-follows-%28user%29.consolidated.csv", "separator": ",", "source": [ "~from", "user" ], "relation": [ "", "follows" ], "dest": [ "~to", "user" ] } ] } }
Podemos ver que las columnas 'mature' y 'partner' con valores booleanos, inicialmente etiquetadas como 'auto' en el archivo training-data-configuration.json, se codificaron como características de categoría.
El archivo 'train_instance_recommendation.json' contiene el tipo de instancia de SageMaker y el tamaño de almacenamiento recomendados para el entrenamiento del modelo:
{ "instance": "ml.g4dn.2xlarge", "cpu_instance": "ml.m5.2xlarge", "disk_size": 14126462, "mem_size": 4349122131.111111 }
El archivo model-hpo-configuration.json contiene el tipo de modelo, las métricas utilizadas para su evaluación, la frecuencia de la evaluación y los hiperparámetros.
Con esto concluye la etapa de procesamiento de datos del proceso, ya que ahora estamos listos para comenzar a entrenar el modelo de ML. Se analizará este tema en la siguiente parte de esta guía.