You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by zi...@apache.org on 2022/06/10 02:20:58 UTC
[dolphinscheduler] branch dev updated: [Feature] [MLOps] support mlflow deploy with docker compose (#10217)
This is an automated email from the ASF dual-hosted git repository.
zihaoxiang pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 3258438f6e [Feature] [MLOps] support mlflow deploy with docker compose (#10217)
3258438f6e is described below
commit 3258438f6eaf59556fb4c495d532864b257b4c33
Author: JieguangZhou <ji...@163.com>
AuthorDate: Fri Jun 10 10:20:50 2022 +0800
[Feature] [MLOps] support mlflow deploy with docker compose (#10217)
* [Feature] [MLOps] support mlflow deploy with docker compose
fix doc
Update docs/docs/en/guide/task/mlflow.md
fix doc
Co-authored-by: Jiajie Zhong <zh...@gmail.com>
revert cancel modification
fix ENV name and docker compose command
* fix doc image link
* fix testModelsDeployDockerCompose
* add docker compose container health check and fix mlflow bug
* update docker compose healthcheck timeout
---
docs/docs/en/guide/task/mlflow.md | 104 ++++++++++-----------
docs/docs/zh/guide/task/mlflow.md | 78 ++++++++--------
docs/img/tasks/demo/mlflow-automl.png | Bin 28971 -> 32372 bytes
docs/img/tasks/demo/mlflow-basic-algorithm.png | Bin 32819 -> 33503 bytes
.../tasks/demo/mlflow-custom-project-template.png | Bin 66296 -> 0 bytes
docs/img/tasks/demo/mlflow-custom-project.png | Bin 84087 -> 35993 bytes
.../tasks/demo/mlflow-models-docker-compose.png | Bin 0 -> 24671 bytes
docs/img/tasks/demo/mlflow-models-docker.png | Bin 20543 -> 17866 bytes
docs/img/tasks/demo/mlflow-models-mlflow.png | Bin 20460 -> 17859 bytes
.../plugin/task/mlflow/MlflowConstants.java | 27 ++++--
.../plugin/task/mlflow/MlflowParameters.java | 44 ++++++---
.../plugin/task/mlflow/MlflowTask.java | 21 ++++-
.../src/main/resources/docker-compose.yml | 39 ++++++++
.../main/resources/run_mlflow_automl_project.sh | 25 -----
.../run_mlflow_basic_algorithm_project.sh | 25 -----
.../plugin/task/mlflow/MlflowTaskTest.java | 37 +++++++-
dolphinscheduler-ui/src/locales/en_US/project.ts | 33 ++++---
dolphinscheduler-ui/src/locales/zh_CN/project.ts | 8 +-
.../components/node/fields/use-mlflow-models.ts | 28 +++++-
.../projects/task/components/node/format-data.ts | 2 +
.../task/components/node/tasks/use-mlflow.ts | 2 +
.../views/projects/task/components/node/types.ts | 2 +
22 files changed, 284 insertions(+), 191 deletions(-)
diff --git a/docs/docs/en/guide/task/mlflow.md b/docs/docs/en/guide/task/mlflow.md
index efcb592534..058eacf4ac 100644
--- a/docs/docs/en/guide/task/mlflow.md
+++ b/docs/docs/en/guide/task/mlflow.md
@@ -5,13 +5,13 @@
[MLflow](https://mlflow.org) is an excellent open source platform to manage the ML lifecycle, including experimentation,
reproducibility, deployment, and a central model registry.
-MLflow task plugin used to execute MLflow tasks,Currently contains Mlflow Projects and MLflow Models.(Model Registry will soon be rewarded for support)
+MLflow task plugin used to execute MLflow tasks,Currently contains MLflow Projects and MLflow Models. (Model Registry will soon be rewarded for support)
-- Mlflow Projects: Package data science code in a format to reproduce runs on any platform.
+- MLflow Projects: Package data science code in a format to reproduce runs on any platform.
- MLflow Models: Deploy machine learning models in diverse serving environments.
- Model Registry: Store, annotate, discover, and manage models in a central repository.
-The Mlflow plugin currently supports and will support the following:
+The MLflow plugin currently supports and will support the following:
- [x] MLflow Projects
- [x] BasicAlgorithm: contains LogisticRegression, svm, lightgbm, xgboost
@@ -20,10 +20,10 @@ The Mlflow plugin currently supports and will support the following:
- [ ] MLflow Models
- [x] MLFLOW: Use `MLflow models serve` to deploy a model service
- [x] Docker: Run the container after packaging the docker image
- - [ ] Docker Compose: Use docker compose to run the container, Will replace the docker run above
+ - [x] Docker Compose: Use docker compose to run the container, it will replace the docker run above
- [ ] Seldon core: Use Selcon core to deploy model to k8s cluster
- - [ ] k8s: Deploy containers directly to K8S
- - [ ] mlflow deployments: Built-in deployment modules, such as built-in deployment to SageMaker, etc
+ - [ ] k8s: Deploy containers directly to K8S
+ - [ ] MLflow deployments: Built-in deployment modules, such as built-in deployment to SageMaker, etc
- [ ] Model Registry
- [ ] Register Model: Allows artifacts (Including model and related parameters, indicators) to be registered directly into the model center
@@ -37,7 +37,7 @@ The Mlflow plugin currently supports and will support the following:
## Task Example
-First, introduce some general parameters of DolphinScheduler
+First, introduce some general parameters of DolphinScheduler:
- **Node name**: The node name in a workflow definition is unique.
- **Run flag**: Identifies whether this node schedules normally, if it does not need to execute, select
@@ -56,6 +56,11 @@ First, introduce some general parameters of DolphinScheduler
- **Predecessor task**: Selecting a predecessor task for the current task, will set the selected predecessor task as
upstream of the current task.
+Here are some specific parameters for the MLFlow component:
+
+- **MLflow Tracking Server URI**: MLflow Tracking Server URI, default http://localhost:5000.
+- **Experiment Name**: Create the experiment where the task is running, if the experiment does not exist. If the name is empty, it is set to ` Default `, the same as MLflow.
+
### MLflow Projects
#### BasicAlgorithm
@@ -64,24 +69,22 @@ First, introduce some general parameters of DolphinScheduler
**Task Parameter**
-- **mlflow server tracking uri** :MLflow server uri, default http://localhost:5000.
-- **experiment name** :Create the experiment where the task is running, if the experiment does not exist. If the name is empty, it is set to ` Default `, the same as MLflow.
-- **register model** :Register the model or not. If register is selected, the following parameters are expanded.
- - **model name** : The registered model name is added to the original model version and registered as
+- **Register Model**: Register the model or not. If register is selected, the following parameters are expanded.
+ - **Model Name**: The registered model name is added to the original model version and registered as
Production.
-- **data path** : The absolute path of the file or folder. Ends with .csv for file or contain train.csv and
- test.csv for folder(In the suggested way, users should build their own test sets for model evaluation)。
-- **parameters** : Parameter when initializing the algorithm/AutoML model, which can be empty. For example
- parameters `"time_budget=30;estimator_list=['lgbm']"` for flaml 。The convention will be passed with '; 'shards
+- **Data Path**: The absolute path of the file or folder. Ends with .csv for file or contain train.csv and
+ test.csv for folder(In the suggested way, users should build their own test sets for model evaluation).
+- **Parameters**: Parameter when initializing the algorithm/AutoML model, which can be empty. For example
+ parameters `"time_budget=30;estimator_list=['lgbm']"` for flaml 。The convention will be passed with '; ' shards
each parameter, using the name before the equal sign as the parameter name, and using the name after the equal
sign to get the corresponding parameter value through `python eval()`.
- [Logistic Regression](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression)
- [SVM](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html?highlight=svc#sklearn.svm.SVC)
- [lightgbm](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html#lightgbm.LGBMClassifier)
- [xgboost](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.XGBClassifier)
-- **algorithm** :The selected algorithm currently supports `LR`, `SVM`, `LightGBM` and `XGboost` based
+- **Algorithm**:The selected algorithm currently supports `LR`, `SVM`, `LightGBM` and `XGboost` based
on [scikit-learn](https://scikit-learn.org/) form.
-- **Parameter search space** : Parameter search space when running the corresponding algorithm, which can be
+- **Parameter Search Space**: Parameter search space when running the corresponding algorithm, which can be
empty. For example, the parameter `max_depth=[5, 10];n_estimators=[100, 200]` for lightgbm 。The convention
will be passed with '; 'shards each parameter, using the name before the equal sign as the parameter name,
and using the name after the equal sign to get the corresponding parameter value through `python eval()`.
@@ -92,63 +95,56 @@ First, introduce some general parameters of DolphinScheduler
**Task Parameter**
-- **mlflow server tracking uri** :MLflow server uri, default http://localhost:5000.
-- **experiment name** :Create the experiment where the task is running, if the experiment does not exist. If the name is empty, it is set to ` Default `, the same as MLflow.
-- **register model** :Register the model or not. If register is selected, the following parameters are expanded.
- - **model name** : The registered model name is added to the original model version and registered as
+- **Register Model**: Register the model or not. If register is selected, the following parameters are expanded.
+ - **model name**: The registered model name is added to the original model version and registered as
Production.
-- **data path** : The absolute path of the file or folder. Ends with .csv for file or contain train.csv and
- test.csv for folder(In the suggested way, users should build their own test sets for model evaluation)。
-- **parameters** : Parameter when initializing the algorithm/AutoML model, which can be empty. For example
- parameters `n_estimators=200;learning_rate=0.2` for flaml 。The convention will be passed with '; 'shards
+- **Data Path**: The absolute path of the file or folder. Ends with .csv for file or contain train.csv and
+ test.csv for folder(In the suggested way, users should build their own test sets for model evaluation).
+- **Parameters**: Parameter when initializing the algorithm/AutoML model, which can be empty. For example
+ parameters `n_estimators=200;learning_rate=0.2` for flaml. The convention will be passed with '; 'shards
each parameter, using the name before the equal sign as the parameter name, and using the name after the equal
sign to get the corresponding parameter value through `python eval()`. The detailed parameter list is as follows:
- [flaml](https://microsoft.github.io/FLAML/docs/reference/automl#automl-objects)
- [autosklearn](https://automl.github.io/auto-sklearn/master/api.html)
-- **AutoML tool** : The AutoML tool used, currently
+- **AutoML tool**: The AutoML tool used, currently
supports [autosklearn](https://github.com/automl/auto-sklearn)
- and [flaml](https://github.com/microsoft/FLAML)
-
+ and [flaml](https://github.com/microsoft/FLAML).
#### Custom projects
-![mlflow-custom-project-template.png](../../../../img/tasks/demo/mlflow-custom-project-template.png)
+![mlflow-custom-project.png](../../../../img/tasks/demo/mlflow-custom-project.png)
**Task Parameter**
-- **mlflow server tracking uri** :MLflow server uri, default http://localhost:5000.
-- **experiment name** :Create the experiment where the task is running, if the experiment does not exist. If the name is empty, it is set to ` Default `, the same as MLflow.
-- **parameters** : `--param-list` in `mlflow run`. For example `-P learning_rate=0.2 -P colsample_bytree=0.8 -P subsample=0.9`
-- **Repository** : Repository url of MLflow Project,Support git address and directory on worker. If it's in a subdirectory,We add `#` to support this (same as `mlflow run`) , for example `https://github.com/mlflow/mlflow#examples/xgboost/xgboost_native`
-- **Project Version** : Version of the project,default master
+- **parameters**: `--param-list` in `mlflow run`. For example `-P learning_rate=0.2 -P colsample_bytree=0.8 -P subsample=0.9`.
+- **Repository**: Repository url of MLflow Project,Support git address and directory on worker. If it's in a subdirectory,We add `#` to support this (same as `mlflow run`) , for example `https://github.com/mlflow/mlflow#examples/xgboost/xgboost_native`.
+- **Project Version**: Version of the project,default master.
-You can now use this feature to run all mlFlow projects on Github (For example [MLflow examples](https://github.com/mlflow/mlflow/tree/master/examples) )了。You can also create your own machine learning library to reuse your work, and then use DolphinScheduler to use your library with one click.
+You can now use this feature to run all MLFlow projects on Github (For example [MLflow examples](https://github.com/mlflow/mlflow/tree/master/examples) ). You can also create your own machine learning library to reuse your work, and then use DolphinScheduler to use your library with one click.
-The actual interface is as follows
-
-![mlflow-custom-project.png](../../../../img/tasks/demo/mlflow-custom-project.png)
### MLflow Models
-#### MLFLOW
+General Parameters:
-![mlflow-models-mlflow](../../../../img/tasks/demo/mlflow-models-mlflow.png)
+- **Model-URI**: Model-URI of MLflow , support `models:/<model_name>/suffix` format and `runs:/` format. See https://mlflow.org/docs/latest/tracking.html#artifact-stores.
+- **Port**: The port to listen on.
-**Task Parameter**
-- **mlflow server tracking uri** :MLflow server uri, default http://localhost:5000.
-- **model-uri** :Model-uri of mlflow , support `models:/<model_name>/suffix` format and `runs:/` format. See https://mlflow.org/docs/latest/tracking.html#artifact-stores
-- **Port** :The port to listen on
+#### MLFLOW
+
+![mlflow-models-mlflow](../../../../img/tasks/demo/mlflow-models-mlflow.png)
#### Docker
![mlflow-models-docker](../../../../img/tasks/demo/mlflow-models-docker.png)
-**Task Parameter**
+#### DOCKER COMPOSE
+
+![mlflow-models-docker-compose](../../../../img/tasks/demo/mlflow-models-docker-compose.png)
-- **mlflow server tracking uri** :MLflow server uri, default http://localhost:5000.
-- **model-uri** :Model-uri of mlflow , support `models:/<model_name>/suffix` format and `runs:/` format. See https://mlflow.org/docs/latest/tracking.html#artifact-stores
-- **Port** :The port to listen on
+- **Max Cpu Limit**: For example `1.0` or `0.5`, the same as docker compose.
+- **Max Memory Limit**: For example `1G` or `500M`, the same as docker compose.
## Environment to prepare
@@ -156,7 +152,7 @@ The actual interface is as follows
You need to enter the admin account to configure a conda environment variable(Please
install [anaconda](https://docs.continuum.io/anaconda/install/)
-or [miniconda](https://docs.conda.io/en/latest/miniconda.html#installing ) in advance )
+or [miniconda](https://docs.conda.io/en/latest/miniconda.html#installing ) in advance).
![mlflow-conda-env](../../../../img/tasks/demo/mlflow-conda-env.png)
@@ -167,9 +163,9 @@ Conda environment.
### Start the mlflow service
-Make sure you have installed MLflow, using 'PIP Install MLFlow'.
+Make sure you have installed MLflow, using 'pip install mlflow'.
-Create a folder where you want to save your experiments and models and start mlFlow service.
+Create a folder where you want to save your experiments and models and start MLflow service.
```sh
mkdir mlflow
@@ -177,8 +173,8 @@ cd mlflow
mlflow server -h 0.0.0.0 -p 5000 --serve-artifacts --backend-store-uri sqlite:///mlflow.db
```
-After running, an MLflow service is started
+After running, an MLflow service is started.
-After this, you can visit the MLFlow service (`http://localhost:5000`) page to view the experiments and models.
+After this, you can visit the MLflow service (`http://localhost:5000`) page to view the experiments and models.
-![mlflow-server](../../../../img/tasks/demo/mlflow-server.png)
+![mlflow-server](../../../../img/tasks/demo/mlflow-server.png)
\ No newline at end of file
diff --git a/docs/docs/zh/guide/task/mlflow.md b/docs/docs/zh/guide/task/mlflow.md
index 7045374b42..2cebb8506e 100644
--- a/docs/docs/zh/guide/task/mlflow.md
+++ b/docs/docs/zh/guide/task/mlflow.md
@@ -4,25 +4,25 @@
[MLflow](https://mlflow.org) 是一个MLops领域一个优秀的开源项目, 用于管理机器学习的生命周期,包括实验、可再现性、部署和中心模型注册。
-MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow Models。(Model Registry将在不就的将来支持)
+MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow Models。(Model Registry将在不就的将来支持)。
-- Mlflow Projects: 将代码打包,并可以运行到任务的平台上。
+- MLflow Projects: 将代码打包,并可以运行到任务的平台上。
- MLflow Models: 在不同的服务环境中部署机器学习模型。
-- Model Registry: 在一个中央存储库中存储、注释、发现和管理模型 (你也可以在你的mlflow project 里面自行注册模型)。
+- Model Registry: 在一个中央存储库中存储、注释、发现和管理模型 (你也可以在你的MLflow project 里面自行注册模型)。
目前 Mlflow 组件支持的和即将支持的内容如下中:
- [x] MLflow Projects
- - [x] BasicAlgorithm: 基础算法,包含LogisticRegression, svm, lightgbm, xgboost。
- - [x] AutoML: AutoML工具,包含autosklean, flaml。
+ - [x] BasicAlgorithm: 基础算法,包含LogisticRegression, svm, lightgbm, xgboost
+ - [x] AutoML: AutoML工具,包含autosklean, flaml
- [x] Custom projects: 支持运行自己的MLflow Projects项目
- [ ] MLflow Models
- - [x] MLFLOW: 直接使用 `MLflow models serve` 部署模型
- - [x] Docker: 打包 DOCKER 镜像后部署模型
- - [ ] Docker Compose: 使用Docker Compose 部署模型,将会取代上面的Docker部署
- - [ ] Seldon core: 构建完镜像后,使用Seldon Core 部署到k8s集群上, 可以使用Seldon Core的生成模型管理能力
- - [ ] k8s: 构建完镜像后, 部署到k8s集群上
- - [ ] mlflow deployments: 内置的允许MLflow 部署模块, 如内置的部署到Sagemaker等
+ - [x] MLFLOW: 直接使用 `mlflow models serve` 部署模型。
+ - [x] Docker: 打包 DOCKER 镜像后部署模型。
+ - [x] Docker Compose: 使用Docker Compose 部署模型,将会取代上面的Docker部署。
+ - [ ] Seldon core: 构建完镜像后,使用Seldon Core 部署到k8s集群上, 可以使用Seldon Core的生成模型管理能力。
+ - [ ] k8s: 构建完镜像后, 部署到k8s集群上。
+ - [ ] MLflow deployments: 内置的允许MLflow 部署模块, 如内置的部署到Sagemaker等。
- [ ] Model Registry
- [ ] Register Model: 注册相关工件(模型以及相关的参数,指标)到模型中心
@@ -48,6 +48,12 @@ MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow
- **超时告警** :勾选超时告警、超时失败,当任务超过"超时时长"后,会发送告警邮件并且任务执行失败。
- **前置任务** :选择当前任务的前置任务,会将被选择的前置任务设置为当前任务的上游。
+
+以下是一些MLflow 组件的常用参数
+
+- **MLflow Tracking Server URI** :MLflow Tracking Server 的连接, 默认 http://localhost:5000。
+- **实验名称** :任务运行时所在的实验,若实验不存在,则创建。若实验名称为空,则设置为`Default`, 与 MLflow 一样。
+
### MLflow Projects
#### BasicAlgorithm
@@ -56,8 +62,6 @@ MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow
**任务参数**
-- **mlflow server tracking uri** :MLflow server 的连接, 默认 http://localhost:5000。
-- **实验名称** :任务运行时所在的实验,若实验不存在,则创建。若实验名称为空,则设置为`Default`, 与 MLflow 一样。
- **注册模型** :是否注册模型,若选择注册,则会展开以下参数。
- **注册的模型名称** : 注册的模型名称,会在原来的基础上加上一个模型版本,并注册为Production。
- **数据路径** : 文件/文件夹的绝对路径, 若文件需以.csv结尾(自动切分训练集与测试集), 文件夹需包含train.csv和test.csv(建议方式,用户应自行构建测试集用于模型评估)。
@@ -66,7 +70,7 @@ MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow
- [SVM](https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html?highlight=svc#sklearn.svm.SVC)
- [lightgbm](https://lightgbm.readthedocs.io/en/latest/pythonapi/lightgbm.LGBMClassifier.html#lightgbm.LGBMClassifier)
- [xgboost](https://xgboost.readthedocs.io/en/stable/python/python_api.html#xgboost.XGBClassifier)
-- **算法** :选择的算法,目前基于 [scikit-learn](https://scikit-learn.org/) 形式支持 `lr`, `svm`, `lightgbm`, `xgboost`.
+- **算法** :选择的算法,目前基于 [scikit-learn](https://scikit-learn.org/) 形式支持 `lr`, `svm`, `lightgbm`, `xgboost`。
- **参数搜索空间** : 运行对应算法的参数搜索空间, 可为空。如针对lightgbm 的 `max_depth=[5, 10];n_estimators=[100, 200]` 则会进行对应搜索。约定传入后会以;切分各个参数,等号前的名字作为参数名,等号后的名字将以python eval执行得到对应的参数值
#### AutoML
@@ -75,8 +79,6 @@ MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow
**任务参数**
-- **mlflow server tracking uri** :MLflow server 的连接, 默认 http://localhost:5000。
-- **实验名称** :任务运行时所在的实验,若实验不存在,则创建。若实验名称为空,则设置为`Default`, 与 MLflow 一样。
- **注册模型** :是否注册模型,若选择注册,则会展开以下参数。
- **注册的模型名称** : 注册的模型名称,会在原来的基础上加上一个模型版本,并注册为Production。
- **数据路径** : 文件/文件夹的绝对路径, 若文件需以.csv结尾(自动切分训练集与测试集), 文件夹需包含train.csv和test.csv(建议方式,用户应自行构建测试集用于模型评估)。
@@ -84,65 +86,61 @@ MLflow 组件用于执行 MLflow 任务,目前包含Mlflow Projects, 和MLflow
- [flaml](https://microsoft.github.io/FLAML/docs/reference/automl#automl-objects)
- [autosklearn](https://automl.github.io/auto-sklearn/master/api.html)
- **AutoML工具** : 使用的AutoML工具,目前支持 [autosklearn](https://github.com/automl/auto-sklearn)
- , [flaml](https://github.com/microsoft/FLAML)
+ , [flaml](https://github.com/microsoft/FLAML)。
#### Custom projects
-![mlflow-custom-project-template.png](../../../../img/tasks/demo/mlflow-custom-project-template.png)
+![mlflow-custom-project.png](../../../../img/tasks/demo/mlflow-custom-project.png)
**任务参数**
-- **mlflow server tracking uri** :MLflow server 的连接, 默认 http://localhost:5000。
-- **实验名称** :任务运行时所在的实验,若实验不存在,则创建。若实验名称为空,则设置为`Default`, 与 MLflow 一样。
- **参数** : `mlflow run`中的 --param-list 如 `-P learning_rate=0.2 -P colsample_bytree=0.8 -P subsample=0.9`
-- **运行仓库** : MLflow Project的仓库地址,可以为github地址,或者worker上的目录, 如Mlflow project位于子目录,可以添加 `#` 隔开, 如 `https://github.com/mlflow/mlflow#examples/xgboost/xgboost_native`
+- **运行仓库** : MLflow Project的仓库地址,可以为github地址,或者worker上的目录, 如MLflow project位于子目录,可以添加 `#` 隔开, 如 `https://github.com/mlflow/mlflow#examples/xgboost/xgboost_native`
- **项目版本** : 对应项目中git版本管理中的版本,默认 master
现在你可以使用这个功能来运行github上所有的MLflow Projects (如 [MLflow examples](https://github.com/mlflow/mlflow/tree/master/examples) )了。你也可以创建自己的机器学习库,用来复用你的研究成果,以后你就可以使用DolphinScheduler来一键操作使用你的算法库。
-实际运行界面如下
-![mlflow-custom-project.png](../../../../img/tasks/demo/mlflow-custom-project.png)
+### MLflow Models
+常用参数:
-### MLflow Models
+- **部署模型的URI** :MLflow 服务里面模型对应的URI, 支持 `models:/<model_name>/suffix` 格式 和 `runs:/` 格式。
+- **监听端口** :部署服务时的端口。
#### MLFLOW
![mlflow-models-mlflow](../../../../img/tasks/demo/mlflow-models-mlflow.png)
-**任务参数**
-
-- **mlflow server tracking uri** :MLflow server 的连接, 默认 http://localhost:5000。
-- **部署模型的uri** :mlflow 服务里面模型对应的uri, 支持 `models:/<model_name>/suffix` 格式 和 `runs:/` 格式。
-- **部署端口** :部署服务时的端口。
-
#### Docker
![mlflow-models-docker](../../../../img/tasks/demo/mlflow-models-docker.png)
-- **mlflow server tracking uri** :MLflow server 的连接, 默认 http://localhost:5000。
-- **部署模型的uri** :mlflow 服务里面模型对应的uri, 支持 `models:/<model_name>/suffix` 格式 和 `runs:/` 格式。
-- **部署端口** :部署服务时的端口。
+#### DOCKER COMPOSE
+
+![mlflow-models-docker-compose](../../../../img/tasks/demo/mlflow-models-docker-compose.png)
+
+- **最大CPU限制** :如 `1.0` 或者 `0.5`, 与 docker compose 一致。
+- **最大内存限制** :如 `1G` 或者 `500M`, 与 docker compose 一致。
## 环境准备
### conda 环境配置
你需要进入admin账户配置一个conda环境变量(请提前[安装anaconda](https://docs.continuum.io/anaconda/install/)
-或者[安装miniconda](https://docs.conda.io/en/latest/miniconda.html#installing) )
+或者[安装miniconda](https://docs.conda.io/en/latest/miniconda.html#installing) )。
![mlflow-conda-env](../../../../img/tasks/demo/mlflow-conda-env.png)
-后续注意配置任务时,环境选择上面创建的conda环境,否则程序会找不到conda环境
+后续注意配置任务时,环境选择上面创建的conda环境,否则程序会找不到conda环境。
![mlflow-set-conda-env](../../../../img/tasks/demo/mlflow-set-conda-env.png)
-### mlflow service 启动
+### MLflow service 启动
-确保你已经安装mlflow,可以使用`pip install mlflow`进行安装
+确保你已经安装MLflow,可以使用`pip install mlflow`进行安装。
-在你想保存实验和模型的地方建立一个文件夹,然后启动 mlflow service
+在你想保存实验和模型的地方建立一个文件夹,然后启动 mlflow service。
```sh
mkdir mlflow
@@ -150,9 +148,9 @@ cd mlflow
mlflow server -h 0.0.0.0 -p 5000 --serve-artifacts --backend-store-uri sqlite:///mlflow.db
```
-运行后会启动一个mlflow服务
+运行后会启动一个MLflow服务。
-可以通过访问 mlflow service (`http://localhost:5000`) 页面查看实验与模型
+可以通过访问 MLflow service (`http://localhost:5000`) 页面查看实验与模型。
![mlflow-server](../../../../img/tasks/demo/mlflow-server.png)
diff --git a/docs/img/tasks/demo/mlflow-automl.png b/docs/img/tasks/demo/mlflow-automl.png
index afdeeb7aa9..66ba5c75cf 100644
Binary files a/docs/img/tasks/demo/mlflow-automl.png and b/docs/img/tasks/demo/mlflow-automl.png differ
diff --git a/docs/img/tasks/demo/mlflow-basic-algorithm.png b/docs/img/tasks/demo/mlflow-basic-algorithm.png
index 3575ce9057..bbcb488ec7 100644
Binary files a/docs/img/tasks/demo/mlflow-basic-algorithm.png and b/docs/img/tasks/demo/mlflow-basic-algorithm.png differ
diff --git a/docs/img/tasks/demo/mlflow-custom-project-template.png b/docs/img/tasks/demo/mlflow-custom-project-template.png
deleted file mode 100644
index cbb2d6f732..0000000000
Binary files a/docs/img/tasks/demo/mlflow-custom-project-template.png and /dev/null differ
diff --git a/docs/img/tasks/demo/mlflow-custom-project.png b/docs/img/tasks/demo/mlflow-custom-project.png
index 54a8cb0ab8..74c00ae1c0 100644
Binary files a/docs/img/tasks/demo/mlflow-custom-project.png and b/docs/img/tasks/demo/mlflow-custom-project.png differ
diff --git a/docs/img/tasks/demo/mlflow-models-docker-compose.png b/docs/img/tasks/demo/mlflow-models-docker-compose.png
new file mode 100644
index 0000000000..7aad9641a2
Binary files /dev/null and b/docs/img/tasks/demo/mlflow-models-docker-compose.png differ
diff --git a/docs/img/tasks/demo/mlflow-models-docker.png b/docs/img/tasks/demo/mlflow-models-docker.png
index c446651022..30587322be 100644
Binary files a/docs/img/tasks/demo/mlflow-models-docker.png and b/docs/img/tasks/demo/mlflow-models-docker.png differ
diff --git a/docs/img/tasks/demo/mlflow-models-mlflow.png b/docs/img/tasks/demo/mlflow-models-mlflow.png
index 677441a16d..7ce41e1785 100644
Binary files a/docs/img/tasks/demo/mlflow-models-mlflow.png and b/docs/img/tasks/demo/mlflow-models-mlflow.png differ
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowConstants.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowConstants.java
index 92d849e433..4b99cfa7cd 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowConstants.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowConstants.java
@@ -36,19 +36,21 @@ public class MlflowConstants {
public static final String PRESET_BASIC_ALGORITHM_PROJECT = PRESET_REPOSITORY + "#Project-BasicAlgorithm";
- public static final String RUN_PROJECT_BASIC_ALGORITHM_SCRIPT = "run_mlflow_basic_algorithm_project.sh";
-
- public static final String RUN_PROJECT_AUTOML_SCRIPT = "run_mlflow_automl_project.sh";
-
public static final String MLFLOW_TASK_TYPE_PROJECTS = "MLflow Projects";
public static final String MLFLOW_TASK_TYPE_MODELS = "MLflow Models";
-
public static final String MLFLOW_MODELS_DEPLOY_TYPE_MLFLOW = "MLFLOW";
public static final String MLFLOW_MODELS_DEPLOY_TYPE_DOCKER = "DOCKER";
+ public static final String MLFLOW_MODELS_DEPLOY_TYPE_DOCKER_COMPOSE = "DOCKER COMPOSE";
+
+ /**
+ * template file
+ */
+ public static final String TEMPLATE_DOCKER_COMPOSE = "docker-compose.yml";
+
/**
* mlflow command
@@ -86,9 +88,22 @@ public class MlflowConstants {
public static final String MLFLOW_BUILD_DOCKER = "mlflow models build-docker -m %s -n %s --enable-mlserver";
-
public static final String DOCKER_RREMOVE_CONTAINER = "docker rm -f %s";
public static final String DOCKER_RUN = "docker run --name=%s -p=%s:8080 %s";
+ public static final String DOCKER_COMPOSE_RUN = "docker-compose up -d";
+
+ public static final String SET_DOCKER_COMPOSE_ENV = "export DS_TASK_MLFLOW_IMAGE_NAME=%s\n" +
+ "export DS_TASK_MLFLOW_CONTAINER_NAME=%s\n" +
+ "export DS_TASK_MLFLOW_DEPLOY_PORT=%s\n" +
+ "export DS_TASK_MLFLOW_CPU_LIMIT=%s\n" +
+ "export DS_TASK_MLFLOW_MEMORY_LIMIT=%s";
+
+ public static final String DOCKER_HEALTH_CHECK_COMMAND = "for i in $(seq 1 300); " +
+ "do " +
+ "[ $(docker inspect --format \"{{json .State.Health.Status }}\" %s) = '\"healthy\"' ] " +
+ "&& exit 0 && break;sleep 1; " +
+ "done; docker-compose down; exit 1";
+
}
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowParameters.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowParameters.java
index 3557a0698a..a49fd051ed 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowParameters.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowParameters.java
@@ -76,6 +76,10 @@ public class MlflowParameters extends AbstractParameters {
private String deployPort;
+ private String cpuLimit;
+
+ private String memoryLimit;
+
public void setAlgorithm(String algorithm) {
this.algorithm = algorithm;
}
@@ -196,6 +200,22 @@ public class MlflowParameters extends AbstractParameters {
return deployPort;
}
+ public void setCpuLimit(String cpuLimit) {
+ this.cpuLimit = cpuLimit;
+ }
+
+ public String getCpuLimit() {
+ return cpuLimit;
+ }
+
+ public void setMemoryLimit(String memoryLimit) {
+ this.memoryLimit = memoryLimit;
+ }
+
+ public String getMemoryLimit() {
+ return memoryLimit;
+ }
+
@Override
public boolean checkParameters() {
Boolean checkResult = true;
@@ -242,19 +262,6 @@ public class MlflowParameters extends AbstractParameters {
paramsMap.put("repo_version", MlflowConstants.PRESET_REPOSITORY_VERSION);
}
- public String getScriptPath() {
- String projectScript;
- if (mlflowJobType.equals(MlflowConstants.JOB_TYPE_BASIC_ALGORITHM)) {
- projectScript = MlflowConstants.RUN_PROJECT_BASIC_ALGORITHM_SCRIPT;
- } else if (mlflowJobType.equals(MlflowConstants.JOB_TYPE_AUTOML)) {
- projectScript = MlflowConstants.RUN_PROJECT_AUTOML_SCRIPT;
- } else {
- throw new IllegalArgumentException();
- }
- String scriptPath = MlflowTask.class.getClassLoader().getResource(projectScript).getPath();
- return scriptPath;
- }
-
public String getModelKeyName(String tag) throws IllegalArgumentException {
String imageName;
if (deployModelKey.startsWith("runs:")) {
@@ -268,4 +275,15 @@ public class MlflowParameters extends AbstractParameters {
return imageName;
}
+ public String getDockerComposeEnvCommand() {
+ String imageName = "mlflow/" + getModelKeyName(":");
+ String env = String.format(MlflowConstants.SET_DOCKER_COMPOSE_ENV, imageName, getContainerName(), deployPort, cpuLimit, memoryLimit);
+ return env;
+ }
+
+ public String getContainerName(){
+ String containerName = "ds-mlflow-" + getModelKeyName("-");
+ return containerName;
+ }
+
};
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowTask.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowTask.java
index 226efb21cf..03fd4dce03 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowTask.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/java/org/apache/dolphinscheduler/plugin/task/mlflow/MlflowTask.java
@@ -101,7 +101,7 @@ public class MlflowTask extends AbstractTaskExecutor {
shellCommandExecutor.cancelApplication();
}
- public String buildCommand(){
+ public String buildCommand() {
String command = "";
if (mlflowParameters.getMlflowTaskType().equals(MlflowConstants.MLFLOW_TASK_TYPE_PROJECTS)) {
command = buildCommandForMlflowProjects();
@@ -146,8 +146,7 @@ public class MlflowTask extends AbstractTaskExecutor {
runCommand = MlflowConstants.MLFLOW_RUN_CUSTOM_PROJECT;
runCommand = String.format(runCommand, mlflowParameters.getParams(), mlflowParameters.getExperimentName(), mlflowParameters.getMlflowProjectVersion());
- }
- else {
+ } else {
runCommand = String.format("Cant not Support %s", mlflowParameters.getMlflowJobType());
}
@@ -173,11 +172,19 @@ public class MlflowTask extends AbstractTaskExecutor {
} else if (mlflowParameters.getDeployType().equals(MlflowConstants.MLFLOW_MODELS_DEPLOY_TYPE_DOCKER)) {
String imageName = "mlflow/" + mlflowParameters.getModelKeyName(":");
- String containerName = "mlflow-" + mlflowParameters.getModelKeyName("-");
+ String containerName = mlflowParameters.getContainerName();
args.add(String.format(MlflowConstants.MLFLOW_BUILD_DOCKER, deployModelKey, imageName));
args.add(String.format(MlflowConstants.DOCKER_RREMOVE_CONTAINER, containerName));
args.add(String.format(MlflowConstants.DOCKER_RUN, containerName, mlflowParameters.getDeployPort(), imageName));
+ } else if (mlflowParameters.getDeployType().equals(MlflowConstants.MLFLOW_MODELS_DEPLOY_TYPE_DOCKER_COMPOSE)) {
+ String templatePath = getTemplatePath(MlflowConstants.TEMPLATE_DOCKER_COMPOSE);
+ args.add(String.format("cp %s %s", templatePath, taskExecutionContext.getExecutePath()));
+ String imageName = "mlflow/" + mlflowParameters.getModelKeyName(":");
+ args.add(String.format(MlflowConstants.MLFLOW_BUILD_DOCKER, deployModelKey, imageName));
+ args.add(mlflowParameters.getDockerComposeEnvCommand());
+ args.add(MlflowConstants.DOCKER_COMPOSE_RUN);
+ args.add(String.format(MlflowConstants.DOCKER_HEALTH_CHECK_COMMAND, mlflowParameters.getContainerName()));
}
String command = ParameterUtils.convertParameterPlaceholders(String.join("\n", args), ParamUtils.convert(paramsMap));
@@ -197,9 +204,15 @@ public class MlflowTask extends AbstractTaskExecutor {
}
+
@Override
public AbstractParameters getParameters() {
return mlflowParameters;
}
+ public String getTemplatePath(String template) {
+ String templatePath = MlflowTask.class.getClassLoader().getResource(template).getPath();
+ return templatePath;
+ }
+
}
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/docker-compose.yml b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/docker-compose.yml
new file mode 100644
index 0000000000..f9211b9bae
--- /dev/null
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/docker-compose.yml
@@ -0,0 +1,39 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+version: "3"
+
+services:
+ mlflow-model:
+ image: "${DS_TASK_MLFLOW_IMAGE_NAME}"
+ container_name: "${DS_TASK_MLFLOW_CONTAINER_NAME}"
+ ports:
+ - "${DS_TASK_MLFLOW_DEPLOY_PORT}:8080"
+ deploy:
+ resources:
+ limits:
+ cpus: "${DS_TASK_MLFLOW_CPU_LIMIT}"
+ memory: "${DS_TASK_MLFLOW_MEMORY_LIMIT}"
+
+ environment:
+ PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION: python
+
+
+ healthcheck:
+ test: ["CMD", "curl", "http://127.0.0.1:8080/ping"]
+ interval: 5s
+ timeout: 5s
+ retries: 5
\ No newline at end of file
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/run_mlflow_automl_project.sh b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/run_mlflow_automl_project.sh
deleted file mode 100644
index fbc5615af9..0000000000
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/run_mlflow_automl_project.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-data_path=${data_path}
-export MLFLOW_TRACKING_URI=${MLFLOW_TRACKING_URI}
-echo $data_path
-repo=${repo}
-mlflow run $repo -P tool=${automl_tool} -P data_path=$data_path -P params="${params}" -P model_name="${model_name}" --experiment-name="${experiment_name}" --version="${repo_version}"
-
-echo "training finish"
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/run_mlflow_basic_algorithm_project.sh b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/run_mlflow_basic_algorithm_project.sh
deleted file mode 100644
index 10a35df390..0000000000
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/main/resources/run_mlflow_basic_algorithm_project.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-data_path=${data_path}
-export MLFLOW_TRACKING_URI=${MLFLOW_TRACKING_URI}
-echo $data_path
-repo=${repo}
-mlflow run $repo -P algorithm=${algorithm} -P data_path=$data_path -P params="${params}" -P search_params="${search_params}" -P model_name="${model_name}" --experiment-name="${experiment_name}" --version="${repo_version}"
-
-echo "training finish"
diff --git a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/test/java/org/apache/dolphinler/plugin/task/mlflow/MlflowTaskTest.java b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/test/java/org/apache/dolphinler/plugin/task/mlflow/MlflowTaskTest.java
index 24a8dfc601..5a85abf3c0 100644
--- a/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/test/java/org/apache/dolphinler/plugin/task/mlflow/MlflowTaskTest.java
+++ b/dolphinscheduler-task-plugin/dolphinscheduler-task-mlflow/src/test/java/org/apache/dolphinler/plugin/task/mlflow/MlflowTaskTest.java
@@ -135,18 +135,37 @@ public class MlflowTaskTest {
}
@Test
- public void testModelsDeployDocker() throws Exception {
+ public void testModelsDeployDocker() {
MlflowTask mlflowTask = initTask(createModelDeplyDockerParameters());
Assert.assertEquals(mlflowTask.buildCommand(),
"export MLFLOW_TRACKING_URI=http://127.0.0.1:5000\n" +
"mlflow models build-docker -m runs:/a272ec279fc34a8995121ae04281585f/model " +
"-n mlflow/a272ec279fc34a8995121ae04281585f:model " +
"--enable-mlserver\n" +
- "docker rm -f mlflow-a272ec279fc34a8995121ae04281585f-model\n" +
- "docker run --name=mlflow-a272ec279fc34a8995121ae04281585f-model " +
+ "docker rm -f ds-mlflow-a272ec279fc34a8995121ae04281585f-model\n" +
+ "docker run --name=ds-mlflow-a272ec279fc34a8995121ae04281585f-model " +
"-p=7000:8080 mlflow/a272ec279fc34a8995121ae04281585f:model");
}
+ @Test
+ public void testModelsDeployDockerCompose() throws Exception{
+ MlflowTask mlflowTask = initTask(createModelDeplyDockerComposeParameters());
+ Assert.assertEquals(mlflowTask.buildCommand(),
+ "export MLFLOW_TRACKING_URI=http://127.0.0.1:5000\n" +
+ "cp " + mlflowTask.getTemplatePath(MlflowConstants.TEMPLATE_DOCKER_COMPOSE) +
+ " /tmp/dolphinscheduler_test\n" +
+ "mlflow models build-docker -m models:/22222/1 -n mlflow/22222:1 --enable-mlserver\n" +
+ "export DS_TASK_MLFLOW_IMAGE_NAME=mlflow/22222:1\n" +
+ "export DS_TASK_MLFLOW_CONTAINER_NAME=ds-mlflow-22222-1\n" +
+ "export DS_TASK_MLFLOW_DEPLOY_PORT=7000\n" +
+ "export DS_TASK_MLFLOW_CPU_LIMIT=0.5\n" +
+ "export DS_TASK_MLFLOW_MEMORY_LIMIT=200m\n" +
+ "docker-compose up -d\n" +
+ "for i in $(seq 1 300); do " +
+ "[ $(docker inspect --format \"{{json .State.Health.Status }}\" ds-mlflow-22222-1) = '\"healthy\"' ] && exit 0 && break;sleep 1; " +
+ "done; docker-compose down; exit 1");
+ }
+
private MlflowTask initTask(MlflowParameters mlflowParameters) {
TaskExecutionContext taskExecutionContext = createContext(mlflowParameters);
MlflowTask mlflowTask = new MlflowTask(taskExecutionContext);
@@ -213,4 +232,16 @@ public class MlflowTaskTest {
mlflowParameters.setDeployPort("7000");
return mlflowParameters;
}
+
+ private MlflowParameters createModelDeplyDockerComposeParameters() {
+ MlflowParameters mlflowParameters = new MlflowParameters();
+ mlflowParameters.setMlflowTaskType(MlflowConstants.MLFLOW_TASK_TYPE_MODELS);
+ mlflowParameters.setDeployType(MlflowConstants.MLFLOW_MODELS_DEPLOY_TYPE_DOCKER_COMPOSE);
+ mlflowParameters.setMlflowTrackingUris("http://127.0.0.1:5000");
+ mlflowParameters.setDeployModelKey("models:/22222/1");
+ mlflowParameters.setDeployPort("7000");
+ mlflowParameters.setCpuLimit("0.5");
+ mlflowParameters.setMemoryLimit("200m");
+ return mlflowParameters;
+ }
}
diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts b/dolphinscheduler-ui/src/locales/en_US/project.ts
index 9c3fe14d54..8c239ede89 100644
--- a/dolphinscheduler-ui/src/locales/en_US/project.ts
+++ b/dolphinscheduler-ui/src/locales/en_US/project.ts
@@ -608,9 +608,6 @@ export default {
zeppelin_paragraph_id: 'zeppelinParagraphId',
zeppelin_paragraph_id_tips:
'Please enter the paragraph id of your zeppelin paragraph',
- zeppelin_parameters: 'parameters',
- zeppelin_parameters_tips:
- 'Please enter the parameters for zeppelin dynamic form',
jupyter_conda_env_name: 'condaEnvName',
jupyter_conda_env_name_tips:
'Please enter the conda environment name of papermill',
@@ -634,36 +631,38 @@ export default {
jupyter_others: 'others',
jupyter_others_tips:
'Please enter the other options you need for papermill',
- mlflow_algorithm: 'algorithm',
+ mlflow_algorithm: 'Algorithm',
mlflow_algorithm_tips: 'svm',
- mlflow_params: 'parameters',
+ mlflow_params: 'Parameters',
mlflow_params_tips: ' ',
- mlflow_searchParams: 'Parameter search space',
+ mlflow_searchParams: 'Parameter Search Space',
mlflow_searchParams_tips: ' ',
- mlflow_isSearchParams: 'Search parameters',
- mlflow_dataPath: 'data path',
+ mlflow_isSearchParams: 'Search Parameters',
+ mlflow_dataPath: 'Data Path',
mlflow_dataPath_tips:
' The absolute path of the file or folder. Ends with .csv for file or contain train.csv and test.csv for folder',
mlflow_dataPath_error_tips: ' data data can not be empty ',
- mlflow_experimentName: 'experiment name',
+ mlflow_experimentName: 'Experiment Name',
mlflow_experimentName_tips: 'experiment_001',
- mlflow_registerModel: 'register model',
- mlflow_modelName: 'model name',
+ mlflow_registerModel: 'Register Model',
+ mlflow_modelName: 'Model Name',
mlflow_modelName_tips: 'model_001',
- mlflow_mlflowTrackingUri: 'mlflow server tracking uri',
+ mlflow_mlflowTrackingUri: 'MLflow Tracking Server URI',
mlflow_mlflowTrackingUri_tips: 'http://127.0.0.1:5000',
mlflow_mlflowTrackingUri_error_tips:
- ' mlflow server tracking uri cant not be empty',
- mlflow_jobType: 'job type',
- mlflow_automlTool: 'AutoML tool',
+ 'MLflow Tracking Server URI can not be empty',
+ mlflow_jobType: 'Job Type',
+ mlflow_automlTool: 'AutoML Tool',
mlflow_taskType: 'MLflow Task Type',
mlflow_deployType: 'Deploy Mode',
- mlflow_deployModelKey: 'model-uri',
+ mlflow_deployModelKey: 'Model-URI',
mlflow_deployPort: 'Port',
mlflowProjectRepository: 'Repository',
mlflowProjectRepository_tips: 'github respository or path on worker',
mlflowProjectVersion: 'Project Version',
mlflowProjectVersion_tips: 'git version',
+ mlflow_cpuLimit: 'Max Cpu Limit',
+ mlflow_memoryLimit: 'Max Memory Limit',
openmldb_zk_address: 'zookeeper address',
openmldb_zk_address_tips: 'Please enter the zookeeper address',
openmldb_zk_path: 'zookeeper path',
@@ -694,4 +693,4 @@ export default {
'Please enter threshold number is needed',
please_enter_comparison_title: 'please select comparison title'
}
-}
+}
\ No newline at end of file
diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
index 6b12c99927..3e5fde23ab 100644
--- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts
+++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
@@ -637,19 +637,21 @@ export default {
mlflow_registerModel: '注册模型',
mlflow_modelName: '注册的模型名称',
mlflow_modelName_tips: 'model_001',
- mlflow_mlflowTrackingUri: 'mlflow server tracking uri',
+ mlflow_mlflowTrackingUri: 'MLflow Tracking Server URI',
mlflow_mlflowTrackingUri_tips: 'http://127.0.0.1:5000',
- mlflow_mlflowTrackingUri_error_tips: ' mlflow server tracking uri 不能为空',
+ mlflow_mlflowTrackingUri_error_tips: ' MLflow Tracking Server URI 不能为空',
mlflow_jobType: '任务类型',
mlflow_automlTool: 'AutoML工具',
mlflow_taskType: 'MLflow 任务类型',
mlflow_deployType: '部署类型',
- mlflow_deployModelKey: '部署的模型uri',
+ mlflow_deployModelKey: '部署的模型URI',
mlflow_deployPort: '监听端口',
mlflowProjectRepository: '运行仓库',
mlflowProjectRepository_tips: '可以为github仓库或worker上的路径',
mlflowProjectVersion: '项目版本',
mlflowProjectVersion_tips: '项目git版本',
+ mlflow_cpuLimit: '最大cpu限制',
+ mlflow_memoryLimit: '最大内存限制',
openmldb_zk_address: 'zookeeper地址',
openmldb_zk_address_tips: '请输入zookeeper地址',
openmldb_zk_path: 'zookeeper路径',
diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-mlflow-models.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-mlflow-models.ts
index 15c9e40e38..622d49f291 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-mlflow-models.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-mlflow-models.ts
@@ -23,6 +23,8 @@ export function useMlflowModels(model: { [field: string]: any }): IJsonItem[] {
const deployTypeSpan = ref(0)
const deployModelKeySpan = ref(0)
const deployPortSpan = ref(0)
+ const cpuLimitSpan = ref(0)
+ const memoryLimitSpan = ref(0)
const setFlag = () => {
model.isModels = model.mlflowTaskType === 'MLflow Models' ? true : false
@@ -35,13 +37,21 @@ export function useMlflowModels(model: { [field: string]: any }): IJsonItem[] {
}
watch(
- () => [model.mlflowTaskType, model.registerModel],
+ () => [model.mlflowTaskType],
() => {
setFlag()
resetSpan()
}
)
+ watch(
+ () => [model.deployType],
+ () => {
+ cpuLimitSpan.value = model.deployType === "DOCKER COMPOSE" ? 12 : 0
+ memoryLimitSpan.value = model.deployType === "DOCKER COMPOSE" ? 12 : 0
+ }
+ )
+
setFlag()
resetSpan()
@@ -64,6 +74,18 @@ export function useMlflowModels(model: { [field: string]: any }): IJsonItem[] {
field: 'deployPort',
name: t('project.node.mlflow_deployPort'),
span: deployPortSpan
+ },
+ {
+ type: 'input',
+ field: 'cpuLimit',
+ name: t('project.node.mlflow_cpuLimit'),
+ span: cpuLimitSpan
+ },
+ {
+ type: 'input',
+ field: 'memoryLimit',
+ name: t('project.node.mlflow_memoryLimit'),
+ span: memoryLimitSpan
}
]
}
@@ -76,5 +98,9 @@ const DEPLOY_TYPE = [
{
label: 'DOCKER',
value: 'DOCKER'
+ },
+ {
+ label: 'DOCKER COMPOSE',
+ value: 'DOCKER COMPOSE'
}
]
diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
index 70bd156cf2..5cf480532a 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
@@ -355,6 +355,8 @@ export function formatParams(data: INodeData): {
taskParams.deployModelKey = data.deployModelKey
taskParams.mlflowProjectRepository = data.mlflowProjectRepository
taskParams.mlflowProjectVersion = data.mlflowProjectVersion
+ taskParams.cpuLimit = data.cpuLimit
+ taskParams.memoryLimit = data.memoryLimit
}
if (data.taskType === 'OPENMLDB') {
diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
index 9a748d7095..8a78f84312 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-mlflow.ts
@@ -49,6 +49,8 @@ export function useMlflow({
mlflowJobType: 'CustomProject',
mlflowProjectVersion: 'master',
automlTool: 'flaml',
+ cpuLimit: '0.5',
+ memoryLimit: '500M',
mlflowCustomProjectParameters: [],
delayTime: 0,
timeout: 30,
diff --git a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
index f400238b6d..9535c76d37 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
@@ -336,6 +336,8 @@ interface ITaskParams {
deployType?: string
deployPort?: string
deployModelKey?: string
+ cpuLimit?: string
+ memoryLimit?: string
zk?: string
zkPath?: string
executeMode?: string