Spark-แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ MLflow-แƒ˜แƒ—

แƒ’แƒแƒ›แƒแƒ แƒฏแƒแƒ‘แƒ แƒฎแƒแƒ‘แƒ แƒแƒ•แƒกแƒ™แƒ˜แƒก แƒ›แƒชแƒฎแƒแƒ•แƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ. แƒ แƒแƒ’แƒแƒ แƒช แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ”แƒ—, แƒแƒ› แƒ—แƒ•แƒ”แƒจแƒ˜ OTUS แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ›แƒแƒœแƒฅแƒแƒœแƒฃแƒ แƒ˜ แƒกแƒฌแƒแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒ  แƒ™แƒฃแƒ แƒกแƒก, แƒ™แƒ”แƒ แƒซแƒแƒ“ แƒ‘แƒแƒ–แƒ ะธ แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ”. แƒแƒ›แƒแƒกแƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒ— แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ›แƒแƒกแƒแƒšแƒ˜แƒก แƒ’แƒแƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒแƒก.

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ›แƒ˜แƒ–แƒแƒœแƒ˜แƒ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒแƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒแƒ–แƒ” MLflow.

แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒ”แƒ‘แƒ— แƒ’แƒแƒœแƒฎแƒ˜แƒšแƒ•แƒแƒก MLflow แƒ›แƒ˜แƒกแƒ˜ แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ“แƒแƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ— แƒ™แƒ•แƒšแƒ”แƒ•แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ’แƒ˜แƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒ— แƒฉแƒ•แƒ”แƒœแƒก แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ”แƒ‘แƒแƒก Spark-แƒ—แƒแƒœ MLflow-แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ UDF-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ แƒ— แƒจแƒ”แƒ›แƒแƒกแƒฃแƒšแƒ˜ แƒแƒšแƒคแƒ แƒฏแƒแƒœแƒ›แƒ แƒ—แƒ”แƒšแƒแƒ‘แƒ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ—แƒ›แƒชแƒแƒ“แƒœแƒ”แƒแƒ‘แƒแƒก แƒ“แƒ แƒฎแƒ”แƒšแƒแƒ•แƒœแƒฃแƒ  แƒ˜แƒœแƒขแƒ”แƒšแƒ”แƒฅแƒขแƒก, แƒ แƒแƒ—แƒ แƒ›แƒ˜แƒ•แƒชแƒ”แƒ— แƒฎแƒแƒšแƒฎแƒก แƒฃแƒคแƒšแƒ”แƒ‘แƒ, แƒแƒ˜แƒฆแƒแƒœ แƒžแƒแƒกแƒฃแƒฎแƒ˜แƒกแƒ›แƒ’แƒ”แƒ‘แƒšแƒแƒ‘แƒ แƒ›แƒแƒ— แƒฏแƒแƒœแƒ›แƒ แƒ—แƒ”แƒšแƒแƒ‘แƒแƒกแƒ แƒ“แƒ แƒ™แƒ”แƒ—แƒ˜แƒšแƒ“แƒฆแƒ”แƒแƒ‘แƒแƒ–แƒ”. แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒแƒ›แƒ˜แƒขแƒแƒ› แƒแƒ แƒ˜แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒฃแƒ แƒ˜ แƒกแƒฌแƒแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜ แƒฉแƒ•แƒ”แƒœแƒก แƒ›แƒ˜แƒ”แƒ  แƒจแƒ”แƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ›แƒ”แƒชแƒœแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ“แƒฃแƒฅแƒขแƒ”แƒ‘แƒ˜แƒก แƒชแƒ”แƒœแƒขแƒ แƒจแƒ˜ แƒ“แƒ แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ›แƒ˜แƒ’แƒ•แƒ˜แƒ–แƒ˜แƒ“แƒ MLflow, แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ›แƒแƒ˜แƒชแƒแƒ•แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ—แƒ›แƒชแƒแƒ“แƒœแƒ”แƒแƒ‘แƒ˜แƒก แƒกแƒแƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒ แƒแƒกแƒžแƒ”แƒฅแƒขแƒก.

MLflow

