ããã«ã¡ã¯ãã¿ããªïŒ ç§ã¯ CROC ã® CV éçºè ã§ãã ç§ãã¡ã¯3幎åããCVåéã®ãããžã§ã¯ããå®æœããŠããŸããã ãã®éãç§ãã¡ã¯å€ãã®ããšãè¡ããŸãããããšãã°ãé転äžã«é£²é ãå«ç ãé»è©±ã§è©±ããªãããã«ãã©ã€ããŒãç£èŠãã倢ãé²ãèŠãã«éè·¯ãèŠãŠããŸããã ; ç§ãã¡ã¯ãå°çšè»ç·ãé転ããããã€ãã®é§è»ã¹ããŒã¹ãå æãã人ã ãèšé²ããŸããã åŽåè ããã«ã¡ãããæè¢ãªã©ãççšããããšãä¿èšŒããã æœèšãžã®ç«ã¡å ¥ããåžæããŠããåŸæ¥å¡ãç¹å®ããã ç§ãã¡ã¯ã§ããéããã¹ãŠãæ°ããŸããã
ç§ã¯äžäœäœã®ããã«ãããªããšãããŠããã®ã§ããããïŒ
ãããžã§ã¯ããå®è¡ããéçšã§ãç§ãã¡ã¯äœåºŠãå°é£ã«ééããŸãããã®äžã«ã¯ãçãããããç¥ã£ãŠããããŸãã¯å°æ¥ç¥ãããšã«ãªãåé¡ã®ããã€ãããããŸãã
ç¶æ³ãã·ãã¥ã¬ãŒã·ã§ã³ããŠã¿ãŸããã
ç§ãã¡ããML ã«é¢é£ãã掻åãè¡ã£ãŠããè¥ãäŒæ¥ãNãã«å°±è·ãããšæ³åããŠã¿ãŸãããã ç§ãã¡ã¯ ML (DLãCV) ãããžã§ã¯ãã«åãçµãã§ããŸããããã®åŸäœããã®çç±ã§å¥ã®ä»äºã«åãæ¿ããéåžžã¯äŒæ©ããšããèªåèªèº«ãŸãã¯ä»ã®äººã®ãã¥ãŒãã³ã«æ»ããŸãã
- æ£å¿µå Žããã£ãŠæ¥ãŸããã©ãã§åæ¢ããããã©ã®ãã€ããŒãã©ã¡ãŒã¿ãè©ŠãããããããŠæãéèŠãªããšã«ãããããã©ã®ãããªçµæããããããããäœããã®æ¹æ³ã§æãåºãå¿
èŠããããŸãã
ãã¹ãŠã®èµ·åã«é¢ããæ å ±ã誰ãä¿åãããã«ã€ããŠã¯ãããããæ§æãã¡ã¢åž³ãã¯ã©ãŠãã®äœæ¥ç°å¢ãªã©ãå€ãã®ãªãã·ã§ã³ããããŸãã ãã€ããŒãã©ã¡ãŒã¿ãã³ãŒãå ã§ã³ã¡ã³ãè¡ãšããŠä¿åãããŠãããšãã®ãªãã·ã§ã³ãããŸããŸç®ã«ããŸããããããã¯äžè¬çã«ã¯ç©ºæ³ã§ãã ããã§ãèªåã®ãããžã§ã¯ãã§ã¯ãªããéè·ãã人ã®ãããžã§ã¯ãã«æ»ããmodel_1.pb ãšããã³ãŒããšã¢ãã«ãç¶æ¿ãããšããŸãã åçãå®æããããã¹ãŠã®çã¿ãäŒããããã«ãããªããåå¿è ã®å°é家ã§ãããšæ³åããŠã¿ãŸãããã - ã©ããã ã³ãŒããå®è¡ããã«ã¯ãç§ãã¡ãšã³ãŒãã䜿çšããŠäœæ¥ããå šå¡ãç°å¢ãäœæããå¿ èŠããããŸãã äœããã®çç±ã§åœŒãã圌ãç§ãã¡ã®çžç¶è²¡ç£ãšããŠæ®ããªãã£ãããšããããããŸãã ãããç°¡åã§ã¯ãªãäœæ¥ã«ãªãå¯èœæ§ããããŸãã ãã®ã¹ãããã§æéãç¡é§ã«ããããªãã§ããã?
- ã¢ãã« (èªåè»æ¢ç¥æ©ãªã©) ããã¬ãŒãã³ã°ããŸãã éåžžã«è¯å¥œãªç¶æ ã«ãªã£ãã®ã§ãçµæãä¿åããŸãã ããã car_detection_v1.pb ãšåä»ããŸãããã 次ã«ãå¥ã® car_detection_v2.pb ããã¬ãŒãã³ã°ããŸãã ãã°ããããŠãç§ãã¡ã®ååãç§ãã¡èªèº«ããããŸããŸãªã¢ãŒããã¯ãã£ã䜿çšããŠæããããšãå¢ããŠããŸããã ãã®çµæã倧éã®ææç©ã圢æããããããã«é¢ããæ å ±ãå ¥å¿µã«åéããå¿ èŠããããŸã (ãã ããä»ã®ãšããã¯ããåªå ãã¹ãäºé ããããããããã¯åŸã§è¡ããŸã)ã
- OKãããçµããã§ãïŒ ã¢ãã«ãããŸãïŒ æ¬¡ã®ã¢ãã«ã®ãã¬ãŒãã³ã°ãéå§ããããæ°ããåé¡ã解決ããããã®ã¢ãŒããã¯ãã£ãéçºãããã§ããŸãã? ãããšããè¶ã飲ã¿ã«è¡ã£ãŠãããã§ãã? ãããŠèª°ãé åããã®ã§ããããïŒ
åé¡ã®ç¹å®
ãããžã§ã¯ãã補åã®éçºã«ã¯å€ãã®äººãæºãããŸãã ãããŠæéãçµã€ã«ã€ããŠã人ãå»ã£ããæ¥ãããããããžã§ã¯ããå¢ãããããžã§ã¯ãèªäœãããè€éã«ãªã£ãŠãããŸãã ãããã«ãããäžèšã®ãµã€ã¯ã« (ã ãã§ã¯ãããŸãã) ã®ç¶æ³ã¯ãç¹å®ã®çµã¿åããã§å埩ããšã«çºçããŸãã ããããã¹ãŠãæéã®ç¡é§ãæ··ä¹±ãç·åŒµããããŠãããã顧客ã®äžæºãåŒãèµ·ãããæçµçã«ã¯ãéã®æ倱ã«ã€ãªãããŸãã ç§ãã¡ã¯æ®æ®µãåãå€ãçæãè¿œããããŠããŸãããããããç¬éãäœåºŠãç¹°ãè¿ãå³ãããããšæã人ã¯ããªããšæããŸãã
ãããã£ãŠãXNUMX ã€ã®éçºãµã€ã¯ã«ãçµãŠã解決ããå¿ èŠãããåé¡ãããããšãããããŸããã ãããè¡ãã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- äœæ¥çµæã䟿å©ã«ä¿åããŸãã
- æ°å ¥ç€Ÿå¡ãå·»ã蟌ãããã»ã¹ãç°¡çŽ åããã
- éçºç°å¢ã®å±éããã»ã¹ãç°¡çŽ åããŸãã
- ã¢ãã«ã®ããŒãžã§ã³ç®¡çããã»ã¹ãæ§æããŸãã
- ã¢ãã«ãæ€èšŒãã䟿å©ãªæ¹æ³ãããã
- ã¢ãã«ç¶æ 管çããŒã«ãèŠã€ããŸãã
- ã¢ãã«ãæ¬çªç°å¢ã«é ä¿¡ããæ¹æ³ãèŠã€ããŸãã
ãã®ã©ã€ããµã€ã¯ã«ãç°¡åãã€äŸ¿å©ã«ç®¡çã§ããã¯ãŒã¯ãããŒãèæ¡ããå¿ èŠãããããã§ãã? ãã®å®è·µã¯ MLOps ãšåŒã°ããŸã
MLOps (æ©æ¢°åŠç¿ã® DevOps) ã䜿çšãããšãããŒã¿ ãµã€ãšã³ã¹ ããŒã ãš IT ããŒã ãååããæ©æ¢°åŠç¿ã¢ãã«ã®ç£èŠãæ€èšŒãã¬ããã³ã¹ãéããŠã¢ãã«ã®éçºãšå±éã®ããŒã¹ãé«ããããšãã§ããŸãã
ããªãã¯ã§ãã
ãã®èšäºã§ã¯ãããã»ã¹ã®äžéšã®ã¿ã説æããŸãã å®è£ ã«ã¯ MLflow ããŒã«ã䜿çšããŸãã ããã¯ãªãŒãã³ãœãŒã¹ ãããžã§ã¯ãã§ãããæ¥ç¶ããã«ã¯å°éã®ã³ãŒããå¿ èŠã§ãäžè¬ç㪠ml ãã¬ãŒã ã¯ãŒã¯ãšçµ±åãããŠããŸãã KubeflowãSageMakerãTrains ãªã©ã®ä»ã®ããŒã«ãã€ã³ã¿ãŒãããã§æ€çŽ¢ãããšãããŒãºã«åã£ãããŒã«ãèŠã€ãããããããŸããã
MLFlow ããŒã«ã®äœ¿çšäŸã䜿çšãã MLOps ã®ãæ§ç¯ã
MLFlow ã¯ãML ã¢ãã«ã®ã©ã€ããµã€ã¯ã«ç®¡çã®ããã®ãªãŒãã³ãœãŒã¹ ãã©ãããã©ãŒã ã§ã (
MLflow ã«ã¯ XNUMX ã€ã®ã³ã³ããŒãã³ããå«ãŸããŠããŸãã
- MLflow Tracking - çµæãšããã®çµæã«ã€ãªãã£ããã©ã¡ãŒã¿ã®èšé²ã®åé¡ã«ã€ããŠèª¬æããŸãã
- MLflow ãããžã§ã¯ã - ã³ãŒããããã±ãŒãžåããä»»æã®ãã©ãããã©ãŒã ã§åçŸã§ããŸãã
- MLflow ã¢ãã« - æ¬çªç°å¢ãžã®ã¢ãã«ã®ãããã€ãæ åœããŸãã
- MLflow ã¬ãžã¹ã㪠- éäžãªããžããªã«ã¢ãã«ãä¿åãããã®ç¶æ ã管çã§ããŸãã
MLflow 㯠XNUMX ã€ã®ãšã³ãã£ãã£ã§åäœããŸãã
- launch ã¯ãç»é²ãããã¬ãŒãã³ã°ããã©ã¡ãŒã¿ãã¡ããªã¯ã¹ã®å®å šãªãµã€ã¯ã«ã§ãã
- å®éšã¯äžç·ã«å®è¡ãããããããã¯ãã§ãã
ãã®äŸã®ãã¹ãŠã®æé ã¯ãUbuntu 18.04 ãªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«å®è£ ãããŠããŸãã
1. ãµãŒããŒãå±éãã
ãããžã§ã¯ããç°¡åã«ç®¡çããå¿ èŠãªæ å ±ããã¹ãŠåãåãããã«ããµãŒããŒããããã€ããŸãã MLflow 远跡ãµãŒããŒã«ã¯ XNUMX ã€ã®äž»èŠã³ã³ããŒãã³ãããããŸãã
- ããã¯ãšã³ã ã¹ã㢠- ç»é²ãããã¢ãã«ã«é¢ããæ å ±ã®ä¿åãæ åœããŸã (mysqlãmssqlãsqliteãpostgresql ã® 4 ã€ã® DBMS ããµããŒãããŸã)ã
- ã¢ãŒãã£ãã¡ã¯ã ã¹ã㢠- ã¢ãŒãã£ãã¡ã¯ãã®ä¿åãæ åœããŸã (Amazon S7ãAzure Blob StorageãGoogle Cloud StorageãFTP ãµãŒããŒãSFTP ãµãŒããŒãNFSãHDFS ã® 3 ã€ã®ã¹ãã¬ãŒãž ãªãã·ã§ã³ããµããŒãããŸã)ã
ãšã㊠ã¢ãŒãã£ãã¡ã¯ãã¹ã㢠簡åã«ããããã«ãSFTP ãµãŒããŒãäŸã«æããŸãã
- ã°ã«ãŒããäœæãã
$ sudo groupadd sftpg
- ãŠãŒã¶ãŒãè¿œå ãããã®ãŠãŒã¶ãŒã®ãã¹ã¯ãŒããèšå®ããŸã
$ sudo useradd -g sftpg mlflowsftp $ sudo passwd mlflowsftp
- ããã€ãã®ã¢ã¯ã»ã¹èšå®ã調æŽãã
$ 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
ãšã㊠ããã¯ãšã³ãã¹ã㢠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 ããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿ èŠããããŸã (å¥ã®ä»®æ³ç°å¢ãäœæããããšããå§ãããŸã)ã
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. 远跡ãè¿œå ãã
ç§ãã¡ã®ãã¬ãŒãã³ã°ã®çµæã倱ãããªãããã«ãå°æ¥ã®äžä»£ã®éçºè ãäœãèµ·ãã£ãŠããã®ããç解ãã幎é·ã®ä»²éãçãããåŠç¿ããã»ã¹ãå·éã«åæã§ããããã«ããããã«ã远跡ãè¿œå ããå¿ èŠããããŸãã 远跡ãšã¯ããã©ã¡ãŒã¿ãã¡ããªã¯ã¹ãã¢ãŒãã£ãã¡ã¯ããããã³ãã¬ãŒãã³ã°ã®éå§ã«é¢ããè¿œå æ å ±ããµãŒããŒã«ä¿åããããšãæå³ããŸãã
ããšãã°ãç§ã¯å°ããªãã®ãäœæããŸãã
æãèå³æ·±ãããšãèµ·ããè¡ã¯æ¬¡ã®ãšããã§ãã
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 ã¡ãœããã®å°ããªã©ãããŒã§ãã MlflowClient (䟿å®äžäœæããŸãã) ã䜿çšããŠå®éšãäœæãããµãŒããŒäžã§å®è¡ããŸãã 次ã«ãèµ·åçµæãããŒãžããå Žæãæå®ããŸã (mlflow.set_tracking_uri(self.tracking_uri))ã èªåãã®ã³ã° mlflow.keras.autolog() ãæå¹ã«ããŸãã çŸåšãMLflow Tracking 㯠TensorFlowãKerasãGluon XGBoostãLightGBMãSpark ã®èªåãã°ããµããŒãããŠããŸãã ãã¬ãŒã ã¯ãŒã¯ãŸãã¯ã©ã€ãã©ãªãèŠã€ãããªãå Žåã¯ããã€ã§ãæ瀺çã«ãã°ãèšé²ã§ããŸãã ãã¬ãŒãã³ã°ãéå§ããŠããŸãã ãªã¢ãŒããµãŒããŒã«ã¿ã°ãç»é²ãããã©ã¡ãŒã¿ãå ¥åããŸãã
æ°è¡å ¥åããã ãã§ãä»ã®äººãšåãããã«ããã¹ãŠã®æã¡äžãã«é¢ããæ å ±ã«ã¢ã¯ã»ã¹ã§ããŸãã ãããïŒ
3. ãããžã§ã¯ããäœæããŸã
次ã«ããããžã§ã¯ããç°¡åã«èµ·åã§ããããã«ããŸãããã ãããè¡ãã«ã¯ãMLproject ãã¡ã€ã«ãš conda.yaml ãã¡ã€ã«ããããžã§ã¯ã ã«ãŒãã«è¿œå ããŸãã
MLãããžã§ã¯ã
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 ã䜿çšã§ããŸãã詳现ã«ã€ããŠã¯ããåç
§ããŠãã ããã
4. ãã¬ãŒãã³ã°ãå§ããŸããã
ãããžã§ã¯ãã®ã¯ããŒã³ãäœæãããããžã§ã¯ã ãã£ã¬ã¯ããªã«ç§»åããŸãã
git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/
å®è¡ããã«ã¯ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããå¿ èŠããããŸã
pip install mlflow
pip install pysftp
ãªããªãconda_env ã䜿çšããäŸã§ã¯ãAnaconda ãã³ã³ãã¥ãŒã¿ã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸã (ãã ããå¿ èŠãªããã±ãŒãžããã¹ãŠèªåã§ã€ã³ã¹ããŒã«ããèµ·åãã©ã¡ãŒã¿ããããããšã§ãããåé¿ã§ããŸã)ã
ãã¹ãŠã®æºåæé ãå®äºããã®ã§ããã¬ãŒãã³ã°ãéå§ã§ããŸãã ãããžã§ã¯ãã®ã«ãŒããã:
$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .
ã³ãã³ããå
¥åãããšcondaç°å¢ãèªåäœæããããã¬ãŒãã³ã°ãéå§ãããŸãã
äžã®äŸã§ã¯ããã¬ãŒãã³ã°çšã®ãšããã¯æ°ãã»ã°ã¡ã³ãåããã«ããŽãªãæž¡ããŸãã (å®å
šãªãªã¹ããåç
§ã§ããŸã)
䜿çšå¯èœãªãã©ã¡ãŒã¿ã®å®å
šãªãªã¹ãã¯ãMLproject ãã¡ã€ã«ã«ãããŸãã
5. åŠç¿çµæãè©äŸ¡ãã
ãã¬ãŒãã³ã°ãå®äºãããããã©ãŠã¶ã§ãµãŒããŒã®ã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
ããã§ã¯ããã¹ãŠã®å®éšã®ãªã¹ã (å·Šäž) ãšå®è¡ã«é¢ããæ å ± (äžå€®) ã衚瀺ãããŸãã èµ·åããšã«ããã詳现ãªæ å ± (ãã©ã¡ãŒã¿ãã¡ããªã¯ã¹ãã¢ãŒãã£ãã¡ã¯ããããã³ããã€ãã®è¿œå æ å ±) ã衚瀺ã§ããŸãã
ã¡ããªã¯ã¹ããšã«å€æŽå±¥æŽã芳å¯ã§ããŸã
ãããã®ã çŸæç¹ã§ã¯ãçµæããæåãã¢ãŒãã§åæã§ããŸãããŸããMLflow API ã䜿çšããŠèªåæ€èšŒãèšå®ããããšãã§ããŸãã
6. ã¢ãã«ãç»é²ãã
ã¢ãã«ãåæããæŠéã®æºåãã§ããŠãããšå€æããããç»é²ã«é²ã¿ãŸãããã®ããã«ãå¿ èŠãªèµ·åãéžæã (åã®æ®µèœã§ç€ºããããã«)ãäžã«é²ã¿ãŸãã
ã¢ãã«ã«ååãä»ãããšãããŒãžã§ã³ã決ãŸããŸãã å¥ã®ã¢ãã«ãåãååã§ä¿åãããšãèªåçã«ããŒãžã§ã³ã¢ãããããŸãã
ã¢ãã«ããšã«èª¬æãè¿œå ããXNUMX ã€ã®ç¶æ (ã¹ããŒãžã³ã°ãå®çšŒåãã¢ãŒã«ã€ã) ã®ãããããéžæã§ããŸãããã®åŸã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) éçºè ã¯ãã¢ãã«ãç°¡åã«æ¹åããæ°ããããŒãžã§ã³ãå ¬éã§ããŸãã
çµè«
ç§ã¯æ¬¡ã®ããšãå¯èœã«ããã·ã¹ãã ã玹ä»ããŸããã
- ML ã¢ãã«ããã¬ãŒãã³ã°ã®é²è¡ç¶æ³ãçµæã«é¢ããæ å ±ãäžå çã«ä¿åããŸãã
- éçºç°å¢ãè¿ éã«å±éããŸãã
- ã¢ãã«ã®äœæ¥ã®é²è¡ç¶æ³ãç£èŠããã³åæããã
- ã¢ãã«ã®ããŒãžã§ã³ç®¡çãç¶æ 管çã«äŸ¿å©ã§ãã
- çµæãšããŠåŸãããã¢ãã«ããããã€ããã®ã¯ç°¡åã§ãã
ãã®äŸã¯ããã¡ãã§ãããç¬èªã®ã·ã¹ãã ãæ§ç¯ããããã®åºçºç¹ãšããŠæ©èœããŸããããã«ã¯ãçµæã®è©äŸ¡ãšã¢ãã«ã®ç»é² (ãããããã€ã³ã 5 ãš 6) ã®èªååãå«ãŸããå ŽåããããŸãããããã¯ãããŒã¿ã»ããã®ããŒãžã§ã³ç®¡çãªã©ãè¿œå ããããšããããŸãã ç§ãèšãããã£ãã®ã¯ãå šäœãšã㊠MLOps ãå¿ èŠã§ãããMLflow ã¯ç®çãéæããããã®æ段ã«ãããªããšããããšã§ãã
ç§ã衚瀺ããªãã£ããçºçããåé¡ã«ã€ããŠæžããŠãã ããã
ããŒãºãæºããããã«ã·ã¹ãã ã«äœãè¿œå ããŸãã?
åé¡ã®ãã¹ãŠãŸãã¯äžéšã解決ããããã«ã©ã®ãããªããŒã«ãã¢ãããŒãã䜿çšããŸãã?
PS ããã€ãã®ãªã³ã¯ãæ®ããŠãããŸãã
ã®ãããããããžã§ã¯ã -
MLflow -
質åçšã®ä»äºçšã¡ãŒã« - [ã¡ãŒã«ä¿è·]
åœç€Ÿã¯ãIT ã¹ãã·ã£ãªã¹ãåãã®ããŸããŸãªã€ãã³ããå®æçã«äž»å¬ããŠããŸããããšãã°ã8 æ 19 æ¥ã®ã¢ã¹ã¯ã¯æé 00:XNUMX ã«ãªã³ã©ã€ã³åœ¢åŒã§ CV ããŒãã¢ãããéå¬ãããŸããèå³ãããã°åå ã§ããŸããç»é²ããŠãã ããã
åºæïŒ habr.com