Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Flytekit] Separate remote signal functions #2933

Open
wants to merge 13 commits into
base: master
Choose a base branch
from

Conversation

mao3267
Copy link
Contributor

@mao3267 mao3267 commented Nov 15, 2024

Tracking issue

Closes flyteorg/flyte#3459

Why are the changes needed?

Currently, the set_signal function can be used to handle three distinct actions: approving, rejecting, and providing input for gates. However, this implementation is not intuitive for users. To enhance clarity and usability, we propose splitting the set_signal function into three separate functions: approve, reject, and set_input. This change will make the functionality more straightforward and user-friendly during coding.

What changes were proposed in this pull request?

  1. Added three functions in FlyteRemote, which are approve, reject, and set_input, providing certain signals or values for gates.
  2. Do integration tests to make sure it works. However, there is a estimated 5–10 seconds delay between the remote execution and the signal being stored in the database. Therefore, we now introduce a 5 or 10 seconds delay before signal operations (set_input, approve, reject) in the integration test.

How was this patch tested?

  1. Integration tests test_signal_approve_reject are added.

Setup process

git clone https://github.com/flyteorg/flytekit.git
gh pr checkout 2933
pip install -e .

Screenshots

  1. Run pyflyte test on tests/flytekit/integration/remote/test_remote.py

image

image

  1. View Results on Flyte Dashboard

image

Check all the applicable boxes

  • I updated the documentation accordingly.
  • All new and existing tests passed.
  • All commits are signed-off.

Related PRs

None

Docs link

TODO

Summary by Bito

This PR enhances FlyteRemote with improved signal handling and retry mechanisms. It implements a configurable retry mechanism with exponential backoff, replacing fixed delays and consolidating duplicate retry loops into a single retry_operation function. The changes include VLLM integration for HuggingFace model serving, Optuna integration for hyperparameter optimization, and a new Environment class. These improvements enhance code maintainability and system robustness.

Unit tests added: True

Estimated effort to review (1-5, lower is better): 5

Signed-off-by: mao3267 <chenvincent610@gmail.com>
Copy link

codecov bot commented Nov 15, 2024

Codecov Report

Attention: Patch coverage is 13.63636% with 19 lines in your changes missing coverage. Please review.

Project coverage is 74.79%. Comparing base (f634d53) to head (f167305).
Report is 5 commits behind head on master.

Files with missing lines Patch % Lines
flytekit/remote/remote.py 13.63% 19 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2933      +/-   ##
==========================================
- Coverage   82.79%   74.79%   -8.01%     
==========================================
  Files           3      202     +199     
  Lines         186    21377   +21191     
  Branches        0     2745    +2745     
==========================================
+ Hits          154    15989   +15835     
- Misses         32     4615    +4583     
- Partials        0      773     +773     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Signed-off-by: mao3267 <chenvincent610@gmail.com>
Signed-off-by: mao3267 <chenvincent610@gmail.com>
Signed-off-by: mao3267 <chenvincent610@gmail.com>
Signed-off-by: mao3267 <chenvincent610@gmail.com>
@flyte-bot
Copy link
Contributor

Code Review Agent Run Status

  • Limitations and other issues: ❌ Failure - The AI Code Review Agent skipped reviewing this change because it is configured to exclude certain pull requests based on the source/target branch or the pull request status. You can change the settings here, or contact the agent instance creator at eduardo@union.ai.

Comment on lines 815 to 828
execution = remote.execute(conditional_wf, inputs={"data": [1.0, 2.0, 3.0, 4.0, 5.0]})
sleep(5)
remote.set_input("title-input", execution.id.name, value="my report", project=PROJECT, domain=DOMAIN, python_type=str, literal_type=LiteralType(simple=SimpleType.STRING))
sleep(10)
remote.approve("review-passes", execution.id.name, project=PROJECT, domain=DOMAIN)
remote.wait(execution=execution, timeout=datetime.timedelta(minutes=5))
assert execution.outputs["o0"] == {"title": "my report", "data": [1.0, 2.0, 3.0, 4.0, 5.0]}

with pytest.raises(FlyteAssertion, match="Outputs could not be found because the execution ended in failure"):
execution = remote.execute(conditional_wf, inputs={"data": [1.0, 2.0, 3.0, 4.0, 5.0]})
sleep(5)
remote.set_input("title-input", execution.id.name, value="my report", project=PROJECT, domain=DOMAIN, python_type=str, literal_type=LiteralType(simple=SimpleType.STRING))
sleep(10)
remote.reject("review-passes", execution.id.name, project=PROJECT, domain=DOMAIN)
Copy link
Member

@Future-Outlier Future-Outlier Jan 3, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

However, there is a 5–10-second delay between the remote execution and the signal being stored in the database. Therefore, we now introduce a 5–10-second delay before each signal operation in the integration test.

this is what @mao3267 said.

Do you think there's a better way to know the signal is callable, which means ' approve, set_input, and reject` can be called?

cc @pingsutw @wild-endeavor @thomasjpfan

…t/#3459-flyteremote-signal-enhance

Signed-off-by: mao3267 <chenvincent610@gmail.com>
@flyte-bot
Copy link
Contributor

Code Review Agent Run Status

  • Limitations and other issues: ❌ Failure - The AI Code Review Agent skipped reviewing this change because it is configured to exclude certain pull requests based on the source/target branch or the pull request status. You can change the settings here, or contact the agent instance creator at eduardo@union.ai.

@mao3267 mao3267 changed the title [WIP] Separate remote signal functions [Flytekit] Separate remote signal functions Jan 3, 2025
@mao3267 mao3267 marked this pull request as ready for review January 4, 2025 10:51
@flyte-bot
Copy link
Contributor

flyte-bot commented Jan 4, 2025

Code Review Agent Run #8b91e1

Actionable Suggestions - 4
  • flytekit/remote/remote.py - 2
  • tests/flytekit/integration/remote/test_remote.py - 1
    • Consider more reliable synchronization mechanism · Line 853-854
  • tests/flytekit/integration/remote/workflows/basic/signal_test.py - 1
    • Approval result not used in workflow · Line 15-19
Review Details
  • Files reviewed - 3 · Commit Range: 6bda0f8..997f918
    • flytekit/remote/remote.py
    • tests/flytekit/integration/remote/test_remote.py
    • tests/flytekit/integration/remote/workflows/basic/signal_test.py
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • MyPy (Static Code Analysis) - ✔︎ Successful
    • Astral Ruff (Static Code Analysis) - ✔︎ Successful

AI Code Review powered by Bito Logo

@flyte-bot
Copy link
Contributor

flyte-bot commented Jan 4, 2025

Changelist by Bito

This pull request implements the following key changes.

Key Change Files Impacted
Feature Improvement - Enhanced Signal Handling in FlyteRemote

remote.py - Added three new methods (approve, reject, set_input) to handle signal operations more intuitively

test_remote.py - Added integration tests for new signal handling methods with retry mechanism

signal_test.py - Created test workflow to demonstrate signal handling functionality

Comment on lines +635 to +721
def approve(self, signal_id: str, execution_name: str, project: str = None, domain: str = None):
"""
:param signal_id: The name of the signal, this is the key used in the approve() or wait_for_input() call.
:param execution_name: The name of the execution. This is the tail-end of the URL when looking
at the workflow execution.
:param project: The execution project, will default to the Remote's default project.
:param domain: The execution domain, will default to the Remote's default domain.
"""

wf_exec_id = WorkflowExecutionIdentifier(
project=project or self.default_project, domain=domain or self.default_domain, name=execution_name
)

lt = TypeEngine.to_literal_type(bool)
true_literal = TypeEngine.to_literal(self.context, True, bool, lt)

req = SignalSetRequest(
id=SignalIdentifier(signal_id, wf_exec_id).to_flyte_idl(), value=true_literal.to_flyte_idl()
)

# Response is empty currently, nothing to give back to the user.
self.client.set_signal(req)

def reject(self, signal_id: str, execution_name: str, project: str = None, domain: str = None):
"""
:param signal_id: The name of the signal, this is the key used in the approve() or wait_for_input() call.
:param execution_name: The name of the execution. This is the tail-end of the URL when looking
at the workflow execution.
:param project: The execution project, will default to the Remote's default project.
:param domain: The execution domain, will default to the Remote's default domain.
"""

wf_exec_id = WorkflowExecutionIdentifier(
project=project or self.default_project, domain=domain or self.default_domain, name=execution_name
)

lt = TypeEngine.to_literal_type(bool)
false_literal = TypeEngine.to_literal(self.context, False, bool, lt)

req = SignalSetRequest(
id=SignalIdentifier(signal_id, wf_exec_id).to_flyte_idl(), value=false_literal.to_flyte_idl()
)

# Response is empty currently, nothing to give back to the user.
self.client.set_signal(req)

def set_input(
self,
signal_id: str,
execution_name: str,
value: typing.Union[literal_models.Literal, typing.Any],
project=None,
domain=None,
python_type=None,
literal_type=None,
):
"""
:param signal_id: The name of the signal, this is the key used in the approve() or wait_for_input() call.
:param execution_name: The name of the execution. This is the tail-end of the URL when looking
at the workflow execution.
:param value: This is either a Literal or a Python value which FlyteRemote will invoke the TypeEngine to
convert into a Literal. This argument is only value for wait_for_input type signals.
:param project: The execution project, will default to the Remote's default project.
:param domain: The execution domain, will default to the Remote's default domain.
:param python_type: Provide a python type to help with conversion if the value you provided is not a Literal.
:param literal_type: Provide a Flyte literal type to help with conversion if the value you provided
is not a Literal
"""

wf_exec_id = WorkflowExecutionIdentifier(
project=project or self.default_project, domain=domain or self.default_domain, name=execution_name
)
if isinstance(value, Literal):
logger.debug(f"Using provided {value} as existing Literal value")
lit = value
else:
lt = literal_type or (
TypeEngine.to_literal_type(python_type) if python_type else TypeEngine.to_literal_type(type(value))
)
lit = TypeEngine.to_literal(self.context, value, python_type or type(value), lt)
logger.debug(f"Converted {value} to literal {lit} using literal type {lt}")

req = SignalSetRequest(id=SignalIdentifier(signal_id, wf_exec_id).to_flyte_idl(), value=lit.to_flyte_idl())

# Response is empty currently, nothing to give back to the user.
self.client.set_signal(req)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider consolidating signal handling methods

Consider consolidating the signal handling methods approve(), reject(), and set_input() into a single method with a signal type parameter, as they share similar code structure and functionality. This would reduce code duplication and improve maintainability.

Code suggestion
Check the AI-generated fix before applying
 @@ -635,87 +635,108 @@
 +    def set_signal_value(self, signal_id: str, execution_name: str, value: typing.Union[literal_models.Literal, typing.Any],
 +                        project: str = None, domain: str = None, python_type = None, literal_type = None):
 +        wf_exec_id = WorkflowExecutionIdentifier(
 +            project=project or self.default_project, domain=domain or self.default_domain, name=execution_name
 +        )
 +        if isinstance(value, Literal):
 +            logger.debug(f"Using provided {value} as existing Literal value")
 +            lit = value
 +        else:
 +            lt = literal_type or (TypeEngine.to_literal_type(python_type) if python_type else TypeEngine.to_literal_type(type(value)))
 +            lit = TypeEngine.to_literal(self.context, value, python_type or type(value), lt)
 +            logger.debug(f"Converted {value} to literal {lit} using literal type {lt}")
 +
 +        req = SignalSetRequest(id=SignalIdentifier(signal_id, wf_exec_id).to_flyte_idl(), value=lit.to_flyte_idl())
 +        self.client.set_signal(req)
 +
 +    def approve(self, signal_id: str, execution_name: str, project: str = None, domain: str = None):
 +        self.set_signal_value(signal_id, execution_name, True, project, domain, bool)
 +
 +    def reject(self, signal_id: str, execution_name: str, project: str = None, domain: str = None):
 +        self.set_signal_value(signal_id, execution_name, False, project, domain, bool)
 +
 +    def set_input(self, signal_id: str, execution_name: str, value: typing.Union[literal_models.Literal, typing.Any],
 +                  project=None, domain=None, python_type=None, literal_type=None):
 +        self.set_signal_value(signal_id, execution_name, value, project, domain, python_type, literal_type)

Code Review Run #8b91e1


Is this a valid issue, or was it incorrectly flagged by the Agent?

  • it was incorrectly flagged

Comment on lines +681 to +690
def set_input(
self,
signal_id: str,
execution_name: str,
value: typing.Union[literal_models.Literal, typing.Any],
project=None,
domain=None,
python_type=None,
literal_type=None,
):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Too many parameters in set_input method

The 'set_input()' method has too many parameters (7 > 5) which makes it harder to use and maintain. Consider refactoring using a configuration object pattern.

Code suggestion
Check the AI-generated fix before applying
Suggested change
def set_input(
self,
signal_id: str,
execution_name: str,
value: typing.Union[literal_models.Literal, typing.Any],
project=None,
domain=None,
python_type=None,
literal_type=None,
):
@dataclass
class SetInputConfig:
signal_id: str
execution_name: str
value: typing.Union[literal_models.Literal, typing.Any]
project: typing.Optional[str] = None
domain: typing.Optional[str] = None
python_type: typing.Optional[type] = None
literal_type: typing.Optional[type_models.LiteralType] = None
def set_input(self, config: SetInputConfig) -> None:

Code Review Run #8b91e1


Is this a valid issue, or was it incorrectly flagged by the Agent?

  • it was incorrectly flagged

Comment on lines 853 to 854
execution = remote.execute(conditional_wf, inputs={"data": [1.0, 2.0, 3.0, 4.0, 5.0]})
sleep(5)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider more reliable synchronization mechanism

Consider using a more reliable synchronization mechanism instead of hardcoded sleep() calls. The test may be flaky since it depends on timing.

Code suggestion
Check the AI-generated fix before applying
Suggested change
execution = remote.execute(conditional_wf, inputs={"data": [1.0, 2.0, 3.0, 4.0, 5.0]})
sleep(5)
execution = remote.execute(conditional_wf, inputs={"data": [1.0, 2.0, 3.0, 4.0, 5.0]})
max_retries = 10
retry_delay = 1
for _ in range(max_retries):
try:
remote.set_input("title-input", execution.id.name, value="my report", project=PROJECT, domain=DOMAIN, python_type=str, literal_type=LiteralType(simple=SimpleType.STRING))
break
except Exception:
sleep(retry_delay)
retry_delay *= 2

Code Review Run #8b91e1


Is this a valid issue, or was it incorrectly flagged by the Agent?

  • it was incorrectly flagged

Comment on lines 15 to 19
approve_node = approve(upstream_item=title_input, name="review-passes", timeout=timedelta(hours=1))
title_input >> approve_node
# This conditional returns the finalized report if the review passes,
# otherwise it returns an invalid report output.
return reporting_wf(title_input, data)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approval result not used in workflow

The approve_node is created but its result is not used in the workflow logic. Consider using the approval result in the conditional logic to determine whether to proceed with report generation.

Code suggestion
Check the AI-generated fix before applying
Suggested change
approve_node = approve(upstream_item=title_input, name="review-passes", timeout=timedelta(hours=1))
title_input >> approve_node
# This conditional returns the finalized report if the review passes,
# otherwise it returns an invalid report output.
return reporting_wf(title_input, data)
approve_node = approve(upstream_item=title_input, name="review-passes", timeout=timedelta(hours=1))
title_input >> approve_node
return conditional(approve_node).\
if_().\
then(reporting_wf(title_input=title_input, data=data)).\
else_().\
fail("Report was not approved")

Code Review Run #8b91e1


Is this a valid issue, or was it incorrectly flagged by the Agent?

  • it was incorrectly flagged

…t/#3459-flyteremote-signal-enhance

Signed-off-by: mao3267 <chenvincent610@gmail.com>
Signed-off-by: mao3267 <chenvincent610@gmail.com>
@flyte-bot
Copy link
Contributor

flyte-bot commented Jan 10, 2025

Code Review Agent Run #994a15

Actionable Suggestions - 0
Additional Suggestions - 10
  • tests/flytekit/unit/core/image_spec/test_default_builder.py - 3
    • Consider using realistic Poetry test files · Line 303-306
    • Consider using complete error message pattern · Line 271-271
    • Consider consolidating duplicate pytest parametrize decorator · Line 275-275
  • tests/flytekit/unit/core/test_flyte_file.py - 1
  • plugins/flytekit-inference/flytekitplugins/inference/vllm/serve.py - 1
    • Consider consolidating validation checks · Line 44-47
  • tests/flytekit/unit/core/test_workflows.py - 1
    • Consider expanding workflow lhs test coverage · Line 360-363
  • plugins/flytekit-optuna/setup.py - 1
    • Consider adding Python 3.11 support · Line 21-21
  • plugins/flytekit-optuna/tests/test_optimizer.py - 1
    • Consider more flexible version constraint · Line 8-8
  • plugins/flytekit-inference/tests/test_vllm.py - 1
    • Consider splitting long assertion statement · Line 41-41
  • plugins/flytekit-optuna/flytekitplugins/optuna/optimizer.py - 1
    • Simplify concurrency validation check · Line 60-61
Review Details
  • Files reviewed - 27 · Commit Range: 997f918..aba3a64
    • flytekit/__init__.py
    • flytekit/core/array_node_map_task.py
    • flytekit/core/environment.py
    • flytekit/core/workflow.py
    • flytekit/image_spec/default_builder.py
    • flytekit/remote/remote.py
    • flytekit/types/directory/types.py
    • flytekit/types/file/file.py
    • plugins/flytekit-inference/flytekitplugins/inference/__init__.py
    • plugins/flytekit-inference/flytekitplugins/inference/vllm/serve.py
    • plugins/flytekit-inference/setup.py
    • plugins/flytekit-inference/tests/test_vllm.py
    • plugins/flytekit-optuna/flytekitplugins/optuna/__init__.py
    • plugins/flytekit-optuna/flytekitplugins/optuna/optimizer.py
    • plugins/flytekit-optuna/setup.py
    • plugins/flytekit-optuna/tests/test_optimizer.py
    • plugins/flytekit-spark/tests/test_environment.py
    • pyproject.toml
    • tests/flytekit/integration/remote/test_remote.py
    • tests/flytekit/integration/remote/utils.py
    • tests/flytekit/integration/remote/workflows/basic/attr_access_sd.py
    • tests/flytekit/integration/remote/workflows/basic/signal_test.py
    • tests/flytekit/unit/core/image_spec/test_default_builder.py
    • tests/flytekit/unit/core/test_environment.py
    • tests/flytekit/unit/core/test_flyte_directory.py
    • tests/flytekit/unit/core/test_flyte_file.py
    • tests/flytekit/unit/core/test_workflows.py
  • Files skipped - 3
    • .github/workflows/pythonbuild.yml - Reason: Filter setting
    • plugins/flytekit-inference/README.md - Reason: Filter setting
    • plugins/flytekit-optuna/README.md - Reason: Filter setting
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • MyPy (Static Code Analysis) - ✔︎ Successful
    • Astral Ruff (Static Code Analysis) - ✔︎ Successful

AI Code Review powered by Bito Logo

Signed-off-by: mao3267 <chenvincent610@gmail.com>
Signed-off-by: mao3267 <chenvincent610@gmail.com>
@flyte-bot
Copy link
Contributor

flyte-bot commented Jan 11, 2025

Code Review Agent Run #ebca5e

Actionable Suggestions - 1
  • tests/flytekit/integration/remote/test_remote.py - 1
    • Consider extracting duplicated retry logic · Line 879-894
Review Details
  • Files reviewed - 2 · Commit Range: aba3a64..58c2e91
    • tests/flytekit/integration/remote/test_remote.py
    • tests/flytekit/integration/remote/workflows/basic/signal_test.py
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • MyPy (Static Code Analysis) - ✔︎ Successful
    • Astral Ruff (Static Code Analysis) - ✔︎ Successful

AI Code Review powered by Bito Logo

Comment on lines 879 to 894
max_retries = 10

for _ in range(max_retries):
try:
remote.set_input("title-input", execution.id.name, value="my report", project=PROJECT, domain=DOMAIN, python_type=str, literal_type=LiteralType(simple=SimpleType.STRING))
break
except Exception as e:
sleep(1)
continue
for _ in range(max_retries):
try:
remote.approve("review-passes", execution.id.name, project=PROJECT, domain=DOMAIN)
break
except Exception as e:
sleep(1)
continue
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider extracting duplicated retry logic

Consider extracting the retry logic into a reusable helper function since the same pattern is repeated multiple times. This could help reduce code duplication and improve maintainability.

Code suggestion
Check the AI-generated fix before applying
Suggested change
max_retries = 10
for _ in range(max_retries):
try:
remote.set_input("title-input", execution.id.name, value="my report", project=PROJECT, domain=DOMAIN, python_type=str, literal_type=LiteralType(simple=SimpleType.STRING))
break
except Exception as e:
sleep(1)
continue
for _ in range(max_retries):
try:
remote.approve("review-passes", execution.id.name, project=PROJECT, domain=DOMAIN)
break
except Exception as e:
sleep(1)
continue
def retry_operation(operation):
max_retries = 10
for _ in range(max_retries):
try:
operation()
break
except Exception:
sleep(1)
retry_operation(lambda: remote.set_input("title-input", execution.id.name, value="my report", project=PROJECT, domain=DOMAIN, python_type=str, literal_type=LiteralType(simple=SimpleType.STRING)))
retry_operation(lambda: remote.approve("review-passes", execution.id.name, project=PROJECT, domain=DOMAIN))

Code Review Run #ebca5e


Is this a valid issue, or was it incorrectly flagged by the Agent?

  • it was incorrectly flagged

Signed-off-by: mao3267 <chenvincent610@gmail.com>
@flyte-bot
Copy link
Contributor

flyte-bot commented Jan 11, 2025

Code Review Agent Run #79075d

Actionable Suggestions - 1
  • tests/flytekit/integration/remote/test_remote.py - 1
    • Consider adding retry operation return value · Line 879-886
Review Details
  • Files reviewed - 1 · Commit Range: 58c2e91..f167305
    • tests/flytekit/integration/remote/test_remote.py
  • Files skipped - 0
  • Tools
    • Whispers (Secret Scanner) - ✔︎ Successful
    • Detect-secrets (Secret Scanner) - ✔︎ Successful
    • MyPy (Static Code Analysis) - ✔︎ Successful
    • Astral Ruff (Static Code Analysis) - ✔︎ Successful

AI Code Review powered by Bito Logo

Comment on lines +879 to +886
def retry_operation(operation):
max_retries = 10
for _ in range(max_retries):
try:
operation()
break
except Exception:
sleep(1)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding retry operation return value

Consider adding a return value from retry_operation to indicate success/failure. Currently, it silently continues after max retries which could mask failures.

Code suggestion
Check the AI-generated fix before applying
Suggested change
def retry_operation(operation):
max_retries = 10
for _ in range(max_retries):
try:
operation()
break
except Exception:
sleep(1)
def retry_operation(operation) -> bool:
max_retries = 10
for _ in range(max_retries):
try:
operation()
return True
except Exception:
sleep(1)
return False

Code Review Run #79075d


Is this a valid issue, or was it incorrectly flagged by the Agent?

  • it was incorrectly flagged

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: In progress
Development

Successfully merging this pull request may close these issues.

[Core feature] add more intuitive methods to FlyteRemote class for gate nodes
3 participants