Nesta postagem, continuaremos trabalhando na previsão de links com o conjunto de dados do Twitch.
Já temos os dados do gráfico exportados do Neptune usando o utilitário neptune-export e o perfil 'neptune_ml'. Os passos anteriores são descritos nas partes 2 e 1 deste guia.
Leia a parte 1 aqui e a parte 2 aqui.
Os dados estão atualmente armazenados no S3 e têm esta aparência:
Vértices CSV (nodes/user.consolidated.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 ...
Bordas CSV (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" ...
O utilitário de exportação também gerou este arquivo de configuração para nós:
configuração-de-dados-de-treinamento.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" : [ ] }
Nosso objetivo atual é executar o processamento de dados, o que significa converter os dados que temos em um formato que a estrutura Deep Graph Library pode usar para treinamento de modelos. (Para uma visão geral da predição de links apenas com DGL, veja esta postagem ). Isso inclui normalização de recursos numéricos, codificação de recursos categóricos, criação de listas de pares de nós com links existentes e inexistentes para habilitar o aprendizado supervisionado para nossa tarefa de predição de links e divisão dos dados em conjuntos de treinamento, validação e teste.
Como você pode ver no arquivo training-data-configuration.json , os recursos do nó 'days' (idade da conta) e 'views' foram reconhecidos como numéricos, e a normalização min-max foi sugerida. A normalização min-max dimensiona valores arbitrários para um intervalo de [0; 1] como este: x_normalized = (x - x_min) / (x_max - x_min). E imputer = median significa que os valores ausentes serão preenchidos com o valor mediano.
Os recursos do nó 'mature' e 'partner' são rotulados como 'auto' e, como essas colunas contêm apenas valores booleanos, esperamos que sejam reconhecidos como recursos categóricos e codificados durante o estágio de processamento de dados. A divisão train-validation-test não está incluída neste arquivo gerado automaticamente, e a divisão padrão para a tarefa de predição de link é 0,9, 0,05, 0,05.
Você pode ajustar as configurações de normalização e codificação, e pode escolher uma divisão personalizada train-validation-test. Se você escolher fazer isso, basta substituir o arquivo training-data-configuration.json original no S3 pela versão atualizada. A lista completa de campos suportados nesse JSON está disponível aqui . Nesta publicação, deixaremos esse arquivo inalterado.
Assim como no estágio de carregamento de dados (que é descrito na Parte 1 deste tutorial), precisamos criar funções do IAM que permitam acesso aos serviços que usaremos, e também precisamos adicionar essas funções ao nosso cluster Neptune. Precisamos de duas funções para o estágio de processamento de dados. A primeira é uma função do Neptune que fornece ao Neptune acesso ao SageMaker e ao S3. A segunda é uma função de execução do SageMaker que é usada pelo SageMaker durante a execução da tarefa de processamento de dados e permite acesso ao S3.
Essas funções devem ter políticas de confiança que permitam que os serviços Neptune e SageMaker as assumam:
{ "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" } ] }
Depois de criar as funções e atualizar suas políticas de confiança, nós as adicionaremos ao cluster Neptune (Neptune -> Bancos de dados -> YOUR_NEPTUNE_CLUSTER_ID -> Conectividade e segurança -> Funções do IAM -> Adicionar função).
Agora que atualizamos o arquivo training-data-configuration.json e adicionamos as funções do IAM ao cluster Neptune, estamos prontos para iniciar o trabalho de processamento de dados. Para fazer isso, precisamos enviar uma solicitação para a API HTTP do cluster Neptune de dentro da VPC onde o cluster está localizado. Usaremos uma instância do EC2 para fazer isso.
Usaremos curl para iniciar o trabalho de processamento de dados:
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" }'
Apenas estes 4 parâmetros são necessários: localização S3 dos dados de entrada, localização S3 dos dados processados, função Neptune, função Sagemaker. Existem muitos parâmetros opcionais: por exemplo, podemos selecionar manualmente o tipo de instância EC2 que será criado para nossa tarefa de processamento de dados com processingInstanceType
e definir seu tamanho de volume de armazenamento com processingInstanceVolumeSizeInGB
. A lista completa de parâmetros pode ser encontrada aqui .
O cluster responde com um JSON que contém o ID do trabalho de processamento de dados que acabamos de criar:
{"id":"d584f5bc-d90e-4957-be01-523e07a7562e"}
Podemos usá-lo para obter o status do trabalho com este comando (use o mesmo neptuneIamRoleArn da solicitação anterior):
curl https://YOUR_NEPTUNE_CLUSTER_ENDPOINT:8182/ml/dataprocessing/YOUR_JOB_ID?neptuneIamRoleArn='arn:aws:iam::123456789012:role/NeptuneMLDataProcessingNeptuneRole'
Uma vez que ele responde com algo assim,
{ "processingJob": {...}, "id":"d584f5bc-d90e-4957-be01-523e07a7562e", "status":"Completed" }
podemos verificar a saída. Esses arquivos foram criados no bucket S3 de destino:
Os arquivos graph.* contêm os dados gráficos processados.
O arquivo features.json contém as listas de recursos de nós e arestas:
{ "nodeProperties": { "user": [ "days", "mature", "views", "partner" ] }, "edgeProperties": {} }
Os detalhes sobre como os dados foram processados e como os recursos foram codificados podem ser encontrados no arquivo 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 as colunas 'mature' e 'partner' com valores booleanos, inicialmente rotuladas como 'auto' no arquivo training-data-configuration.json, foram codificadas como recursos de categoria.
O arquivo 'train_instance_recommendation.json' contém o tipo de instância do SageMaker e o tamanho de armazenamento recomendados para treinamento do modelo:
{ "instance": "ml.g4dn.2xlarge", "cpu_instance": "ml.m5.2xlarge", "disk_size": 14126462, "mem_size": 4349122131.111111 }
O arquivo model-hpo-configuration.json contém o tipo do modelo, as métricas usadas para sua avaliação, a frequência da avaliação e os hiperparâmetros.
Isso conclui o estágio de processamento de dados do processo, pois agora estamos prontos para começar a treinar o modelo ML. Isso será discutido na próxima parte deste guia.