MLflow āĻ¸āĻš āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž

āĻšā§āĻ¯āĻžāĻ˛ā§‹, āĻ–āĻžāĻŦā§āĻ°ā§‹āĻ­āĻ¸ā§āĻ•ā§‡āĻ° āĻŦāĻžāĻ¸āĻŋāĻ¨ā§āĻĻāĻžāĻ°āĻžāĨ¤ āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡āĻ‡ āĻ˛āĻŋāĻ–ā§‡āĻ›āĻŋ, āĻāĻ‡ āĻŽāĻžāĻ¸ā§‡ OTUS āĻĻā§āĻŸāĻŋ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻ•ā§‹āĻ°ā§āĻ¸ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻ›ā§‡, āĻ¯āĻĨāĻž āĻŦā§‡āĻ¸ и āĻ‰āĻ¨ā§āĻ¨āĻ¤. āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡, āĻ†āĻŽāĻ°āĻž āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻž āĻ…āĻŦāĻŋāĻ°āĻ¤.

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋāĻ° āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯ āĻšāĻ˛ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛āĻž āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹.

āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§āĻ¯āĻžāĻ˛ā§‹āĻšāĻ¨āĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻŦ āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ āĻāĻ° āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻĨā§‡āĻ•ā§‡ āĻāĻŦāĻ‚ āĻ…āĻ§ā§āĻ¯āĻ¯āĻŧāĻ¨ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ˛āĻ— āĻ•āĻ°ā§āĻ¨āĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ†āĻŽāĻ°āĻž UDF āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ MLflow-āĻāĻ° āĻ¸āĻžāĻĨā§‡ Spark āĻ¸āĻ‚āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻŦāĨ¤

āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—

āĻ†āĻŽāĻžāĻ°āĻž āĻ†āĻ›āĻŋ āĻ†āĻ˛āĻĢāĻž āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻ†āĻŽāĻ°āĻž āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻāĻŦāĻ‚ āĻ•ā§ƒāĻ¤ā§āĻ°āĻŋāĻŽ āĻŦā§āĻĻā§āĻ§āĻŋāĻŽāĻ¤ā§āĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ˛ā§‹āĻ•ā§‡āĻĻā§‡āĻ° āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻāĻŦāĻ‚ āĻ¸ā§āĻ¸ā§āĻĨāĻ¤āĻžāĻ° āĻĻāĻžāĻ¯āĻŧāĻŋāĻ¤ā§āĻŦ āĻ¨āĻŋāĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻŋāĨ¤ āĻāĻ‡ āĻ•āĻžāĻ°āĻŖā§‡āĻ‡ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻŽāĻĄā§‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĄā§‡āĻ­ā§‡āĻ˛āĻĒ āĻ•āĻ°āĻž āĻĄā§‡āĻŸāĻž āĻ¸āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻ¸ āĻĒā§āĻ°ā§‹āĻĄāĻžāĻ•ā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ° āĻ•ā§‡āĻ¨ā§āĻĻā§āĻ°āĻŦāĻŋāĻ¨ā§āĻĻā§āĻ¤ā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ‡ āĻ•āĻžāĻ°āĻŖā§‡āĻ‡ āĻ†āĻŽāĻ°āĻž MLflow-āĻ āĻ†āĻ•ā§ƒāĻˇā§āĻŸ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋ, āĻāĻ•āĻŸāĻŋ āĻ“āĻĒā§‡āĻ¨ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽ āĻ¯āĻž āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻ˛āĻžāĻ‡āĻĢāĻ¸āĻžāĻ‡āĻ•ā§‡āĻ˛ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĻāĻŋāĻ• āĻ•āĻ­āĻžāĻ° āĻ•āĻ°ā§‡ā§ˇ

āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹

MLflow āĻāĻ° āĻŽā§‚āĻ˛ āĻ˛āĻ•ā§āĻˇā§āĻ¯ āĻšāĻ˛ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻāĻ° āĻ‰āĻĒāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ…āĻ¤āĻŋāĻ°āĻŋāĻ•ā§āĻ¤ āĻ¸ā§āĻ¤āĻ° āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻž āĻ¯āĻž āĻĄā§‡āĻŸāĻž āĻŦāĻŋāĻœā§āĻžāĻžāĻ¨ā§€āĻĻā§‡āĻ° āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ (h2o, keras, mleap, āĻĒāĻžāĻ‡āĻŸāĻžāĻ°ā§āĻš, sklearn и tensorflow), āĻ¤āĻžāĻ° āĻ•āĻžāĻœāĻ•ā§‡ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻšā§āĻ›ā§‡āĨ¤

