แแแแแ แฏแแแ แฎแแแ แแแกแแแก แแชแฎแแแ แแแแแแ. แ แแแแ แช แฃแแแ แแแแฌแแ แแ, แแ แแแแจแ OTUS แแฌแงแแแก แแ แแแ แแฃแแแ แแแแฅแแแฃแ แ แกแฌแแแแแแแก แแ แแฃแ แกแก, แแแ แซแแ
แแ แกแขแแขแแแก แแแแแแแ แแแกแแฃแแ แแ แฉแแแแก แแแ แแแ แแแแแชแแแแแแแแ
แฉแแแ แแแแแฌแงแแแ แแแแฎแแแแแก
แแแแขแแฅแกแขแ
แฉแแแ แแแ แ แจแแแแกแฃแแ
MLflow
MLflow-แแก แแแแแแ แ แแแแแแแ แฃแแ แฃแแแแแงแแก แแแแแขแแแแแ แคแแแ แแแแฅแแแฃแ แ แกแฌแแแแแก แแแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแกแชแแแก แแแแแชแแแแ แแแชแแแแ แแแก แแแฃแจแแแ แแแแฅแแแก แแแแแกแแแแ แแแแฅแแแแแแชแแแแแแแแก แแแแแแแแแแแกแแแ (
MLflow แฃแแ แฃแแแแแงแแคแก แกแแ แแแแแแแแแขแก:
- แจแแขแงแแแแแแแแแ - แฉแแฌแแ แ แแ แแฅแกแแแ แแแแแขแแแแก แแแแฎแแแแ: แแแแ, แแแแแชแแแแแ, แแแแคแแแฃแ แแชแแ แแ แจแแแแแแแ. แแแแแแแก แจแแฅแแแแก แแ แแชแแกแแก แแแแแขแแ แแแแ แซแแแแแ แแแแจแแแแแแแแแแ.
- แแ แแแฅแขแแแ - แจแแคแฃแแแแก แคแแ แแแขแ แแแแแกแแแแ แแแแขแคแแ แแแแ แแแกแแจแแแแแ (แแแ.
SageMaker ) - แแแแแแแแ โ แกแแแ แแ แคแแ แแแขแ แแแแแแแแแก แกแฎแแแแแกแฎแแ แแแแแแแแแแก แแแกแขแ แฃแแแแขแแแแ แฌแแ แแแแแแกแแแแก.
MLflow (แฌแแ แแก แแ แแก แแแคแแจแ) แแ แแก แฆแแ แแแแแก แแแแขแคแแ แแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแ แแแ แแแแฅแแแแแแชแแแแแแแแก แกแแกแแชแแชแฎแแ แชแแแแ, แแฅแกแแแ แแแแแขแแแแก, แฎแแแแฎแแแ แแแแแงแแแแแแกแ แแ แแแแแแแแแแก แฉแแแแแแ.
MLflow-แแก แแแงแแแแแ
MLflow-แแก แแแแแกแแงแแแแแแแ แฏแแ แฃแแแ แแแแงแแแแ แแแแแ แแฅแแแแ Python แแแ แแแ, แแแแกแแแแก แฉแแแ แแแแแแแงแแแแแ
```
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-แแก แแ
# 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-แแ แแ แขแแคแแฅแขแแก แแแแแแแแแก แแแกแแฌแแ แแ.
Tracking UI แแแแฎแแแก แแ แขแแคแแฅแขแแแก S3 แแแแแฃแแจแ
แแแจแแแแฃแแ แแแแแแแแ
แ แแแแ แช แแ Tracking แกแแ แแแ แ แแฃแจแแแแก, แจแแแแซแแแแ แแแแฌแงแแ แแแแแแแแแก แขแ แแแแแแ.
แแแแแแแแแ, แฉแแแ แแแแแแแงแแแแแ แฆแแแแแก แแแแแคแแแแชแแแก 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 แกแแจแฃแแแแแแก แแแซแแแแ แแแแ แแแแกแขแ แแ แแ แแแแแแแก แแแ แแแแขแ แแแ, แแแขแ แแแ แแ แแ แขแแคแแฅแขแแแ, แ แแแ แแแแแงแฃแ แ แแแแแแแ แแฃ แ แแแแ แแแแแ แแแแแแ แแกแแแ แแแแแแแ แแแแ. แแก แคแฃแแฅแชแแ แซแแแแ แกแแกแแ แแแแแแ, แ แแแแแ แแ แแแแ แฉแแแ แจแแแแแซแแแ แกแแฃแแแแแกแ แแแแแแแก แ แแแ แแแฃแชแแ แแแ 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")
แฆแแแแแก แแแแแแ แแแแแ
แกแแ แแแ แแก แแแฌแแแ แแแแแแแกแแแแก
MLflow แแแแแแแแแแก แกแแ แแแ แก, แ แแแแแแช แแแจแแแแฃแแแ "mlflow server" แแ แซแแแแแแก แแแแแงแแแแแแ, แแฅแแก REST API แแแจแแแแแแแก แแแแแงแฃแ แแก แแแแแแแแกแแแแก แแ แแแแแชแแแแแแก แแแแแแแแ แแ แคแแแแฃแ แกแแกแขแแแแจแ แฉแแกแแฌแแ แแ. แแฅแแแ แจแแแแซแแแแ แแแฃแแแแแ แแแแแแแแแแก แกแแ แแแ แแก แแแกแแแแ แแ แแแ แแแแก แชแแแแแแก โMLFLOW_TRACKING_URIโ แแแแแงแแแแแแ แแ MLflow แแแแแแแแแแก API แแแขแแแแขแฃแ แแ แแแฃแแแแจแแ แแแแ แแแแแแแแแแก แกแแ แแแ แก แแ แแแกแแแแ แแแ, แ แแแ แจแแฅแแแแก/แแแแฆแแก แแแจแแแแแก แแแคแแ แแแชแแ, แแฃแ แแแแแก แแแขแ แแแ แแ แ.แจ.
แฌแงแแ แ:
Docs// แแ แแฅแแแ แกแแ แแแ แแก แแแจแแแแ
แแแแแแแก แกแแ แแแ แแก แฃแแ แฃแแแแแกแแงแแคแแ, แฉแแแ แแแญแแ แแแแ แแแจแแแแฃแแ แแแแแแแแแแก แกแแ แแแ แ (แแฎ. แแแจแแแแแก แแแขแแ แคแแแกแ) แแ แแแแแแแก Run ID.
แแแฃแจแแแ 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 แกแแ แแแ แ แกแแแแแ แแกแแ แซแแแแ แแ แแแแแแแแก แ แแแแฃแ แแ แแจแ แแแกแแฎแฃแ แแแ, แแแแแแแแแแก แแแ แแ แแแแแแงแแแแแก แกแแ แแแ แแก แคแฃแแฅแชแแแแแ แแแแก (แฌแงแแ แ:
แฌแแ แแแแแแแแแ, แ แแ แแฅแแแ แฃแแ แแแแ แแแแแแแแ แขแ แแแแแแ แแคแแแแแจแ แแ แจแแแแแ แแแแแแงแแแแ แแแแแแแแแแ แแแแแแ แแฅแแแแก แงแแแแ แแแแแชแแแแ. แแฅ แแแแแแแก Spark แแ MLflow.
แแแแแแกแขแแแแ แแ PySpark + Jupyter + Spark
แฌแงแแ แ:
แแแแฌแงแแ PySpark - Jupyter
แแแแก แกแแฉแแแแแแแแ, แแฃ แ แแแแ แแแงแแแแแ MLflow แแแแแแแแก Spark แแแแแชแแแแ แฉแแ แฉแแแแแ, แฉแแแ แฃแแแ แแแแแงแแแแ Jupyter แแแฃแแแฃแฅแแแ 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-แแแ
แแแแแแแแ แฉแแแ แจแแแซแแแแ แแฃแแแขแแ แแก, แ แแแแ แช 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
แ แแแแ แช แแแแแ แแฆแแแแจแแ, 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)
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 แแแแกแแแแแแแแกแ แแ แกแแ แแแแแแแแแชแแ แกแแกแขแแแแแแกแแแแก.
แแแ แแ แแฅแแแแแแ แคแแแแฃแ แ แกแแกแขแแแแก แแแชแแแแ แคแแแแแแแก แจแแแแฎแแแก แแแแแชแแแแ แแแแแกแแแ แกแแแฅแ แแแแแแชแแ. แแแแ แฃแแแ แแแแแชแแก แแ แแแแแ แกแแแแแแ แฌแแ แขแแแ, แ แแแแแกแแช แจแแฃแซแแแ แแแแแแงแแแแก แแ แแ แแ แแแแแ แคแแแแแก แกแแชแแแ. แแแแแแแแแ, แแแแแแงแแแแ แแ แแแแแ แแแแแแแแ
แจแแฏแแแแแแกแแแแก, แแแแแ แแแแแแแ แแแแแแฃแฎแแแ MLFlow แกแแแแแแแแแแแก, แ แแ แฃแคแ แ แกแแแแขแแ แแกแ แแแฎแแแ แฉแแแแ แแฃแจแแแแ แแแแแชแแแแแแแ.
แแฃ แแฅแแแ แแแแแจแแแ MLflow-แแแ, แแฃ แแแแแ แแแแแแ แแแแแฌแแ แแ แแ แแแแแฎแแ แแ, แ แแแแ แแงแแแแแ แแแก แแ แแแ แฃแแแขแแก, แแฃ แแงแแแแแ แแแก แฌแแ แแแแแแจแ.
แจแแแขแงแแแ แแแขแ แแฃแ แกแแแแก แจแแกแแฎแแ:
แฒฌแแแแแแฎแ แแแขแ:
แ แแกแแแแ แแ แแแคแ แแฎแแแแแ แซแแ แแแแแ แแแแแแแแแขแแก แแแแแแแแก แแแแแงแแแแแแกแแก แแแแแแฎแแแแแแแแแแ แกแฌแแแแแก แแ แแแแแแแแแ แแแแฅแแแฃแ แ แกแฌแแแแแแแก แแแแแแแก แแแงแแแแแ Docker-แแ - แแแฌแแแ 1 แแแแฅแแแฃแ แ แกแฌแแแแแแแก แแแแแแแก แแแงแแแแแ Docker-แแ - แแแฌแแแ 2
แฌแงแแ แ: www.habr.com