MLflow-แƒ˜แƒก แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ›แƒ˜แƒ–แƒแƒœแƒ˜แƒ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒคแƒ”แƒœแƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒฃแƒ แƒ˜ แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒก แƒ—แƒแƒ•แƒ–แƒ”, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ›แƒ˜แƒกแƒชแƒ”แƒ›แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ›แƒ”แƒชแƒœแƒ˜แƒ”แƒ แƒ”แƒ‘แƒก แƒ˜แƒ›แƒฃแƒจแƒแƒแƒœ แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ—แƒ›แƒชแƒแƒ“แƒœแƒ”แƒแƒ‘แƒ˜แƒก แƒ‘แƒ˜แƒ‘แƒšแƒ˜แƒแƒ—แƒ”แƒ™แƒแƒกแƒ—แƒแƒœ (H2o, แƒ™แƒ”แƒ แƒแƒก, แƒ›แƒ˜แƒšแƒ˜แƒžแƒ˜, แƒžแƒ˜แƒขแƒแƒ แƒฉแƒ˜, แƒกแƒ™แƒšแƒ”แƒ”แƒ แƒœแƒ˜ ะธ tensorflow), แƒ’แƒแƒ“แƒแƒ˜แƒงแƒ•แƒแƒœแƒก แƒ›แƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ“แƒแƒœแƒ”แƒ–แƒ”.

MLflow แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒก แƒกแƒแƒ› แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒก:

  • แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜ - แƒฉแƒแƒฌแƒ”แƒ แƒ แƒ“แƒ แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ: แƒ™แƒแƒ“แƒ˜, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜, แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ แƒ“แƒ แƒจแƒ”แƒ“แƒ”แƒ’แƒ”แƒ‘แƒ˜. แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒœแƒ’แƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ•แƒแƒœแƒ˜แƒ.
  • แƒžแƒ แƒแƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜ - แƒจแƒ”แƒคแƒฃแƒ—แƒ•แƒ˜แƒก แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ แƒœแƒ”แƒ‘แƒ˜แƒกแƒ›แƒ˜แƒ”แƒ  แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒแƒ–แƒ” แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“ (แƒ›แƒแƒ’. SageMaker)
  • แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜ โ€“ แƒกแƒแƒ”แƒ แƒ—แƒ แƒคแƒแƒ แƒ›แƒแƒขแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ–แƒ” แƒฌแƒแƒ แƒ“แƒ’แƒ”แƒœแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

