JieguangZhou
2 years ago
committed by
GitHub
8 changed files with 380 additions and 0 deletions
@ -0,0 +1,42 @@
|
||||
.. 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. |
||||
|
||||
Pytorch |
||||
======= |
||||
|
||||
|
||||
A Pytorch task type's example and dive into information of **PyDolphinScheduler**. |
||||
|
||||
Example |
||||
------- |
||||
|
||||
.. literalinclude:: ../../../src/pydolphinscheduler/examples/task_pytorch_example.py |
||||
:start-after: [start workflow_declare] |
||||
:end-before: [end workflow_declare] |
||||
|
||||
Dive Into |
||||
--------- |
||||
|
||||
.. automodule:: pydolphinscheduler.tasks.pytorch |
||||
|
||||
|
||||
YAML file example |
||||
----------------- |
||||
|
||||
.. literalinclude:: ../../../examples/yaml_define/Pytorch.yaml |
||||
:start-after: # under the License. |
||||
:language: yaml |
@ -0,0 +1,53 @@
|
||||
# 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. |
||||
|
||||
# Define the workflow |
||||
workflow: |
||||
name: "Pytorch" |
||||
|
||||
# Define the tasks under the workflow |
||||
tasks: |
||||
|
||||
# run project with existing environment |
||||
- name: task_existing_env |
||||
task_type: pytorch |
||||
script: main.py |
||||
script_params: --dry-run --no-cuda |
||||
project_path: https://github.com/pytorch/examples#mnist |
||||
python_command: /home/anaconda3/envs/pytorch/bin/python3 |
||||
|
||||
|
||||
# run project with creating conda environment |
||||
- name: task_conda_env |
||||
task_type: pytorch |
||||
script: main.py |
||||
script_params: --dry-run --no-cuda |
||||
project_path: https://github.com/pytorch/examples#mnist |
||||
is_create_environment: True |
||||
python_env_tool: conda |
||||
requirements: requirements.txt |
||||
conda_python_version: 3.7 |
||||
|
||||
# run project with creating virtualenv environment |
||||
- name: task_virtualenv_env |
||||
task_type: pytorch |
||||
script: main.py |
||||
script_params: --dry-run --no-cuda |
||||
project_path: https://github.com/pytorch/examples#mnist |
||||
is_create_environment: True |
||||
python_env_tool: virtualenv |
||||
requirements: requirements.txt |
@ -0,0 +1,62 @@
|
||||
# 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. |
||||
|
||||
# [start workflow_declare] |
||||
"""A example workflow for task pytorch.""" |
||||
|
||||
from pydolphinscheduler.core.process_definition import ProcessDefinition |
||||
from pydolphinscheduler.tasks.pytorch import Pytorch |
||||
|
||||
with ProcessDefinition( |
||||
name="task_pytorch_example", |
||||
tenant="tenant_exists", |
||||
) as pd: |
||||
|
||||
# run project with existing environment |
||||
task_existing_env = Pytorch( |
||||
name="task_existing_env", |
||||
script="main.py", |
||||
script_params="--dry-run --no-cuda", |
||||
project_path="https://github.com/pytorch/examples#mnist", |
||||
python_command="/home/anaconda3/envs/pytorch/bin/python3", |
||||
) |
||||
|
||||
# run project with creating conda environment |
||||
task_conda_env = Pytorch( |
||||
name="task_conda_env", |
||||
script="main.py", |
||||
script_params="--dry-run --no-cuda", |
||||
project_path="https://github.com/pytorch/examples#mnist", |
||||
is_create_environment=True, |
||||
python_env_tool="conda", |
||||
requirements="requirements.txt", |
||||
conda_python_version="3.7", |
||||
) |
||||
|
||||
# run project with creating virtualenv environment |
||||
task_virtualenv_env = Pytorch( |
||||
name="task_virtualenv_env", |
||||
script="main.py", |
||||
script_params="--dry-run --no-cuda", |
||||
project_path="https://github.com/pytorch/examples#mnist", |
||||
is_create_environment=True, |
||||
python_env_tool="virtualenv", |
||||
requirements="requirements.txt", |
||||
) |
||||
|
||||
pd.submit() |
||||
# [end workflow_declare] |
@ -0,0 +1,95 @@
|
||||
# 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. |
||||
|
||||
"""Task Pytorch.""" |
||||
from typing import Optional |
||||
|
||||
from pydolphinscheduler.constants import TaskType |
||||
from pydolphinscheduler.core.task import Task |
||||
|
||||
|
||||
class DEFAULT: |
||||
"""Default values for Pytorch.""" |
||||
|
||||
is_create_environment = False |
||||
project_path = "." |
||||
python_command = "${PYTHON_HOME}" |
||||
|
||||
|
||||
class Pytorch(Task): |
||||
"""Task Pytorch object, declare behavior for Pytorch task to dolphinscheduler. |
||||
|
||||
See also: `DolphinScheduler Pytorch Task Plugin |
||||
<https://dolphinscheduler.apache.org/en-us/docs/dev/user_doc/guide/task/pytorch.html>`_ |
||||
|
||||
:param name: task name |
||||
:param script: Entry to the Python script file that you want to run. |
||||
:param script_params: Input parameters at run time. |
||||
:param project_path: The path to the project. Default "." . |
||||
:param is_create_environment: is create environment. Default False. |
||||
:param python_command: The path to the python command. Default "${PYTHON_HOME}". |
||||
:param python_env_tool: The python environment tool. Default "conda". |
||||
:param requirements: The path to the requirements.txt file. Default "requirements.txt". |
||||
:param conda_python_version: The python version of conda environment. Default "3.7". |
||||
""" |
||||
|
||||
_task_custom_attr = { |
||||
"script", |
||||
"script_params", |
||||
"other_params", |
||||
"python_path", |
||||
"is_create_environment", |
||||
"python_command", |
||||
"python_env_tool", |
||||
"requirements", |
||||
"conda_python_version", |
||||
} |
||||
|
||||
def __init__( |
||||
self, |
||||
name: str, |
||||
script: str, |
||||
script_params: str = "", |
||||
project_path: Optional[str] = DEFAULT.project_path, |
||||
is_create_environment: Optional[bool] = DEFAULT.is_create_environment, |
||||
python_command: Optional[str] = DEFAULT.python_command, |
||||
python_env_tool: Optional[str] = "conda", |
||||
requirements: Optional[str] = "requirements.txt", |
||||
conda_python_version: Optional[str] = "3.7", |
||||
*args, |
||||
**kwargs, |
||||
): |
||||
"""Init Pytorch task.""" |
||||
super().__init__(name, TaskType.PYTORCH, *args, **kwargs) |
||||
self.script = script |
||||
self.script_params = script_params |
||||
self.is_create_environment = is_create_environment |
||||
self.python_path = project_path |
||||
self.python_command = python_command |
||||
self.python_env_tool = python_env_tool |
||||
self.requirements = requirements |
||||
self.conda_python_version = conda_python_version |
||||
|
||||
@property |
||||
def other_params(self): |
||||
"""Return other params.""" |
||||
conds = [ |
||||
self.is_create_environment != DEFAULT.is_create_environment, |
||||
self.python_path != DEFAULT.project_path, |
||||
self.python_command != DEFAULT.python_command, |
||||
] |
||||
return any(conds) |
@ -0,0 +1,124 @@
|
||||
# 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. |
||||
|
||||
"""Test Task Pytorch.""" |
||||
from copy import deepcopy |
||||
from unittest.mock import patch |
||||
|
||||
import pytest |
||||
|
||||
from pydolphinscheduler.tasks.pytorch import DEFAULT, Pytorch |
||||
from tests.testing.task import Task |
||||
|
||||
CODE = 123 |
||||
VERSION = 1 |
||||
|
||||
EXPECT = { |
||||
"code": CODE, |
||||
"version": VERSION, |
||||
"description": None, |
||||
"delayTime": 0, |
||||
"taskType": "PYTORCH", |
||||
"taskParams": { |
||||
"resourceList": [], |
||||
"localParams": [], |
||||
"dependence": {}, |
||||
"conditionResult": {"successNode": [""], "failedNode": [""]}, |
||||
"waitStartTimeout": {}, |
||||
}, |
||||
"flag": "YES", |
||||
"taskPriority": "MEDIUM", |
||||
"workerGroup": "default", |
||||
"environmentCode": None, |
||||
"failRetryTimes": 0, |
||||
"failRetryInterval": 1, |
||||
"timeoutFlag": "CLOSE", |
||||
"timeoutNotifyStrategy": None, |
||||
"timeout": 0, |
||||
} |
||||
|
||||
|
||||
def test_pytorch_get_define(): |
||||
"""Test task pytorch function get_define.""" |
||||
name = "task_conda_env" |
||||
script = "main.py" |
||||
script_params = "--dry-run --no-cuda" |
||||
project_path = "https://github.com/pytorch/examples#mnist" |
||||
is_create_environment = True |
||||
python_env_tool = "conda" |
||||
requirements = "requirements.txt" |
||||
conda_python_version = "3.7" |
||||
|
||||
expect = deepcopy(EXPECT) |
||||
expect["name"] = name |
||||
task_params = expect["taskParams"] |
||||
|
||||
task_params["script"] = script |
||||
task_params["scriptParams"] = script_params |
||||
task_params["pythonPath"] = project_path |
||||
task_params["otherParams"] = True |
||||
task_params["isCreateEnvironment"] = is_create_environment |
||||
task_params["pythonCommand"] = "${PYTHON_HOME}" |
||||
task_params["pythonEnvTool"] = python_env_tool |
||||
task_params["requirements"] = requirements |
||||
task_params["condaPythonVersion"] = conda_python_version |
||||
|
||||
with patch( |
||||
"pydolphinscheduler.core.task.Task.gen_code_and_version", |
||||
return_value=(CODE, VERSION), |
||||
): |
||||
task = Pytorch( |
||||
name=name, |
||||
script=script, |
||||
script_params=script_params, |
||||
project_path=project_path, |
||||
is_create_environment=is_create_environment, |
||||
python_env_tool=python_env_tool, |
||||
requirements=requirements, |
||||
) |
||||
assert task.get_define() == expect |
||||
|
||||
|
||||
@pytest.mark.parametrize( |
||||
"is_create_environment, project_path, python_command, expect", |
||||
[ |
||||
( |
||||
DEFAULT.is_create_environment, |
||||
DEFAULT.project_path, |
||||
DEFAULT.python_command, |
||||
False, |
||||
), |
||||
(True, DEFAULT.project_path, DEFAULT.python_command, True), |
||||
(DEFAULT.is_create_environment, "/home", DEFAULT.python_command, True), |
||||
(DEFAULT.is_create_environment, DEFAULT.project_path, "/usr/bin/python", True), |
||||
], |
||||
) |
||||
def test_other_params(is_create_environment, project_path, python_command, expect): |
||||
"""Test task pytorch function other_params.""" |
||||
with patch( |
||||
"pydolphinscheduler.core.task.Task.gen_code_and_version", |
||||
side_effect=Task("test_func_wrap", "func_wrap").gen_code_and_version, |
||||
): |
||||
task = Pytorch( |
||||
name="test", |
||||
script="", |
||||
script_params="", |
||||
project_path=project_path, |
||||
is_create_environment=is_create_environment, |
||||
python_command=python_command, |
||||
) |
||||
assert task.other_params == expect |
Loading…
Reference in new issue