この投稿では、Twitch データセットを使用したリンク予測の作業を続けます。
neptune-exportユーティリティと 'neptune_ml' プロファイルを使用して、Neptune からグラフ データがすでにエクスポートされています。 これまでの手順については、このガイドのパート 2 と 1 で説明しています。
パート 1 はこちら、パート 2 はこちらでお読みください。
データは現在 S3 に保存されており、次のようになります。
頂点 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 ...
Edges 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" ...
エクスポート ユーティリティによって、次の構成ファイルも生成されました。
トレーニングデータ構成.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" : [ ] }
私たちの現在の目標は、データ処理を実行することです。つまり、私たちが持っているデータを、Deep Graph Library フレームワークがモデルのトレーニングに使用できる形式に変換することです。(DGL のみを使用したリンク予測の概要については、この投稿を参照してください)。これには、数値特徴の正規化、カテゴリ特徴のエンコード、リンク予測タスクの教師あり学習を可能にするために既存および非既存のリンクを持つノードペアのリストの作成、およびデータをトレーニング、検証、およびテスト セットに分割することが含まれます。
training-data-configuration.jsonファイルを見るとわかるように、ノード機能「日数」(アカウントの存続期間)と「ビュー」は数値として認識され、最小最大正規化が提案されました。最小最大正規化は、x_normalized = (x - x_min) / (x_max - x_min) のように、任意の値を [0; 1] の範囲にスケーリングします。また、imputer = median は、欠損値が中央値で埋められることを意味します。
ノード機能「成熟」と「パートナー」には「自動」というラベルが付けられており、これらの列にはブール値のみが含まれているため、データ処理段階でカテゴリ機能として認識され、エンコードされることが予想されます。この自動生成されたファイルには、トレーニング、検証、テストの分割は含まれておらず、リンク予測タスクのデフォルトの分割は 0.9、0.05、0.05 です。
正規化とエンコードの設定を調整したり、カスタムのトレーニング、検証、テストの分割を選択したりできます。その場合は、S3 の元の training-data-configuration.json ファイルを更新バージョンに置き換えるだけです。その JSON でサポートされているフィールドの完全なリストは、こちらで確認できます。この記事では、このファイルを変更せずにそのままにしておきます。
データロード段階 (このチュートリアルのパート 1 で説明) と同様に、使用するサービスへのアクセスを許可する IAM ロールを作成し、それらのロールを Neptune クラスターに追加する必要があります。データ処理段階には 2 つのロールが必要です。1 つ目は、SageMaker と S3 への Neptune アクセスを提供する Neptune ロールです。2 つ目は、データ処理タスクの実行中に SageMaker によって使用され、S3 へのアクセスを許可する SageMaker 実行ロールです。
これらのロールには、Neptune および SageMaker サービスがロールを引き受けることを許可する信頼ポリシーが必要です。
{ "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" } ] }
ロールを作成し、信頼ポリシーを更新したら、それらを Neptune クラスターに追加します (Neptune -> データベース -> YOUR_NEPTUNE_CLUSTER_ID -> 接続とセキュリティ -> IAM ロール -> ロールの追加)。
training-data-configuration.json ファイルを更新し、IAM ロールを Neptune クラスターに追加したので、データ処理ジョブを開始する準備が整いました。そのためには、クラスターが配置されている VPC 内から Neptune クラスターの HTTP API にリクエストを送信する必要があります。そのためには、EC2 インスタンスを使用します。
データ処理ジョブを開始するには、curl を使用します。
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" }'
必要なパラメータは、入力データの S3 ロケーション、処理済みデータの S3 ロケーション、Neptune ロール、Sagemaker ロールの 4 つだけです。オプションのパラメータは多数あります。たとえば、 processingInstanceType
を使用してデータ処理タスク用に作成される EC2 インスタンス タイプを手動で選択し、 processingInstanceVolumeSizeInGB
を使用してそのストレージ ボリューム サイズを設定できます。パラメータの完全なリストについては、こちらを参照してください。
クラスターは、先ほど作成したデータ処理ジョブの ID を含む JSON で応答します。
{"id":"d584f5bc-d90e-4957-be01-523e07a7562e"}
このコマンドを使用してジョブのステータスを取得できます (前のリクエストと同じ neptuneIamRoleArn を使用します)。
curl https://YOUR_NEPTUNE_CLUSTER_ENDPOINT:8182/ml/dataprocessing/YOUR_JOB_ID?neptuneIamRoleArn='arn:aws:iam::123456789012:role/NeptuneMLDataProcessingNeptuneRole'
次のような応答が返ってきたら、
{ "processingJob": {...}, "id":"d584f5bc-d90e-4957-be01-523e07a7562e", "status":"Completed" }
出力を確認できます。これらのファイルは宛先 S3 バケットに作成されました。
graph.* ファイルには処理されたグラフ データが含まれています。
features.json ファイルには、ノード機能とエッジ機能のリストが含まれています。
{ "nodeProperties": { "user": [ "days", "mature", "views", "partner" ] }, "edgeProperties": {} }
データがどのように処理され、特徴がどのようにエンコードされたかについての詳細は、 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" ] } ] } }
training-data-configuration.json ファイルで最初に「auto」というラベルが付けられていたブール値を持つ列「mature」と「partner」が、カテゴリ機能としてエンコードされていることがわかります。
「train_instance_recommendation.json」ファイルには、モデルのトレーニングに推奨される SageMaker インスタンス タイプとストレージ サイズが含まれています。
{ "instance": "ml.g4dn.2xlarge", "cpu_instance": "ml.m5.2xlarge", "disk_size": 14126462, "mem_size": 4349122131.111111 }
model-hpo-configuration.jsonファイルには、モデルのタイプ、その評価に使用されるメトリック、評価の頻度、およびハイパーパラメータが含まれています。
これでプロセスのデータ処理段階は終了です。これで ML モデルのトレーニングを開始する準備が整いました。これについては、このガイドの次の部分で説明します。