MLflow āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ‰āĻĒāĻžāĻĻāĻžāĻ¨ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡:

  • āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖāĻ•āĻ°āĻŖ - āĻ°ā§‡āĻ•āĻ°ā§āĻĄāĻŋāĻ‚ āĻāĻŦāĻ‚ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§: āĻ•ā§‹āĻĄ, āĻĄā§‡āĻŸāĻž, āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻāĻŦāĻ‚ āĻĢāĻ˛āĻžāĻĢāĻ˛āĨ¤ āĻāĻ•āĻŸāĻŋ āĻŽāĻĄā§‡āĻ˛ āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻž āĻ–ā§āĻŦāĻ‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖāĨ¤
  • āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒ - āĻ¯ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽā§‡ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻŋāĻ‚ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ (āĻ¯ā§‡āĻŽāĻ¨ SageMaker)
  • āĻŽāĻĄā§‡āĻ˛ - āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻžāĻ° āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŽāĻĄā§‡āĻ˛ āĻœāĻŽāĻž āĻĻā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸āĨ¤

āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ (āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻ˛āĻĢāĻžāĻ¤ā§‡) āĻāĻ•āĻŸāĻŋ āĻ“āĻĒā§‡āĻ¨ āĻ¸ā§‹āĻ°ā§āĻ¸ āĻĒā§āĻ˛ā§āĻ¯āĻžāĻŸāĻĢāĻ°ā§āĻŽ āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž, āĻĒā§āĻ¨āĻƒāĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻ¸āĻš āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻœā§€āĻŦāĻ¨āĻšāĻ•ā§āĻ° āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

MLflow āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻž āĻšāĻšā§āĻ›ā§‡

MLflow āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ Python āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡, āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ PyEnv (āĻŽā§āĻ¯āĻžāĻ•ā§‡ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡, āĻšā§‡āĻ• āĻ†āĻ‰āĻŸ āĻ•āĻ°ā§āĻ¨ āĻāĻ–āĻžāĻ¨ā§‡) āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻŦāĨ¤

```
pyenv install 3.7.0
pyenv global 3.7.0 # Use Python 3.7
mkvirtualenv mlflow # Create a Virtual Env with Python 3.7
workon mlflow
```

āĻāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•.

```
pip install mlflow==0.7.0 
            Cython==0.29  
            numpy==1.14.5 
            pandas==0.23.4 
            pyarrow==0.11.0
```

āĻĻā§āĻ°āĻˇā§āĻŸāĻŦā§āĻ¯: UDF-āĻāĻ° āĻŽāĻ¤ā§‹ āĻŽāĻĄā§‡āĻ˛ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž PyArrow āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤ PyArrow āĻāĻŦāĻ‚ Numpy-āĻāĻ° āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ āĻŋāĻ• āĻ•āĻ°āĻž āĻĻāĻ°āĻ•āĻžāĻ° āĻ•āĻžāĻ°āĻŖ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻ—ā§āĻ˛āĻŋ āĻāĻ•ā§‡ āĻ…āĻĒāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŦāĻŋāĻ°ā§‹āĻ§āĻĒā§‚āĻ°ā§āĻŖāĨ¤

āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ UI āĻšāĻžāĻ˛ā§ āĻ•āĻ°ā§āĻ¨

MLflow āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ˛āĻ— āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ āĻŦāĻŋāĻļā§āĻ°āĻžāĻŽ API āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ āĻŽāĻĄā§‡āĻ˛ āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ (āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻšā§‹āĻ¸ā§āĻŸ, āĻ†āĻŽāĻžāĻœāĻ¨ S3, āĻ†āĻœā§āĻ° āĻŦā§āĻ˛āĻŦ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ, Google āĻ•ā§āĻ˛āĻžāĻ‰āĻĄ āĻ¸āĻžā§āĻšāĻ¯āĻŧāĻ¸ā§āĻĨāĻžāĻ¨ āĻŦāĻž SFTP āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°) āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ†āĻ˛āĻĢāĻž āĻšā§‡āĻ˛āĻĨ āĻ AWS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻšāĻŦā§‡ S3āĨ¤

# Running a Tracking Server
mlflow server 
    --file-store /tmp/mlflow/fileStore 
    --default-artifact-root s3://<bucket>/mlflow/artifacts/ 
    --host localhost
    --port 5000

