เดนเดฒเต, เดเดฌเตเดฐเตเดตเตเดธเตเดเต เดจเดฟเดตเดพเดธเดฟเดเตพ. เดเดเตเดเตพ เดเดคเดฟเดจเดเด เดเดดเตเดคเดฟเดฏเดคเตเดชเตเดฒเต, เด เดฎเดพเดธเด OTUS เดเดฐเตเดธเดฎเดฏเด เดฐเดฃเตเดเต เดฎเตเดทเตเตป เดฒเตเดฃเดฟเดเดเต เดเตเดดเตเดธเตเดเตพ เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเตเดจเตเดจเต, เด
เดคเดพเดฏเดคเต
เด เดฒเตเดเดจเดคเตเดคเดฟเดจเตเดฑเต เดเดฆเตเดฆเตเดถเตเดฏเด เดเดเตเดเดณเตเดเต เดเดฆเตเดฏ เด
เดจเตเดญเดตเดคเตเดคเตเดเตเดเตเดฑเดฟเดเตเดเต เดธเดเดธเดพเดฐเดฟเดเตเดเตเด เดเดจเตเดจเดคเดพเดฃเต
เดเดเตเดเตพ เด
เดตเดฒเตเดเดจเด เดเดฐเดเดญเดฟเดเตเดเตเด
เดธเดจเตเดฆเตผเดญเด
เดเดเตเดเตพ เด
เดเดคเตเดคเดพเดฃเต
เดเดเดเตฝเดซเตเดฒเต
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 เดเดจเตเดจเดฟเดตเดฏเตเดเต เดชเดคเดฟเดชเตเดชเตเดเตพ เดชเดฐเดฟเดนเดฐเดฟเดเตเดเตเดฃเตเดเดคเตเดฃเตเดเต, เดเดพเดฐเดฃเด เดชเดฟเดจเตเดจเตเดเตเดณเตเดณ เดชเดคเดฟเดชเตเดชเตเดเตพ เดชเดฐเดธเตเดชเดฐเด เดตเตเดฐเตเดฆเตเดงเตเดฏเดฎเตเดณเตเดณเดตเดฏเดพเดฃเต.
เดเตเดฐเดพเดเตเดเดฟเดเดเต เดฏเตเด เดธเดฎเดพเดฐเดเดญเดฟเดเตเดเตเด
MLflow เดเตเดฐเดพเดเตเดเดฟเดเดเต เดชเตเดคเตเดคเตบ เดเดชเดฏเตเดเดฟเดเตเดเต เดชเดฐเตเดเตเดทเดฃเดเตเดเตพ เดฒเตเดเต เดเตเดฏเตเดฏเดพเดจเตเด เด
เดจเตเดตเตเดทเดฟเดเตเดเดพเดจเตเด เด
เดจเตเดตเดฆเดฟเดเตเดเตเดจเตเดจเต
# 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 เดธเตเตผเดตเตผ เดเดชเดฏเตเดเดฟเดเตเดเดฃเดฎเตเดเตเดเดฟเตฝ, เด เดต เดซเดฏเตฝ เดธเตเดฑเตเดฑเตเดฑเตเดเดฟเตฝ เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเดฎเตเดจเตเดจเต เดเตผเดฎเตเดฎเดฟเดเตเดเตเด. เดเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด, เดเดคเต เดเตเดเดพเดคเต เดคเดจเตเดจเต เดเดเตเดเตพเดเตเดเต เด เดตเดฐเต เดฏเต.เดกเดฟ.เดเดซเดฟเตฝ เดเดชเดฏเตเดเดฟเดเตเดเดพเด, เดเดพเดฐเดฃเด เดเดเตเดเตพเดเตเดเต เดฎเดพเดคเตเดเดฏเดฟเดฒเตเดเตเดเตเดณเตเดณ เดชเดพเดค เดฎเดพเดคเตเดฐเดฎเต เดเดตเดถเตเดฏเดฎเตเดณเตเดณเต.
เดถเตเดฐเดฆเตเดงเดฟเดเตเดเตเด: เดเตเดฐเดพเดเตเดเดฟเดเดเต เดฏเตเดเดเตเดเตเด เดฎเตเดกเตฝ เดเตเดฒเดฏเดจเตเดฑเดฟเดจเตเด เดเตผเดเตเดเดฟเดซเดพเดเตโเดฑเตเดฑเต เดฒเตเดเตเดเตเดทเดจเดฟเดฒเตเดเตเดเต เดเดเตโเดธเดธเต เดเดฃเตเดเดพเดฏเดฟเดฐเดฟเดเตเดเดฃเดฎเตเดจเตเดจเต เดเตผเดฎเตเดฎเดฟเดเตเดเตเด. เด เดคเดพเดฏเดคเต, เดเตเดฐเดพเดเตเดเดฟเดเดเต เดฏเตเด เดเดฐเต 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 เด เดตเดฟเดฒเดพเดธเดคเตเดคเดฟเดฒเต เดเตเดฐเดพเดเตเดเดฟเดเดเต เดธเตเตผเดตเดฑเตเดฎเดพเดฏเดฟ เดธเตเดตเดฏเดฎเตเดต เดฌเดจเตเดงเดชเตเดชเตเดเตเด.
เด เดตเดฒเดเดฌเด:
เดกเตเดเตเดธเต// เดเดฐเต เดเตเดฐเดพเดเตเดเดฟเดเดเต เดธเตเตผเดตเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเดจเตเดจเต
เดเดฐเต เดธเตเตผเดตเดฑเดฟเดจเตเดชเตเดชเด เดฎเตเดกเตฝ เดจเตฝเดเตเดจเตเดจเดคเดฟเดจเต, เดเดเตเดเตพเดเตเดเต เดเดฐเต เดฑเดฃเตเดฃเดฟเดเดเต เดเตเดฐเดพเดเตเดเดฟเดเดเต เดธเตเตผเดตเดฑเตเด (เดฒเตเดเตเดเต เดเดจเตเดฑเตผเดซเตเดธเต เดเดพเดฃเตเด) เดฎเตเดกเดฒเดฟเดจเตเดฑเต เดฑเตบ เดเดกเดฟเดฏเตเด เดเดตเดถเตเดฏเดฎเดพเดฃเต.
เดเดกเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเดเตเดเตเด
# 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 เดธเตเตผเดตเต เดซเดเดเตโเดทเดฃเดพเดฒเดฟเดฑเตเดฑเดฟ เดเดชเดฏเตเดเดฟเดเตเดเต เดฎเตเดกเดฒเตเดเตพ เดธเตเตผเดตเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดฎเตเดกเดฒเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเตเดณเตเดณ เดตเดฟเดตเดฐเดเตเดเตพ เดตเตเดฏเดเตเดคเดฎเดพเดเตเดเตเดจเตเดจเดคเดฟเดฒเตเดเต เดจเดฎเตเดเตเดเต เดเตเดฐเดพเดเตเดเดฟเดเดเต เดฏเตเดเดฏเดฟเดฒเตเดเตเดเต เดเดเตโเดธเดธเต เดเดตเดถเตเดฏเดฎเดพเดฃเต. --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 - 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 เดกเตเดฐเตเดตเดฑเดพเดฏเดฟ เดเตเตบเดซเดฟเดเตผ เดเตเดฏเตเดฏเดพเตป เดเดเตเดเตพเดเตเดเต เดเดดเดฟเดเตเดเดคเดฟเดจเดพเตฝ, 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
เดฎเตเดเดณเดฟเตฝ เดธเตเดเดฟเดชเตเดชเดฟเดเตเดเดคเตเดชเตเดฒเต, S3-เตฝ เดฎเตเดกเตฝ เดเตผเดเตเดเดฟเดซเดพเดเตโเดฑเตเดฑเตเดเตพ เดฒเตเดเต เดเตเดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดเดฐเต เดซเตเดเตเดเตผ MLflow เดจเตฝเดเตเดจเตเดจเต. เดคเดฟเดฐเดเตเดเตเดเตเดคเตเดค เดฎเตเดกเตฝ เดจเดฎเตเดฎเตเดเต เดเตเดฏเดฟเตฝ เดเดฟเดเตเดเดฟเดฏเดพเดฒเตเดเตป เด
เดคเต เดฎเตเดกเตเดฏเตเตพ เดเดชเดฏเตเดเดฟเดเตเดเต เดฏเต เดกเดฟ เดเดซเต เดเดฏเดฟ เดเดฑเดเตเดเตเดฎเดคเดฟ เดเตเดฏเตเดฏเดพเตป เด
เดตเดธเดฐเดฎเตเดฃเตเดเต. 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 เดเดเตเดเดจเต เดเดชเดฏเตเดเดฟเดเตเดเดพเดฎเตเดจเตเดจเดคเดฟเดจเตเดเตเดเตเดฑเดฟเดเตเดเต เดเดเตเดเตพ เดธเดเดธเดพเดฐเดฟเดเตเดเต, เดฎเตเดดเตเดตเตป เดตเตเตป เดกเดพเดฑเตเดฑเดพเดธเตเดฑเตเดฑเดฟเดฒเตเด เดตเตเตป เดเตเดฃเดจเดฟเดฒเดตเดพเดฐ เดชเตเดฐเดตเดเดจเดเตเดเตพ เดจเดเดคเตเดคเตเดจเตเดจเต. เดเดจเตเดจเดพเตฝ เดจเดฟเดเตเดเตพเดเตเดเต Scala Spark-เตฝ เดจเดฟเดจเตเดจเต Python MLflow เดฎเตเดกเตเดฏเตเดณเตเดเตพ เดเดชเดฏเตเดเดฟเดเตเดเตเดฃเตเดเดฟ เดตเดจเตเดจเดพเดฒเต?
เดธเตเดเดพเดฒเดฏเตเดเตเดเตเด เดชเตเดคเตเดคเดฃเดฟเดจเตเดฎเดฟเดเดฏเดฟเตฝ เดธเตเดชเดพเตผเดเตเดเต เดธเดจเตเดฆเตผเดญเด เดตเดฟเดญเดเดฟเดเตเดเต เดเดเตเดเตพ เดเดคเตเด เดชเดฐเตเดเตเดทเดฟเดเตเดเต. เด เดคเดพเดฏเดคเต, เดเดเตเดเตพ เดชเตเดคเตเดคเดฃเดฟเตฝ MLflow UDF เดฐเดเดฟเดธเตเดฑเตเดฑเตผ เดเตเดฏเตเดฏเตเดเดฏเตเด เดธเตเดเดพเดฒเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด เดคเต เดเดชเดฏเตเดเดฟเดเตเดเตเดเดฏเตเด เดเตเดฏเตเดคเต (เด เดคเต, เดเดฐเตเดชเดเตเดทเต เดเดฑเตเดฑเดตเตเด เดฎเดฟเดเดเตเด เดชเดฐเดฟเดนเดพเดฐเดฎเดฒเตเดฒ, เดชเดเตเดทเต เดเดเตเดเดณเตเดเต เดชเดเตเดเดฒเตเดณเตเดณเดคเต).
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
```
เด เดฑเตเดฑเดพเดเตเดเต เดเตเดฏเตเดค เดจเตเดเตเดเตเดฌเตเดเตเดเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเดเตเดเตพเดเตเดเต เดเดพเดฃเดพเดจเดพเดเตเดจเตเดจเดคเตเดชเตเดฒเต, เดฏเต.เดกเดฟ.เดเดซเต เดธเตเดชเดพเตผเดเตเดเตเด เดชเตเดธเตเดชเดพเตผเดเตเดเตเด เดคเดฎเตเดฎเดฟเตฝ เดชเดเตเดเดฟเดเตเดจเตเดจเต. เดธเตเดเดพเดฒเดฏเต เดเดทเตเดเดชเตเดชเตเดเตเดจเตเดจเดตเตผเดเตเดเตเด เดจเดฟเตผเดฎเตเดฎเดพเดฃเดคเตเดคเดฟเตฝ เดฎเตเดทเตเตป เดฒเตเดฃเดฟเดเดเต เดฎเตเดกเดฒเตเดเตพ เดตเดฟเดจเตเดฏเดธเดฟเดเตเดเดพเตป เดเดเตเดฐเดนเดฟเดเตเดเตเดจเตเดจเดตเตผเดเตเดเตเด เด เดญเดพเดเด เดเดชเดฏเตเดเดชเตเดฐเดฆเดฎเดพเดเตเดฎเตเดจเตเดจเต เดเดเตเดเตพ เดชเตเดฐเดคเตเดเตเดทเดฟเดเตเดเตเดจเตเดจเต.
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