ในโพสต์นี้ เราจะทำงานต่อในการทำนายลิงก์ด้วยชุดข้อมูล Twitch
เรามีข้อมูลกราฟที่ส่งออกจาก Neptune โดยใช้ยูทิลิตี้ neptune-export และโปรไฟล์ 'neptune_ml' แล้ว ขั้นตอนก่อนหน้านี้มีอธิบายไว้ในส่วนที่ 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 ...
ขอบ 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" ...
ยูทิลิตี้การส่งออกยังสร้างไฟล์ config นี้สำหรับเราด้วย:
การฝึกอบรม-ข้อมูล-การกำหนดค่า.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 คุณลักษณะของโหนด 'วัน' (อายุบัญชี) และ 'มุมมอง' ได้รับการจดจำเป็นตัวเลข และแนะนำให้ปรับค่าต่ำสุด-สูงสุด การปรับค่าต่ำสุด-สูงสุดจะปรับขนาดค่าตามอำเภอใจเป็นช่วง [0; 1] เช่นนี้: x_normalized = (x - x_min) / (x_max - x_min) และ imputer = median หมายความว่าค่าที่หายไปจะถูกเติมด้วยค่ามัธยฐาน
คุณลักษณะโหนด 'mature' และ 'partner' ถูกระบุเป็น 'auto' และเนื่องจากคอลัมน์เหล่านี้มีเฉพาะค่าบูลีนเท่านั้น เราจึงคาดว่าคุณลักษณะเหล่านี้จะได้รับการจดจำเป็นคุณลักษณะแบบหมวดหมู่และเข้ารหัสระหว่างขั้นตอนการประมวลผลข้อมูล การแยกส่วนการฝึกอบรม-การตรวจสอบ-การทดสอบไม่ได้รวมอยู่ในไฟล์ที่สร้างโดยอัตโนมัตินี้ และการแยกส่วนเริ่มต้นสำหรับงานการคาดการณ์ลิงก์คือ 0.9, 0.05, 0.05
คุณสามารถปรับแต่งการตั้งค่า normalization และ encoding และคุณสามารถเลือกการแยก train-validation-test แบบกำหนดเองได้ หากคุณเลือกที่จะทำเช่นนั้น เพียงแค่แทนที่ไฟล์ training-data-configuration.json ดั้งเดิมใน S3 ด้วยเวอร์ชันที่อัปเดต รายการทั้งหมดของฟิลด์ที่รองรับใน JSON นั้นมีอยู่ ที่นี่ ในโพสต์นี้ เราจะไม่เปลี่ยนแปลงไฟล์นี้
เช่นเดียวกับในขั้นตอนการโหลดข้อมูล (ซึ่งอธิบายไว้ในส่วนที่ 1 ของบทช่วยสอนนี้) เราจำเป็นต้องสร้างบทบาท IAM ที่อนุญาตให้เข้าถึงบริการที่เราจะใช้ และเราจำเป็นต้องเพิ่มบทบาทเหล่านั้นไปยังคลัสเตอร์ Neptune ของเราด้วย เราต้องการบทบาทสองบทบาทสำหรับขั้นตอนการประมวลผลข้อมูล บทบาทแรกคือบทบาท Neptune ที่ให้การเข้าถึง Neptune ไปยัง SageMaker และ S3 บทบาทที่สองคือบทบาทการดำเนินการ SageMaker ที่ SageMaker ใช้ขณะรันงานการประมวลผลข้อมูลและอนุญาตให้เข้าถึง S3
บทบาทเหล่านี้จะต้องมีนโยบายความน่าเชื่อถือที่อนุญาตให้บริการ 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 แล้ว เราก็พร้อมที่จะเริ่มงานการประมวลผลข้อมูลแล้ว ในการดำเนินการดังกล่าว เราต้องส่งคำขอไปยัง HTTP API ของคลัสเตอร์ Neptune จากภายใน VPC ที่มีคลัสเตอร์อยู่ เราจะใช้อินสแตนซ์ 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" }'
จำเป็นต้องมีพารามิเตอร์ 4 ตัวนี้เท่านั้น: ตำแหน่งข้อมูลอินพุต S3, ตำแหน่งข้อมูล S3 ที่ประมวลผลแล้ว, บทบาท Neptune, บทบาท Sagemaker มีพารามิเตอร์เสริมอีกหลายตัว เช่น เราสามารถเลือกประเภทอินสแตนซ์ EC2 ที่จะสร้างขึ้นสำหรับงานประมวลผลข้อมูลด้วยตนเองโดยใช้ processingInstanceType
และกำหนดขนาดโวลุ่มการจัดเก็บโดยใช้ processingInstanceVolumeSizeInGB
สามารถดูรายการพารามิเตอร์ทั้งหมด ได้ที่นี่
คลัสเตอร์ตอบสนองด้วย JSON ที่มี ID ของงานการประมวลผลข้อมูลที่เราเพิ่งสร้างขึ้น:
{"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" ] } ] } }
เราจะเห็นได้ว่าคอลัมน์ 'mature' และ 'partner' ที่มีค่าบูลีน ซึ่งในตอนแรกมีป้ายกำกับว่า 'auto' ในไฟล์ training-data-configuration.json ได้รับการเข้ารหัสเป็นคุณลักษณะหมวดหมู่
ไฟล์ '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 แล้ว เราจะอธิบายในส่วนต่อไปของคู่มือนี้