MLflow (แƒฌแƒ”แƒ แƒ˜แƒก แƒ“แƒ แƒแƒก แƒแƒšแƒคแƒแƒจแƒ˜) แƒแƒ แƒ˜แƒก แƒฆแƒ˜แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒžแƒšแƒแƒขแƒคแƒแƒ แƒ›แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ›แƒแƒ แƒ—แƒแƒ— แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ—แƒ›แƒชแƒแƒ“แƒœแƒ”แƒแƒ‘แƒ˜แƒก แƒกแƒแƒกแƒ˜แƒชแƒแƒชแƒฎแƒšแƒ แƒชแƒ˜แƒ™แƒšแƒ˜, แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก, แƒฎแƒ”แƒšแƒแƒฎแƒแƒšแƒ˜ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒฉแƒแƒ—แƒ•แƒšแƒ˜แƒ—.

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
```

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ: แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— PyArrow-แƒก แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“, แƒ แƒแƒ’แƒแƒ แƒ˜แƒชแƒแƒ UDF. PyArrow-แƒ˜แƒกแƒ แƒ“แƒ Numpy-แƒ˜แƒก แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒ›แƒแƒกแƒฌแƒแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒงแƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒ”แƒก แƒฃแƒ™แƒแƒœแƒแƒกแƒ™แƒœแƒ”แƒšแƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ”แƒ‘แƒ˜ แƒ”แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’แƒ”แƒ‘แƒแƒ“แƒ แƒ”แƒ แƒ—แƒ›แƒแƒœแƒ”แƒ—แƒก.

แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก UI

MLflow Tracking แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒ•แƒแƒซแƒšแƒ”แƒ•แƒก แƒฉแƒแƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ“แƒ แƒจแƒ”แƒ•แƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒ”แƒฅแƒกแƒžแƒ”แƒ แƒ˜แƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜ Python-แƒ˜แƒก แƒ“แƒ แƒ“แƒแƒกแƒ•แƒ”แƒœแƒ”แƒ‘แƒ API. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— แƒกแƒแƒ“ แƒจแƒ”แƒ˜แƒœแƒแƒฎแƒแƒ— แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ”แƒ‘แƒ˜ (localhost, Amazon S3, Azure Blob Storage, Google Cloud Storage แƒแƒœ SFTP แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜). แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— AWS-แƒก Alpha Health-แƒจแƒ˜, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ 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-แƒจแƒ˜, แƒ แƒแƒ“แƒ’แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒ–แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒกแƒ™แƒ”แƒœ.

แƒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ: แƒ’แƒแƒ˜แƒ—แƒ•แƒแƒšแƒ˜แƒกแƒฌแƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› Tracking UI-แƒก แƒ“แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒก แƒฃแƒœแƒ“แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒ— แƒฌแƒ•แƒ“แƒแƒ›แƒ แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ˜แƒก แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒแƒ–แƒ”. แƒแƒœแƒฃ, แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“ แƒ˜แƒ›แƒ˜แƒกแƒ, แƒ แƒแƒ› Tracking UI แƒ›แƒ“แƒ”แƒ‘แƒแƒ แƒ”แƒแƒ‘แƒก EC2 แƒ˜แƒœแƒกแƒขแƒแƒœแƒชแƒ˜แƒแƒจแƒ˜, MLflow แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒแƒ“ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒก แƒฃแƒœแƒ“แƒ แƒฐแƒฅแƒแƒœแƒ“แƒ”แƒก แƒžแƒ˜แƒ แƒ“แƒแƒžแƒ˜แƒ แƒ˜ แƒฌแƒ•แƒ“แƒแƒ›แƒ S3-แƒ–แƒ” แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“.

Spark-แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ MLflow-แƒ˜แƒ—
Tracking UI แƒ˜แƒœแƒแƒฎแƒแƒ•แƒก แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ”แƒ‘แƒก S3 แƒ—แƒแƒ˜แƒ’แƒฃแƒšแƒจแƒ˜

แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜

แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ Tracking แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ˜แƒฌแƒงแƒแƒ— แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒขแƒ แƒ”แƒœแƒ˜แƒœแƒ’แƒ˜.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒฆแƒ•แƒ˜แƒœแƒ˜แƒก แƒ›แƒแƒ“แƒ˜แƒคแƒ˜แƒ™แƒแƒชแƒ˜แƒแƒก MLflow แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒ“แƒแƒœ Sklearn.

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

แƒ แƒแƒ’แƒแƒ แƒช แƒฃแƒ™แƒ•แƒ” แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒ”แƒ—, MLflow แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒ“แƒแƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒแƒ— แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜, แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ แƒ“แƒ แƒแƒ แƒขแƒ”แƒคแƒแƒฅแƒขแƒ”แƒ‘แƒ˜, แƒ แƒแƒ—แƒ แƒ—แƒ•แƒแƒšแƒงแƒฃแƒ แƒ˜ แƒแƒ“แƒ”แƒ•แƒœแƒแƒ— แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ•แƒ˜แƒ—แƒแƒ แƒ“แƒ”แƒ‘แƒ˜แƒแƒœ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒ—. แƒ”แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒซแƒแƒšแƒ–แƒ” แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒแƒ, แƒ แƒแƒ“แƒ’แƒแƒœ แƒแƒ› แƒ’แƒ–แƒ˜แƒ— แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒ แƒ”แƒžแƒ แƒแƒ“แƒฃแƒชแƒ˜แƒ แƒ”แƒ‘แƒ Tracking แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ— แƒแƒœ แƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ’แƒ”แƒ‘แƒ˜แƒ—, แƒ—แƒฃ แƒ แƒแƒ›แƒ”แƒšแƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ“แƒ แƒกแƒแƒญแƒ˜แƒ แƒ แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒแƒก แƒ™แƒแƒ›แƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒก git hash แƒŸแƒฃแƒ แƒœแƒแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—.

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")

Spark-แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ MLflow-แƒ˜แƒ—
แƒฆแƒ•แƒ˜แƒœแƒ˜แƒก แƒ’แƒแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ”แƒ‘แƒ˜

แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก

MLflow แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ "mlflow server" แƒ‘แƒ แƒซแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—, แƒแƒฅแƒ•แƒก REST API แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒ—แƒ•แƒแƒšแƒงแƒฃแƒ แƒ˜แƒก แƒ“แƒ”แƒ•แƒœแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ• แƒคแƒแƒ˜แƒšแƒฃแƒ  แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜ แƒฉแƒแƒกแƒแƒฌแƒ”แƒ แƒแƒ“. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒฃแƒ—แƒ˜แƒ—แƒแƒ— แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜ แƒ’แƒแƒ แƒ”แƒ›แƒแƒก แƒชแƒ•แƒšแƒแƒ“แƒ˜แƒก โ€žMLFLOW_TRACKING_URIโ€œ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ MLflow แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก API แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒฃแƒ แƒแƒ“ แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก แƒแƒ› แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ–แƒ”, แƒ แƒแƒ—แƒ แƒจแƒ”แƒฅแƒ›แƒœแƒแƒก/แƒ›แƒ˜แƒ˜แƒฆแƒแƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ, แƒŸแƒฃแƒ แƒœแƒแƒšแƒ˜แƒก แƒ›แƒ”แƒขแƒ แƒ˜แƒ™แƒ แƒ“แƒ แƒ.แƒจ.

แƒฌแƒงแƒแƒ แƒ: Docs// แƒ—แƒ แƒ”แƒฅแƒ˜แƒœแƒ’ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ

แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒกแƒแƒงแƒแƒคแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ—แƒ•แƒแƒšแƒ—แƒ•แƒแƒšแƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ (แƒ˜แƒฎ. แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒ˜แƒœแƒขแƒ”แƒ แƒคแƒ”แƒ˜แƒกแƒ˜) แƒ“แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก Run ID.

Spark-แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ MLflow-แƒ˜แƒ—
แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— ID

# 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

MLflow แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒกแƒแƒ›แƒกแƒแƒฎแƒฃแƒ แƒ”แƒ‘แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ’แƒ•แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒฌแƒ•แƒ“แƒแƒ›แƒ Tracking UI-แƒ–แƒ”, แƒ แƒแƒ—แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ›แƒ˜แƒ—แƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒ— --run_id.

แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜ แƒ“แƒแƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ Tracking แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก, แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒแƒ— แƒแƒฎแƒแƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜แƒก แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜.

# 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]}

แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜ Spark-แƒ“แƒแƒœ

แƒ˜แƒ›แƒ˜แƒกแƒ“แƒ แƒ›แƒ˜แƒฃแƒฎแƒ”แƒ“แƒแƒ•แƒแƒ“, แƒ แƒแƒ› Tracking แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒกแƒแƒ™แƒ›แƒแƒ แƒ˜แƒกแƒแƒ“ แƒซแƒšแƒ˜แƒ”แƒ แƒ˜แƒ แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒก แƒ แƒ”แƒแƒšแƒฃแƒ  แƒ“แƒ แƒแƒจแƒ˜ แƒ”แƒ›แƒกแƒแƒฎแƒฃแƒ แƒ”แƒ‘แƒ, แƒ›แƒแƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒก แƒ›แƒแƒ— แƒ“แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒก แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒแƒก (แƒฌแƒงแƒแƒ แƒ: mlflow // docs // แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜ # แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜), Spark-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ (แƒกแƒแƒ›แƒงแƒแƒ แƒ แƒแƒœ แƒœแƒแƒ™แƒแƒ“แƒ˜) แƒ™แƒ˜แƒ“แƒ”แƒ• แƒฃแƒคแƒ แƒ แƒ›แƒซแƒšแƒแƒ•แƒ แƒ˜ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒแƒ แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒ.

แƒฌแƒแƒ แƒ›แƒแƒ˜แƒ“แƒ’แƒ˜แƒœแƒ”แƒ—, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒ”แƒ— แƒขแƒ แƒ”แƒœแƒ˜แƒœแƒ’แƒ˜ แƒแƒคแƒšแƒแƒ˜แƒœแƒจแƒ˜ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ’แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒแƒ“แƒ”แƒšแƒ˜ แƒ—แƒฅแƒ•แƒ”แƒœแƒก แƒงแƒ•แƒ”แƒšแƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ–แƒ”. แƒแƒฅ แƒแƒœแƒแƒ—แƒ”แƒ‘แƒก Spark แƒ“แƒ MLflow.

แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ— PySpark + Jupyter + Spark

แƒฌแƒงแƒแƒ แƒ: แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ— PySpark - Jupyter

แƒ˜แƒ›แƒ˜แƒก แƒกแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒšแƒแƒ“, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— MLflow แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒก Spark แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒฉแƒแƒ แƒฉแƒแƒ”แƒ‘แƒ–แƒ”, แƒฉแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒแƒ— Jupyter แƒœแƒแƒฃแƒ—แƒ‘แƒฃแƒฅแƒ”แƒ‘แƒ˜ PySpark-แƒ—แƒแƒœ แƒ”แƒ แƒ—แƒแƒ“ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ“แƒแƒ˜แƒฌแƒงแƒ”แƒ— แƒฃแƒแƒฎแƒšแƒ”แƒกแƒ˜ แƒกแƒขแƒแƒ‘แƒ˜แƒšแƒฃแƒ แƒ˜ แƒ•แƒ”แƒ แƒกแƒ˜แƒ˜แƒก แƒ˜แƒœแƒกแƒขแƒแƒšแƒแƒชแƒ˜แƒ˜แƒ— Apache Spark:

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-แƒ“แƒแƒœ

แƒ•แƒ˜แƒœแƒแƒ˜แƒ“แƒแƒœ แƒฉแƒ•แƒ”แƒœ แƒจแƒ”แƒ•แƒซแƒ”แƒšแƒ˜แƒ— แƒ˜แƒฃแƒžแƒ˜แƒขแƒ”แƒ แƒ˜แƒก, แƒ แƒแƒ’แƒแƒ แƒช PySpark แƒ“แƒ แƒแƒ˜แƒ•แƒ”แƒ แƒ˜แƒก แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒ, แƒแƒฎแƒšแƒ แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ Jupyter แƒœแƒแƒฃแƒ—แƒ‘แƒฃแƒฅแƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ PySpark-แƒ˜แƒก แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒจแƒ˜.

(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

Spark-แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ 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)

Spark-แƒ˜แƒก แƒ’แƒแƒคแƒแƒ แƒ—แƒแƒ”แƒ‘แƒ MLflow-แƒ˜แƒ—
PySpark - แƒฆแƒ•แƒ˜แƒœแƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒžแƒ แƒแƒ’แƒœแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒขแƒแƒœแƒ

แƒแƒ› แƒ›แƒแƒ›แƒ”แƒœแƒขแƒแƒ›แƒ“แƒ”, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ— แƒ˜แƒ›แƒแƒ–แƒ”, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— PySpark MLflow-แƒ˜แƒ—, แƒฆแƒ•แƒ˜แƒœแƒ˜แƒก แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก แƒžแƒ แƒแƒ’แƒœแƒแƒ–แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ แƒฆแƒ•แƒ˜แƒœแƒ˜แƒก แƒ›แƒ—แƒ”แƒš แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒ–แƒ”. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒ“แƒแƒ’แƒญแƒ˜แƒ แƒ“แƒ”แƒ‘แƒแƒ— Python MLflow แƒ›แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ Scala Spark-แƒ˜แƒกแƒ’แƒแƒœ?

แƒฉแƒ•แƒ”แƒœ แƒ”แƒกแƒ”แƒช แƒ’แƒแƒ›แƒแƒ•แƒชแƒแƒ“แƒ”แƒ— Spark แƒ™แƒแƒœแƒขแƒ”แƒฅแƒกแƒขแƒ˜แƒก แƒ’แƒแƒงแƒแƒคแƒ˜แƒ— Scala-แƒกแƒ แƒ“แƒ Python-แƒก แƒจแƒแƒ แƒ˜แƒก. แƒแƒœแƒฃ, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒแƒ แƒ”แƒ’แƒ˜แƒกแƒขแƒ แƒ˜แƒ แƒ”แƒ— MLflow UDF แƒžแƒ˜แƒ—แƒแƒœแƒจแƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ˜แƒ’แƒ˜ Scala-แƒ“แƒแƒœ (แƒ“แƒ˜แƒแƒฎ, แƒแƒšแƒ‘แƒแƒ— แƒแƒ แƒ แƒกแƒแƒฃแƒ™แƒ”แƒ—แƒ”แƒกแƒ แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒช แƒ’แƒ•แƒแƒฅแƒ•แƒก).

Scala Spark + MLflow

แƒแƒ› แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒก แƒ“แƒแƒ•แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ— แƒ—แƒแƒ แƒ” แƒ™แƒ”แƒ แƒœแƒ”แƒšแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš แƒ˜แƒฃแƒžแƒ˜แƒขแƒ”แƒ แƒจแƒ˜.

แƒ“แƒแƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ— Spark + Toree + Jupyter

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
```