MLflow āĻ•ā§āĻ°āĻŽāĻžāĻ—āĻ¤ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ°āĻžāĻ¨ āĻāĻŦāĻ‚ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻŽā§‡āĻŸāĻžāĻĄā§‡āĻŸāĻž āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŦā§‡āĨ¤ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°ā§āĻ¨ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻ¸ā§āĻĨāĻžāĻ¯āĻŧā§€ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž āĻ¸āĻšāĻœāĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ /tmp.

āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻ†āĻŽāĻ°āĻž āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻžāĻ¨ā§‹ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ mlflow āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ‡ āĻ¤āĻŦā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻŽāĻ¨āĻ•āĻŋ āĻāĻŸāĻŋ āĻ›āĻžāĻĄāĻŧāĻž āĻ†āĻŽāĻ°āĻž āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ UDF-āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋ, āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŽāĻĄā§‡āĻ˛ā§‡āĻ° āĻĒāĻĨā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻĻā§āĻ°āĻˇā§āĻŸāĻŦā§āĻ¯: āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ UI āĻāĻŦāĻ‚ āĻŽāĻĄā§‡āĻ˛ āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ UI āĻāĻ•āĻŸāĻŋ EC2 āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤ā§‡ āĻĨāĻžāĻ•āĻž āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻļā§‡āĻˇā§‡, āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ MLflow āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻŽāĻĄā§‡āĻ˛ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻŽā§‡āĻļāĻŋāĻ¨ā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ S3-āĻ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

MLflow āĻ¸āĻš āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž
āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ UI āĻāĻ•āĻŸāĻŋ S3 āĻŦāĻžāĻ˛āĻ¤āĻŋāĻ¤ā§‡ āĻļāĻŋāĻ˛ā§āĻĒāĻ•āĻ°ā§āĻŽ āĻ¸āĻžā§āĻšāĻ¯āĻŧ āĻ•āĻ°ā§‡

āĻšāĻ˛āĻŽāĻžāĻ¨ āĻŽāĻĄā§‡āĻ˛

āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻšāĻžāĻ˛ā§ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻŽāĻĄā§‡āĻ˛āĻĻā§‡āĻ° āĻĒā§āĻ°āĻļāĻŋāĻ•ā§āĻˇāĻŖ āĻļā§āĻ°ā§ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤

āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻ†āĻŽāĻ°āĻž MLflow āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĨā§‡āĻ•ā§‡ āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ¨ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ āĻ¸ā§āĻ•āĻ˛āĻžāĻ°ā§āĻ¨.

MLFLOW_TRACKING_URI=http://localhost:5000 python wine_quality.py 
  --alpha 0.9
  --l1_ration 0.5
  --wine_file ./data/winequality-red.csv

āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°ā§‡āĻ›āĻŋ, MLflow āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŽāĻĄā§‡āĻ˛ āĻĒā§āĻ¯āĻžāĻ°āĻžāĻŽāĻŋāĻŸāĻžāĻ°, āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻāĻŦāĻ‚ āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻ˛āĻ— āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ āĻ¯āĻžāĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¤āĻžāĻ°āĻž āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻŦāĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻ‡ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯āĻŸāĻŋ āĻ…āĻ¤ā§āĻ¯āĻ¨ā§āĻ¤ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻžāĻ°āĻŖ āĻāĻ‡āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻŦāĻž āĻ•āĻŽāĻŋāĻŸā§‡āĻ° āĻ—āĻŋāĻŸ āĻšā§āĻ¯āĻžāĻļ āĻ˛āĻ— āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ•ā§‹āĻ¨ āĻ•ā§‹āĻĄāĻŸāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°ā§‡āĻ›ā§‡ āĻ¤āĻž āĻŦā§‹āĻāĻžāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ†āĻŽāĻ°āĻž āĻ¸ā§‡āĻ°āĻž āĻŽāĻĄā§‡āĻ˛āĻŸāĻŋ āĻĒā§āĻ¨āĻ°ā§āĻ¤ā§āĻĒāĻžāĻĻāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤

with mlflow.start_run():

    ... model ...

    mlflow.log_param("source", wine_path)
    mlflow.log_param("alpha", alpha)
    mlflow.log_param("l1_ratio", l1_ratio)

    mlflow.log_metric("rmse", rmse)
    mlflow.log_metric("r2", r2)
    mlflow.log_metric("mae", mae)

    mlflow.set_tag('domain', 'wine')
    mlflow.set_tag('predict', 'quality')
    mlflow.sklearn.log_model(lr, "model")

