truefoundry 0.5.7rc1__py3-none-any.whl → 0.5.8rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of truefoundry might be problematic. Click here for more details.

@@ -71,7 +71,7 @@ def truefoundry_cli(ctx, json, debug):
71
71
  logger.add_cli_handler(level=log_level)
72
72
 
73
73
 
74
- def create_truefoundry_cli() -> click.MultiCommand:
74
+ def create_truefoundry_cli() -> click.Group:
75
75
  """Generates CLI by combining all subcommands into a main CLI and returns in
76
76
 
77
77
  Returns:
@@ -105,7 +105,7 @@ def main():
105
105
  try:
106
106
  cli = create_truefoundry_cli()
107
107
  except Exception as e:
108
- raise click.exceptions.UsageError(message=str(e)) from e
108
+ raise click.UsageError(message=str(e)) from e
109
109
  sys.exit(cli())
110
110
 
111
111
 
@@ -38,7 +38,7 @@ class EnvCredentialProvider(CredentialProvider):
38
38
  )
39
39
  self._host = resolve_tfy_host()
40
40
  self._auth_service = AuthServiceClient.from_tfy_host(tfy_host=self._host)
41
- self._token: Token = Token(access_token=api_key, refresh_token=None) # type: ignore[call-arg]
41
+ self._token: Token = Token(access_token=api_key, refresh_token=None)
42
42
 
43
43
  @staticmethod
44
44
  def can_provide() -> bool:
@@ -62,7 +62,7 @@ class Token(BaseModel):
62
62
  return (exp - time.time()) < buffer_in_seconds
63
63
 
64
64
  def to_user_info(self) -> UserInfo:
65
- return UserInfo( # type: ignore[call-arg]
65
+ return UserInfo(
66
66
  user_id=self.decoded_value["username"],
67
67
  email=self.decoded_value["email"]
68
68
  if "email" in self.decoded_value
@@ -81,9 +81,7 @@ class CredentialsFileContent(BaseModel):
81
81
  host: NonEmptyStr
82
82
 
83
83
  def to_token(self) -> Token:
84
- return Token( # type: ignore[call-arg]
85
- access_token=self.access_token, refresh_token=self.refresh_token
86
- )
84
+ return Token(access_token=self.access_token, refresh_token=self.refresh_token)
87
85
 
88
86
 
89
87
  class TenantInfo(BaseModel):
@@ -1,9 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import functools
4
+ from typing import Callable, TypeVar
4
5
 
5
6
  import requests
6
7
  from packaging import version
8
+ from typing_extensions import ParamSpec
7
9
 
8
10
  from truefoundry.common.constants import (
9
11
  SERVICEFOUNDRY_CLIENT_MAX_RETRIES,
@@ -24,10 +26,13 @@ from truefoundry.common.utils import (
24
26
  from truefoundry.logger import logger
25
27
  from truefoundry.version import __version__
26
28
 
29
+ P = ParamSpec("P")
30
+ R = TypeVar("R")
27
31
 
28
- def check_min_cli_version(fn):
32
+
33
+ def check_min_cli_version(fn: Callable[P, R]) -> Callable[P, R]:
29
34
  @functools.wraps(fn)
30
- def inner(*args, **kwargs):
35
+ def inner(*args: P.args, **kwargs: P.kwargs) -> R:
31
36
  client: "ServiceFoundryServiceClient" = args[0]
32
37
  client.check_min_cli_version()
33
38
  return fn(*args, **kwargs)
@@ -0,0 +1,7 @@
1
+ from typing import Protocol
2
+
3
+
4
+ class UploadCodePackageCallable(Protocol):
5
+ def __call__(
6
+ self, workspace_fqn: str, component_name: str, package_local_path: str
7
+ ) -> str: ...
@@ -53,7 +53,7 @@ def get_tfy_servers_config(tfy_host: str) -> _TFYServersConfig:
53
53
  global _tfy_servers_config
54
54
  if _tfy_servers_config is None:
55
55
  if ENV_VARS.TFY_CLI_LOCAL_DEV_MODE:
56
- _tfy_servers_config = _TFYServersConfig() # type: ignore[call-arg]
56
+ _tfy_servers_config = _TFYServersConfig()
57
57
  else:
58
58
  _tfy_servers_config = _TFYServersConfig.from_tfy_host(tfy_host)
59
59
  return _tfy_servers_config
@@ -55,7 +55,7 @@ def _get_default_spec_file():
55
55
  help="Wait and tail the deployment progress",
56
56
  )
57
57
  @click.option(
58
- "--force-deploy/--no-force-deploy",
58
+ "--force/--no-force",
59
59
  is_flag=True,
60
60
  show_default=True,
61
61
  default=False,
@@ -68,7 +68,7 @@ def deploy_command(
68
68
  file: str,
69
69
  workspace_fqn: Optional[str],
70
70
  wait: bool,
71
- force_deploy: bool,
71
+ force: bool = False,
72
72
  ):
73
73
  if ctx.invoked_subcommand is not None:
74
74
  return
@@ -85,9 +85,7 @@ def deploy_command(
85
85
  application_definition = yaml.safe_load(f)
86
86
 
87
87
  application = Application.parse_obj(application_definition)
88
- application.deploy(
89
- workspace_fqn=workspace_fqn, wait=wait, force_deploy=force_deploy
90
- )
88
+ application.deploy(workspace_fqn=workspace_fqn, wait=wait, force=force)
91
89
  sys.exit(0)
92
90
 
93
91
  click.echo(
@@ -4,7 +4,7 @@ import json
4
4
  import os
5
5
  import time
6
6
  from datetime import datetime, timezone
7
- from typing import TYPE_CHECKING, Any, Dict, List, Optional
7
+ from typing import Any, Dict, List, Optional
8
8
  from urllib.parse import urljoin
9
9
 
10
10
  import requests
@@ -50,9 +50,6 @@ DEPLOYMENT_LOGS_SUBSCRIBE_MESSAGE = "DEPLOYMENT_LOGS"
50
50
  BUILD_LOGS_SUBSCRIBE_MESSAGE = "BUILD_LOGS"
51
51
  MAX_RETRIES_WORKFLOW_TRIGGER = 3
52
52
 
53
- if TYPE_CHECKING:
54
- from truefoundry.deploy.auto_gen.models import Application
55
-
56
53
 
57
54
  def _upload_packaged_code(metadata, package_file):
58
55
  file_size = os.stat(package_file).st_size
@@ -242,13 +239,13 @@ class ServiceFoundryServiceClient(BaseServiceFoundryServiceClient):
242
239
  self,
243
240
  workspace_id: str,
244
241
  application: auto_gen_models.Workflow,
245
- force_deploy: bool,
242
+ force: bool = False,
246
243
  ) -> Deployment:
247
244
  data = {
248
245
  "workspaceId": workspace_id,
249
246
  "name": application.name,
250
247
  "manifest": application.dict(exclude_none=True),
251
- "forceDeploy": force_deploy,
248
+ "forceDeploy": force,
252
249
  }
253
250
  logger.debug(json.dumps(data))
254
251
  url = f"{self._api_server_url}/{VERSION_PREFIX}/deployment"
@@ -252,7 +252,7 @@ def deploy_component(
252
252
  component: Component,
253
253
  workspace_fqn: Optional[str] = None,
254
254
  wait: bool = True,
255
- force_deploy: bool = False,
255
+ force: bool = False,
256
256
  ) -> Deployment:
257
257
  _warn_when_gpu_selected_without_cuda(component=component)
258
258
  workspace_fqn = _resolve_workspace_fqn(
@@ -274,7 +274,7 @@ def deploy_component(
274
274
  response = client.deploy_application(
275
275
  workspace_id=workspace_id,
276
276
  application=updated_component,
277
- force_deploy=force_deploy,
277
+ force=force,
278
278
  )
279
279
  logger.info(
280
280
  "🚀 Deployment started for application '%s'. Deployment FQN is '%s'.",
@@ -1,7 +1,7 @@
1
1
  import os
2
2
  import sys
3
3
  from pathlib import Path
4
- from typing import Callable, Dict, List, Optional, Union
4
+ from typing import Dict, List, Optional, Union
5
5
 
6
6
  import requirements
7
7
  from flytekit.configuration import (
@@ -19,6 +19,7 @@ from flytekit.tools.translator import TaskSpec as FlyteTaskSpec
19
19
  from flytekit.tools.translator import WorkflowSpec as FlyteWorkflowSpec
20
20
  from google.protobuf.json_format import MessageToDict
21
21
 
22
+ from truefoundry.common.types import UploadCodePackageCallable
22
23
  from truefoundry.deploy.auto_gen import models as auto_gen_models
23
24
  from truefoundry.deploy.lib.clients.servicefoundry_client import (
24
25
  ServiceFoundryServiceClient,
@@ -39,7 +40,7 @@ from truefoundry.workflow.workflow import (
39
40
  def _handle_code_upload_for_workflow(
40
41
  workflow: auto_gen_models.Workflow,
41
42
  workspace_fqn: str,
42
- upload_code_package: Callable[[str, str, str], str],
43
+ upload_code_package: UploadCodePackageCallable,
43
44
  ) -> auto_gen_models.Workflow:
44
45
  new_workflow = workflow.copy(deep=True)
45
46
  new_workflow.source = local_source_to_remote_source(
@@ -92,7 +93,7 @@ def _is_tfy_wf_present_in_task_python_build(
92
93
 
93
94
 
94
95
  def _is_dynamic_task(flyte_task: FlyteTaskSpec) -> bool:
95
- envs: Dict[str:str] = flyte_task.template.container.env or {}
96
+ envs: Dict[str, str] = flyte_task.template.container.env or {}
96
97
  return SERIALIZED_CONTEXT_ENV_VAR in envs.keys()
97
98
 
98
99
 
@@ -273,7 +274,7 @@ def deploy_workflow(
273
274
  workflow: auto_gen_models.Workflow,
274
275
  workspace_fqn: str,
275
276
  wait: bool = True,
276
- force_deploy: bool = False,
277
+ force: bool = False,
277
278
  ) -> Deployment:
278
279
  _generate_manifest_for_workflow(workflow)
279
280
  _validate_workspace_fqn(workflow, workspace_fqn)
@@ -296,7 +297,9 @@ def deploy_workflow(
296
297
  )
297
298
 
298
299
  deployment = client.deploy_application(
299
- workspace_id=workspace_id, application=workflow
300
+ workspace_id=workspace_id,
301
+ application=workflow,
302
+ force=force,
300
303
  )
301
304
  logger.info(
302
305
  "🚀 Deployment started for application '%s'. Deployment FQN is '%s'.",
@@ -12,13 +12,13 @@ class DeployablePatchedModelBase(BaseModel):
12
12
  extra = "forbid"
13
13
 
14
14
  def deploy(
15
- self, workspace_fqn: str, wait: bool = True, force_deploy: bool = False
15
+ self, workspace_fqn: str, wait: bool = True, force: bool = False
16
16
  ) -> Deployment:
17
17
  return deploy_component(
18
18
  component=self,
19
19
  workspace_fqn=workspace_fqn,
20
20
  wait=wait,
21
- force_deploy=force_deploy,
21
+ force=force,
22
22
  )
23
23
 
24
24
 
@@ -26,7 +26,7 @@ class Service(models.Service, DeployablePatchedModelBase):
26
26
  type: Literal["service"] = "service"
27
27
  resources: models.Resources = Field(default_factory=models.Resources)
28
28
  # This is being patched because cue export marks this as a "number"
29
- replicas: Union[conint(ge=0, le=100), models.ServiceAutoscaling] = Field(
29
+ replicas: Union[conint(ge=0, le=100), models.ServiceAutoscaling] = Field( # type: ignore[valid-type]
30
30
  1,
31
31
  description="+label=Replicas\n+usage=Replicas of service you want to run\n+icon=fa-clone\n+sort=3",
32
32
  )
@@ -70,7 +70,7 @@ class ApplicationSet(models.ApplicationSet, DeployablePatchedModelBase):
70
70
 
71
71
  class AsyncService(models.AsyncService, DeployablePatchedModelBase):
72
72
  type: Literal["async-service"] = "async-service"
73
- replicas: Union[conint(ge=0, le=100), models.AsyncServiceAutoscaling] = 1
73
+ replicas: Union[conint(ge=0, le=100), models.AsyncServiceAutoscaling] = 1 # type: ignore[valid-type]
74
74
  resources: models.Resources = Field(default_factory=models.Resources)
75
75
 
76
76
 
@@ -81,7 +81,7 @@ class SSHServer(models.SSHServer, DeployablePatchedModelBase):
81
81
 
82
82
  class Application(models.Application, DeployablePatchedModelBase):
83
83
  def deploy(
84
- self, workspace_fqn: str, wait: bool = True, force_deploy: bool = False
84
+ self, workspace_fqn: str, wait: bool = True, force: bool = False
85
85
  ) -> Deployment:
86
86
  if isinstance(self.__root__, models.Workflow):
87
87
  from truefoundry.deploy.v2.lib.deploy_workflow import deploy_workflow
@@ -90,14 +90,14 @@ class Application(models.Application, DeployablePatchedModelBase):
90
90
  workflow=self.__root__,
91
91
  workspace_fqn=workspace_fqn,
92
92
  wait=wait,
93
- force_deploy=force_deploy,
93
+ force=force,
94
94
  )
95
95
  else:
96
96
  return deploy_component(
97
97
  component=self.__root__,
98
98
  workspace_fqn=workspace_fqn,
99
99
  wait=wait,
100
- force_deploy=force_deploy,
100
+ force=force,
101
101
  )
102
102
 
103
103
 
@@ -107,7 +107,11 @@ class Workflow(models.Workflow, DeployablePatchedModelBase):
107
107
  default_factory=lambda: LocalSource(local_build=False)
108
108
  )
109
109
 
110
- def deploy(self, workspace_fqn: str, wait: bool = True) -> Deployment:
110
+ def deploy(
111
+ self, workspace_fqn: str, wait: bool = True, force: bool = False
112
+ ) -> Deployment:
111
113
  from truefoundry.deploy.v2.lib.deploy_workflow import deploy_workflow
112
114
 
113
- return deploy_workflow(workflow=self, workspace_fqn=workspace_fqn, wait=wait)
115
+ return deploy_workflow(
116
+ workflow=self, workspace_fqn=workspace_fqn, wait=wait, force=force
117
+ )
@@ -26,7 +26,7 @@ class BuildResponse(BaseModel):
26
26
 
27
27
 
28
28
  class AppDeploymentStatusResponse(BaseModel):
29
- state: create_model(
29
+ state: create_model( # type: ignore[valid-type]
30
30
  "State",
31
31
  isTerminalState=(bool, ...),
32
32
  type=(str, ...),
@@ -518,7 +518,7 @@ class ArtifactsDownload(models.ArtifactsDownload, PatchedModelBase):
518
518
 
519
519
  class NvidiaGPU(models.NvidiaGPU, PatchedModelBase):
520
520
  type: Literal["nvidia_gpu"] = "nvidia_gpu"
521
- name: Optional[Union[GPUType, constr(regex=r"^tpu-[a-z\d\-]+$")]] = None
521
+ name: Optional[Union[GPUType, constr(regex=r"^tpu-[a-z\d\-]+$")]] = None # type: ignore[valid-type]
522
522
 
523
523
 
524
524
  class NvidiaMIGGPU(models.NvidiaMIGGPU, PatchedModelBase):
@@ -8,6 +8,7 @@ from typing import Callable, List, Optional
8
8
  import gitignorefile
9
9
  from tqdm import tqdm
10
10
 
11
+ from truefoundry.common.types import UploadCodePackageCallable
11
12
  from truefoundry.common.warnings import TrueFoundryDeprecationWarning
12
13
  from truefoundry.deploy import builder
13
14
  from truefoundry.deploy.auto_gen import models
@@ -136,7 +137,7 @@ def local_source_to_remote_source(
136
137
  local_source: models.LocalSource,
137
138
  workspace_fqn: str,
138
139
  component_name: str,
139
- upload_code_package: Callable[[str, str, str], str],
140
+ upload_code_package: UploadCodePackageCallable,
140
141
  ) -> RemoteSource:
141
142
  with tempfile.TemporaryDirectory() as local_dir:
142
143
  package_local_path = os.path.join(local_dir, "build.tar.gz")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: truefoundry
3
- Version: 0.5.7rc1
3
+ Version: 0.5.8rc1
4
4
  Summary: TrueFoundry CLI
5
5
  Author: Abhishek Choudhary
6
6
  Author-email: abhishek@truefoundry.com
@@ -24,7 +24,7 @@ truefoundry/autodeploy/utils/client.py,sha256=PvbSkfgAjAogGjisinqmh4mP4svowxAC0I
24
24
  truefoundry/autodeploy/utils/diff.py,sha256=Ef8Y-VffDKel_-q-GxRam6gqiv8qTLMcqVg6iifXfcA,5358
25
25
  truefoundry/autodeploy/utils/pydantic_compat.py,sha256=hEAUy5kLjhPdzw7yGZ2iXGMXbbMVXVlGzIofmyHafXQ,412
26
26
  truefoundry/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
- truefoundry/cli/__main__.py,sha256=0nEwE0UkFagCO5ctGcqEThdmBT2fN8MVcr0ERItnsNQ,3483
27
+ truefoundry/cli/__main__.py,sha256=oPtY1egJ21nN46me7E-xLfU0m_Zy5Oz2jj571os8Yxg,3465
28
28
  truefoundry/cli/config.py,sha256=tf8w4UfVzcC6eYkENvuuCPYt_V3sqVpO1bclORV9tAk,206
29
29
  truefoundry/cli/console.py,sha256=9-dMy4YPisCJQziRKTg8Qa0UJnOGl1soiUnJjsnLDvE,242
30
30
  truefoundry/cli/const.py,sha256=dVHPo1uAiDSSMXwXoT2mR5kNQjExT98QNVRz98Hz_Ts,510
@@ -34,14 +34,15 @@ truefoundry/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuF
34
34
  truefoundry/common/auth_service_client.py,sha256=N3YxKlx63r6cPZqbgb2lqBOPI69ShB7D7RCIq4FSCjc,7949
35
35
  truefoundry/common/constants.py,sha256=WQjylPv7xTVYURv4zicJUHYL73Gv3c3i6Iw4oy9Lhg4,2744
36
36
  truefoundry/common/credential_file_manager.py,sha256=1yEk1Zm2xS4G0VDFwKSZ4w0VUrcPWQ1nJnoBaz9xyKA,4251
37
- truefoundry/common/credential_provider.py,sha256=R666i1ADKb2ldwEVh9lnaFcPaa4q3vAscIX3MX1UiFA,4097
38
- truefoundry/common/entities.py,sha256=8O-EGPk4PKqnyoFMKUTxISCU19rz0KBnfRDJU695DhY,3797
37
+ truefoundry/common/credential_provider.py,sha256=_OhJ2XFlDaVsrUO-FyywxctcGGqDdC2pgcvwEKqQD0Q,4071
38
+ truefoundry/common/entities.py,sha256=12olLKzRT092Jnze5busK68cwH8wwyL6ch77ohKOFPU,3723
39
39
  truefoundry/common/exceptions.py,sha256=jkU0N7hV_P-EhXeud4I5vuB9glXXZSWPf8LcH04mSbw,459
40
40
  truefoundry/common/request_utils.py,sha256=e9qrAQ1MutU7JALDKcucmNd0KQEVBqgW3yx0w1zeHIU,5700
41
- truefoundry/common/servicefoundry_client.py,sha256=295ZXOEM46lXZP59O04XFTDCsZLtz3MssXRDMk2x9hg,3169
41
+ truefoundry/common/servicefoundry_client.py,sha256=2fYhdVPSvLXz5C5tosOq86JD8WM3IRUIy1VO9deDxZI,3340
42
42
  truefoundry/common/session.py,sha256=BiTJ2WEzLkTvzpqy67xX3fXgiKH_ltzzmQdFG7xUtwI,2904
43
43
  truefoundry/common/storage_provider_utils.py,sha256=yURhMw8k0FLFvaviRHDiifhvc6GnuQwGMC9Qd2uM440,10934
44
- truefoundry/common/utils.py,sha256=sZyg-vpShVXvnrwnINrdsyWJR3FHMUBiOB1CslYdQTo,6072
44
+ truefoundry/common/types.py,sha256=BMJFCsR1lPJAw66IQBSvLyV4I6o_x5oj78gVsUa9si8,188
45
+ truefoundry/common/utils.py,sha256=E1kKw_hqlVMgwyPkER2SvVLIoQ-B_4TQCuM5IJXvgig,6046
45
46
  truefoundry/common/warnings.py,sha256=rs6BHwk7imQYedo07iwh3TWEOywAR3Lqhj0AY4khByg,504
46
47
  truefoundry/deploy/__init__.py,sha256=e0EgG-fVJ6N9PNIlBINO6QtIMEehQgmz3ONPPjYlcSY,2596
47
48
  truefoundry/deploy/auto_gen/models.py,sha256=83OoBHcu3VP8Xe75vBNaQmPGjqxhsSkHAZZZD4mROOM,87620
@@ -61,7 +62,7 @@ truefoundry/deploy/cli/commands/apply_command.py,sha256=Y2e_C8HVpo8CssVod-3JRz-8
61
62
  truefoundry/deploy/cli/commands/build_command.py,sha256=zJBywMatbpUlXx5O2aqpEVmPeBIJ9RNnG9abSc8C8CE,1234
62
63
  truefoundry/deploy/cli/commands/create_command.py,sha256=rCajvQvAfZU10nDZOYpRACbAATH1zj52ihTWrhnLLUc,1829
63
64
  truefoundry/deploy/cli/commands/delete_command.py,sha256=JMibxvt1rsZ8sODa0jI1e6vavjN8Pv04ttVFURSTKTw,2362
64
- truefoundry/deploy/cli/commands/deploy_command.py,sha256=JW7_gUwM7sg7cNkK-28AdNdgFj26Oj2KjkqIO-CvZFg,4172
65
+ truefoundry/deploy/cli/commands/deploy_command.py,sha256=8aTBvzPaT9xg6KPmpcpqJlmdj4yXzWUfAy6slcoPN74,4123
65
66
  truefoundry/deploy/cli/commands/deploy_init_command.py,sha256=g-jBfrEmhZ0TDWsyqPDn4K6q33EqJSGmBTt1eMYig-w,600
66
67
  truefoundry/deploy/cli/commands/get_command.py,sha256=HZQGWib-qrS0RdzctRDwDLfMGu0wqWkAM1u26cTZlsc,5944
67
68
  truefoundry/deploy/cli/commands/list_command.py,sha256=zKu_JWY35eMIzgSNFYtmwi2uezZ4k-8yk3C1Vqsvshc,4470
@@ -81,7 +82,7 @@ truefoundry/deploy/io/output_callback.py,sha256=V2YwUFec4G4a67lM4r-x_64AqdOVNo_9
81
82
  truefoundry/deploy/io/rich_output_callback.py,sha256=TJLiRD-EnFVwgcepxR7WN0koKqW1X2DevETPhNPi_nU,829
82
83
  truefoundry/deploy/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
84
  truefoundry/deploy/lib/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
- truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=twgEUKSES8HWewMj-8xeD1O3AOz9kfhaaZA4D0BATxk,26444
85
+ truefoundry/deploy/lib/clients/servicefoundry_client.py,sha256=TjReImI1lL2xRQvdFh_ldfuVeVP7bohyxIf53PxYvNs,26341
85
86
  truefoundry/deploy/lib/const.py,sha256=Wg0GDnfFu-g1fJr4lU80NH2ULw0R0dYjV7LnW-PbOeM,173
86
87
  truefoundry/deploy/lib/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
88
  truefoundry/deploy/lib/dao/application.py,sha256=oMszpueXPUfTUuN_XdKwoRjQyqAgWHhZ-10cbprCVdM,9226
@@ -98,12 +99,12 @@ truefoundry/deploy/lib/win32.py,sha256=1RcvPTdlOAJ48rt8rCbE2Ufha2ztRqBAE9dueNXAr
98
99
  truefoundry/deploy/python_deploy_codegen.py,sha256=qJHH1BJQII9e6PhkcRFYiE_3De7_VMMm8nM4AX5Eq1o,6513
99
100
  truefoundry/deploy/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
101
  truefoundry/deploy/v2/lib/__init__.py,sha256=WEiVMZXOVljzEE3tpGJil14liIn_PCDoACJ6b3tZ6sI,188
101
- truefoundry/deploy/v2/lib/deploy.py,sha256=Uk4osyx7uGfYWgyzd6FlmDEnR6tnIjDdytIlCQAq9Xs,12441
102
- truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=NM6MDdJ7qeqr1HPM5dLLhwkshQ3OweKQOFjzRZ_2c5w,12797
103
- truefoundry/deploy/v2/lib/deployable_patched_models.py,sha256=6zLJmzRfKXoYa151lc_WUIUOc4wBtNthFfGS9IWMrQc,3990
104
- truefoundry/deploy/v2/lib/models.py,sha256=pSolLMTArDuYpeNsmeeS5DWliloN_iCDfZSpRllMHUg,1120
105
- truefoundry/deploy/v2/lib/patched_models.py,sha256=-YnzXSabKs8XDx2I5zYjSKj1lM2qf-L4huewtHSvnP4,16310
106
- truefoundry/deploy/v2/lib/source.py,sha256=wArU8AwSy7U9EUGLEMmB4Ke7ZwgZWmh8fFU-PACogIk,9347
102
+ truefoundry/deploy/v2/lib/deploy.py,sha256=aHYT3p5o_AejVudr-Zbau3wJpMRAzJ4FTlPCUsJ436M,12420
103
+ truefoundry/deploy/v2/lib/deploy_workflow.py,sha256=92aA8ji46-KjC3tu46KeJuvOFkajSU1WAdLKgqVOGh8,12869
104
+ truefoundry/deploy/v2/lib/deployable_patched_models.py,sha256=hqfPxQvuA9rTjaxZY9YqV51hdNFT-0YBXyR-S859PTo,4060
105
+ truefoundry/deploy/v2/lib/models.py,sha256=ogc1UYs1Z2nBdGSKCrde9sk8d0GxFKMkem99uqO5CmM,1148
106
+ truefoundry/deploy/v2/lib/patched_models.py,sha256=v26Rm0BaV6RKr-TxKZ8O3gT-90JA91K4bnGSKgCrQ7o,16338
107
+ truefoundry/deploy/v2/lib/source.py,sha256=zM8k3hJ2N5b8FgkVsYPhEvHPA4rt2rSqtLUMRcaGGiQ,9405
107
108
  truefoundry/logger.py,sha256=u-YCNjg5HBwE70uQcpjIG64Ghos-K2ulTWaxC03BSj4,714
108
109
  truefoundry/ml/__init__.py,sha256=ssUEIs8BixPWxynKoeSh-dkRl6AtLXG0PBGYnUR5Az8,2217
109
110
  truefoundry/ml/artifact/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -354,11 +355,6 @@ truefoundry/pydantic_v1.py,sha256=jSuhGtz0Mbk1qYu8jJ1AcnIDK4oxUsdhALc4spqstmM,34
354
355
  truefoundry/version.py,sha256=bqiT4Q-VWrTC6P4qfK43mez-Ppf-smWfrl6DcwV7mrw,137
355
356
  truefoundry/workflow/__init__.py,sha256=XY83vqtLAclI82atZXyBtF9ZgLROXaaXO5p60XH5hJA,1493
356
357
  truefoundry/workflow/container_task.py,sha256=8arieePsX4__OnG337hOtCiNgJwtKJJCsZcmFmCBJtk,402
357
- truefoundry/workflow/example/deploy.sh,sha256=wfbPRrCi04WYRqCf4g-Xo12uWbcqPD6G_Tz0lV0jU_U,60
358
- truefoundry/workflow/example/hello_world_package/workflow.py,sha256=IkRKfPY5BcvLPo_PVuNbZKK9PPJ93LRkzb1a3RKQYOw,435
359
- truefoundry/workflow/example/package/test_workflow.py,sha256=TUcvYCGz4IbzF9bQJAfB-6Wd2wx-0RKcuIpUG0t6d8c,3972
360
- truefoundry/workflow/example/truefoundry.yaml,sha256=LlPrMADSPJsiXRoK76N_RVjX1bnZ3FH1u2jXrwLfR9I,226
361
- truefoundry/workflow/example/workflow.yaml,sha256=YtYdKXMuW_08gfEo21XSculj2MGI2lfEnGF8qCT8NKE,2858
362
358
  truefoundry/workflow/map_task.py,sha256=2m3qGXQ90k9LdS45q8dqCCECc3qr8t2m_LMCVd1mZ7g,1737
363
359
  truefoundry/workflow/python_task.py,sha256=SRXRLC4vdBqGjhkwuaY39LEWN6iPCpJAuW17URRdWTY,1128
364
360
  truefoundry/workflow/remote_filesystem/__init__.py,sha256=LQ95ViEjJ7Ts4JcCGOxMPs7NZmQdZ4bTiq6qXtsjUhE,206
@@ -367,7 +363,7 @@ truefoundry/workflow/remote_filesystem/tfy_signed_url_client.py,sha256=xcT0wQmQl
367
363
  truefoundry/workflow/remote_filesystem/tfy_signed_url_fs.py,sha256=nSGPZu0Gyd_jz0KsEE-7w_BmnTD8CVF1S8cUJoxaCbc,13305
368
364
  truefoundry/workflow/task.py,sha256=34m55mALXx6ko9o5HkK6FDtMajdvJzBhOsHwDM2RcBA,1779
369
365
  truefoundry/workflow/workflow.py,sha256=WaTqUjhwfAXDWu4E5ehuwAxrCbDJkoAf1oWmR2E9Qy0,4575
370
- truefoundry-0.5.7rc1.dist-info/METADATA,sha256=x5GilnYFCgdiFnR85bO_VZSTstYfnHbumizGDELekAM,2887
371
- truefoundry-0.5.7rc1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
372
- truefoundry-0.5.7rc1.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
373
- truefoundry-0.5.7rc1.dist-info/RECORD,,
366
+ truefoundry-0.5.8rc1.dist-info/METADATA,sha256=w78rupDdfwn-65YZwSnGEBgIqFfc3B-kWigUjyUWY6I,2887
367
+ truefoundry-0.5.8rc1.dist-info/WHEEL,sha256=IYZQI976HJqqOpQU6PHkJ8fb3tMNBFjg-Cn-pwAbaFM,88
368
+ truefoundry-0.5.8rc1.dist-info/entry_points.txt,sha256=TXvUxQkI6zmqJuycPsyxEIMr3oqfDjgrWj0m_9X12x4,95
369
+ truefoundry-0.5.8rc1.dist-info/RECORD,,
@@ -1 +0,0 @@
1
- tfy deploy --workspace_fqn tfy-ctl-euwe1-devtest:nikhil-ws
@@ -1,20 +0,0 @@
1
- from truefoundry.workflow import PythonTaskConfig, TaskPythonBuild, task, workflow
2
-
3
-
4
- @task(
5
- task_config=PythonTaskConfig(
6
- image=TaskPythonBuild(
7
- python_version="3.9",
8
- pip_packages=["truefoundry[workflow]"],
9
- ),
10
- service_account="tfy-workflows-sa",
11
- )
12
- )
13
- def say_hello() -> str:
14
- return "Hello, World!"
15
-
16
-
17
- @workflow
18
- def hello_world_wf() -> str:
19
- res = say_hello()
20
- return res
@@ -1,151 +0,0 @@
1
- import os
2
- from functools import partial
3
- from pathlib import Path
4
- from typing import List, Optional, Tuple
5
-
6
- from truefoundry.deploy import Image, NvidiaGPU, Resources
7
- from truefoundry.workflow import (
8
- ContainerTask,
9
- ContainerTaskConfig,
10
- FlyteDirectory,
11
- PythonTaskConfig,
12
- TaskPythonBuild,
13
- conditional,
14
- map_task,
15
- task,
16
- workflow,
17
- )
18
-
19
- cpu_task_config = PythonTaskConfig(
20
- image=TaskPythonBuild(
21
- python_version="3.9",
22
- pip_packages=["truefoundry[workflow]==0.4.1"],
23
- ),
24
- resources=Resources(cpu_request=0.45),
25
- service_account="tfy-workflows-sa",
26
- )
27
-
28
-
29
- # figure out naming
30
- @task(task_config=cpu_task_config)
31
- def should_train_tokenizer(tokenizer: str) -> bool:
32
- print("Should train tokenizer")
33
- return not bool(tokenizer)
34
-
35
-
36
- @task(
37
- task_config=cpu_task_config,
38
- # currently we will not support the caching, but keeping here for now
39
- # cache=True,
40
- # cache_version="1.0",
41
- )
42
- def train_tokenizer() -> str:
43
- print("Training tokenizer")
44
- return "trained_tokenizer"
45
-
46
-
47
- @task(
48
- task_config=PythonTaskConfig(
49
- image=TaskPythonBuild(
50
- python_version="3.9",
51
- pip_packages=["truefoundry[workflow]==0.4.1", "pynvml==11.5.0"],
52
- cuda_version="11.5-cudnn8",
53
- ),
54
- env={
55
- "NVIDIA_DRIVER_CAPABILITIES": "compute,utility",
56
- "NVIDIA_VISIBLE_DEVICES": "all",
57
- },
58
- resources=Resources(cpu_request=0.45, devices=[NvidiaGPU(name="T4", count=1)]),
59
- service_account="tfy-workflows-sa",
60
- ),
61
- )
62
- def train_model(tokenizer: str) -> Tuple[FlyteDirectory, str]:
63
- print("Training model")
64
- import flytekit
65
- # from pynvml import nvmlDeviceGetCount, nvmlInit
66
-
67
- # nvmlInit()
68
- # assert nvmlDeviceGetCount() > 0
69
-
70
- working_dir = flytekit.current_context().working_directory
71
- local_dir = Path(os.path.join(working_dir, "csv_files"))
72
- local_dir.mkdir(exist_ok=True)
73
-
74
- with open(os.path.join(local_dir, "model"), "w", encoding="utf-8") as f:
75
- f.write(tokenizer)
76
-
77
- return FlyteDirectory(path=str(local_dir)), "hello"
78
-
79
-
80
- @task(task_config=cpu_task_config)
81
- def get_validation_data() -> List[str]:
82
- print("Getting validation data")
83
- return ["foo", "bar", "baz"]
84
-
85
-
86
- @task(task_config=cpu_task_config)
87
- def validate_model(model: FlyteDirectory, tokenizer: str, validation_data: str) -> bool:
88
- print(validation_data)
89
- model_path = os.path.join(model, "model")
90
- with open(model_path, "r", encoding="utf-8") as f:
91
- return f.read() == tokenizer
92
-
93
-
94
- @task(task_config=cpu_task_config)
95
- def all_good(validations: List[bool]) -> bool:
96
- print("Validations", validations)
97
- return all(validations)
98
-
99
-
100
- echo = ContainerTask(
101
- name="echo",
102
- task_config=ContainerTaskConfig(
103
- image=Image(
104
- image_uri="docker.io/bash:4.1",
105
- command=["echo", "hello"],
106
- ),
107
- service_account="tfy-workflows-sa",
108
- ),
109
- )
110
-
111
-
112
- @task(task_config=cpu_task_config)
113
- def random(tokenizer: str) -> Tuple[FlyteDirectory, str]:
114
- print(tokenizer)
115
- return FlyteDirectory(path=""), "random"
116
-
117
-
118
- @workflow(
119
- # execution_configs=[
120
- # ExecutionConfig(
121
- # schedule="*/10 * * * *",
122
- # )
123
- # ]
124
- )
125
- def train(
126
- tokenizer: str = "",
127
- test_v2: str = "",
128
- optional_var: Optional[str] = "",
129
- default_v: Optional[str] = "hello1",
130
- default_v2: str = "hello2",
131
- ) -> bool:
132
- stt = should_train_tokenizer(tokenizer=tokenizer)
133
- model, t = (
134
- conditional("train_tokenizer")
135
- .if_(stt.is_true())
136
- .then(train_model(tokenizer=tokenizer))
137
- .else_()
138
- .then(random(tokenizer=tokenizer))
139
- )
140
- validation_task = partial(validate_model, model=model, tokenizer=t)
141
- validation_data = get_validation_data()
142
- validations = map_task(
143
- validation_task,
144
- concurrency=2,
145
- )(validation_data=validation_data)
146
- echo()
147
- return all_good(validations=validations)
148
-
149
-
150
- if __name__ == "__main__":
151
- train()
@@ -1,9 +0,0 @@
1
- type: workflow
2
- name: my-test-workflow9
3
- source:
4
- type: local
5
- local_build: false
6
- project_root_path: "./"
7
- workflow_file_path: package/test_workflow.py
8
- # workflow_file_path: hello_world_package/workflow.py
9
- flyte_entities: []
@@ -1,116 +0,0 @@
1
- type: workflow
2
- name: my-test-workflow5
3
- source:
4
- type: remote
5
- remote_uri: s3://tfy-mlfoundry-tfy-ctl-euwe1-devtest20221012173221749100000002/tfy-ctl-euwe1-devtest:nikhil-ws/my-test-workflow5/clyhb79w4013l01oyfq1iawd5/package.tar.gz
6
- workflow_file_path: hello_world_package/workflow.py
7
- docker_registry: docker.io/nikp-test
8
- flyte_entities:
9
- - template:
10
- id:
11
- resourceType: TASK
12
- name: hello_world_package.workflow.say_hello
13
- type: python-task
14
- metadata:
15
- runtime:
16
- type: FLYTE_SDK
17
- version: 1.12.2
18
- flavor: python
19
- retries: {}
20
- interface:
21
- inputs: {}
22
- outputs:
23
- variables:
24
- o0:
25
- type:
26
- simple: STRING
27
- description: o0
28
- custom:
29
- truefoundry:
30
- type: python-task-config
31
- image:
32
- type: task-python-build
33
- python_version: '3.9'
34
- pip_packages:
35
- - flytekit==1.10.3
36
- resources:
37
- cpu_request: 0.2
38
- cpu_limit: 0.5
39
- memory_request: 200
40
- memory_limit: 500
41
- ephemeral_storage_request: 1000
42
- ephemeral_storage_limit: 2000
43
- container:
44
- image: ':'
45
- args:
46
- - pyflyte-execute
47
- - --inputs
48
- - '{{.input}}'
49
- - --output-prefix
50
- - '{{.outputPrefix}}'
51
- - --raw-output-data-prefix
52
- - '{{.rawOutputDataPrefix}}'
53
- - --checkpoint-path
54
- - '{{.checkpointOutputPrefix}}'
55
- - --prev-checkpoint
56
- - '{{.prevCheckpointPrefix}}'
57
- - --resolver
58
- - flytekit.core.python_auto_container.default_task_resolver
59
- - --
60
- - task-module
61
- - hello_world_package.workflow
62
- - task-name
63
- - say_hello
64
- resources: {}
65
- description:
66
- longDescription:
67
- format: DESCRIPTION_FORMAT_RST
68
- - template:
69
- id:
70
- resourceType: WORKFLOW
71
- name: hello_world_package.workflow.hello_world_wf
72
- metadata: {}
73
- interface:
74
- inputs: {}
75
- outputs:
76
- variables:
77
- o0:
78
- type:
79
- simple: STRING
80
- description: o0
81
- nodes:
82
- - id: n0
83
- metadata:
84
- name: say_hello
85
- retries: {}
86
- taskNode:
87
- referenceId:
88
- resourceType: TASK
89
- name: hello_world_package.workflow.say_hello
90
- overrides: {}
91
- outputs:
92
- - var: o0
93
- binding:
94
- promise:
95
- nodeId: n0
96
- var: o0
97
- metadataDefaults: {}
98
- description:
99
- longDescription:
100
- format: DESCRIPTION_FORMAT_RST
101
- - id:
102
- resourceType: LAUNCH_PLAN
103
- name: hello_world_package.workflow.hello_world_wf
104
- spec:
105
- workflowId:
106
- resourceType: WORKFLOW
107
- name: hello_world_package.workflow.hello_world_wf
108
- entityMetadata: {}
109
- defaultInputs: {}
110
- fixedInputs: {}
111
- labels: {}
112
- annotations: {}
113
- rawOutputDataConfig: {}
114
- closure:
115
- expectedInputs: {}
116
- expectedOutputs: {}