เจนเฉเจฒเฉ, Khabrovsk เจจเจฟเจตเจพเจธเฉ. เจเจฟเจตเฉเจ เจเจฟ เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจฒเจฟเจเจฟเจ เจนเฉ, เจเจธ เจฎเจนเฉเจจเฉ OTUS เจเฉฑเจ เจตเจพเจฐ เจตเจฟเฉฑเจ เจฆเฉ เจฎเจธเจผเฉเจจ เจธเจฟเจเจฒเจพเจ เจเฉเจฐเจธ เจธเจผเฉเจฐเฉ เจเจฐ เจฐเจฟเจนเจพ เจนเฉ, เจ
เจฐเจฅเจพเจค
เจเจธ เจฒเฉเจ เจฆเจพ เจเจฆเฉเจธเจผ เจธเจพเจกเฉ เจชเจนเจฟเจฒเฉ เจ
เจจเฉเจญเจต เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเจฐเจจเจพ เจนเฉ
เจ
เจธเฉเจ เจธเจฎเฉเจเจฟเจ เจธเจผเฉเจฐเฉ เจเจฐเจพเจเจเฉ
เจชเฉเจฐเจธเฉฐเจ
เจ
เจธเฉเจ เจ
เฉฐเจฆเจฐ เจนเจพเจ
MLflow
MLflow เจฆเจพ เจฎเฉเฉฑเจ เจเฉเจเจพ เจฎเจธเจผเฉเจจ เจธเจฟเจเจฒเจพเจ เจฆเฉ เจธเจฟเจเจฐ 'เจคเฉ เจเฉฑเจ เจตเจพเจงเฉ เจชเจฐเจค เจชเฉเจฐเจฆเจพเจจ เจเจฐเจจเจพ เจนเฉ เจเฉ เจกเฉเจเจพ เจตเจฟเจเจฟเจเจจเฉเจเจ เจจเฉเฉฐ เจฒเจเจญเจ เจเจฟเจธเฉ เจตเฉ เจฎเจธเจผเฉเจจ เจธเจฟเจเจฒเจพเจ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉ (
MLflow เจคเจฟเฉฐเจจ เจญเจพเจ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเจพ เจนเฉ:
- เจเจฐเฉเจเจฟเฉฐเจ - เจฐเจฟเจเจพเจฐเจกเจฟเฉฐเจ เจ เจคเฉ เจชเฉเจฐเจฏเฉเจเจพเจ เจฒเจ เจฌเฉเจจเจคเฉเจเจ: เจเฉเจก, เจกเฉเจเจพ, เจเฉเจเจซเจฟเจเจฐเฉเจธเจผเจจ เจ เจคเฉ เจจเจคเฉเจเฉเฅค เจฎเจพเจกเจฒ เจฌเจฃเจพเจเจฃ เจฆเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเฉ เจจเจฟเจเจฐเจพเจจเฉ เจเจฐเจจเจพ เจฌเจนเฉเจค เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจนเฉ.
- เจชเฉเจฐเจพเจเฉเจเจ - เจเจฟเจธเฉ เจตเฉ เจชเจฒเฉเจเจซเจพเจฐเจฎ 'เจคเฉ เจเฉฑเจฒเจฃ เจฒเจ เจชเฉเจเฉเจเจฟเฉฐเจ เจซเจพเจฐเจฎเฉเจ (เจเจฆเจพ.
เจธเฉเจเจฎเฉเจเจฐ ) - เจฎเจพเจกเจฒ - เจตเฉฑเจ-เจตเฉฑเจ เจคเฉเจจเจพเจคเฉ เจธเจพเจงเจจเจพเจ เจฒเจ เจฎเจพเจกเจฒเจพเจ เจจเฉเฉฐ เจเจฎเฉเจนเจพเจ เจเจฐเจจ เจฒเจ เจเฉฑเจ เจเจฎ เจซเจพเจฐเจฎเฉเจเฅค
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
```
เจจเฉเจ: เจ เจธเฉเจ UDF เจตเจฐเจเฉ เจฎเจพเจกเจฒเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฒเจ PyArrow เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค PyArrow เจ เจคเฉ Numpy เจฆเฉ เจธเฉฐเจธเจเจฐเจฃเจพเจ เจจเฉเฉฐ เจ เฉเจ เจเจฐเจจ เจฆเฉ เจฒเฉเฉ เจนเฉ เจเจฟเจเจเจเจฟ เจฌเจพเจ เจฆ เจตเจพเจฒเฉ เจธเฉฐเจธเจเจฐเจฃ เจเฉฑเจ เจฆเฉเจเฉ เจจเจพเจฒ เจเจเจฐเจพ เจเจ เจธเจจเฅค
เจเจฐเฉเจเจฟเฉฐเจ UI เจฒเจพเจเจ เจเจฐเฉ
MLflow เจเจฐเฉเจเจฟเฉฐเจ เจธเจพเจจเฉเฉฐ 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 เจตเจฟเฉฑเจ เจตเจฐเจค เจธเจเจฆเฉ เจนเจพเจ, เจเจฟเจเจเจเจฟ เจธเจพเจจเฉเฉฐ เจธเจฟเจฐเจซ เจฎเจพเจกเจฒ เจฒเจ เจฎเจพเจฐเจ เจฆเฉ เจฒเฉเฉ เจนเฉเฅค
เจจเฉเจ: เจงเจฟเจเจจ เจตเจฟเฉฑเจ เจฐเฉฑเจเฉ เจเจฟ เจเจฐเฉเจเจฟเฉฐเจ UI เจ เจคเฉ เจฎเจพเจกเจฒ เจเจฒเจพเจเฉฐเจ เจเฉเจฒ เจเจฐเจเฉเจซเฉเจเจ เจเจฟเจเจพเจฃเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเฉเฅค เจญเจพเจต, เจเจธ เจคเฉฑเจฅ เจฆเฉ เจชเจฐเจตเจพเจน เจเฉเจคเฉ เจฌเจฟเจจเจพเจ เจเจฟ เจเจฐเฉเจเจฟเฉฐเจ UI เจเฉฑเจ EC2 เจเจฆเจพเจนเจฐเจจ เจตเจฟเฉฑเจ เจฐเจนเจฟเฉฐเจฆเจพ เจนเฉ, เจเจฆเฉเจ MLflow เจธเจฅเจพเจจเจ เจคเฉเจฐ 'เจคเฉ เจเฉฑเจฒเจฆเจพ เจนเฉ, เจฎเจธเจผเฉเจจ เจจเฉเฉฐ เจเจฐเจเฉเจซเฉเจเจ เจฎเจพเจกเจฒเจพเจ เจจเฉเฉฐ เจฒเจฟเจเจฃ เจฒเจ S3 เจคเฉฑเจ เจธเจฟเฉฑเจงเฉ เจชเจนเฉเฉฐเจ เจนเฉเจฃเฉ เจเจพเจนเฉเจฆเฉ เจนเฉเฅค
เจเจฐเฉเจเจฟเฉฐเจ 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 เจธเจฐเจตเจฐ" เจเจฎเจพเจเจก เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจฒเจพเจเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉ, เจเฉเจฒ เจฐเจจ เจจเฉเฉฐ เจเจฐเฉเจ เจเจฐเจจ เจ เจคเฉ เจธเจฅเจพเจจเจ เจซเจพเจเจฒ เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจกเฉเจเจพ เจฒเจฟเจเจฃ เจฒเจ เจเฉฑเจ REST API เจนเฉเฅค เจคเฉเจธเฉเจ เจตเจพเจคเจพเจตเจฐเจฃ เจตเฉเจฐเฉเจเจฌเจฒ โMLFLOW_TRACKING_URIโ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจฐเฉเจเจฟเฉฐเจ เจธเจฐเจตเจฐ เจฆเจพ เจชเจคเจพ เจจเจฟเจฐเจงเจพเจฐเจค เจเจฐ เจธเจเจฆเฉ เจนเฉ เจ เจคเฉ MLflow เจเจฐเฉเจเจฟเฉฐเจ API เจฒเจพเจเจ เจเจพเจฃเจเจพเจฐเฉ, เจฒเฉเจ เจฎเฉเจเฉเจฐเจฟเจเจธ, เจเจฆเจฟ เจฌเจฃเจพเจเจฃ/เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฒเจ เจเจชเจฃเฉ เจเจช เจเจธ เจชเจคเฉ 'เจคเฉ เจเจฐเฉเจเจฟเฉฐเจ เจธเจฐเจตเจฐ เจจเจพเจฒ เจธเฉฐเจชเจฐเจ เจเจฐเฉเจเจพเฅค
เจธเจฐเฉเจค:
เจกเฉเจเจธ// เจเฉฑเจ เจเจฐเฉเจเจฟเฉฐเจ เจธเจฐเจตเจฐ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉ
เจเฉฑเจ เจธเจฐเจตเจฐ เจจเจพเจฒ เจฎเจพเจกเจฒ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจจ เจฒเจ, เจธเจพเจจเฉเฉฐ เจเฉฑเจ เจเฉฑเจฒ เจฐเจนเฉ เจเจฐเฉเจเจฟเฉฐเจ เจธเจฐเจตเจฐ (เจฒเฉเจเจ เจเฉฐเจเจฐเจซเฉเจธ เจตเฉเจเฉ) เจ เจคเฉ เจฎเจพเจกเจฒ เจฆเฉ เจฐเจจ 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 เจธเจฐเจตเจฐ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจ เจฎเจพเจกเจฒเจพเจ เจฆเฉ เจธเฉเจตเจพ เจเจฐเจจ เจฒเจ, เจธเจพเจจเฉเฉฐ เจธเจฟเจฐเจซเจผ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจเจฐเจเฉ เจฎเจพเจกเจฒ เจฌเจพเจฐเฉ เจเจพเจฃเจเจพเจฐเฉ เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฒเจ เจเจฐเฉเจเจฟเฉฐเจ 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]}
เจธเจชเจพเจฐเจ เจคเฉเจ เจเฉฑเจฒ เจฐเจนเฉ เจฎเจพเจกเจฒ
เจเจธ เจคเฉฑเจฅ เจฆเฉ เจฌเจพเจตเจเฉเจฆ เจเจฟ เจเจฐเฉเจเจฟเฉฐเจ เจธเจฐเจตเจฐ เจ
เจธเจฒ เจธเจฎเฉเจ เจตเจฟเฉฑเจ เจฎเจพเจกเจฒเจพเจ เจฆเฉ เจธเฉเจตเจพ เจเจฐเจจ, เจเจนเจจเจพเจ เจจเฉเฉฐ เจธเจฟเจเจฒเจพเจ เจฆเฉเจฃ เจ
เจคเฉ เจธเจฐเจตเจฐ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจ เจฒเจ เจเจพเจซเจผเฉ เจธเจผเจเจคเฉเจธเจผเจพเจฒเฉ เจนเฉ (เจธเจฐเฉเจค:
เจเจฒเจชเจจเจพ เจเจฐเฉ เจเจฟ เจคเฉเจธเฉเจ เจธเจฟเจฐเจซเจผ เจเจซเจฒเจพเจเจจ เจธเจฟเจเจฒเจพเจ เจฆเจฟเฉฑเจคเฉ เจนเฉ เจ เจคเฉ เจซเจฟเจฐ เจคเฉเจนเจพเจกเฉ เจธเจพเจฐเฉ เจกเฉเจเจพ เจฒเจ เจเจเจเจชเฉเฉฑเจ เจฎเจพเจกเจฒ เจฒเจพเจเฉ เจเฉเจคเจพ เจนเฉเฅค เจเจน เจเจน เจฅเจพเจ เจนเฉ เจเจฟเฉฑเจฅเฉ เจธเจชเจพเจฐเจ เจ เจคเฉ เจเจฎเจเจฒเจซเจฒเฉ เจเจฎเจเจฆเฉ เจนเจจเฅค
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ฬ
เจตเจฐเจเฉเจ เจฒ เจตเจพเจคเจพเจตเจฐเจฃ เจตเจฟเฉฑเจ เจชเจพเจเจธเจชเจพเจฐเจ เจ เจคเฉ เจเฉเจชเฉเจเจฐ เจจเฉเฉฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเฉ:
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 เจคเฉเจ เจเฉเจชเฉเจเจฐ เจฒเจพเจเจ เจเจฐเจจเจพ
เจเจฟเจเจเจเจฟ เจ เจธเฉเจ เจเฉเจชเฉเจเจฐ เจจเฉเฉฐ เจชเจพเจเจธเจชเจพเจฐเจ เจกเจฐเจพเจเจตเจฐ เจตเจเฉเจ เจธเฉฐเจฐเจเจฟเจค เจเจฐเจจ เจฆเฉ เจฏเฉเจ เจธเฉ, เจ เจธเฉเจ เจนเฉเจฃ เจเฉเจชเฉเจเจฐ เจจเฉเจเจฌเฉเฉฑเจ เจจเฉเฉฐ เจชเจพเจเจธเจชเจพเจฐเจ เจฆเฉ เจธเฉฐเจฆเจฐเจญ เจตเจฟเฉฑเจ เจเจฒเจพ เจธเจเจฆเฉ เจนเจพเจเฅค
(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)
เจชเจพเจเจธเจชเจพเจฐเจ - เจตเจพเจเจจ เจเฉเจฃเจตเฉฑเจคเจพ เจฆเฉเจเจ เจญเจตเจฟเฉฑเจเจฌเจพเจฃเฉเจเจ เจจเฉเฉฐ เจเจเจเจชเฉเฉฑเจ เจเจฐเจจเจพ
เจเจธ เจฌเจฟเฉฐเจฆเฉ เจคเฉฑเจ, เจ เจธเฉเจ เจเจธ เจฌเจพเจฐเฉ เจเฉฑเจฒ เจเฉเจคเฉ เจนเฉ เจเจฟ MLflow เจจเจพเจฒ PySpark เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเฉเจคเฉ เจเจพเจตเฉ, เจชเฉเจฐเฉ เจตเจพเจเจจ เจกเฉเจเจพเจธเฉเจ 'เจคเฉ เจตเจพเจเจจ เจเฉเจฃเจตเฉฑเจคเจพ เจฆเฉ เจญเจตเจฟเฉฑเจเจฌเจพเจฃเฉ เจเฉฑเจฒ เจฐเจนเฉ เจนเฉเฅค เจชเจฐ เจเจฆเฉเจ เจเฉ เจเฉ เจคเฉเจนเจพเจจเฉเฉฐ เจธเจเฉเจฒเจพ เจธเจชเจพเจฐเจ เจคเฉเจ เจชเจพเจเจฅเจจ เจเจฎเจเจฒเจซเจฒเฉ เจฎเฉเจกเฉเจเจฒ เจตเจฐเจคเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ?
เจ เจธเฉเจ เจธเจเฉเจฒเจพ เจ เจคเฉ เจชเจพเจเจฅเจจ เจตเจฟเจเจเจพเจฐ เจธเจชเจพเจฐเจ เจธเฉฐเจฆเจฐเจญ เจจเฉเฉฐ เจตเฉฐเจก เจเฉ เจเจธเจฆเฉ เจตเฉ เจเจพเจเจ เจเฉเจคเฉเฅค เจญเจพเจต, เจ เจธเฉเจ เจชเจพเจเจฅเจจ เจตเจฟเฉฑเจ MLflow UDF เจฐเจเจฟเจธเจเจฐ เจเฉเจคเจพ เจนเฉ, เจ เจคเฉ เจเจธเจจเฉเฉฐ Scala เจคเฉเจ เจตเจฐเจคเจฟเจ เจนเฉ (เจนเจพเจ, เจธเจผเจพเจเจฆ เจธเจญ เจคเฉเจ เจตเจงเฉเจ เจนเฉฑเจฒ เจจเจนเฉเจ, เจชเจฐ เจธเจพเจกเฉ เจเฉเจฒ เจเฉ เจนเฉ)เฅค
เจธเจเฉเจฒเจพ เจธเจชเจพเจฐเจ + MLflow
เจเจธ เจเจฆเจพเจนเจฐเจฃ เจฒเจ เจ
เจธเฉเจ เจเฉเฉเจพเจเจเฉ
เจธเจชเจพเจฐเจ + เจเฉเจฐเฉ + เจเฉเจชเฉเจเจฐ เจธเจฅเจพเจชเจฟเจค เจเจฐเฉ
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 เจธเจชเจพเจฐเจ เจ เจคเฉ 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 เจจเจพเจฒ เจเฉเจก เจฐเจนเฉ เจนเฉ, เจคเจพเจ เจธเจพเจจเฉเฉฐ เจฒเจฟเจเจฃ เจคเฉเจ เจธเฉฐเจเฉเจ เจจเจพ เจเจฐเฉ เจ เจคเฉ เจธเจพเจจเฉเฉฐ เจฆเฉฑเจธเฉ เจเจฟ เจคเฉเจธเฉเจ เจเจธเจจเฉเฉฐ เจเจฟเจตเฉเจ เจตเจฐเจคเจฆเฉ เจนเฉ, เจ เจคเฉ เจเจธ เจคเฉเจ เจตเฉ เจตเฉฑเจง เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเจธเจจเฉเฉฐ เจเจคเจชเจพเจฆเจจ เจตเจฟเฉฑเจ เจตเจฐเจคเจฆเฉ เจนเฉเฅค
เจเฉเจฐเจธเจพเจ เจฌเจพเจฐเฉ เจนเฉเจฐ เจเจพเจฃเฉ:
เจนเฉเจฐ เจชเฉเฉเจนเฉ:
เจจเจฟเจฐเฉเจเจฃ เจเฉเจคเฉเจเจ เจธเจฟเฉฑเจเจฃ เจฆเฉเจเจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจฒเจ เจฎเฉเฉฑเจ เจญเจพเจ เจตเจฟเจธเจผเจฒเฉเจธเจผเจฃ เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฆเฉ เจเฉเจเจฎ เจ เจคเฉ เจเฉเจคเจพเจตเจจเฉเจเจ เจกเฉเจเจฐ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจฎเจธเจผเฉเจจ เจฒเจฐเจจเจฟเฉฐเจ เจฎเจพเจกเจฒ เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเจจเจพ - เจญเจพเจ 1 เจกเฉเจเจฐ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจฎเจธเจผเฉเจจ เจฒเจฐเจจเจฟเฉฐเจ เจฎเจพเจกเจฒ เจจเฉเฉฐ เจคเฉเจจเจพเจค เจเจฐเจจเจพ - เจญเจพเจ 2
เจธเจฐเฉเจค: www.habr.com