MLflow āĻ¸āĻš āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž
āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ¨ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ

āĻŽāĻĄā§‡āĻ˛ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ…āĻ‚āĻļ

MLflow āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°, "mlflow āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°" āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻšāĻžāĻ˛ā§ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻĢāĻžāĻ‡āĻ˛ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡ āĻ°āĻžāĻ¨ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ REST API āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ¨āĻ­āĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§‡āĻ¨ā§āĻŸ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ "MLFLOW_TRACKING_URI" āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ āĻŋāĻ•āĻžāĻ¨āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ MLflow āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ API āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ˛āĻžā§āĻšā§‡āĻ° āĻ¤āĻĨā§āĻ¯, āĻ˛āĻ— āĻŽā§‡āĻŸā§āĻ°āĻŋāĻ•ā§āĻ¸ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻ¤ā§ˆāĻ°āĻŋ/āĻĒā§āĻ°āĻžāĻĒā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻāĻ‡ āĻ āĻŋāĻ•āĻžāĻ¨āĻžāĻ¯āĻŧ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦā§‡āĨ¤

āĻ‰āĻ¤ā§āĻ¸: āĻĄāĻ•ā§āĻ¸// āĻāĻ•āĻŸāĻŋ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻšāĻžāĻ˛āĻžāĻ¨ā§‹

āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻĄā§‡āĻ˛ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻšāĻ˛āĻŽāĻžāĻ¨ āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° (āĻ˛āĻžā§āĻš āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ āĻĻā§‡āĻ–ā§āĻ¨) āĻāĻŦāĻ‚ āĻŽāĻĄā§‡āĻ˛āĻŸāĻŋāĻ° āĻ°āĻžāĻ¨ āĻ†āĻ‡āĻĄāĻŋ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§ˇ

MLflow āĻ¸āĻš āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž
āĻ†āĻ‡āĻĄāĻŋ āĻšāĻžāĻ˛āĻžāĻ¨

# Serve a sklearn model through 127.0.0.0:5005
MLFLOW_TRACKING_URI=http://0.0.0.0:5000 mlflow sklearn serve 
  --port 5005  
  --run_id 0f8691808e914d1087cf097a08730f17 
  --model-path model

āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ āĻ¸āĻžāĻ°ā§āĻ­ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŽāĻĄā§‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻŦā§‡āĻļāĻ¨ āĻ•āĻ°āĻ¤ā§‡, āĻŽāĻĄā§‡āĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¤āĻĨā§āĻ¯ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ UI-āĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻŦā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§‡ --run_id.

āĻŽāĻĄā§‡āĻ˛āĻŸāĻŋ āĻāĻ•āĻŦāĻžāĻ° āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‹āĻ—āĻžāĻ¯ā§‹āĻ— āĻ•āĻ°āĻ˛ā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŽāĻĄā§‡āĻ˛ā§‡āĻ° āĻļā§‡āĻˇ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĒā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤

# Query Tracking Server Endpoint
curl -X POST 
  http://127.0.0.1:5005/invocations 
  -H 'Content-Type: application/json' 
  -d '[
	{
		"fixed acidity": 3.42, 
		"volatile acidity": 1.66, 
		"citric acid": 0.48, 
		"residual sugar": 4.2, 
		"chloridessssss": 0.229, 
		"free sulfur dsioxide": 19, 
		"total sulfur dioxide": 25, 
		"density": 1.98, 
		"pH": 5.33, 
		"sulphates": 4.39, 
		"alcohol": 10.8
	}
]'

> {"predictions": [5.825055635303461]}

āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĨā§‡āĻ•ā§‡ āĻŽāĻĄā§‡āĻ˛ āĻšāĻ˛āĻŽāĻžāĻ¨

āĻŸā§āĻ°ā§āĻ¯āĻžāĻ•āĻŋāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°āĻŸāĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻ¸āĻŽāĻ¯āĻŧā§‡ āĻŽāĻĄā§‡āĻ˛ āĻĒāĻ°āĻŋāĻŦā§‡āĻļāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€, āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ°āĻļāĻŋāĻ•ā§āĻˇāĻŖ āĻāĻŦāĻ‚ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻšāĻ“āĻ¯āĻŧāĻž āĻ¸āĻ¤ā§āĻ¤ā§āĻŦā§‡āĻ“ (āĻ¸ā§‚āĻ¤ā§āĻ°: mlflow // āĻĄāĻ•ā§āĻ¸ // āĻŽāĻĄā§‡āĻ˛ # āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ), āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° (āĻŦā§āĻ¯āĻžāĻš āĻŦāĻž āĻ¸ā§āĻŸā§āĻ°āĻŋāĻŽāĻŋāĻ‚) āĻŦāĻŋāĻ¤āĻ°āĻŖā§‡āĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ†āĻ°āĻ“ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĨ¤

āĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°ā§āĻ¨ āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻ…āĻĢāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻĒā§āĻ°āĻļāĻŋāĻ•ā§āĻˇāĻŖāĻŸāĻŋ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄā§‡āĻŸāĻžāĻ¤ā§‡ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻŽāĻĄā§‡āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡āĻ‡ āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ āĻœā§āĻŦāĻ˛āĻœā§āĻŦāĻ˛ āĻ•āĻ°ā§‡āĨ¤

PySpark + Jupyter + Spark āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨

āĻ‰āĻ¤ā§āĻ¸: āĻļā§āĻ°ā§ āĻ•āĻ°ā§āĻ¨ PySpark - āĻœā§āĻĒāĻŋāĻŸāĻžāĻ°

āĻ†āĻŽāĻ°āĻž āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĄā§‡āĻŸāĻžāĻĢā§āĻ°ā§‡āĻŽā§‡ MLflow āĻŽāĻĄā§‡āĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻ— āĻ•āĻ°āĻŋ āĻ¤āĻž āĻĻā§‡āĻ–āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯, PySpark-āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœā§āĻĒāĻŋāĻŸāĻžāĻ° āĻ¨ā§‹āĻŸāĻŦā§āĻ• āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻļā§€āĻ˛ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§āĻ¨ āĻ†āĻĒāĻž āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ•:

cd ~/Downloads/
tar -xzf spark-2.4.3-bin-hadoop2.7.tgz
mv ~/Downloads/spark-2.4.3-bin-hadoop2.7 ~/
ln -s ~/spark-2.4.3-bin-hadoop2.7 ~/sparkĖ€

āĻ­āĻžāĻ°ā§āĻšā§āĻ¯āĻŧāĻžāĻ˛ āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡ PySpark āĻāĻŦāĻ‚ Jupyter āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨:

pip install pyspark jupyter

āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻ¸ā§‡āĻŸ āĻ†āĻĒ āĻ•āĻ°ā§āĻ¨:

export SPARK_HOME=~/spark
export PATH=$SPARK_HOME/bin:$PATH
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --notebook-dir=${HOME}/Projects/notebooks"

āĻ¸ā§āĻĨāĻŋāĻ° āĻ•āĻ°ā§‡ notebook-dir, āĻ†āĻŽāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨ā§‹āĻŸāĻŦā§āĻ• āĻĒāĻ›āĻ¨ā§āĻĻāĻ¸āĻ‡ āĻĢā§‹āĻ˛ā§āĻĄāĻžāĻ°ā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨.

PySpark āĻĨā§‡āĻ•ā§‡ Jupyter āĻ˛āĻžā§āĻš āĻšāĻšā§āĻ›ā§‡

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻœā§āĻĒāĻŋāĻŸāĻžāĻ°āĻ•ā§‡ āĻĒāĻžāĻ‡āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĄā§āĻ°āĻžāĻ‡āĻ­āĻžāĻ° āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻ•ā§āĻˇāĻŽ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋ, āĻ¤āĻžāĻ‡ āĻ†āĻŽāĻ°āĻž āĻāĻ–āĻ¨ āĻĒāĻžāĻ‡āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ—ā§‡ āĻœā§āĻĒāĻŋāĻŸāĻžāĻ° āĻ¨ā§‹āĻŸāĻŦā§āĻ• āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤

(mlflow) afranzi:~$ pyspark
[I 19:05:01.572 NotebookApp] sparkmagic extension enabled!
[I 19:05:01.573 NotebookApp] Serving notebooks from local directory: /Users/afranzi/Projects/notebooks
[I 19:05:01.573 NotebookApp] The Jupyter Notebook is running at:
[I 19:05:01.573 NotebookApp] http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745
[I 19:05:01.573 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 19:05:01.574 NotebookApp]

    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=c06252daa6a12cfdd33c1d2e96c8d3b19d90e9f6fc171745

MLflow āĻ¸āĻš āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž

āĻ‰āĻĒāĻ°ā§‡ āĻ‰āĻ˛ā§āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, MLflow S3 āĻ āĻŽāĻĄā§‡āĻ˛ āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻ˛āĻ— āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻšāĻžāĻ¤ā§‡ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻŽāĻĄā§‡āĻ˛āĻŸāĻŋ āĻĒāĻžāĻ“āĻ¯āĻŧāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻŽāĻĄāĻŋāĻ‰āĻ˛āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ UDF āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻ†āĻŽāĻĻāĻžāĻ¨āĻŋ āĻ•āĻ°āĻžāĻ° āĻ¸ā§āĻ¯ā§‹āĻ— āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ mlflow.pyfunc.

import mlflow.pyfunc

model_path = 's3://<bucket>/mlflow/artifacts/1/0f8691808e914d1087cf097a08730f17/artifacts/model'
wine_path = '/Users/afranzi/Projects/data/winequality-red.csv'
wine_udf = mlflow.pyfunc.spark_udf(spark, model_path)

df = spark.read.format("csv").option("header", "true").option('delimiter', ';').load(wine_path)
columns = [ "fixed acidity", "volatile acidity", "citric acid",
            "residual sugar", "chlorides", "free sulfur dioxide",
            "total sulfur dioxide", "density", "pH",
            "sulphates", "alcohol"
          ]
          
df.withColumn('prediction', wine_udf(*columns)).show(100, False)

MLflow āĻ¸āĻš āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŋāĻ¤ āĻ•āĻ°āĻž
PySpark - āĻ†āĻ‰āĻŸāĻĒā§āĻŸāĻŋāĻ‚ āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ¨ āĻŽāĻžāĻ¨ā§‡āĻ° āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāĻ¸

āĻāĻ‡ āĻŽā§āĻšā§āĻ°ā§āĻ¤ā§‡, āĻ†āĻŽāĻ°āĻž MLflow āĻāĻ° āĻ¸āĻžāĻĨā§‡ PySpark āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¸ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•āĻĨāĻž āĻŦāĻ˛ā§‡āĻ›āĻŋ, āĻĒā§āĻ°ā§‹ āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ¨ āĻĄā§‡āĻŸāĻžāĻ¸ā§‡āĻŸā§‡ āĻ“āĻ¯āĻŧāĻžāĻ‡āĻ¨ āĻŽāĻžāĻ¨ā§‡āĻ° āĻĒā§‚āĻ°ā§āĻŦāĻžāĻ­āĻžāĻ¸ āĻšāĻ˛āĻ›ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ¸ā§āĻ•āĻžāĻ˛āĻž āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĨā§‡āĻ•ā§‡ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ?

āĻ¸ā§āĻ•āĻžāĻ˛āĻž āĻāĻŦāĻ‚ āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒā§āĻ°āĻ¸āĻ™ā§āĻ— āĻŦāĻŋāĻ­āĻ•ā§āĻ¤ āĻ•āĻ°ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋāĻ“ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡āĻ›āĻŋāĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻ†āĻŽāĻ°āĻž āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ āĻ‡āĻ‰āĻĄāĻŋāĻāĻĢ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŋāĻ¤ āĻ•āĻ°ā§‡āĻ›āĻŋ āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ¸ā§āĻ•āĻžāĻ˛āĻž āĻĨā§‡āĻ•ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ›āĻŋ (āĻšā§āĻ¯āĻžāĻ, āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ āĻ¸ā§‡āĻ°āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ¨āĻ¯āĻŧ, āĻ¤āĻŦā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ¯āĻž āĻ†āĻ›ā§‡)āĨ¤

āĻ¸ā§āĻ•āĻžāĻ˛āĻž āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• + āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹

āĻāĻ‡ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°āĻŦ āĻ¤ā§‹āĻ°āĻŋ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻŦā§ƒāĻšāĻ¸ā§āĻĒāĻ¤āĻŋāĻ¤ā§‡

āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• + āĻŸāĻ°āĻŋ + āĻœā§āĻĒāĻŋāĻŸāĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°ā§āĻ¨

pip install toree
jupyter toree install --spark_home=${SPARK_HOME} --sys-prefix
jupyter kernelspec list
```
```
Available kernels:
  apache_toree_scala    /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/apache_toree_scala
  python3               /Users/afranzi/.virtualenvs/mlflow/share/jupyter/kernels/python3
```

āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻ‚āĻ¯ā§āĻ•ā§āĻ¤ āĻ¨ā§‹āĻŸāĻŦā§āĻ• āĻĨā§‡āĻ•ā§‡ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻšā§āĻ›ā§‡āĻ¨, āĻ‡āĻ‰āĻĄāĻŋāĻāĻĢ āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ āĻĒāĻžāĻ‡āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ­āĻžāĻ— āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ†āĻŽāĻ°āĻž āĻ†āĻļāĻž āĻ•āĻ°āĻŋ āĻāĻ‡ āĻ…āĻ‚āĻļāĻŸāĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§‹āĻ—ā§€ āĻšāĻŦā§‡ āĻ¯āĻžāĻ°āĻž āĻ¸ā§āĻ•āĻžāĻ˛āĻž āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ā§‡ āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻŽāĻĄā§‡āĻ˛ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨āĨ¤

import org.apache.spark.sql.functions.col
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.{Column, DataFrame}
import scala.util.matching.Regex

val FirstAtRe: Regex = "^_".r
val AliasRe: Regex = "[\s_.:@]+".r

def getFieldAlias(field_name: String): String = {
    FirstAtRe.replaceAllIn(AliasRe.replaceAllIn(field_name, "_"), "")
}

def selectFieldsNormalized(columns: List[String])(df: DataFrame): DataFrame = {
    val fieldsToSelect: List[Column] = columns.map(field =>
        col(field).as(getFieldAlias(field))
    )
    df.select(fieldsToSelect: _*)
}

def normalizeSchema(df: DataFrame): DataFrame = {
    val schema = df.columns.toList
    df.transform(selectFieldsNormalized(schema))
}

FirstAtRe = ^_
AliasRe = [s_.:@]+

getFieldAlias: (field_name: String)String
selectFieldsNormalized: (columns: List[String])(df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame
normalizeSchema: (df: org.apache.spark.sql.DataFrame)org.apache.spark.sql.DataFrame
Out[1]:
[s_.:@]+
In [2]:
val winePath = "~/Research/mlflow-workshop/examples/wine_quality/data/winequality-red.csv"
val modelPath = "/tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model"

winePath = ~/Research/mlflow-workshop/examples/wine_quality/data/winequality-red.csv
modelPath = /tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model
Out[2]:
/tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model
In [3]:
val df = spark.read
              .format("csv")
              .option("header", "true")
              .option("delimiter", ";")
              .load(winePath)
              .transform(normalizeSchema)

df = [fixed_acidity: string, volatile_acidity: string ... 10 more fields]
Out[3]:
[fixed_acidity: string, volatile_acidity: string ... 10 more fields]
In [4]:
%%PySpark
import mlflow
from mlflow import pyfunc

model_path = "/tmp/mlflow/artifactStore/0/96cba14c6e4b452e937eb5072467bf79/artifacts/model"
wine_quality_udf = mlflow.pyfunc.spark_udf(spark, model_path)

spark.udf.register("wineQuality", wine_quality_udf)
Out[4]:
<function spark_udf.<locals>.predict at 0x1116a98c8>
In [6]:
df.createOrReplaceTempView("wines")
In [10]:
%%SQL
SELECT 
    quality,
    wineQuality(
        fixed_acidity,
        volatile_acidity,
        citric_acid,
        residual_sugar,
        chlorides,
        free_sulfur_dioxide,
        total_sulfur_dioxide,
        density,
        pH,
        sulphates,
        alcohol
    ) AS prediction
FROM wines
LIMIT 10
Out[10]:
+-------+------------------+
|quality|        prediction|
+-------+------------------+
|      5| 5.576883967129615|
|      5|  5.50664776916154|
|      5| 5.525504822954496|
|      6| 5.504311247097457|
|      5| 5.576883967129615|
|      5|5.5556903912725755|
|      5| 5.467882654744997|
|      7| 5.710602976324739|
|      7| 5.657319539336507|
|      5| 5.345098606538708|
+-------+------------------+

In [17]:
spark.catalog.listFunctions.filter('name like "%wineQuality%").show(20, false)

+-----------+--------+-----------+---------+-----------+
|name       |database|description|className|isTemporary|
+-----------+--------+-----------+---------+-----------+
|wineQuality|null    |null       |null     |true       |
+-----------+--------+-----------+---------+-----------+

āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒ

āĻ¯āĻĻāĻŋāĻ“ āĻāĻŽāĻāĻ˛āĻĢā§āĻ˛ā§‹ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ†āĻ˛āĻĢāĻž āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻāĻŸāĻŋ āĻŦā§‡āĻļ āĻ†āĻļāĻžāĻŦā§āĻ¯āĻžā§āĻœāĻ• āĻĻā§‡āĻ–āĻžāĻšā§āĻ›ā§‡āĨ¤ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚ āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻāĻ¨ā§āĻĄāĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ—ā§āĻ°āĻšāĻŖ āĻ•āĻ°āĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļāĻ•āĻžāĻ°ā§€ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĒāĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“, MLflow āĻĄā§‡āĻŸāĻž āĻ‡āĻžā§āĻœāĻŋāĻ¨āĻŋāĻ¯āĻŧāĻžāĻ° āĻāĻŦāĻ‚ āĻĄā§‡āĻŸāĻž āĻ¸āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻ¸ āĻŦāĻŋāĻļā§‡āĻˇāĻœā§āĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻ¸ā§‡, āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ¸ā§āĻ¤āĻ° āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°ā§‡āĨ¤

MLflow-āĻāĻ° āĻāĻ‡ āĻ…āĻ¨ā§āĻŦā§‡āĻˇāĻŖā§‡āĻ° āĻĒāĻ°ā§‡, āĻ†āĻŽāĻ°āĻž āĻ†āĻ¤ā§āĻŽāĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ā§€ āĻ¯ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ—āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻŦ āĻāĻŦāĻ‚ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¸ā§āĻĒāĻžāĻ°ā§āĻ• āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ āĻāĻŦāĻ‚ āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļāĻ•āĻžāĻ°ā§€ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦāĨ¤

āĻĢāĻžāĻ‡āĻ˛ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡ āĻĄāĻžāĻŸāĻžāĻŦā§‡āĻ¸ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ‡āĻœ āĻ•āĻ°āĻž āĻ­āĻžāĻ˛ āĻšāĻŦā§‡āĨ¤ āĻāĻŸāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻļā§‡āĻˇ āĻĒāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ āĻĻāĻŋāĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯āĻž āĻāĻ•āĻ‡ āĻĢāĻžāĻ‡āĻ˛ āĻ¸ā§āĻŸā§‹āĻ°ā§‡āĻœ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨ āĻĒā§āĻ°āĻŦāĻāĻšāĻ¨āĻžāĻŽāĻ¯āĻŧ и āĻ—ā§āĻ°ā§€āĻ• āĻĒā§āĻ°āĻžāĻŖā§‡āĻ° āĻĻā§‡āĻŦā§€ āĻāĻ•āĻ‡ āĻ†āĻ āĻžāĻ˛ā§‹ āĻŽā§‡āĻŸāĻžāĻ¸ā§āĻŸā§‹āĻ° āĻĻāĻŋāĻ¯āĻŧā§‡āĨ¤

āĻ¸āĻ‚āĻ•ā§āĻˇā§‡āĻĒā§‡ āĻŦāĻ˛āĻ¤ā§‡ āĻšāĻžāĻ‡, āĻĄā§‡āĻŸāĻž āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻœāĻ•ā§‡ āĻ†āĻ°āĻ“ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻŋ MLFlow āĻ¸āĻŽā§āĻĒā§āĻ°āĻĻāĻžāĻ¯āĻŧāĻ•ā§‡ āĻ§āĻ¨ā§āĻ¯āĻŦāĻžāĻĻ āĻœāĻžāĻ¨āĻžāĻ¤ā§‡ āĻšāĻžāĻ‡āĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ MLflow āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ–ā§‡āĻ˛āĻ¤ā§‡ āĻĨāĻžāĻ•ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĻā§āĻŦāĻŋāĻ§āĻž āĻ•āĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨ āĻ¤āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻœāĻžāĻ¨āĻžāĻ¨, āĻāĻŦāĻ‚ āĻ†āĻ°āĻ“ āĻŦā§‡āĻļāĻŋ āĻ•āĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋ āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĻ¨āĨ¤

āĻ•ā§‹āĻ°ā§āĻ¸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻœāĻžāĻ¨ā§āĻ¨:
āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚āĨ¤ āĻŦā§‡āĻ¸āĻŋāĻ• āĻ•ā§‹āĻ°ā§āĻ¸
āĻŽā§‡āĻļāĻŋāĻ¨ āĻ˛āĻžāĻ°ā§āĻ¨āĻŋāĻ‚āĨ¤ āĻ‰āĻšā§āĻšāĻ¤āĻ° āĻ•ā§‹āĻ°ā§āĻ¸

āĻ†āĻ°āĻ“ āĻĒāĻĄāĻŧā§āĻ¨:

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