From 730e24a6a1a9def0f4ae3e79c674b6a5e2643482 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Wed, 4 Oct 2023 16:07:46 +0800 Subject: [PATCH 01/11] kf-tensorflow-operator-evaluator Signed-off-by: Future Outlier --- .../flytekitplugins/kftensorflow/__init__.py | 2 +- .../flytekitplugins/kftensorflow/task.py | 31 +++++++++++--- .../tests/test_tensorflow_task.py | 41 ++++++++++++++++++- 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/__init__.py b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/__init__.py index 81a4cbc248..fd12b7192f 100644 --- a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/__init__.py +++ b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/__init__.py @@ -10,4 +10,4 @@ TfJob """ -from .task import PS, Chief, CleanPodPolicy, RestartPolicy, RunPolicy, TfJob, Worker +from .task import PS, Chief, CleanPodPolicy, Evaluator, RestartPolicy, RunPolicy, TfJob, Worker diff --git a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py index 43a6ad55c3..acabf1eb71 100644 --- a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py +++ b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py @@ -85,6 +85,15 @@ class Worker: restart_policy: Optional[RestartPolicy] = None +@dataclass +class Evaluator: + image: Optional[str] = None + requests: Optional[Resources] = None + limits: Optional[Resources] = None + replicas: Optional[int] = None + restart_policy: Optional[RestartPolicy] = None + + @dataclass class TfJob: """ @@ -95,6 +104,7 @@ class TfJob: chief: Configuration for the chief replica group. ps: Configuration for the parameter server (PS) replica group. worker: Configuration for the worker replica group. + evaluator: Configuration for the evaluator replica group. run_policy: Configuration for the run policy. num_workers: [DEPRECATED] This argument is deprecated. Use `worker.replicas` instead. num_ps_replicas: [DEPRECATED] This argument is deprecated. Use `ps.replicas` instead. @@ -104,11 +114,13 @@ class TfJob: chief: Chief = field(default_factory=lambda: Chief()) ps: PS = field(default_factory=lambda: PS()) worker: Worker = field(default_factory=lambda: Worker()) + evaluator: Optional[Evaluator] = field(default_factory=lambda: Evaluator()) run_policy: Optional[RunPolicy] = field(default_factory=lambda: None) # Support v0 config for backwards compatibility num_workers: Optional[int] = None num_ps_replicas: Optional[int] = None num_chief_replicas: Optional[int] = None + num_evaluator_replicas: Optional[int] = None class TensorflowFunctionTask(PythonFunctionTask[TfJob]): @@ -130,19 +142,23 @@ def __init__(self, task_config: TfJob, task_function: Callable, **kwargs): ) if task_config.num_chief_replicas and task_config.chief.replicas: raise ValueError( - "Cannot specify both `num_workers` and `chief.replicas`. Please use `chief.replicas` as `num_chief_replicas` is depreacated." + "Cannot specify both `num_chief_replicas` and `chief.replicas`. Please use `chief.replicas` as `num_chief_replicas` is depreacated." ) if task_config.num_chief_replicas is None and task_config.chief.replicas is None: raise ValueError( - "Must specify either `num_workers` or `chief.replicas`. Please use `chief.replicas` as `num_chief_replicas` is depreacated." + "Must specify either `num_chief_replicas` or `chief.replicas`. Please use `chief.replicas` as `num_chief_replicas` is depreacated." ) if task_config.num_ps_replicas and task_config.ps.replicas: raise ValueError( - "Cannot specify both `num_workers` and `ps.replicas`. Please use `ps.replicas` as `num_ps_replicas` is depreacated." + "Cannot specify both `num_ps_replicas` and `ps.replicas`. Please use `ps.replicas` as `num_ps_replicas` is depreacated." ) if task_config.num_ps_replicas is None and task_config.ps.replicas is None: raise ValueError( - "Must specify either `num_workers` or `ps.replicas`. Please use `ps.replicas` as `num_ps_replicas` is depreacated." + "Must specify either `num_ps_replicas` or `ps.replicas`. Please use `ps.replicas` as `num_ps_replicas` is depreacated." + ) + if task_config.num_evaluator_replicas and task_config.evaluator and task_config.evaluator.replicas: + raise ValueError( + "Cannot specify both `num_evaluator_replicas` and `evaluator.replicas`. Please use `evaluator.replicas` as `num_evaluator_replicas` is depreacated." ) super().__init__( task_type=self._TF_JOB_TASK_TYPE, @@ -153,7 +169,7 @@ def __init__(self, task_config: TfJob, task_function: Callable, **kwargs): ) def _convert_replica_spec( - self, replica_config: Union[Chief, PS, Worker] + self, replica_config: Union[Chief, PS, Worker, Evaluator] ) -> tensorflow_task.DistributedTensorflowTrainingReplicaSpec: resources = convert_resources_to_resource_model(requests=replica_config.requests, limits=replica_config.limits) return tensorflow_task.DistributedTensorflowTrainingReplicaSpec( @@ -184,11 +200,16 @@ def get_custom(self, settings: SerializationSettings) -> Dict[str, Any]: if self.task_config.num_ps_replicas: ps.replicas = self.task_config.num_ps_replicas + evaluator = self._convert_replica_spec(self.task_config.evaluator) if self.task_config.evaluator else None + if evaluator and self.task_config.num_evaluator_replicas: + evaluator.replicas = self.task_config.num_evaluator_replicas + run_policy = self._convert_run_policy(self.task_config.run_policy) if self.task_config.run_policy else None training_task = tensorflow_task.DistributedTensorflowTrainingTask( chief_replicas=chief, worker_replicas=worker, ps_replicas=ps, + evaluator_replicas=evaluator, run_policy=run_policy, ) diff --git a/plugins/flytekit-kf-tensorflow/tests/test_tensorflow_task.py b/plugins/flytekit-kf-tensorflow/tests/test_tensorflow_task.py index a6acae1760..0ae32439d7 100644 --- a/plugins/flytekit-kf-tensorflow/tests/test_tensorflow_task.py +++ b/plugins/flytekit-kf-tensorflow/tests/test_tensorflow_task.py @@ -1,5 +1,5 @@ import pytest -from flytekitplugins.kftensorflow import PS, Chief, CleanPodPolicy, RestartPolicy, RunPolicy, TfJob, Worker +from flytekitplugins.kftensorflow import PS, Chief, CleanPodPolicy, Evaluator, RestartPolicy, RunPolicy, TfJob, Worker from flytekit import Resources, task from flytekit.configuration import Image, ImageConfig, SerializationSettings @@ -23,6 +23,7 @@ def test_tensorflow_task_with_default_config(serialization_settings: Serializati worker=Worker(replicas=1), chief=Chief(replicas=0), ps=PS(replicas=0), + evaluator=Evaluator(replicas=0), ) @task( @@ -52,6 +53,9 @@ def my_tensorflow_task(x: int, y: str) -> int: "psReplicas": { "resources": {}, }, + "evaluatorReplicas": { + "resources": {}, + }, } assert my_tensorflow_task.get_custom(serialization_settings) == expected_dict @@ -75,6 +79,13 @@ def test_tensorflow_task_with_custom_config(serialization_settings: Serializatio replicas=2, restart_policy=RestartPolicy.ALWAYS, ), + evaluator=Evaluator( + replicas=5, + requests=Resources(cpu="2", mem="2Gi"), + limits=Resources(cpu="4", mem="2Gi"), + image="evaluator:latest", + restart_policy=RestartPolicy.FAILURE, + ), ) @task( @@ -122,7 +133,23 @@ def my_tensorflow_task(x: int, y: str) -> int: "replicas": 2, "restartPolicy": "RESTART_POLICY_ALWAYS", }, + "evaluatorReplicas": { + "replicas": 5, + "image": "evaluator:latest", + "resources": { + "requests": [ + {"name": "CPU", "value": "2"}, + {"name": "MEMORY", "value": "2Gi"}, + ], + "limits": [ + {"name": "CPU", "value": "4"}, + {"name": "MEMORY", "value": "2Gi"}, + ], + }, + "restartPolicy": "RESTART_POLICY_ON_FAILURE", + }, } + assert my_tensorflow_task.get_custom(serialization_settings) == expected_custom_dict @@ -131,6 +158,7 @@ def test_tensorflow_task_with_run_policy(serialization_settings: SerializationSe worker=Worker(replicas=1), ps=PS(replicas=0), chief=Chief(replicas=0), + evaluator=Evaluator(replicas=0), run_policy=RunPolicy( clean_pod_policy=CleanPodPolicy.RUNNING, backoff_limit=5, @@ -166,6 +194,9 @@ def my_tensorflow_task(x: int, y: str) -> int: "psReplicas": { "resources": {}, }, + "evaluatorReplicas": { + "resources": {}, + }, "runPolicy": { "cleanPodPolicy": "CLEANPOD_POLICY_RUNNING", "backoffLimit": 5, @@ -173,12 +204,13 @@ def my_tensorflow_task(x: int, y: str) -> int: "ttlSecondsAfterFinished": 100, }, } + assert my_tensorflow_task.get_custom(serialization_settings) == expected_dict def test_tensorflow_task(): @task( - task_config=TfJob(num_workers=10, num_ps_replicas=1, num_chief_replicas=1), + task_config=TfJob(num_workers=10, num_ps_replicas=1, num_chief_replicas=1, num_evaluator_replicas=1), cache=True, requests=Resources(cpu="1"), cache_version="1", @@ -212,7 +244,12 @@ def my_tensorflow_task(x: int, y: str) -> int: "replicas": 1, "resources": {}, }, + "evaluatorReplicas": { + "replicas": 1, + "resources": {}, + }, } + assert my_tensorflow_task.get_custom(settings) == expected_dict assert my_tensorflow_task.resources.limits == Resources() assert my_tensorflow_task.resources.requests == Resources(cpu="1") From 919d71b0617744c9411c4f6cac2064f097b74fd3 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Fri, 6 Oct 2023 11:56:03 +0800 Subject: [PATCH 02/11] give evaluator default value Signed-off-by: Future Outlier --- .../flytekitplugins/kftensorflow/task.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py index acabf1eb71..b99b7e4fad 100644 --- a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py +++ b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py @@ -114,13 +114,13 @@ class TfJob: chief: Chief = field(default_factory=lambda: Chief()) ps: PS = field(default_factory=lambda: PS()) worker: Worker = field(default_factory=lambda: Worker()) - evaluator: Optional[Evaluator] = field(default_factory=lambda: Evaluator()) + evaluator: Evaluator = field(default_factory=lambda: Evaluator()) run_policy: Optional[RunPolicy] = field(default_factory=lambda: None) # Support v0 config for backwards compatibility num_workers: Optional[int] = None num_ps_replicas: Optional[int] = None num_chief_replicas: Optional[int] = None - num_evaluator_replicas: Optional[int] = None + num_evaluator_replicas: int = 0 class TensorflowFunctionTask(PythonFunctionTask[TfJob]): @@ -156,7 +156,7 @@ def __init__(self, task_config: TfJob, task_function: Callable, **kwargs): raise ValueError( "Must specify either `num_ps_replicas` or `ps.replicas`. Please use `ps.replicas` as `num_ps_replicas` is depreacated." ) - if task_config.num_evaluator_replicas and task_config.evaluator and task_config.evaluator.replicas: + if task_config.num_evaluator_replicas and task_config.evaluator.replicas and task_config.evaluator.replicas > 0: raise ValueError( "Cannot specify both `num_evaluator_replicas` and `evaluator.replicas`. Please use `evaluator.replicas` as `num_evaluator_replicas` is depreacated." ) @@ -200,8 +200,8 @@ def get_custom(self, settings: SerializationSettings) -> Dict[str, Any]: if self.task_config.num_ps_replicas: ps.replicas = self.task_config.num_ps_replicas - evaluator = self._convert_replica_spec(self.task_config.evaluator) if self.task_config.evaluator else None - if evaluator and self.task_config.num_evaluator_replicas: + evaluator = self._convert_replica_spec(self.task_config.evaluator) + if self.task_config.num_evaluator_replicas: evaluator.replicas = self.task_config.num_evaluator_replicas run_policy = self._convert_run_policy(self.task_config.run_policy) if self.task_config.run_policy else None From b33a7e49334ff03daf7662f112f38c014deec906 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Fri, 6 Oct 2023 16:35:23 +0800 Subject: [PATCH 03/11] update plugin_requires for ImageSpec test Signed-off-by: Future Outlier --- plugins/flytekit-kf-tensorflow/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/flytekit-kf-tensorflow/setup.py b/plugins/flytekit-kf-tensorflow/setup.py index 79c1ade31d..66826a88f9 100644 --- a/plugins/flytekit-kf-tensorflow/setup.py +++ b/plugins/flytekit-kf-tensorflow/setup.py @@ -4,7 +4,7 @@ microlib_name = f"flytekitplugins-{PLUGIN_NAME}" -plugin_requires = ["flytekit>=1.6.1"] +plugin_requires = ["flytekit"] __version__ = "0.0.0+develop" From c310a230b4aabf8fc61220089a6a30dedb9441a7 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Fri, 6 Oct 2023 17:06:45 +0800 Subject: [PATCH 04/11] update sortedcontainers Signed-off-by: Future Outlier --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 6828cb8661..f1d58465d4 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,7 @@ "pyyaml!=6.0.0,!=5.4.0,!=5.4.1", # pyyaml is broken with cython 3: https://github.com/yaml/pyyaml/issues/601 "keyring>=18.0.1", "requests>=2.18.4,<3.0.0", - "sortedcontainers>=1.5.9,<3.0.0", + "sortedcontainers>=1.5.9, sortedcontainers<3.0.0", "statsd>=3.0.0,<4.0.0", "urllib3>=1.22,<2.0.0", "wrapt>=1.0.0,<2.0.0", From ee498f9ef3fb1e2bd8a919c8433d2e6b27ae1c49 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Fri, 6 Oct 2023 17:23:46 +0800 Subject: [PATCH 05/11] test sortedcontainers Signed-off-by: Future Outlier --- setup.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f1d58465d4..0f1655f0d4 100644 --- a/setup.py +++ b/setup.py @@ -53,7 +53,8 @@ "pyyaml!=6.0.0,!=5.4.0,!=5.4.1", # pyyaml is broken with cython 3: https://github.com/yaml/pyyaml/issues/601 "keyring>=18.0.1", "requests>=2.18.4,<3.0.0", - "sortedcontainers>=1.5.9, sortedcontainers<3.0.0", + "sortedcontainers>=1.5.9", + "sortedcontainers<3.0.0", "statsd>=3.0.0,<4.0.0", "urllib3>=1.22,<2.0.0", "wrapt>=1.0.0,<2.0.0", From f4b03c4af086ea38be7b0821d1ebcb67126710c2 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Fri, 6 Oct 2023 17:51:08 +0800 Subject: [PATCH 06/11] update sortedcontainers in setup.py Signed-off-by: Future Outlier --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 0f1655f0d4..fd0d6f80a0 100644 --- a/setup.py +++ b/setup.py @@ -53,8 +53,7 @@ "pyyaml!=6.0.0,!=5.4.0,!=5.4.1", # pyyaml is broken with cython 3: https://github.com/yaml/pyyaml/issues/601 "keyring>=18.0.1", "requests>=2.18.4,<3.0.0", - "sortedcontainers>=1.5.9", - "sortedcontainers<3.0.0", + "sortedcontainers>=1.5.9, <3.0.0", "statsd>=3.0.0,<4.0.0", "urllib3>=1.22,<2.0.0", "wrapt>=1.0.0,<2.0.0", From 98ddd542a02551a9a9eb122b98004d0d092abbe9 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Sat, 7 Oct 2023 12:44:11 +0800 Subject: [PATCH 07/11] update idl version Signed-off-by: Future Outlier --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index fd0d6f80a0..6cb395301c 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ }, install_requires=[ "googleapis-common-protos>=1.57", - "flyteidl>=1.5.16", + "flyteidl", "wheel>=0.30.0,<1.0.0", "pandas>=1.0.0,<2.0.0", "pyarrow>=4.0.0,<11.0.0", @@ -53,7 +53,7 @@ "pyyaml!=6.0.0,!=5.4.0,!=5.4.1", # pyyaml is broken with cython 3: https://github.com/yaml/pyyaml/issues/601 "keyring>=18.0.1", "requests>=2.18.4,<3.0.0", - "sortedcontainers>=1.5.9, <3.0.0", + "sortedcontainers>=1.5.9,<3.0.0", "statsd>=3.0.0,<4.0.0", "urllib3>=1.22,<2.0.0", "wrapt>=1.0.0,<2.0.0", From fbfea59eabeb0c37094ed9014268aab1bf4c8430 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Sat, 7 Oct 2023 21:57:01 +0800 Subject: [PATCH 08/11] make evaluator default 0 replicas Signed-off-by: Future Outlier --- .../flytekitplugins/kftensorflow/task.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py index b99b7e4fad..7be1f7d030 100644 --- a/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py +++ b/plugins/flytekit-kf-tensorflow/flytekitplugins/kftensorflow/task.py @@ -90,7 +90,7 @@ class Evaluator: image: Optional[str] = None requests: Optional[Resources] = None limits: Optional[Resources] = None - replicas: Optional[int] = None + replicas: int = 0 restart_policy: Optional[RestartPolicy] = None @@ -120,7 +120,7 @@ class TfJob: num_workers: Optional[int] = None num_ps_replicas: Optional[int] = None num_chief_replicas: Optional[int] = None - num_evaluator_replicas: int = 0 + num_evaluator_replicas: Optional[int] = None class TensorflowFunctionTask(PythonFunctionTask[TfJob]): @@ -156,7 +156,7 @@ def __init__(self, task_config: TfJob, task_function: Callable, **kwargs): raise ValueError( "Must specify either `num_ps_replicas` or `ps.replicas`. Please use `ps.replicas` as `num_ps_replicas` is depreacated." ) - if task_config.num_evaluator_replicas and task_config.evaluator.replicas and task_config.evaluator.replicas > 0: + if task_config.num_evaluator_replicas and task_config.evaluator.replicas > 0: raise ValueError( "Cannot specify both `num_evaluator_replicas` and `evaluator.replicas`. Please use `evaluator.replicas` as `num_evaluator_replicas` is depreacated." ) From 75885ac221c19435777a00f44302bd82d869274a Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Sun, 8 Oct 2023 00:00:16 +0000 Subject: [PATCH 09/11] update flytekit dependency Signed-off-by: Future Outlier --- plugins/flytekit-kf-tensorflow/setup.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/flytekit-kf-tensorflow/setup.py b/plugins/flytekit-kf-tensorflow/setup.py index 66826a88f9..79c1ade31d 100644 --- a/plugins/flytekit-kf-tensorflow/setup.py +++ b/plugins/flytekit-kf-tensorflow/setup.py @@ -4,7 +4,7 @@ microlib_name = f"flytekitplugins-{PLUGIN_NAME}" -plugin_requires = ["flytekit"] +plugin_requires = ["flytekit>=1.6.1"] __version__ = "0.0.0+develop" diff --git a/setup.py b/setup.py index 6cb395301c..6828cb8661 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ }, install_requires=[ "googleapis-common-protos>=1.57", - "flyteidl", + "flyteidl>=1.5.16", "wheel>=0.30.0,<1.0.0", "pandas>=1.0.0,<2.0.0", "pyarrow>=4.0.0,<11.0.0", From 0f6f69fb40d62829e2014ba7556bdd3e0bb8b27f Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Sun, 5 Nov 2023 19:19:20 +0800 Subject: [PATCH 10/11] update version Signed-off-by: Future Outlier --- plugins/flytekit-kf-tensorflow/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/flytekit-kf-tensorflow/setup.py b/plugins/flytekit-kf-tensorflow/setup.py index 79c1ade31d..25ffe19eec 100644 --- a/plugins/flytekit-kf-tensorflow/setup.py +++ b/plugins/flytekit-kf-tensorflow/setup.py @@ -4,7 +4,7 @@ microlib_name = f"flytekitplugins-{PLUGIN_NAME}" -plugin_requires = ["flytekit>=1.6.1"] +plugin_requires = ["flyteidl>=1.10.0", "flytekit>=1.6.1"] __version__ = "0.0.0+develop" From 7a0f729d48d900739396ad039458ea2a8cbd3af9 Mon Sep 17 00:00:00 2001 From: Future Outlier Date: Mon, 6 Nov 2023 09:25:40 +0800 Subject: [PATCH 11/11] update idl requirements version Signed-off-by: Future Outlier --- .../flytekit-kf-tensorflow/requirements.txt | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/plugins/flytekit-kf-tensorflow/requirements.txt b/plugins/flytekit-kf-tensorflow/requirements.txt index 8f67a26831..96552b075f 100644 --- a/plugins/flytekit-kf-tensorflow/requirements.txt +++ b/plugins/flytekit-kf-tensorflow/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.9 # by the following command: # # pip-compile requirements.in @@ -75,6 +75,7 @@ cryptography==39.0.2 # msal # pyjwt # pyopenssl + # secretstorage dataclasses-json==0.5.7 # via flytekit decorator==5.1.1 @@ -89,8 +90,10 @@ docker-image-py==0.1.12 # via flytekit docstring-parser==0.15 # via flytekit -flyteidl==1.5.5 - # via flytekit +flyteidl==1.10.0 + # via + # flytekit + # flytekitplugins-kftensorflow flytekit==1.6.1 # via flytekitplugins-kftensorflow frozenlist==1.3.3 @@ -151,12 +154,14 @@ importlib-metadata==6.1.0 # via # flytekit # keyring -importlib-resources==5.12.0 - # via keyring isodate==0.6.1 # via azure-storage-blob jaraco-classes==3.2.3 # via keyring +jeepney==0.8.0 + # via + # keyring + # secretstorage jinja2==3.1.2 # via # cookiecutter @@ -240,7 +245,9 @@ pycparser==2.21 pygments==2.15.1 # via rich pyjwt[crypto]==2.7.0 - # via msal + # via + # msal + # pyjwt pyopenssl==23.0.0 # via flytekit python-dateutil==2.8.2 @@ -299,6 +306,8 @@ rsa==4.9 # via google-auth s3fs==2023.5.0 # via flytekit +secretstorage==3.3.3 + # via keyring six==1.16.0 # via # azure-core @@ -323,7 +332,6 @@ typing-extensions==4.5.0 # azure-core # azure-storage-blob # flytekit - # rich # typing-inspect typing-inspect==0.8.0 # via dataclasses-json @@ -350,9 +358,7 @@ wrapt==1.15.0 yarl==1.9.2 # via aiohttp zipp==3.15.0 - # via - # importlib-metadata - # importlib-resources + # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools