MLflow рд╕рдБрдЧ рд╕реНрдкрд╛рд░реНрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрджреИ

рдирдорд╕реНрддреЗ, Khabrovsk рдирд┐рд╡рд╛рд╕реАрд╣рд░реВред рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд▓реЗрдЦреЗрдЭреИрдВ, рдпреЛ рдорд╣рд┐рдирд╛ OTUS рд▓реЗ рджреБрдИрд╡рдЯрд╛ рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рдХреЛрд░реНрд╕рд╣рд░реВ рдПрдХреИрдЪреЛрдЯрд┐ рд╕реБрд░реБ рдЧрд░реНрджреИрдЫ, рдЕрд░реНрдерд╛рддреН рдЖрдзрд╛рд░ ╨╕ рдЙрдиреНрдирддред рдпрд╕ рд╕рдиреНрджрд░реНрднрдорд╛, рд╣рд╛рдореА рдЙрдкрдпреЛрдЧреА рд╕рд╛рдордЧреНрд░реА рд╕рд╛рдЭрд╛ рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред

рдпрд╕ рд▓реЗрдЦрдХреЛ рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд╣рд╛рдореНрд░реЛ рдкрд╣рд┐рд▓реЛ рдЕрдиреБрднрд╡рдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреБ рд╣реЛ MLflow.

рд╣рд╛рдореА рд╕рдореАрдХреНрд╖рд╛ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫреМрдВ MLflow рдпрд╕рдХреЛ рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ рд╕рд░реНрднрд░рдмрд╛рдЯ рд░ рдЕрдзреНрдпрдпрдирдХрд╛ рд╕рдмреИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ рд▓рдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реНред рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА UDF рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ MLflow рд╕рдБрдЧ рд╕реНрдкрд╛рд░реНрдХ рдЬрдбрд╛рди рдЧрд░реНрдиреЗ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрднрд╡ рд╕рд╛рдЭрд╛ рдЧрд░реНрдиреЗрдЫреМрдВред

рдкреНрд░рд╕реНрдЧ

рд╣рд╛рдореА рднрд┐рддреНрд░ рдЫреМ рдЕрд▓реНрдлрд╛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╣рд╛рдореА рдорд╛рдирд┐рд╕рд╣рд░реВрд▓рд╛рдИ рдЙрдиреАрд╣рд░реВрдХреЛ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд░ рдХрд▓реНрдпрд╛рдгрдХреЛ рдЬрд┐рдореНрдорд╛ рд▓рд┐рди рд╕рд╢рдХреНрдд рдмрдирд╛рдЙрди рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рд░ рдХреГрддреНрд░рд┐рдо рдмреБрджреНрдзрд┐рдорддреНрддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред рдпрд╕реИрд▓реЗ рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рдореЛрдбреЗрд▓рд╣рд░реВ рд╣рд╛рдореАрд▓реЗ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдиреЗ рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рдЙрддреНрдкрд╛рджрдирд╣рд░реВрдХреЛ рдХреЗрдиреНрджреНрд░рдмрд┐рдиреНрджреБ рд╣реБрдиреН, рд░ рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА MLflow, рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рдЬреАрд╡рдирдЪрдХреНрд░рдХрд╛ рд╕рдмреИ рдкрдХреНрд╖рд╣рд░реВрд▓рд╛рдИ рд╕рдореЗрдЯреНрдиреЗ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдЖрдХрд░реНрд╖рд┐рдд рднрдпреМрдВред

MLflow

MLflow рдХреЛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рднрдиреЗрдХреЛ рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩрдХреЛ рд╢реАрд░реНрд╖рдорд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд╣ рдкреНрд░рджрд╛рди рдЧрд░реНрдиреБ рд╣реЛ рдЬрд╕рд▓реЗ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХрд╣рд░реВрд▓рд╛рдИ рд▓рдЧрднрдЧ рдХреБрдиреИ рдкрдирд┐ рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫредh2o, рдХреЗрд░рд╛рд╕, mleap, рдкрд╛рдЗрдЯрд░рдЪ, sklearn ╨╕ tensorflow), рдЙрдирдХреЛ рдХрд╛рдорд▓рд╛рдИ рдЕрд░реНрдХреЛ рд╕реНрддрд░рдорд╛ рд▓реИрдЬрд╛рдиреНрдЫред

MLflow рддреАрди рдШрдЯрдХ рдкреНрд░рджрд╛рди рдЧрд░реНрджрдЫ:

  • рдЯреНрд░рдпрд╛рдХрд┐рдЩреН - рд░реЗрдХрд░реНрдбрд┐рдЩ рд░ рдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреБрд░реЛрдзрд╣рд░реВ: рдХреЛрдб, рдбрд╛рдЯрд╛, рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рд░ рдкрд░рд┐рдгрд╛рдорд╣рд░реВред рдореЛрдбреЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдЕрдиреБрдЧрдорди рдзреЗрд░реИ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫред
  • рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реБ - рдХреБрдиреИ рдкрдирд┐ рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ рдЪрд▓рд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрдпрд╛рдХреЗрдЬрд┐рдЩ рдврд╛рдБрдЪрд╛ (рдЬрд╕реНрддреИред рд╕реЗрдЬрдореЗрдХрд░)
  • рдореЛрдбреЗрд▓ - рд╡рд┐рднрд┐рдиреНрди рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдЙрдкрдХрд░рдгрд╣рд░реВрдорд╛ рдореЛрдбреЗрд▓ рдкреЗрд╢ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рд╕рд╛рдЭрд╛ рдврд╛рдБрдЪрд╛ред

MLflow (рд▓реЗрдЦреНрдиреЗ рд╕рдордпрдорд╛ рдЕрд▓реНрдлрд╛рдорд╛) рдПрдЙрдЯрд╛ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╣реЛ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ, рдкреБрди: рдкреНрд░рдпреЛрдЧ, рд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕рд╣рд┐рдд рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рдЬреАрд╡рдирдЪрдХреНрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

MLflow рд╕реЗрдЯрдЕрдк рдЧрд░реНрджреИ

MLflow рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдкрд╣рд┐рд▓реЗ рдЖрдлреНрдиреЛ рд╕рдореНрдкреВрд░реНрдг рдкрд╛рдЗрдерди рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ 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 рдЯреНрд░реНрдпрд╛рдХрд┐рдЩрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ Python рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд░рдпреЛрдЧрд╣рд░реВ рд▓рдЧ рдЧрд░реНрди рд░ рдХреНрд╡реЗрд░реА рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ REST APIред рдердк рд░реВрдкрдорд╛, рддрдкрд╛рдЗрдБ рдореЛрдбреЗрд▓ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдХрд╣рд╛рдБ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (localhost, Amazon S3, Azure рдмреНрд▓рдм рднрдгреНрдбрд╛рд░рдг, рдЧреБрдЧрд▓ рдХреНрд▓рд╛рдЙрдб рднрдгреНрдбрд╛рд░рдг рд╡рд╛ 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 рдЙрджрд╛рд╣рд░рдгрдмрд╛рдЯ рд╡рд╛рдЗрди рдкрд░рд┐рдорд╛рд░реНрдЬрди рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ 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 рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдореЛрдбреЗрд▓ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ, рдореЗрдЯреНрд░рд┐рдХреНрд╕, рд░ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рд▓рдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рддрд╛рдХрд┐ рддрдкрд╛рдИрдВ рддрд┐рдиреАрд╣рд░реВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВрдорд╛ рдХрд╕рд░реА рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдиреНрдЫрдиреН рднрдиреЗрд░ рдЯреНрд░реНрдпрд╛рдХ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рд╕реБрд╡рд┐рдзрд╛ рдЕрддреНрдпрдиреНрдд рдЙрдкрдпреЛрдЧреА рдЫ рдХрд┐рдирднрдиреЗ рдпрд╕ рддрд░рд┐рдХрд╛рд▓реЗ рд╣рд╛рдореАрд▓реЗ рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ рд╕рд░реНрднрд░рд▓рд╛рдИ рд╕рдореНрдкрд░реНрдХ рдЧрд░реЗрд░ рд╡рд╛ рдХрдорд┐рдЯрд╣рд░реВрдХреЛ git рд╣реНрдпрд╛рд╕ рд▓рдЧрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХреБрди рдХреЛрдбрд▓реЗ рдЖрд╡рд╢реНрдпрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНтАНрдпреЛ рднрдиреЗрд░ рдмреБрдЭреЗрд░ рдЙрддреНрдХреГрд╖реНрдЯ рдореЛрдбреЗрд▓ рдкреБрди: рдЙрддреНрдкрд╛рджрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВред

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

MLflow рд╕реЗрд╡рд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдореЛрдбреЗрд▓рд╣рд░реВ рд╕реЗрд╡рд╛ рдЧрд░реНрди, рд╣рд╛рдореАрд▓реЗ рдХреЗрд╡рд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрд░ рдореЛрдбреЗрд▓рдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЯреНрд░реНрдпрд╛рдХрд┐рдЩ 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 // рдХрд╛рдЧрдЬрд╛рдд // рдореЛрдбреЗрд▓ # рд╕реНрдерд╛рдиреАрдп), рд╕реНрдкрд╛рд░реНрдХ (рдмреНрдпрд╛рдЪ рд╡рд╛ рд╕реНрдЯреНрд░рд┐рдорд┐рдЩ) рдХреЛ рдкреНрд░рдпреЛрдЧ рд╡рд┐рддрд░рдгрдХреЛ рдХрд╛рд░рдг рдЕрдЭ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рдорд╛рдзрд╛рди рд╣реЛред

рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдХреЗрд╡рд▓ рдЕрдлрд▓рд╛рдЗрди рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЧрд░реНрдиреБрднрдпреЛ рд░ рддреНрдпрд╕рдкрдЫрд┐ рддрдкрд╛рдИрдВрдХреЛ рд╕рдмреИ рдбреЗрдЯрд╛рдорд╛ рдЖрдЙрдЯрдкреБрдЯ рдореЛрдбреЗрд▓ рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрднрдпреЛред рдпреЛ рдЬрд╣рд╛рдБ рд╕реНрдкрд╛рд░реНрдХ рд░ MLflow рдЪрдореНрдХрд┐рдиреНрдЫред

PySpark + Jupyter + Spark рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╕реНрд░реЛрдд: PySpark - Jupyter рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╣рд╛рдореАрд▓реЗ Spark рдбреЗрдЯрд╛рдлреНрд░реЗрдорд╣рд░реВрдорд╛ MLflow рдореЛрдбреЗрд▓рд╣рд░реВ рдХрд╕рд░реА рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ рднрдиреЗрд░ рджреЗрдЦрд╛рдЙрди, PySpark рд╕рдБрдЧ рдорд┐рд▓реЗрд░ рдХрд╛рдо рдЧрд░реНрди рд╣рд╛рдореАрд▓реЗ Jupyter рдиреЛрдЯрдмреБрдХрд╣рд░реВ рд╕реЗрдЯрдЕрдк рдЧрд░реНрдиреБрдкрд░реНрдЫред

рдирд╡реАрдирддрдо рд╕реНрдерд┐рд░ рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реЗрд░ рд╕реБрд░реВ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ:

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 рд▓рдиреНрдЪ рдЧрд░реНрджреИ

рд╣рд╛рдореАрд▓реЗ рдЬреБрдкрд┐рдЯрд░рд▓рд╛рдИ PySpark рдбреНрд░рд╛рдЗрднрд░рдХреЛ рд░реВрдкрдорд╛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдХрд╛рд▓реЗ, рд╣рд╛рдореА рдЕрдм 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 рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ, рд╕рдореНрдкреВрд░реНрдг рд╡рд╛рдЗрди рдбреЗрдЯрд╛рд╕реЗрдЯрдорд╛ рд╡рд╛рдЗрди рдЧреБрдгрд╕реНрддрд░ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреАрд╣рд░реВ рдЪрд▓рд╛рдЙрдиреЗ рдмрд╛рд░реЗ рдХреБрд░рд╛ рдЧрд░реЗрдХрд╛ рдЫреМрдВред рддрд░ рдпрджрд┐ рддрдкрд╛рдЗрдБ рд╕реНрдХрд╛рд▓рд╛ рд╕реНрдкрд╛рд░реНрдХрдмрд╛рдЯ рдкрд╛рдЗрдерди MLflow рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ рдХреЗ рд╣реБрдиреНрдЫ?

рд╣рд╛рдореАрд▓реЗ рд╕реНрдХрд╛рд▓рд╛ рд░ рдкрд╛рдЗрдерди рдмреАрдЪ рд╕реНрдкрд╛рд░реНрдХ рд╕рдиреНрджрд░реНрдн рд╡рд┐рднрд╛рдЬрди рдЧрд░реЗрд░ рдпреЛ рдкрдирд┐ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНтАНрдпреМрдВред рддреНрдпреЛ рд╣реЛ, рд╣рд╛рдореАрд▓реЗ рдкрд╛рдЗрдердирдорд╛ MLflow UDF рджрд░реНрддрд╛ рдЧрд░реНрдпреМрдВ, рд░ рдпрд╕рд▓рд╛рдИ Scala рдмрд╛рдЯ рдкреНрд░рдпреЛрдЧ рдЧрд░реНтАНрдпреМрдВ (рд╣реЛ, рд╕рд╛рдпрдж рдЙрддреНрддрдо рд╕рдорд╛рдзрд╛рди рд╣реЛрдЗрди, рддрд░ рд╣рд╛рдореАрд╕рдБрдЧ рдХреЗ рдЫ)ред

рд╕реНрдХрд╛рд▓рд╛ рд╕реНрдкрд╛рд░реНрдХ + рдПрдордПрд▓рдлреНрд▓реЛ

рдпрд╕ рдЙрджрд╛рд╣рд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореА рдердкреНрдиреЗрдЫреМрдВ Toree рдХрд░реНрдиреЗрд▓ рдЕрд╡рд╕реНрдерд┐рдд рдмреГрд╣рд╕реНрдкрддрд┐ рдорд╛ред

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 рдХреЛ рдпреЛ рдЕрдиреНрд╡реЗрд╖рдг рдкрдЫрд┐, рд╣рд╛рдореА рд╡рд┐рд╢реНрд╡рд╕реНрдд рдЫреМрдВ рдХрд┐ рд╣рд╛рдореА рдЕрдЧрд╛рдбрд┐ рдмрдвреНрдиреЗрдЫреМрдВ рд░ рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореНрд░реЛ рд╕реНрдкрд╛рд░реНрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд╣рд░реВ рд░ рд╕рд┐рдлрд╛рд░рд┐рд╕рдХрд░реНрддрд╛ рдкреНрд░рдгрд╛рд▓реАрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред

рдлрд╛рдЗрд▓ рдкреНрд░рдгрд╛рд▓реАрдХреЛ рд╕рдЯреНрдЯрд╛ рдбрд╛рдЯрд╛рдмреЗрд╕рд╕рдБрдЧ рдлрд╛рдЗрд▓ рднрдгреНрдбрд╛рд░рдг рд╕рд┐рдЩреНрдХреНрд░реЛрдирд╛рдЗрдЬ рдЧрд░реНрди рд░рд╛рдореНрд░реЛ рд╣реБрдиреЗрдЫред рдпрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдЙрдЯреИ рдлрд╛рдЗрд▓ рднрдгреНрдбрд╛рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреЗ рдзреЗрд░реИ рдЕрдиреНрддрдмрд┐рдиреНрджреБрд╣рд░реВ рджрд┐рдиреБрдкрд░реНрджрдЫред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдзреЗрд░реИ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕рдлрд╛рдИ ╨╕ рдПрдереЗрдирд╛ рдПрдЙрдЯреИ рдЧреЛрдВрдж рдореЗрдЯрд╛рд╕реНрдЯреЛрд░ рд╕рдВрдЧред

рд╕рдВрдХреНрд╖реЗрдкрдорд╛, рдо MLFlow рд╕рдореБрджрд╛рдпрд▓рд╛рдИ рдбрд╛рдЯрд╛рдХреЛ рд╕рд╛рде рд╣рд╛рдореНрд░реЛ рдХрд╛рдорд▓рд╛рдИ рдердк рд░реЛрдЪрдХ рдмрдирд╛рдЙрдирдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж рднрдиреНрди рдЪрд╛рд╣рдиреНрдЫреБред

рдпрджрд┐ рддрдкрд╛рдЗрдБ MLflow рд╕рдБрдЧ рд╡рд░рд┐рдкрд░рд┐ рдЦреЗрд▓реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рд╣рд╛рдореАрд▓рд╛рдИ рд▓реЗрдЦреНрди рдирд╣рд┐рдЪрдХрд┐рдЪрд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рд╣рд╛рдореАрд▓рд╛рдИ рдмрддрд╛рдЙрдиреБрд╣реЛрд╕реН, рд░ рдЕрдЭ рдмрдврд┐ рдпрджрд┐ рддрдкрд╛рдЗрдБ рдпрд╕рд▓рд╛рдИ рдЙрддреНрдкрд╛рджрдирдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗред

рдкрд╛рдареНрдпрдХреНрд░рдорд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдердк рдЬрд╛рдиреНрдиреБрд╣реЛрд╕реН:
рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩред рдЖрдзрд╛рд░рднреВрдд рдкрд╛рдареНрдпрдХреНрд░рдо
рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩред рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдо

рдердк рдкрдвреНрдиреБрд╣реЛрд╕реН:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди