á¡á¬ážáá¯á¶ážáááºá¹ááá¬áá«! áá»áœááºá¯ááºááẠCROC ááœáẠCV ááŒá¯á á¯áá°ááŒá áºáááºá CV áááºáááºááŸá¬ ááá±á¬áá»ááºááœá±ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá±áᬠá ááŸá áºááŸááá«ááŒá®á á€áá¬áá¡ááœááºáž áá»áœááºá¯ááºááá¯á·ááẠá¡áá¬áá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºáá²á·áááºá á¥ááá¬- áá¬ážáá±á¬ááºážáá±á ááºááœáẠá¡áááºáá±á¬ááºááŒááºážá áá±ážááááºááá±á¬ááºááŒááºážá áá¯ááºážáááŒá±á¬ááŒááºážá áááºážááá¯ááŒáá·áºááŒááºážá á¡áááºáááºáá»á¬áž ááá¯á·ááá¯áẠááááºáá»á¬ážááᯠáááŒáá·áºááŸá¯á á±áááºá ; áá®ážááŒá¬ážáááºážááŒá±á¬áá»á¬ážááœáẠáá±á¬ááºážááŸááºáá°áá»á¬ážááŸáá·áº áá¬ážáá«áááºáá±áá¬áá»á¬ážá áœá¬áá°áá°áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· ááŸááºáááºážáááºáá¬ážáá«áááºá á¡áá¯ááºááá¬ážáá»á¬ážááẠááá±á¬ááºá áááºá¡ááẠá áááºááá¯á·ááᯠáááºáááºáá¬ážááŒá±á¬ááºážá á ááºáá¯á¶ááá¯á·áááºáá±á¬ááºááá¯áá±á¬ áááºáááºážáá áºáŠážá¡á¬áž áá±á¬áºáá¯ááºááœá±á·ááŸááá²á·áááºá áááºááá¯ááºááá»áŸ áá±ááœááºáááºá
áá« áá«ááœá±á¡á¬ážáá¯á¶áž áá¬á¡ááœááºáá¯ááºáá¬áá²á
ááá±á¬áá»ááºáá»á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºááá·áº áá¯ááºáááºážá ááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áá¯á¡áá áºáá»á¬ážá á¡áá¯á¡áá áºáá»á¬ážá áœá¬ááᯠááŒá¯á¶ááœá±á·áááŒá®áž áááºááŸáá·áºáááºážááŸá®ážáá±á¬ ááá¯á·ááá¯áẠáá±á¬ááºááœáẠááááŸááá¬ááá·áº ááŒá¿áá¬á¡áá»áá¯á·ááŸááááºá
á¡ááŒá±á¡áá±ááᯠáá¯á¶áá±á¬áºááŒáá·áºáá¡á±á¬ááº
ML ááŸáá·áº áááºáááºáá±á¬ ááŸá¯ááºááŸá¬ážááŸá¯áá»á¬ážááŸáááá·áº áá°áááºáá¯áá¹ááá® âNâ ááœáẠá¡áá¯ááºááááºáᯠá áááºáá°ážááŒáá·áºááŒáá«á áá¯á·á áá»áœááºá¯ááºááá¯á·ááẠML (DLá CV) ááá±á¬áá»ááºáá áºáá¯ááœáẠá¡áá¯ááºáá¯ááºáááºá ááá¯á·áá±á¬áẠá¡ááŒá±á¬ááºážáá áºáá¯áá¯ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡ááŒá¬ážá¡áá¯ááºáá áºáá¯ááá¯á· ááŒá±á¬ááºážáᬠáá±áá¯áá»á¡á¬ážááŒáá·áº á¡áá¬ážáá°áᬠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠááá¯á·ááá¯áẠá¡ááŒá¬ážáá°áá áºáŠážá á¡á¬áá¯á¶ááŒá±á¬ááá¯á· ááŒááºááœá¬ážááŒáááºá
- á¡ááŸááºááá¬ážáá¡ááá¯ááºá¡ááá·áºáá±á¬ááºáá¬áááºá áááºáááºááá¯ááºááá·áºáá±áá¬ááœááºá áááºááŒáá¯ážá
á¬ážáá²á·ááá·áº hyperparameters áá»á¬ážááŸáá·áº á¡áá±ážá¡ááŒá®ážáá¯á¶ážááŸá¬ áááºážááá¯á·ááẠáááºááá·áºááááºáá»á¬ážááᯠááŒá
áºáá±á«áºá
á±áá²á·áááºááᯠáá
áºáááºážáááºážááŸáá·áº ááááááẠááá¯á¡ááºáááºá
ááœáŸááºáááºááŸá¯á¡á¬ážáá¯á¶ážááœáẠá¡áá»ááºá¡áááºáá»á¬ážááᯠááááºážáááºážáá¬ážáá°á¡ááœáẠááœá±ážáá»ááºá áá¬áá»á¬ážá áœá¬ááŸáááá¯ááºáááº- headá configsá notepadá cloud ááŸá á¡áá¯ááºáááºáááºážáá»ááºááœááºá ááá¯ááºáá«áá«áá¬áá®áá¬áá»á¬ážááᯠáá¯ááºááœáẠááŸááºáá»ááºáá±ážáá¬ážáá±á¬á á¬ááŒá±á¬ááºážáá»á¬ážá¡ááŒá Ạááááºážáááºážáá±á¬á¡áá«á áá±áá¯áá»á¡á¬ážááŒáá·áº á áááºáá°ážáááºáááºáá±á¬ áá»á¶áááºážááŸá¯áá áºáá¯á¡á¬áž áá»áœááºá¯ááºááœá±á·áá²á·ááááºá ááᯠáááºááẠááá·áºááá±á¬áá»ááºááá¯á· ááŒááºááá¬áá±á¬á·áá² áá¯áá¹ááá®á០ááœááºááœá¬ážááŒá®áž model_1.pb áá¯áá±á«áºáá±á¬ áá¯ááºááŸáá·áº áá±á¬áºáááºááᯠá¡ááœá±áááºáá¶áá°á ááá±á¬áá»ááºáá®ááá¯á· á áááºáá°ážááŒáá·áºáá«á áá¯ááºáá¯á¶á¡á¬áž ááŒá®ážááŒá±á¬ááºááŒá®áž áá¬áá»ááºááŸá¯á¡á¬ážáá¯á¶ážááᯠáá±á¬áºááœáŸááºážáááºá áááºááẠá¡á ááŒá¯áá° á¡áá°ážáá¯áá áºáŠážáááºážááŒá áºáááºáᯠá áááºáá°ážááŒáá·áºááŒáá«á áá¯á·á - áááºáá¯ááºáááºá áá¯ááºááá¯á¡áá¯á¶ážááŒá¯ááẠáá»áœááºá¯ááºááá¯á·ááŸáá·áº áááºážááŸáá·áºáá¯ááºáá±á¬ááºááá·áºáá°ááá¯ááºážááẠáááºáááºážáá»ááºáá áºáá¯áááºáá®ážááẠááá¯á¡ááºáá«áááºá á¡ááŒá±á¬ááºážáá áºáá¯áá¯ááŒá±á¬áá·áº áá°á·á¡á¬áž áá»áœááºá¯ááºááá¯á·áá¡ááœá±á¡ááŒá Ạááá¬ážáá²á·áá² áááŒá¬áá ááŒá áºáááºáá«áááºá áá«á á¡áá±ážá¡ááœá²ááá¯ááºáá²á· á¡áá¯ááºáá áºáá¯áááºáž ááŒá áºáá¬ááá¯ááºáá«áááºá áá®á¡ááá·áºá¡ááœáẠá¡áá»áááºáááŒá¯ááºážáá»ááºáá°ážáá¬ážá
- áá»áœááºá¯ááºááá¯á·ááẠáá±á¬áºáááºáá áºáᯠ(á¥ááá¬á áá¬áž detector) ááᯠáá±á·áá»áá·áºáá±ážáááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááœááºáá±á¬ááºážááœááºááá·áº á¡áá±á¡áá¬ážááá¯á· áá±á¬ááºááẠ- ááááºááᯠááááºážáááºážááẠá¡áá»áááºáááºáá«ááŒá®á á¡á²áá«ááᯠcar_detection_v1.pb ááá¯á·áá±á«áºááŒáá«á áá¯á·á ááŒá®ážááẠáá±á¬ááºáá áºáᯠáá±á·áá»áá·áºááẠ- car_detection_v2.pbá á¡áá»áááºá¡áááºážáááºááŒá¬áá±á¬á¡áá«á áá»áœááºá¯ááºááá¯á·ááá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬áž ááá¯á·ááá¯áẠáá»áœááºá¯ááºááá¯á·ááá¯ááºááá¯ááºááẠááá°áá®áá±á¬áááá¯áá¬ááá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºááŒá¬ážááŒáááŸá¯áá»á¬áž ááá¯áá»á¬ážáá¬áááºá ááááºá¡áá±áá²á·á áá®áááá áá¯ááºáá¯ááºá á¯áá±á¬ááºážááááºááá¯áá²á· á¡áá»ááºá¡áááºááœá± á á¯á ááºážáá¬ážáá²á· ááŸá±ážáá±á¬ááºážáá á¹á ááºáž á¡á á¯á¡áá±ážááœá± áá±á«áºáá±á«ááºáá¬áá«ááẠ(áá«áá±ááá·áº á¡áá¯áá±á¬ááºááá¯ááºážááŸá¬ áá»áœááºáá±á¬áºááá¯á·ááŸá¬ áŠážá á¬ážáá±ážááá á¹á ááœá±ááŸáááá¯á·)á
- áá² á¡á¬ážáá¯á¶ážááŒá®ážááœá¬ážááŒá®á áá»áœááºá¯ááºááá¯á·ááœáẠáá±á¬áºáááºáá áºáá¯ááŸááááºá ááŒá¿áá¬á¡áá áºááá¯ááŒá±ááŸááºážááẠáá±á¬ááºáá±á¬áºáááºááᯠáá±á·áá»áá·áºááŒááºážá áááá¯áá¬ááá¬áá áºáᯠáá®ááœááºááŒááºáž ááá¯á·ááá¯áẠáááºáááºáááºáá±á¬ááºááá¯ááºáá«ááá¬ážá áááºáá°á·ááᯠá¡áá¯á¶ážáá»áááºáááºážá
ááŒá¿áá¬áá»á¬ážááᯠáá±á¬áºáá¯ááºááŒááºážá
ááá±á¬áá»ááºáá áºáᯠááá¯á·ááá¯áẠáá¯ááºáá¯ááºáá áºáá¯ááœáẠá¡áá¯ááºáá¯ááºááŒááºážááẠáá°á¡áá»á¬ážáá¡áá¯ááºááŒá áºáááºá á¡áá»áááºááŒá¬áá¬áááºááŸáá·áºá¡áá»áŸ áá°ááœá±á ááœááºááœá¬áá¬ááŒá®ážá ááá±á¬áá»ááºááœá± ááá¯áá»á¬ážáá¬ááŒá®áž ááá±á¬áá»ááºááœá±á áá°ááá¯á·ááá¯ááºáá°ááá¯á· ááá¯ááŸá¯ááºááœá±ážáá¬ááŒáááºá áá áºáááºážááá¯ááºáá áºáááºážá á¡áááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ á ááºáááºážá០á¡ááŒá±á¡áá±áá»á¬áž (áá¬áá) á¡áá»áá¯á·áá±á¬ áá±á«ááºážá ááºááŸá¯áá»á¬ážááœáẠá¡áááºáááºá០áááºáá¬áááºáᬠááŒá áºáá±á«áºáááá·áºáááºá á€á¡áá¬á¡á¬ážáá¯á¶ážááẠá¡áá»áááºááŒá¯ááºážááŒááºážá ááŸá¯ááºááœá±ážááŸá¯áá»á¬ážá á¡á¬áá¯á¶ááŒá±á¬áá»á¬ážá áá±á¬ááºáááºáá»á¬áž ááá»á±áááºááŸá¯áá»á¬áž ááŒá áºááá¯ááºááŒá®áž áá±á¬ááºáá¯á¶ážááœáẠááœá±áá¯á¶ážááŸá¯á¶ážááœá¬ážá á±áááºá áá»áœááºá¯ááºááá¯á·á¡á¬ážáá¯á¶ážááẠáá°áá®áá±á¬ ááŸá±ážáá°áá¯ááºáá¬áá±á¬ááºááá¯á· ááá¯ááºááŒáá±á¬áºáááºáž á€á¡ááá¯ááºá¡ááá·áºáá»á¬ážááᯠáááºáá«áááºáá« ááŒááºáááºá¡áááºááœááºážááá¯ááŒááºážáááŸááᯠáá»áœááºá¯ááºáá¯á¶ááŒááºáá«áááºá
áá«ááŒá±á¬áá·áº áá»áœááºáá±á¬áºááá¯á·áᬠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ á ááºáááºážáá áºáá¯ááᯠááŒááºáá»á±á¬áºáá²á·ááŒá®áž ááŒá±ááŸááºážáááá·áº ááŒá¿áá¬ááœá± ááŸááááºááá¯á· ááŒááºáá«áááºá áá®ááá¯áá¯ááºááá¯á·áááºááá¯á¡ááºáá«áááº:
- á¡áá¯ááºááááºáá»á¬ážááᯠá¡áááºááŒá±á áœá¬ ááááºážáááºážáá«á
- áááºáááºážá¡áá áºáá»á¬ážáá«áááºááá·áºáá¯ááºáááºážá ááºááᯠááá¯ážááŸááºážá¡á±á¬ááºááŒá¯áá¯ááºáá«á
- ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áááºáááºážáá»ááºááᯠá¡áá¯á¶ážáá»ááŒááºážáá¯ááºáááºážá ááºááᯠááá¯ážááŸááºážá¡á±á¬ááºá
- áá±á¬áºáááºáá¬ážááŸááºážááŒá±á¬ááºážáá²ááŒááºáž áá¯ááºáááºážá ááºááᯠá á®á ááºáááºááŸááºáá«á
- áá±á¬áºáááºáá»á¬ážááá¯á¡áááºááŒá¯áááºá¡áááºááŒá±áá±á¬áááºážáááºážáá áºáá¯ááŸááááºá
- á á¶ááŒááá¯ááºáá¶áá±á¬áº á á®áá¶ááá·áºááœá²ááŸá¯ áááááá¬ááᯠááŸá¬áá«á
- áá±á¬áºáááºáá»á¬ážááᯠáá¯ááºáá¯ááºááẠáááºážáááºážááŸá¬áá«á
á€ááá ááºáááºážááᯠá¡ááœááºááá°ááŸáá·áº á¡áááºááŒá±á áœá¬ á á®áá¶ááá·áºááœá²ááá¯ááºá á±ááá·áº á¡áá¯ááºá¡ááœá¬ážá¡áá¬áá áºáᯠáá±á«áºáá¬ááẠááá¯á¡ááºáááºááŸá¬ áááºááŸá¬ážáá«áááºá á€á¡áá±á·á¡áá»áá·áºááᯠMLOps áá¯áá±á«áºáááºá
á ááºáááºáá°ááŸá¯á¡ááœáẠMLOps ááá¯á·ááá¯áẠDevOps ááẠáá±áá¬áááá¹áá¶ááŸáá·áº á¡áá¯ááºáá®á¡ááœá²á·áá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºááŒááºážá á¡áááºááŒá¯ááŒááºážááŸáá·áº á¡á¯ááºáá»á¯ááºááŸá¯á áá áºáá»á¬ážá¡ááœáẠá ááºáááºáá°ááŸá¯áá±á¬áºáááºáá»á¬ážá¡ááœáẠáá±á¬áºáááºáá»á¬ážááᯠá á±á¬áá·áºááŒáá·áºááŒááºážá á¡áááºááŒá¯ááŒááºážááŸáá·áº á¡á¯ááºáá»á¯ááºááŸá¯ááŸáá áºááá·áº áá±á¬áºáááºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááŸáá·áº á¡áá¯á¶ážáá»ááŸá¯á¡ááŸáááºá¡áá¯ááºááᯠááá¯ážááŒáŸáá·áºááá¯ááºá á±áá«áááºá
ááá¯ááº
áá±á¬ááºááẠáá»áœááºá¯ááºááá±á¬ááºážáá«ážááœáẠáá»áœááºá¯ááºááẠáá¯ááºáááºážá ááºá áá áºá áááºáá áºááá¯ááºážááá¯áᬠáá±á¬áºááŒáá«áááºá á¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠáá»áœááºá¯ááºááẠMLflow tool ááá¯á¡áá¯á¶ážááŒá¯áááºááŒá áºáá±á¬ááŒá±á¬áá·áº... áááºážááẠopen-source ááá±á¬áá»ááºáá áºáá¯ááŒá áºááŒá®áž áá»áááºáááºáááºá¡ááœáẠáá¯ááºá¡áááºážáááºááá¯á¡ááºááŒá®áž áá°ááŒáá¯ááºáá»á¬ážáá±á¬ ml frameworks áá»á¬ážááŸáá·áº áá±á«ááºážá ááºááŸá¯ááŸááá«áááºá Kubeflowá SageMakerá Trains á áááºááá¯á·áá²á·ááá¯á·áá±á¬ á¡ááŒá¬ážáááááá¬áá»á¬ážá¡ááœáẠá¡ááºáá¬áááºááᯠáááºááŸá¬ááœá±ááá¯ááºááŒá®áž ááá·áºááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº ááá¯ááá¯ááá¯ááºáá®ááá·áºáá áºáá¯ááᯠááŸá¬ááœá±ááá¯ááºáááºá
MLFlow tool ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážá¥ááá¬ááá¯á¡áá¯á¶ážááŒá¯á "áááºáá±á¬ááºááŒááºáž" MLOps
MLFlow ááẠml áá±á¬áºáááºáá»á¬ážá áááá¶ááá¬á
á®áá¶ááá·áºááœá²ááŸá¯á¡ááœáẠááœáá·áºáááºážáá±á¬á¡áááºážá¡ááŒá
áºááááºáá±á¬ááºážáá
áºáá¯ááŒá
áºááẠ(
MLflow ááœáẠá¡á áááºá¡ááá¯ááºážáá±ážáᯠáá«áááºáááº-
- MLflow ááŒá±áá¬áá¶ááŒááºáž - á€ááááºááá¯ááŒá áºáá±á«áºá á±ááá·áº ááŸááºáááºážáááºááŒááºážááááºáá»á¬ážááŸáá·áº ááá·áºáááºáá»ááºáá»á¬ážááá¯ááºáᬠááŒá¿áá¬áá»á¬ážááᯠá¡áá»á¯á¶ážáááºáááºá
- MLflow ááá±á¬áá»áẠ- ááá·áºá¡á¬áž áá¯ááºáá¯ááºááá¯ážáááºááŸáá·áº áááºááá·áºááááºáá±á¬ááºážáá±á«áºááœááºáááᯠááŒááºáááºáá¯ááºáá¯ááºááœáá·áºááŒá¯áááºá
- MLflow áá±á¬áºáááºáá»á¬áž - áá±á¬áºáááºáá»á¬ážááᯠáá¯ááºáá¯ááºááŸá¯ááœáẠá¡áá¯á¶ážáá»ááẠáá¬áááºááŸááááºá
- MLflow Registry - ááá·áºá¡á¬áž áá±á¬áºáááºáá»á¬ážááᯠááááºážáááºážáááºááŸáá·áº áááºážááá¯á·á á¡ááŒá±á¡áá±ááᯠáááá¯áá»á¯ááºááá¯ááºáá¬ážáá±á¬ ááá¯ááŸá±á¬ááºááŸá¯ááœáẠá á®áá¶ááá·áºááœá²ááẠááœáá·áºááŒá¯áááºá
MLflow ááẠá¡áá¬ááŸá áºáá¯áá±á«áºááœáẠáá¯ááºáá±á¬ááºáááº
- ááœáŸáá·áºáááºááŒááºážááẠáá»áœááºá¯ááºááá¯á· ááŸááºáá¯á¶áááºááá¯áá±á¬ áá±á·áá»áá·áºááŸá¯á ááá·áºáááºáá»ááºáá»á¬áž ááŸáá·áº áááºááá áºáá»á¬ážá áááºáááºááŸá¯ á¡ááŒáá·áºá¡á á¯á¶ááŒá áºáááºá
- á ááºážáááºááŸá¯áá áºáá¯ááẠá¡áá°áááœáá¯ááºáá±á¬ááºááá·áº âá¡ááŒá±á¬ááºážá¡áá¬â ááŒá áºáááºá
á¥ááá¬á á¡ááá·áºá¡á¬ážáá¯á¶ážááᯠUbuntu 18.04 áááºáááºááŸá¯á áá áºááœáẠá¡áá±á¬ááºá¡ááẠáá±á¬áºáá¬ážáááºá
1. áá¬áá¬ááᯠá¡áá¯á¶ážááŒá¯áá«á
áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºááᯠááœááºáá°á áœá¬á á®áá¶ááá·áºááœá²ááá¯ááºááŒá®áž ááá¯á¡ááºáá±á¬á¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážááᯠáááŸáá á±áááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá¬áá¬áá áºáá¯á¡á¬áž á¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá MLflow ááŒá±áá¬áá¶áá¬áá¬ááœáẠá¡ááá á¡á áááºá¡ááá¯ááºážááŸá áºáᯠááŸááááº-
- backend á ááá¯áž - ááŸááºáá¯á¶áááºáá¬ážáá±á¬áá±á¬áºáááºáá»á¬ážááŸáá·áºáááºáááºáá±á¬á¡áá»ááºá¡áááºáá»á¬ážááá¯ááááºážáááºážáááºáá¬áááºááŸáááẠ(4 DBMSs: mysql, mssql, sqlite, ááŸáá·áº postgresql);
- artifact store - ááŸá±ážáá±á¬ááºážáá á¹á ááºážáá»á¬ážááᯠááááºážáááºážááẠáá¬áááºááŸáááẠ(ááá¯ááŸá±á¬ááºááŸá¯ááœá±ážáá»ááºá áᬠ7 áá¯ááᯠáá¶á·ááá¯ážáááº- Amazon S3á Azure Blob Storageá Google Cloud Storageá FTP áá¬áá¬á SFTP áá¬áá¬á NFSá HDFS)á
áá áºá¥á®ážá¡ááŒá ẠááŸá±ážáá±á¬ááºážáá á¹á ááºážááá¯áẠááá¯ážááŸááºážá á±áááºá sftp áá¬áá¬áá áºáá¯áá°ááŒáá«á áá¯á·á
- á¡ááœá²á·áá
áºáá¯áááºáá®ážáá«á
$ sudo groupadd sftpg
- á¡áá¯á¶ážááŒá¯áá°áá
áºáŠážááá¯ááá·áºáᬠáá°á·á¡ááœáẠá
áá¬ážááŸááºáá
áºáá¯áááºááŸááºáá«á
$ sudo useradd -g sftpg mlflowsftp $ sudo passwd mlflowsftp
- access áááºáááºá¡áá»áá¯á·ááᯠáá»áááºááŸáááŒááºážá
$ sudo mkdir -p /data/mlflowsftp/upload $ sudo chown -R root.sftpg /data/mlflowsftp $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
- /etc/ssh/sshd_config ááœáẠááá¯ááºážá¡áááºážáááºááá·áºáá«á
Match Group sftpg ChrootDirectory /data/%u ForceCommand internal-sftp
- áááºáá±á¬ááºááŸá¯ááᯠááŒááºáááºá
áááºáá«á
$ sudo systemctl restart sshd
áá áºá¥á®ážá¡ááŒá Ạbackend á ááá¯áž postgresql ááᯠáá°ááŒáá¡á±á¬ááºá
$ sudo apt update
$ sudo apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
$ sudo apt install gcc
$ pip install psycopg2
$ sudo -u postgres -i
# Create new user: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Enter name of role to add: mlflow_user
Enter password for new role: mlflow
Enter it again: mlflow
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
# Create database mlflow_bd owned by mlflow_user
$ createdb -O mlflow_user mlflow_db
áá¬áá¬ááᯠá áááºááẠá¡á±á¬ááºáá« python áááºáá±á·áá»áºáá»á¬ážááᯠááá·áºááœááºážááẠááá¯á¡ááºááẠ(áá®ážááŒá¬áž virtual áááºážáá»ááºáá áºáᯠáááºáá®ážááẠá¡ááŒá¶ááŒá¯ááá¯áá«áááº)á
pip install mlflow
pip install pysftp
áá»áœááºá¯ááºááá¯á·ááá¬áá¬ááá¯á áááºááŒáá«á áá¯á·
$ mlflow server
--backend-store-uri postgresql://mlflow_user:mlflow@localhost/mlflow_db
--default-artifact-root sftp://mlflowsftp:mlflow@sftp_host/upload
--host server_host
--port server_port
2. ááŒá±áá¬áá¶ááá·áºáá«á
áá»áœááºá¯ááºááá¯á·ááá±á·áá»áá·áºááŸá¯ááááºáá»á¬áž ááá¯á¶ážááŸá¯á¶ážá á±áááºá¡ááœáẠááŒá áºáá»ááºáá±ááá·áºá¡áá¬ááᯠáá¬ážáááºááá¯ááºááẠá¡áá¬ááẠdeveloper áá»á¬ážá áá»áá¯ážáááºáá»á¬ážááŸáá·áº áááºááŒá¬ážáá±ážáá¯ááºáááºážá ááºááᯠá¡á±ážá¡á±ážáá±ážáá±áž ááœá²ááŒááºážá áááºááŒá¬ááá¯ááºá á±áááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠááŒá±áá¬áá¶ááŒááºážááᯠááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá ááŒá±áá¬áá¶ááŒááºážááá¯áááºááŸá¬ ááá·áºáááºáá»ááºáá»á¬ážá áááºááá áºáá»á¬ážá ááŸá±ážáá±á¬ááºážáá á¹á ááºážáá»á¬ážááŸáá·áº áá±á·áá»áá·áºááŸá¯á áááºááŒááºážááá¯ááºáᬠáá±á¬ááºáááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœáẠáá¬áá¬áá±á«áºááœáẠááááºážáááºážááŒááºážááŒá áºáááºá
á¥ááá¬á¡á¬ážááŒáá·áº á¡áá±ážáá±ážáá
áºáᯠáááºáá®ážáááºá
á€áááºááŸá¬ á áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶ážá¡áá¬áá»á¬áž ááŒá áºáá»ááºáá±ááá·áº ááá¯ááºážáá»á¬ážááŒá áºáááºá
def run(self, epochs, lr, experiment_name):
# getting the id of the experiment, creating an experiment in its absence
remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
# creating a "run" and getting its id
remote_run_id = self.remote_server.get_run_id(remote_experiment_id)
# indicate that we want to save the results on a remote server
mlflow.set_tracking_uri(self.tracking_uri)
mlflow.set_experiment(experiment_name)
with mlflow.start_run(run_id=remote_run_id, nested=False):
mlflow.keras.autolog()
self.train_pipeline.train(lr=lr, epochs=epochs)
try:
self.log_tags_and_params(remote_run_id)
except mlflow.exceptions.RestException as e:
print(e)
á€áá±áá¬ááœáẠself.remote_server ááẠmlflow.tracking áááºážáááºážáá»á¬ážááẠáá±ážáááºáá±á¬ wrapper áá áºáá¯ááŒá áºáááºá MlflowClient (áá»áœááºá¯ááºáááºáááºážááá¯á¡áááºááŒá±á á±áááºááŒá¯áá¯ááºáá¬ážáááº)á áá»áœááºá¯ááºáááºá ááºážáááºááŸá¯áá áºáá¯ááá¯áááºáá®ážááŒá®ážáá¬áá¬áá±á«áºááœáẠrun áá±á¬á¡áá°á¡áá®ááŒáá·áºááŒá¯áá¯ááºáá¬ážáááºá ááá¯á·áá±á¬ááºá ááœáŸáá·áºáááºááŸá¯ááááºáá»á¬ážááᯠáááºááá·áºáá±áá¬ááœáẠáá±á«ááºážá ááºááá·áºáááºááᯠáá»áœááºá¯ááºááœáŸááºááŒááẠ(mlflow.set_tracking_uri(self.tracking_uri)))á mlflow.keras.autolog() á¡ááá¯á¡áá»á±á¬áẠáá±á¬á·ááºáá¯ááºááŒááºážááᯠáá»áœááºá¯ááºááœáá·áºáá«áááºá áá±á¬áá±á¬ááẠMLflow ááŒá±áá¬áá¶ááŒááºážááẠTensorFlow, Keras, Gluon XGBoost, LightGBM, Spark á¡ááœáẠá¡ááá¯á¡áá»á±á¬áẠááŸááºáááºážááᯠáá¶á·ááá¯ážáá±ážáá«áááºá ááá·áºáá±á¬áẠááá¯á·ááá¯áẠáá áºáá»á áºááá¯ááºááᯠááŸá¬áááœá±á·áá«áá áááºááẠá¡ááŒá²áááºáž ááŒááºáá¬ážá áœá¬ ááŸááºáááºážáááºááá¯ááºáááºá áá»áœááºáá±á¬áºááá¯á· áá±á·áá»áá·áºááŸá¯ á áááºáá±áá«ááŒá®á áá±ážáá¶áá±á«ááºáá®áá±á¬áá¬áá¬ááœáẠáááºáá»á¬ážááᯠááŸááºáá¯á¶áááºááŒá®áž ááá·áºááœááºážááŸá¯ááá·áºáááºáá»ááºáá»á¬ážá
ááá¯ááºážááŸá áºááá¯ááºážááŸáá·áº á¡ááŒá¬ážáá°ááá¯ááºážáá²á·ááá¯á· áááºááẠááœáŸáá·áºáááºááŸá¯á¡á¬ážáá¯á¶ážááŸáá·áº áááºáááºááá·áº á¡áá»ááºá¡áááºááᯠááá°ááá¯ááºáááºá á¡á±ážáá¬áž?
áá á á®áá¶ááááºážááᯠáá±ážááœá²áááºá
ááᯠááá±á¬áá»ááºááᯠá
áááºááẠááœááºáá°á¡á±á¬áẠáá¯ááºááá¯ááºáá¡á±á¬ááºá áá«ááá¯áá¯ááºááá¯á·á ááá±á¬áá»áẠroot ááŸá¬ MLproject áá²á· conda.yaml ááá¯ááºááᯠááá·áºáá«á
MLproject
name: flow_segmentation
conda_env: conda.yaml
entry_points:
main:
parameters:
categories: {help: 'list of categories from coco dataset'}
epochs: {type: int, help: 'number of epochs in training'}
lr: {type: float, default: 0.001, help: 'learning rate'}
batch_size: {type: int, default: 8}
model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
backbone_name: {type: str, default: 'resnet18', help: 'exampe resnet18, resnet50, mobilenetv2 ...'}
tracking_uri: {type: str, help: 'the server address'}
experiment_name: {type: str, default: 'My_experiment', help: 'remote and local experiment name'}
command: "python mlflow_training.py
--epochs={epochs}
--categories={categories}
--lr={lr}
--tracking_uri={tracking_uri}
--model_name={model_name}
--backbone_name={backbone_name}
--batch_size={batch_size}
--experiment_name={experiment_name}"
MLflow ááá±á¬áá»ááºááœáẠáá¯ááºááá¹áááá»á¬ážá áœá¬ ááŸááááºá
- á¡ááẠ- ááá·áºááá±á¬áá»ááºá¡áááºá
- áááºáááºážáá»áẠ- áá»áœááºá¯ááºáá¡ááŒá±á¡áá±ááœááºá conda_env ááẠAnaconda ááá¯áááºáááºáááºá¡áá¯á¶ážááŒá¯ááŒá±á¬ááºážáá±á¬áºááŒááŒá®áž ááŸá®ááá¯ááŸá¯áá±á¬áºááŒáá»ááºááẠconda.yaml ááá¯ááºááœááºááŸááá±áá«áááºá
- áááºááœáá·áºá¡ááŸááºáá»á¬áž - áááºááá·áºááá¯ááºáá»á¬ážááŸáá·áº áá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºááá¯ááºááá·áº ááá·áºáááºáá»ááºáá»á¬ážááᯠááœáŸááºááŒááẠ(áá±á·áá»áá·áºáá±ážá áá±á¬á¡áá«ááœáẠááá·áºáááºáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠá¡ááá¯á¡áá»á±á¬áẠááŸááºáá¬ážáá¬ážáááº)
conda.yaml
name: flow_segmentation
channels:
- defaults
- anaconda
dependencies:
- python==3.7
- pip:
- mlflow==1.8.0
- pysftp==0.2.9
- Cython==0.29.19
- numpy==1.18.4
- pycocotools==2.0.0
- requests==2.23.0
- matplotlib==3.2.1
- segmentation-models==1.0.1
- Keras==2.3.1
- imgaug==0.4.0
- tqdm==4.46.0
- tensorflow-gpu==1.14.0
á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážá¡ááœáẠDocker ááᯠáááºá runtime áááºáááºážáá»ááºá¡ááŒá
Ạáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
4. áááºáááºážá ááá¯ááºáá¡á±á¬ááº
áá»áœááºá¯ááºááá¯á·ááẠááá±á¬áá»ááºááá¯ááœá¬ážááŒá®áž ááá±á¬áá»ááºáááºážááœáŸááºááá¯á·ááœá¬ážáá«-
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
Run áááºá¡ááœáẠá á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá
pip install mlflow
pip install pysftp
áá¬ááŒá áºááá¯á·áá²ááá¯áá±á¬á· áá« conda_env ááá¯á¡áá¯á¶ážááŒá¯ááá·áºá¥ááá¬ááœááºá Anaconda ááá¯áááºáááœááºáá»á°áá¬áá±á«áºááœááºááá·áºááœááºážááá«ááẠ(ááá¯á·áá±á¬áºááá¯á¡ááºáá±á¬áááºáá±á·áá»áºá¡á¬ážáá¯á¶ážááá¯áááºááá¯ááºááá¯ááºááá·áºááœááºážááŒá®áž launch parameters áá»á¬ážááŒáá·áºáá á¬ážááŒááºážááŒáá·áºáááºážááá¯áááºáá±á¬ááºááŸáááá¯ááºáááº) á
ááŒáá¯áááºááŒááºáááºááŸá¯ á¡ááá·áºáá»á¬ážá¡á¬ážáá¯á¶áž ááŒá®ážááŒá±á¬ááºááŒá®áž áááºáááºážááᯠá áááºááá¯ááºáá«ááŒá®á ááá±á¬áá»ááºá¡ááŒá áºááŸ-
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
á¡áááá·áºááᯠááá·áºááœááºážááŒá®ážáá±á¬ááºá conda áááºáááºážáá»ááºááᯠá¡ááá¯á¡áá»á±á¬áẠáááºáá®ážáááºááŒá
áºááŒá®áž áá±á·áá»áá·áºááŸá¯ á
áááºáááºááŒá
áºáááºá
á¡áááºáá±á¬áºááŒáá« á¥ááá¬ááœáẠáá»áœááºá¯ááºááẠáá±á·áá»áá·áºááŸá¯áá»á¬ážá¡ááœáẠá¡ááá¯ááºážá¡áá±á¡ááœááºá áá»áœááºá¯ááºááá¯á· ááœá²áá±ážááá¯áá±á¬ á¡áá»áá¯ážá¡á
á¬ážáá»á¬ážááᯠáá»á±á¬áºááŒááºáá²á·ááẠ(á
á¬áááºážá¡ááŒáá·áºá¡á
á¯á¶ááᯠáááºááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
ááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ ááá·áºáááºáá»ááºáá»á¬ážá
á¬áááºážá¡ááŒáá·áºá¡á
á¯á¶ááᯠMLproject ááá¯ááºááœáẠááœá±á·ááá¯ááºáá«áááºá
5. áááºáá°ááŸá¯ááááºáá»á¬ážááᯠá¡áá²ááŒááºáá«á
áááºáááºážááŒá®ážáá«áá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááá¬áá¬ááááºá
á¬ááá¯á· ááá±á¬ááºáá¬ááœáẠááœá¬ážááá¯ááºáá«áááºá
á€ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá ááºážáááºááŸá¯á¡á¬ážáá¯á¶áž (áááºáááºááááº) ááŸáá·áº ááŒá±ážááŒááºážááá¯ááºáᬠá¡áá»ááºá¡ááẠ(á¡áááº) ááá¯á·ááᯠá€áá±áá¬ááœáẠááœá±á·ááá«áááºá áá áºááœáŸááºááŸá¯áá áºáá¯á á®á¡ááœáẠááá¯ááá¯á¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬áž (áá«áá¬áá®áá¬áá»á¬ážá áááºááá áºáá»á¬ážá á¡áá¯ááá¬áá á¹á ááºážáá»á¬ážááŸáá·áº áá±á¬ááºáááºá¡áá»ááºá¡áááºá¡áá»áá¯á·) ááᯠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
áááºááá áºáá áºáá¯á á®á¡ááœáẠáá»áœááºá¯ááºááá¯á·ááẠááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááááá¯ááºážááŒá±á¬ááºážááᯠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
á¡á²áá«ááœá±á áá±á¬áá±á¬áááºááœááºá áá»áœááºá¯ááºááá¯á·ááẠááááºáá»á¬ážááᯠ"áááºá áœá²" áá¯ááºááœáẠááá¯ááºážááŒá¬ážá áááºááŒá¬ááá¯ááºááŒá®áž MLflow API ááᯠá¡áá¯á¶ážááŒá¯á á¡ááá¯á¡áá»á±á¬áẠááŸááºáááºááŒá±á¬ááºážááá¯áááºáž áááºáááºááŸááºááá¯ááºáááºá
6. áá±á¬áºáááºááᯠááŸááºáá¯á¶áááºáá«á
áá»áœááºá¯ááºááá¯á·á áá±á¬áºáááºááᯠááœá²ááŒááºážá áááºááŒá¬ááŒá®áž ááá¯ááºááœá²á¡ááœáẠá¡áááºááá·áºááŒá áºááŒá®áᯠáá¯á¶ážááŒááºááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠáááºážááᯠá á¬áááºážááœááºážááẠáááºáááºáá¯ááºáá±á¬ááºááŒá®ážá áá»áœááºá¯ááºááá¯á· ááá¯á¡ááºáá±á¬ áá áºááœáŸááºááŸá¯ááᯠ(ááááºá á¬ááá¯ááºááœáẠááŒáá¬ážááá·áºá¡ááá¯ááºáž) ááᯠááœá±ážáá»ááºááŒá®áž á¡á±á¬ááºááá¯á· áááºážááœá¬ážáá«á
áá»áœááºá¯ááºááá¯á·ááá±á¬áºáááºááᯠáá¬áááºáá±ážááŒá®ážáá±á¬ááºá áááºážááœáẠáá¬ážááŸááºážáá áºáá¯ááŸááááºá á¡áááºáá° á¡ááŒá¬ážáá±á¬áºáááºááᯠááááºážáááºážáá«á áá¬ážááŸááºážááᯠá¡ááá¯á¡áá»á±á¬áẠá¡ááá·áºááŒáŸáá·áºáááºááŒá áºáááºá
áá±á¬áºáááºáá áºáá¯á á®á¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá±á¬áºááŒáá»ááºáá áºáá¯ááᯠáá±á«ááºážááá·áºááá¯ááºááŒá®áž ááŒááºáááºáá¯á¶ážáᯠ(Stagingá Productioná Archived) á០áá áºáá¯ááᯠááœá±ážáá»ááºááá¯ááºáááº) ááá¯á·áá±á¬áẠAPI ááᯠá¡áá¯á¶ážááŒá¯á áá¬ážááŸááºážááŒá±á¬ááºážáá²ááŒááºážááŸáá·áºá¡áá° á¡ááá¯ááŒá±á¬ááºážááœááºááŒááºááœááºáá±ážááá·áº á¡ááá¯áá«ááŒááºáááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· áááºáá±á¬ááºááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
áá»áœááºá¯ááºááá¯á·áááºáááºáž áá±á¬áºáááºá¡á¬ážáá¯á¶ážááᯠááœááºáá°á áœá¬ áá¯á¶ážá áœá²ááá¯ááºáááº
áááºážááá¯á·ááá¬ážááŸááºážáá»á¬áž
ááááºá á¬ááá¯ááºááœááºáá²á·ááá¯á·á áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááᯠAPI ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááá¯ááºáááºá
7. áá±á¬áºáááºááᯠá¡áá¯á¶ážáá»áá«á
á€á¡ááá·áºááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠáá±á·áá»áá·áºáá¬ážáá±á¬ (keras) áá±á¬áºáááºáá áºáᯠááŸáááŸáá·áºááŒá®ážááŒá áºáááºá áááºá¡áá¯á¶ážááŒá¯áá¯á¶á¥ááá¬áá áºáá¯á
class SegmentationModel:
def __init__(self, tracking_uri, model_name):
self.registry = RemoteRegistry(tracking_uri=tracking_uri)
self.model_name = model_name
self.model = self.build_model(model_name)
def get_latest_model(self, model_name):
registered_models = self.registry.get_registered_model(model_name)
last_model = self.registry.get_last_model(registered_models)
local_path = self.registry.download_artifact(last_model.run_id, 'model', './')
return local_path
def build_model(self, model_name):
local_path = self.get_latest_model(model_name)
return mlflow.keras.load_model(local_path)
def predict(self, image):
image = self.preprocess(image)
result = self.model.predict(image)
return self.postprocess(result)
def preprocess(self, image):
image = cv2.resize(image, (256, 256))
image = image / 255.
image = np.expand_dims(image, 0)
return image
def postprocess(self, result):
return result
á€ááœáẠself.registry ááẠmlflow.tracking.MlflowClient ááẠá¡áááºááŒá±á á±áááºá¡ááœáẠáá±ážáááºáá±á¬ áá¯ááºááá¯ážááŸá¯áá áºáá¯ááŒá áºáááºá á¡áááá¡áá»ááºááŸá¬ á¡áá±ážááááºážáá¬áá¬áá áºáá¯á¡á¬áž áá»áœááºá¯ááºáááºáá±á¬ááºááŒá®áž áááºááŸááºáá¬ážáá±á¬á¡áááºááŸáá·áº áá±á¬ááºáá¯á¶ážááœááºááŸááá¬ážááŸááºážááŒáá·áº áá±á¬áºáááºáá áºáá¯ááᯠááŸá¬ááœá±áá±ááŒááºážááŒá áºáááºá ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááẠááŸá±ážáá±á¬ááºážáá á¹á ááºážááᯠ./model ááá¯ááºááœá²ááœáẠáá±á«ááºážáá¯ááºáá¯ááºááŒá®áž á€áááºážááœáŸááºááœáẠmlflow.keras.load_model(local_path) á០áá±á¬áºáááºááᯠáááºáá±á¬ááºáá«á ááá¯áá»áœááºá¯ááºááá¯á·ááá±á¬áºáááºááá¯áá¯á¶ážááá¯ááºáááºá CV (ML) developer áá»á¬ážááẠáá±á¬áºáááºááᯠá¡ááœááºááá° ááŒáŸáá·áºáááºááá¯ááºááŒá®áž áá¬ážááŸááºážá¡áá áºáá»á¬ážááᯠáá¯ááºáá±ááá¯ááºáááºá
áááá¯á¶ážáá»á¯ááº
ááœáá·áºááŒá¯áá²á·á áá áºáá áºáá¯ááᯠáááºááŒáá²á·áááº-
- ML áá±á¬áºáááºáá»á¬ážá áá±á·áá»áá·áºáá±ážááá¯ážáááºááŸá¯ááŸáá·áº ááááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááᯠáááá¯ááœáẠááááºážáááºážáá«á
- ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áááºáááºážáá»ááºááᯠá¡ááŒááºá¡áá¯á¶ážáá»áá«á
- áá±á¬áºáááºáá»á¬ážááœáẠá¡áá¯ááºáááá¯ážáááºááŸá¯ááᯠá á±á¬áá·áºááŒáá·áºááŒá®áž ááœá²ááŒááºážá áááºááŒá¬áá«á
- áá±á¬áºáááºáá»á¬ážá á¡ááŒá±á¡áá±ááᯠáá¬ážááŸááºážááŸáá·áº á á®áá¶ááá·áºááœá²ááẠá¡áááºááŒá±áááºá
- ááá¬áá²á· áá±á¬áºáááºááœá±ááᯠá¡áá¯á¶ážáá»ááá¯á· ááœááºáá«áááºá
á€á¥ááá¬ááẠáá á¬ážá áá¬áá áºáá¯ááŒá áºááŒá®áž ááááºáá»á¬ážááᯠá¡áá²ááŒááºááŒááºážááŸáá·áº áá±á¬áºáááºáá»á¬ážá ááŸááºáá¯á¶áááºááŒááºáž (á¡ááŸáẠ5 ááŸáá·áº 6 á¡áá®ážáá®áž) á¡áá«á¡ááẠááá·áºááá¯ááºááá¯ááºá áá áºáááºáá±á¬ááºááŒááºážá¡ááœáẠá ááŸááºáá áºáá¯á¡ááŒá Ạáá¯ááºáá±á¬ááºááá¯ááºááẠááá¯á·ááá¯áẠáááºááẠáá±áá¬á¡ááœá²áá»á¬ážááᯠáá¬ážááŸááºážááá·áºááœááºážááẠááá¯á·ááá¯áẠá¡ááŒá¬ážá¡áá¬áá áºáá¯áᯠááŒá áºááá¯ááºáá«ááá¬ážá áá«ááŒáá¯ážá á¬ážáá±áá²á·á¡áá»ááºá áááºáž MLOps áá áºáá¯áá¯á¶ážááá¯áááºá MLflow á á¡áá¯á¶ážáááºáá²á·áááºážáááºážáá áºáá¯áá²á
áá«ááá±á¬áºááŒáá² áááºážááŒá¯á¶ááœá±á·áá²á·ááá²á· ááŒá¿áá¬ááœá±ááᯠáá±ážáá»áá«á
ááá·áºááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº ááá¯ááºáá®á
á±ááẠá
áá
áºááœáẠáááºáá¬ááá·áºáááºáááºážá
ááŒá¿áá¬á¡á¬ážáá¯á¶áž ááá¯á·ááá¯áẠáá
áºá
áááºáá
áºááá¯ááºážááᯠááŒá±ááŸááºážááẠáááºááá·áºáááááá¬ááŸáá·áº áá»ááºážáááºáááºážáá»á¬ážááᯠáááºá¡áá¯á¶ážááŒá¯ááááºážá
PS ááá·áºááºááŸá
áºáá¯áá»ááºáá¬ážáá±ážáá«á·áááºá
github ááá±á¬áá»áẠ-
MLflow -
áá±ážááœááºážáá»á¬ážá¡ááœáẠáá»áœááºá¯ááºá á¡áá¯ááºá¡á®ážáá±ážááº- [á¡á®ážáá±ážááºááá¯áá¬ááœááºáá¬ážáááº]
áá»áœááºá¯ááºááá¯á·ááá¯áá¹ááá®ááẠá¡áá¯ááºáá®áá»áœááºážáá»ááºáá°áá»á¬ážá¡ááœáẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ááœá²áá»á¬ážááᯠá¡áá«á¡á¬ážáá»á±á¬áºá
áœá¬ áááºáá¶áá»ááºážááá±ážáá«áááºá á¥ááá¬- áá°ááá¯áẠ8 áááºáá±á· 19:00 áá±á¬áºá
ááá¯á
á¶áá±á¬áºáá»áááºá CV Meetup ááᯠá¡áœááºááá¯ááºážáá±á¬áºáááºááŒáá·áº ááŒá¯áá¯ááºáááºááŒá
áºáááºá á
áááºáá«áááºá
á¬ážáá«á á
á¬áááºážáá±ážááœááºážááá¯ááºáá«áááºá
source: www.habr.com