V tomto príspevku budeme pokračovať v práci na predpovedi prepojenia s datasetom Twitch. Zameriame sa na trénovanie modelu ML založeného na grafových neurónových sieťach (GNN) a optimalizáciu jeho hyperparametrov. Teraz už máme grafové dáta spracované a pripravené na modelový tréning. Predchádzajúce kroky sú popísané v 3. časti - Spracovanie údajov, 2. časti - Export údajov z DB a 1. časti - Načítanie údajov do DB.
Prečítajte si časť 1 tu ; časť 2 tu ; a časť 3 tu.
Použijeme Graph Convolutional Neural Networks rovnako ako v príspevku s predikciou lokálnych odkazov , a hoci Neptune ML používa rovnaký rámec DGL.ai , základný model je trochu odlišný. Neptune ML podporuje znalostné grafy (homogénne grafy s jedným typom uzla a typom jednej hrany) aj heterogénne grafy, ktoré majú viacero typov uzlov a hrán. Množina údajov, s ktorou pracujeme, má jeden typ uzla (používateľ) a jeden typ hrany (priateľstvo). Hoci by v tomto prípade fungoval aj model grafovej konvolučnej siete (GCN) alebo vzorka a agregácie grafov (GraphSAGE), Neptune ML automaticky vyberie model konvolučnej siete relačných grafov (R-GCN) pre množiny údajov s vlastnosťami uzla, ktoré sa môžu líšiť od uzla k uzlu, ako je vysvetlené tu . Vo všeobecnosti R-GCN vyžadujú viac výpočtov na trénovanie kvôli zvýšenému počtu parametrov potrebných na spracovanie viacerých typov uzlov a hrán.
Počas fázy spracovania údajov (ktorú sme opísali v predchádzajúcom príspevku TODO LINK) vytvoril Neptune ML súbor s názvom model-hpo-configuration.json
. Obsahuje typ modelu (R-GCN), typ úlohy (predikcia prepojenia), vyhodnocovaciu metriku a frekvenciu a 4 zoznamy parametrov: jeden s pevnými parametrami, ktoré sa počas tréningu nemenia, a 3 zoznamy parametrov, ktoré sa majú optimalizovať, s rozsahmi a predvolenými hodnotami. Parametre sú zoskupené podľa dôležitosti. O tom, či sa vyladia parametre z každej zo skupín, sa rozhoduje na základe počtu dostupných ladiacich úloh: parametre 1. úrovne sa vyladia vždy, parametre 2. úrovne sa ladia, ak je počet dostupných úloh > 10, a parametre 3. úrovne sa ladia, iba ak je > 50. Náš súbor model-hpo-configuration.json
vyzerá takto:
{ "models": [ { "model": "rgcn", "task_type": "link_predict", "eval_metric": { "metric": "mrr", "global_ranking_metrics": true, "include_retrieval_metrics": false }, "eval_frequency": { "type": "evaluate_every_pct", "value": 0.05 }, "1-tier-param": [ { "param": "num-hidden", "range": [16, 128], "type": "int", "inc_strategy": "power2" }, { "param": "num-epochs", "range": [3, 100], "inc_strategy": "linear", "inc_val": 1, "type": "int", "edge_strategy": "perM" }, { "param": "lr", "range": [0.001, 0.01], "type": "float", "inc_strategy": "log" }, { "param": "num-negs", "range": [4, 32], "type": "int", "inc_strategy": "power2" } ], "2-tier-param": [ { "param": "dropout", "range": [0.0, 0.5], "inc_strategy": "linear", "type": "float", "default": 0.3 }, { "param": "layer-norm", "type": "bool", "default": true }, { "param": "regularization-coef", "range": [0.0001, 0.01], "type": "float", "inc_strategy": "log", "default": 0.001 } ], "3-tier-param": [ { "param": "batch-size", "range": [128, 512], "inc_strategy": "power2", "type": "int", "default": 256 }, { "param": "sparse-lr", "range": [0.001, 0.01], "inc_strategy": "log", "type": "float", "default": 0.001 }, { "param": "fanout", "type": "int", "options": [[10, 30], [15, 30], [15, 30]], "default": [10, 15, 15] }, { "param": "num-layer", "range": [1, 3], "inc_strategy": "linear", "inc_val": 1, "type": "int", "default": 2 }, { "param": "num-bases", "range": [0, 8], "inc_strategy": "linear", "inc_val": 2, "type": "int", "default": 0 } ], "fixed-param": [ { "param": "neg-share", "type": "bool", "default": true }, { "param": "use-self-loop", "type": "bool", "default": true }, { "param": "low-mem", "type": "bool", "default": true }, { "param": "enable-early-stop", "type": "bool", "default": true }, { "param": "window-for-early-stop", "type": "bool", "default": 3 }, { "param": "concat-node-embed", "type": "bool", "default": true }, { "param": "per-feat-name-embed", "type": "bool", "default": true }, { "param": "use-edge-features", "type": "bool", "default": false }, { "param": "edge-num-hidden", "type": "int", "default": 16 }, { "param": "weighted-link-prediction", "type": "bool", "default": false }, { "param": "link-prediction-remove-targets", "type": "bool", "default": false }, { "param": "l2norm", "type": "float", "default": 0 } ] } ] }
Parametre modelu a typu úlohy boli nastavené počas fáz exportu a spracovania údajov a nemali by sa tu meniť.
Automaticky bola zvolená aj metrika hodnotenia . Stredná recipročná poradie (MRR) meria priemerné poradie správneho prepojenia v predpokladaných výsledkoch, pričom vyššia hodnota MRR naznačuje lepší výkon .
Frekvencia hodnotenia je nastavená na 5% tréningového pokroku. Napríklad, ak máme 100 epoch, vyhodnotenie sa vykoná každých 5 epoch.
Pozrime sa na niektoré z hyperparametrov, ktoré budú vyladené:
lr : Rýchlosť učenia je jedným z najvplyvnejších hyperparametrov pre akýkoľvek modelový tréning. Nižšia rýchlosť učenia môže viesť k pomalšej konvergencii, ale potenciálne lepšiemu výkonu, zatiaľ čo vyššia rýchlosť učenia môže urýchliť tréning, ale môže prísť o optimálne riešenia.
num-hidden : Parameter num-hidden sa týka počtu skrytých jednotiek (neurónov) v každej vrstve neurónovej siete R-GCN, konkrétne v skrytých vrstvách. Väčší počet skrytých jednotiek zvyšuje schopnosť modelu učiť sa zložité vzory a vzťahy z údajov, čo môže zlepšiť presnosť predikcie, ale môže tiež viesť k preplneniu, ak sa model stane príliš zložitým pre súbor údajov.
num-epochs : Definuje, ako dlho je model trénovaný. Viac epoch umožňuje modelu naučiť sa viac z údajov, ale môže zvýšiť riziko nadmerného vybavenia.
batch-size : Veľkosť dávky ovplyvňuje využitie pamäte a stabilitu konvergencie. Menšia veľkosť dávky môže spôsobiť, že model bude citlivejší na údaje, zatiaľ čo väčšia veľkosť dávky môže zvýšiť rýchlosť tréningu.
num-negs : Negatívne vzorkovanie ovplyvňuje spôsob, akým sa model učí rozlišovať skutočné odkazy od falošných. Vyšší počet negatívnych vzoriek môže zlepšiť kvalitu predpovedí, ale zvyšuje výpočtové náklady.
výpadok : Výpadok pomáha predchádzať preťaženiu náhodným vynechaním niektorých neurónov počas tréningu. Vyššia miera výpadkov môže znížiť nadmerné vybavenie, ale môže to pre model sťažiť učenie.
regularizačný-koef : Regularizácia, ktorej cieľom je zabrániť nadmernému prispôsobeniu modelu.
Pre každý z týchto parametrov môžete zmeniť predvolené hodnoty, rozsah a veľkosť kroku. Úplný zoznam parametrov nájdete tu .
Po zmene parametrov stačí nahradiť pôvodný súbor model-hpo-configuration.json
v S3.
Rovnako ako spracovanie údajov opísané v 3. časti tejto príručky, aj trénovanie modelu vyžaduje 2 roly IAM: rolu Neptúna, ktorá poskytuje Neptúnovi prístup k SageMaker a S3, a rolu vykonávania Sagemakera, ktorú používa SageMaker pri spustení úlohy spracovania údajov a umožňuje mu prístup k S3. Tieto roly musia mať zásady dôvery, ktoré umožnia službám Neptune a SageMaker prevziať ich:
{ "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" } ] }
Po vytvorení rolí a aktualizácii ich politík dôveryhodnosti ich pridáme do klastra Neptún (Neptún -> Databázy -> YOUR_NEPTUNE_CLUSTER_ID -> Connectivity & Security -> IAM Roles -> Add role).
Teraz sme pripravení začať s modelovým tréningom. Aby sme to dosiahli, musíme odoslať požiadavku do HTTP API klastra Neptún z VPC, kde sa klaster nachádza. V inštancii EC2 použijeme curl:
curl -XPOST https://(YOUR_NEPTUNE_ENDPOINT):8182/ml/modeltraining \ -H 'Content-Type: application/json' \ -d '{ "dataProcessingJobId" : "ID_OF_YOUR_DATAPROCESSING_JOB", "trainModelS3Location" : "s3://OUTPUT_BUCKET/model-artifacts/...", "neptuneIamRoleArn": "arn:aws:iam::123456789012:role/NeptuneMLModelTrainingNeptuneRole", "sagemakerIamRoleArn": "arn:aws:iam::123456789012:role/NeptuneMLModelTrainingSagemakerRole" }'
Vyžadujú sa iba tieto parametre:
K dispozícii je tiež parameter maxHPONumberOfTrainingJobs , ktorý nastavuje počet úloh školenia, ktoré sa majú spustiť s rôznymi sadami hyperparametrov. V predvolenom nastavení je to 2, ale AWS odporúča spustiť aspoň 10 úloh, aby ste získali presný model.
Existuje aj veľa voliteľných parametrov: napríklad môžeme manuálne vybrať typ inštancie EC2, ktorý sa použije na modelové trénovanie pomocou trainingInstanceType a nastaviť veľkosť jeho úložného priestoru pomocou trainingInstanceVolumeSizeInGB . Úplný zoznam parametrov nájdete tu .
Klaster odpovie JSON, ktorý obsahuje ID úlohy spracovania údajov, ktorú sme práve vytvorili:
{"id":"d584f5bc-d90e-4957-be01-523e07a7562e"}
Môžeme ho použiť na získanie stavu úlohy trénovania modelu pomocou tohto príkazu (použite rovnaký neptuneIamRoleArn ako v predchádzajúcej požiadavke):
curl https://YOUR_NEPTUNE_CLUSTER_ENDPOINT:8182/ml/modeltraining/YOUR_JOB_ID?neptuneIamRoleArn='arn:aws:iam::123456789012:role/NeptuneMLModelTrainingNeptuneRole'
Akonáhle odpovie niečím takým,
{ "processingJob": { "name": "PROCESSING_JOB_NAME", "arn": "arn:aws:sagemaker:us-east-1:123456789012:processing-job/YOUR_PROCESSING_JOB_NAME", "status": "Completed", "outputLocation": "s3://OUTPUT_BUCKET/model-artifacts/PROCESSING_JOB_NAME/autotrainer-output" }, "hpoJob": { "name": "HPO_JOB_NAME", "arn": "arn:aws:sagemaker:us-east-1:123456789012:hyper-parameter-tuning-job/HPO_JOB_NAME", "status": "Completed" }, "mlModels": [ { "name": "MODEL_NAME-cpu", "arn": "arn:aws:sagemaker:us-east-1:123456789012:model/MODEL_NAME-cpu" } ], "id": "d584f5bc-d90e-4957-be01-523e07a7562e", "status": "Completed" }
môžeme skontrolovať tréningové protokoly a artefakty v cieľovom vedre S3.
Modelové školenie je ukončené, tak poďme skontrolovať výsledky v AWS konzole: SageMaker -> Training -> Training Jobs.
Pre jednoduchosť sme pri spustení modelového školenia nemenili počet úloh HPO a použila sa predvolená hodnota 2. Tieto 2 úlohy prebiehali paralelne. Typ inštancie bol vybratý automaticky: ml.g4dn.2xlarge .
Prvá úloha (tá s '001' v názve) bola dokončená za 15 minút a druhá ('002') bola automaticky zastavená, pretože SageMaker podporuje skoré zastavenie, ak sa tréningové metriky na chvíľu nezlepšia:
Porovnajme hyperparametre, ktoré boli použité v týchto úlohách:
Iba 3 parametre majú rôzne hodnoty: num-hidden, num-negs a lr . Druhý model (trénovaný pomocou úlohy 2) mal vyššiu rýchlosť učenia a zároveň mal menšiu kapacitu na zachytenie zložitých vzorov (pretože mal menej neurónov) a bol trénovaný na menšom počte negatívnych vzoriek. To viedlo k výrazne nižšej presnosti, ako môžeme vidieť z Validation Mean Rank (115 vs 23) a HITS@K :
Priemerná pozícia (MR) je priemerná pozícia správneho prepojenia medzi predpoveďami. Nižšie hodnoty MR sú lepšie, pretože naznačujú, že správny odkaz je v priemere zaradený bližšie k vrcholu .
Metriky HITS@K merajú podiel prípadov, kedy sa správny odkaz objaví v prvých K predpokladaných výsledkoch.
Po dokončení úloh školenia sa vo výstupnom segmente S3 vytvoria artefakty modelu spolu so súbormi, ktoré obsahujú štatistiky a metriky školenia:
Metriky a parametre v týchto súboroch JSON sú tie, ktoré sme spomenuli vyššie. Iba adresár 001 obsahuje podadresár 'output' so súborom model.tar.gz, pretože je to jediná úloha HPO, ktorá bola dokončená. Artefakty pre predikciu prepojenia obsahujú aj údaje grafu DGL, pretože sú potrebné na vytváranie skutočných predpovedí, ako je vysvetlené tu .
Tieto súbory sa použijú na vytvorenie koncového bodu inferencie a generovanie skutočných predpovedí prepojenia. O tom bude reč v ďalšom a poslednom príspevku tejto série.