แƒ แƒแƒ’แƒแƒ แƒช แƒ—แƒแƒœแƒ“แƒแƒ แƒ—แƒฃแƒšแƒ˜ แƒœแƒแƒฃแƒ—แƒ‘แƒฃแƒฅแƒ˜แƒ“แƒแƒœ แƒฎแƒ”แƒ“แƒแƒ•แƒ—, UDF แƒ’แƒแƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Spark-แƒกแƒ แƒ“แƒ PySpark-แƒก แƒจแƒแƒ แƒ˜แƒก. แƒ•แƒ˜แƒ›แƒ”แƒ“แƒแƒ•แƒœแƒ”แƒ‘แƒ—, แƒ แƒแƒ› แƒ”แƒก แƒœแƒแƒฌแƒ˜แƒšแƒ˜ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒ—แƒ•แƒ˜แƒก, แƒ•แƒ˜แƒกแƒแƒช แƒฃแƒงแƒ•แƒแƒ แƒก Scala แƒ“แƒ แƒกแƒฃแƒ แƒก แƒ›แƒแƒœแƒฅแƒแƒœแƒฃแƒ แƒ˜ แƒกแƒฌแƒแƒ•แƒšแƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜ แƒ“แƒแƒœแƒ”แƒ แƒ’แƒ•แƒ.

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-แƒ˜แƒก แƒแƒ› แƒ’แƒแƒ›แƒแƒ™แƒ•แƒšแƒ”แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ แƒฌแƒ›แƒฃแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ•แƒแƒ แƒ—, แƒ แƒแƒ› แƒฌแƒ˜แƒœ แƒฌแƒแƒ•แƒแƒšแƒ— แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒก แƒฉแƒ•แƒ”แƒœแƒ˜ Spark แƒ›แƒ˜แƒšแƒกแƒแƒ“แƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒ แƒ“แƒ แƒกแƒแƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ™แƒแƒ แƒ’แƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒแƒ“แƒ แƒคแƒแƒ˜แƒšแƒฃแƒ แƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“ แƒคแƒแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ. แƒแƒ›แƒแƒœ แƒฃแƒœแƒ“แƒ แƒ›แƒแƒ’แƒ•แƒชแƒ”แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒแƒ‘แƒแƒšแƒแƒ แƒฌแƒ”แƒ แƒขแƒ˜แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒก แƒ”แƒ แƒ—แƒ˜ แƒ“แƒ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒคแƒแƒ˜แƒšแƒ˜แƒก แƒกแƒแƒชแƒแƒ•แƒ˜. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ— แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜ Presto ะธ Athena แƒ˜แƒ’แƒ˜แƒ•แƒ” Glue metastore-แƒ˜แƒ—.

