เชนเซเชฒเซ, เชเชพเชฌเซเชฐเซเชตเชธเซเช เชฐเชนเซเชตเชพเชธเซเช. เช
เชฎเซ เชชเชนเซเชฒเซเชฅเซ เช เชฒเชเซเชฏเซเช เชเซ เชคเซเชฎ, เช เชฎเชนเชฟเชจเซ OTUS เชเช เชธเชพเชฅเซ เชฌเซ เชฎเชถเซเชจ เชฒเชฐเซเชจเชฟเชเช เชเซเชฐเซเชธ เชถเชฐเซ เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ, เชเชเชฒเซ เชเซ
เช เชฒเซเชเชจเซ เชนเซเชคเซ เช
เชฎเชพเชฐเชพ เชเชชเชฏเซเชเชจเชพ เชชเซเชฐเชฅเชฎ เช
เชจเซเชญเชต เชตเชฟเชถเซ เชตเชพเชค เชเชฐเชตเชพเชจเซ เชเซ
เช
เชฎเซ เชธเชฎเซเชเซเชทเชพ เชถเชฐเซ เชเชฐเซเชถเซเช
เชธเชเชฆเชฐเซเชญ
เช
เชฎเซ เช
เชเชฆเชฐ เชเซเช
MLflow
MLflowเชจเซเช เชฎเซเชเซเชฏ เชงเซเชฏเซเชฏ เชฎเชถเซเชจ เชฒเชฐเซเชจเชฟเชเชเชจเซ เชเซเช เชชเชฐ เชเช เชตเชงเชพเชฐเชพเชจเซเช เชธเซเชคเชฐ เชชเซเชฐเซเช เชชเชพเชกเชตเชพเชจเซเช เชเซ เชเซ เชกเซเชเชพ เชตเซเชเซเชเชพเชจเชฟเชเซเชจเซ เชฒเชเชญเช เชเซเชเชชเชฃ เชฎเชถเซเชจ เชฒเชฐเซเชจเชฟเชเช เชฒเชพเชเชฌเซเชฐเซเชฐเซ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเชถเซ (
MLflow เชคเซเชฐเชฃ เชเชเชเซ เชชเซเชฐเชฆเชพเชจ เชเชฐเซ เชเซ:
- เชเซเชฐเซเชเชฟเชเช - เชฐเซเชเซเชฐเซเชกเชฟเชเช เช เชจเซ เชชเซเชฐเชฏเซเชเซ เชฎเชพเชเซเชจเซ เชตเชฟเชจเชเชคเซเช: เชเซเชก, เชกเซเชเชพ, เชเซเช เชตเชฃเซ เช เชจเซ เชชเชฐเชฟเชฃเชพเชฎเซ. เชฎเซเชกเซเชฒ เชฌเชจเชพเชตเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซเช เชจเชฟเชฐเซเชเซเชทเชฃ เชเชฐเชตเซเช เชเซเชฌ เช เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชเซ.
- เชชเซเชฐเซเชเซเชเซเชเซเชธ - เชเซเชเชชเชฃ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชชเชฐ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ เชชเซเชเซเชเชฟเชเช เชซเซเชฐเซเชฎเซเช (เชฆเชพ.เชค.
เชธเซเชเชฎเซเชเชฐ ) - เชฎเซเชกเชฒเซเชธ - เชตเชฟเชตเชฟเชง เชกเชฟเชชเซเชฒเซเชฏเชฎเซเชจเซเช เชเซเชฒเซเชธ เชชเชฐ เชฎเซเชกเชฒเซเชธ เชธเชฌเชฎเชฟเช เชเชฐเชตเชพ เชฎเชพเชเซเชจเซเช เชธเชพเชฎเชพเชจเซเชฏ เชซเซเชฐเซเชฎเซเช.
MLflow (เชฒเซเชเชตเชพเชจเชพ เชธเชฎเชฏเซ เชเชฒเซเชซเชพเชฎเชพเช) เชเช เชเชชเชจ เชธเซเชฐเซเชธ เชชเซเชฒเซเชเชซเซเชฐเซเชฎ เชเซ เชเซ เชคเชฎเชจเซ เชชเซเชฐเชฏเซเช, เชชเซเชจเชเชเชชเชฏเซเช เช เชจเซ เชเชฎเชพเชตเช เชธเชนเชฟเชค เชฎเชถเซเชจ เชฒเชฐเซเชจเชฟเชเช เชฒเชพเชเชซเชธเชพเชเชเชฒเชจเซเช เชธเชเชเชพเชฒเชจ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ.
MLflow เชธเซเช เชเชฐเซ เชฐเชนเซเชฏเซเช เชเซ
MLflow เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเซ เชชเชนเซเชฒเชพ เชคเชฎเชพเชฐเชพ เชธเชฎเชเซเชฐ เชชเชพเชฏเชฅเซเชจ เชชเชฐเซเชฏเชพเชตเชฐเชฃเชจเซ เชธเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ, เช เชฎเชพเชเซ เช
เชฎเซ เชเชชเชฏเซเช เชเชฐเซเชถเซเช
```
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 server" เชเชฆเซเชถเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชถเชฐเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ, เชคเซเชฎเชพเช เชฐเชจ เชเซเชฐเซเช เชเชฐเชตเชพ เช เชจเซ เชธเซเชฅเชพเชจเชฟเช เชซเชพเชเชฒ เชธเชฟเชธเซเชเชฎเชฎเชพเช เชกเซเชเชพ เชฒเชเชตเชพ เชฎเชพเชเซ 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]}
เชธเซเชชเชพเชฐเซเชเชจเชพ เชฎเซเชกเซเชฒเซ เชเชพเชฒเซ เชฐเชนเซเชฏเชพ เชเซ
เชนเชเซเชเชค เช เชเซ เชเซ เชเซเชฐเซเชเชฟเชเช เชธเชฐเซเชตเชฐ เชตเชพเชธเซเชคเชตเชฟเช เชธเชฎเชฏเชฎเชพเช เชฎเซเชกเชฒเซเชธเชจเซ เชธเซเชตเชพ เชเชชเชตเชพ เชฎเชพเชเซ, เชคเซเชฎเชจเซ เชคเชพเชฒเซเชฎ เชเชชเชตเชพ เช
เชจเซ เชธเชฐเซเชตเชฐ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพ เชฎเชพเชเซ เชชเซเชฐเชคเซเช เชถเชเซเชคเชฟเชถเชพเชณเซ เชเซ (เชธเซเชฐเซเชค:
เชเชฒเซเชชเชจเชพ เชเชฐเซ เชเซ เชคเชฎเซ เชซเชเซเชค เชเชซเชฒเชพเชเชจ เชคเชพเชฒเซเชฎ เชเชฐเซ เช เชจเซ เชชเชเซ เชคเชฎเชพเชฐเชพ เชฌเชงเชพ เชกเซเชเชพ เชชเชฐ เชเชเชเชชเซเช เชฎเซเชกเซเชฒ เชฒเชพเชเซ เชเชฐเซเชฏเซเช. เช เชคเซ เชเซ เชเซเชฏเชพเช เชธเซเชชเชพเชฐเซเช เช เชจเซ 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 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 - เชเชเชเชชเซเชเชฟเชเช เชตเชพเชเชจเชจเซ เชเซเชฃเชตเชคเซเชคเชพเชจเซ เชเชเชพเชนเซเช
เช เชฌเชฟเชเชฆเซ เชธเซเชงเซ, เช เชฎเซ MLflow เชธเชพเชฅเซ PySpark เชจเซ เชเชชเชฏเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชฐเชตเซ เชคเซ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซ เชเซ, เชธเชฎเชเซเชฐ เชตเชพเชเชจ เชกเซเชเชพเชธเซเช เชชเชฐ เชตเชพเชเชจเชจเซ เชเซเชฃเชตเชคเซเชคเชพเชจเซ เชเชเชพเชนเซเช เชเชพเชฒเซ เชฐเชนเซ เชเซ. เชชเชฐเชเชคเซ เชเซ เชคเชฎเชพเชฐเซ เชธเซเชเซเชฒเชพ เชธเซเชชเชพเชฐเซเชเชฎเชพเชเชฅเซ เชชเชพเชฏเชฅเซเชจ เชเชฎเชเชฒเชซเซเชฒเซ เชฎเซเชกเซเชฏเซเชฒเซเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชนเซเชฏ เชคเซ เชถเซเช?
เช เชฎเซ เชธเซเชเซเชฒเชพ เช เชจเซ เชชเชพเชฏเชฅเซเชจ เชตเชเซเชเซ เชธเซเชชเชพเชฐเซเช เชธเชเชฆเชฐเซเชญเชจเซ เชตเชฟเชญเชพเชเชฟเชค เชเชฐเซเชจเซ เชชเชฃ เชเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเซเชฏเซเช เชเซ. เชเชเชฒเซ เชเซ, เช เชฎเซ Python เชฎเชพเช MLflow UDF เชฐเชเซเชธเซเชเชฐ เชเชฐเซเชฏเซเช เชเซ, เช เชจเซ เชคเซเชจเซ เชเชชเชฏเซเช Scala (เชนเชพ, เชเชฆเชพเช เชถเซเชฐเซเชทเซเช เชเชเซเชฒ เชจเชฅเซ, เชชเชฐเชเชคเซ เช เชฎเชพเชฐเซ เชชเชพเชธเซ เชถเซเช เชเซ) เชฅเซ เชเชฐเซเชฏเซ เชเซ.
เชธเซเชเซเชฒเชพ เชธเซเชชเชพเชฐเซเช + 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 เชธเชพเชฅเซ เชฐเชฎเซ เชฐเชนเซเชฏเชพเช เชเซ, เชคเซ เช เชฎเชจเซ เชฒเชเชตเชพเชฎเชพเช เช เชเชเชพเชถเซ เชจเชนเซเช เช เชจเซ เช เชฎเชจเซ เชเชฃเชพเชตเซ เชเซ เชคเชฎเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเซเชตเซ เชฐเซเชคเซ เชเชฐเซ เชเซ, เช เชจเซ เชคเซเชฅเซ เชชเชฃ เชตเชงเซ เชเซ เชคเชฎเซ เชเชคเซเชชเชพเชฆเชจเชฎเชพเช เชคเซเชจเซ เชเชชเชฏเซเช เชเชฐเซ เชเซ.
เช
เชญเซเชฏเชพเชธเชเซเชฐเชฎเซ เชตเชฟเชถเซ เชตเชงเซ เชเชพเชฃเซ:
เชตเชงเซ เชตเชพเชเชเซ:
เชจเชฟเชฐเซเชเซเชทเชฟเชค เชถเซเชเชตเชพเชจเซ เชธเชฎเชธเซเชฏเชพเช เชฎเชพเชเซ เชฎเซเชเซเชฏ เชเชเช เชตเชฟเชถเซเชฒเซเชทเชฃ เชฒเชพเชเซ เชเชฐเชตเชพเชจเชพ เชเซเชเชฎเซ เช เชจเซ เชธเชพเชตเชเซเชคเซเช เชกเซเชเชฐ เชธเชพเชฅเซ เชฎเชถเซเชจ เชฒเชฐเซเชจเชฟเชเช เชฎเซเชกเชฒ เชเชฎเชพเชตเชตเซเช โ เชญเชพเช 1 เชกเซเชเชฐ เชธเชพเชฅเซ เชฎเชถเซเชจ เชฒเชฐเซเชจเชฟเชเช เชฎเซเชกเชฒ เชเชฎเชพเชตเชตเซเช โ เชญเชพเช 2
เชธเซเชฐเซเชธ: www.habr.com