แƒจแƒ”แƒฏแƒแƒ›แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒ˜แƒœแƒ“แƒ แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒ’แƒแƒ“แƒแƒ•แƒฃแƒฎแƒแƒ“แƒ MLFlow แƒกแƒแƒ–แƒแƒ’แƒแƒ“แƒแƒ”แƒ‘แƒแƒก, แƒ แƒแƒ› แƒฃแƒคแƒ แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ’แƒแƒฎแƒแƒ“แƒ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ”แƒ‘แƒ—แƒแƒœ.

แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ—แƒแƒ›แƒแƒจแƒแƒ‘แƒ— MLflow-แƒ—แƒแƒœ, แƒœแƒฃ แƒ›แƒแƒ’แƒ”แƒ แƒ˜แƒ“แƒ”แƒ‘แƒแƒ— แƒ›แƒแƒ’แƒ•แƒฌแƒ”แƒ แƒแƒ— แƒ“แƒ แƒ’แƒ•แƒ˜แƒ—แƒฎแƒแƒ แƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ  แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒก แƒ“แƒ แƒ›แƒ˜แƒ— แƒฃแƒ›แƒ”แƒขแƒ”แƒก, แƒ—แƒฃ แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒก แƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘แƒแƒจแƒ˜.

แƒจแƒ”แƒ˜แƒขแƒงแƒ•แƒ”แƒ— แƒ›แƒ”แƒขแƒ˜ แƒ™แƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘:
แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ—แƒ›แƒชแƒแƒ“แƒœแƒ”แƒแƒ‘แƒ. แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ™แƒฃแƒ แƒกแƒ˜
แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ—แƒ›แƒชแƒแƒ“แƒœแƒ”แƒแƒ‘แƒ. แƒ›แƒแƒฌแƒ˜แƒœแƒแƒ•แƒ” แƒ™แƒฃแƒ แƒกแƒ˜

แฒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ” แƒ›แƒ”แƒขแƒ˜:

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