snowflake-ml-python 1.8.6__py3-none-any.whl → 1.9.0__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.
- snowflake/ml/_internal/utils/identifier.py +1 -1
- snowflake/ml/_internal/utils/mixins.py +61 -0
- snowflake/ml/jobs/_utils/constants.py +1 -1
- snowflake/ml/jobs/_utils/interop_utils.py +63 -4
- snowflake/ml/jobs/_utils/payload_utils.py +6 -5
- snowflake/ml/jobs/_utils/query_helper.py +9 -0
- snowflake/ml/jobs/_utils/spec_utils.py +6 -4
- snowflake/ml/jobs/decorators.py +18 -25
- snowflake/ml/jobs/job.py +179 -58
- snowflake/ml/jobs/manager.py +194 -145
- snowflake/ml/model/_client/ops/model_ops.py +12 -3
- snowflake/ml/model/_client/ops/service_ops.py +4 -2
- snowflake/ml/model/_client/service/model_deployment_spec_schema.py +2 -0
- snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +38 -10
- snowflake/ml/model/_packager/model_env/model_env.py +35 -27
- snowflake/ml/model/_packager/model_handlers/pytorch.py +5 -1
- snowflake/ml/model/_packager/model_meta/model_meta.py +3 -1
- snowflake/ml/model/_signatures/snowpark_handler.py +55 -3
- snowflake/ml/model/target_platform.py +11 -0
- snowflake/ml/model/task.py +9 -0
- snowflake/ml/model/type_hints.py +5 -13
- snowflake/ml/modeling/metrics/metrics_utils.py +2 -0
- snowflake/ml/registry/_manager/model_manager.py +30 -15
- snowflake/ml/registry/registry.py +119 -42
- snowflake/ml/version.py +1 -1
- {snowflake_ml_python-1.8.6.dist-info → snowflake_ml_python-1.9.0.dist-info}/METADATA +52 -16
- {snowflake_ml_python-1.8.6.dist-info → snowflake_ml_python-1.9.0.dist-info}/RECORD +30 -26
- {snowflake_ml_python-1.8.6.dist-info → snowflake_ml_python-1.9.0.dist-info}/WHEEL +0 -0
- {snowflake_ml_python-1.8.6.dist-info → snowflake_ml_python-1.9.0.dist-info}/licenses/LICENSE.txt +0 -0
- {snowflake_ml_python-1.8.6.dist-info → snowflake_ml_python-1.9.0.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,5 @@
|
|
1
|
+
import logging
|
2
|
+
import os
|
1
3
|
import warnings
|
2
4
|
from types import ModuleType
|
3
5
|
from typing import Any, Optional, Union, overload
|
@@ -11,6 +13,7 @@ from snowflake.ml.model import (
|
|
11
13
|
Model,
|
12
14
|
ModelVersion,
|
13
15
|
model_signature,
|
16
|
+
task,
|
14
17
|
type_hints as model_types,
|
15
18
|
)
|
16
19
|
from snowflake.ml.model._client.model import model_version_impl
|
@@ -29,6 +32,52 @@ _MODEL_MONITORING_DISABLED_ERROR = (
|
|
29
32
|
)
|
30
33
|
|
31
34
|
|
35
|
+
class _NullStatusContext:
|
36
|
+
"""A fallback context manager that logs status updates."""
|
37
|
+
|
38
|
+
def __init__(self, label: str) -> None:
|
39
|
+
self._label = label
|
40
|
+
|
41
|
+
def __enter__(self) -> "_NullStatusContext":
|
42
|
+
logging.info(f"Starting: {self._label}")
|
43
|
+
return self
|
44
|
+
|
45
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
|
46
|
+
pass
|
47
|
+
|
48
|
+
def update(self, label: str, *, state: str = "running", expanded: bool = True) -> None:
|
49
|
+
"""Update the status by logging the message."""
|
50
|
+
logging.info(f"Status update: {label} (state: {state})")
|
51
|
+
|
52
|
+
|
53
|
+
class RegistryEventHandler:
|
54
|
+
def __init__(self) -> None:
|
55
|
+
try:
|
56
|
+
import streamlit as st
|
57
|
+
|
58
|
+
if not st.runtime.exists():
|
59
|
+
self._streamlit = None
|
60
|
+
else:
|
61
|
+
self._streamlit = st
|
62
|
+
USE_STREAMLIT_WIDGETS = os.getenv("USE_STREAMLIT_WIDGETS", "1") == "1"
|
63
|
+
if not USE_STREAMLIT_WIDGETS:
|
64
|
+
self._streamlit = None
|
65
|
+
except ImportError:
|
66
|
+
self._streamlit = None
|
67
|
+
|
68
|
+
def update(self, message: str) -> None:
|
69
|
+
"""Write a message using streamlit if available, otherwise do nothing."""
|
70
|
+
if self._streamlit is not None:
|
71
|
+
self._streamlit.write(message)
|
72
|
+
|
73
|
+
def status(self, label: str, *, state: str = "running", expanded: bool = True) -> Any:
|
74
|
+
"""Context manager that provides status updates with optional enhanced display capabilities."""
|
75
|
+
if self._streamlit is None:
|
76
|
+
return _NullStatusContext(label)
|
77
|
+
else:
|
78
|
+
return self._streamlit.status(label, state=state, expanded=expanded)
|
79
|
+
|
80
|
+
|
32
81
|
class Registry:
|
33
82
|
@telemetry.send_api_usage_telemetry(project=_TELEMETRY_PROJECT, subproject=_MODEL_TELEMETRY_SUBPROJECT)
|
34
83
|
def __init__(
|
@@ -136,7 +185,7 @@ class Registry:
|
|
136
185
|
user_files: Optional[dict[str, list[str]]] = None,
|
137
186
|
code_paths: Optional[list[str]] = None,
|
138
187
|
ext_modules: Optional[list[ModuleType]] = None,
|
139
|
-
task: model_types.Task =
|
188
|
+
task: model_types.Task = task.Task.UNKNOWN,
|
140
189
|
options: Optional[model_types.ModelSaveOption] = None,
|
141
190
|
) -> ModelVersion:
|
142
191
|
"""
|
@@ -159,12 +208,12 @@ class Registry:
|
|
159
208
|
to specify a dependency. It is a recommended way to specify your dependencies using conda. When channel
|
160
209
|
is not specified, Snowflake Anaconda Channel will be used. Defaults to None.
|
161
210
|
pip_requirements: List of Pip package specifications. Defaults to None.
|
162
|
-
Models
|
163
|
-
|
164
|
-
|
165
|
-
|
211
|
+
Models running in a Snowflake Warehouse must also specify a pip artifact repository (see
|
212
|
+
`artifact_repository_map`). Otherwise, models with pip requirements are runnable only in Snowpark
|
213
|
+
Container Services. See
|
214
|
+
https://docs.snowflake.com/en/developer-guide/snowflake-ml/model-registry/container for more.
|
166
215
|
artifact_repository_map: Specifies a mapping of package channels or platforms to custom artifact
|
167
|
-
repositories. Defaults to None. Currently, the mapping applies only to
|
216
|
+
repositories. Defaults to None. Currently, the mapping applies only to Warehouse execution.
|
168
217
|
Note : This feature is currently in Public Preview.
|
169
218
|
Format: {channel_name: artifact_repository_name}, where:
|
170
219
|
- channel_name: Currently must be 'pip'.
|
@@ -172,10 +221,13 @@ class Registry:
|
|
172
221
|
`snowflake.snowpark.pypi_shared_repository`.
|
173
222
|
resource_constraint: Mapping of resource constraint keys and values, e.g. {"architecture": "x86"}.
|
174
223
|
target_platforms: List of target platforms to run the model. The only acceptable inputs are a combination of
|
175
|
-
"WAREHOUSE" and "SNOWPARK_CONTAINER_SERVICES":
|
176
|
-
- ["WAREHOUSE"]
|
177
|
-
- ["SNOWPARK_CONTAINER_SERVICES"]
|
178
|
-
|
224
|
+
"WAREHOUSE" and "SNOWPARK_CONTAINER_SERVICES", or a target platform constant:
|
225
|
+
- ["WAREHOUSE"] or snowflake.ml.model.target_platform.WAREHOUSE_ONLY (Warehouse only)
|
226
|
+
- ["SNOWPARK_CONTAINER_SERVICES"] or
|
227
|
+
snowflake.ml.model.target_platform.SNOWPARK_CONTAINER_SERVICES_ONLY
|
228
|
+
(Snowpark Container Services only)
|
229
|
+
- ["WAREHOUSE", "SNOWPARK_CONTAINER_SERVICES"] or
|
230
|
+
snowflake.ml.model.target_platform.BOTH_WAREHOUSE_AND_SNOWPARK_CONTAINER_SERVICES (Both)
|
179
231
|
Defaults to None. When None, the target platforms will be both.
|
180
232
|
python_version: Python version in which the model is run. Defaults to None.
|
181
233
|
signatures: Model data signatures for inputs and outputs for various target methods. If it is None,
|
@@ -280,7 +332,7 @@ class Registry:
|
|
280
332
|
user_files: Optional[dict[str, list[str]]] = None,
|
281
333
|
code_paths: Optional[list[str]] = None,
|
282
334
|
ext_modules: Optional[list[ModuleType]] = None,
|
283
|
-
task: model_types.Task =
|
335
|
+
task: model_types.Task = task.Task.UNKNOWN,
|
284
336
|
options: Optional[model_types.ModelSaveOption] = None,
|
285
337
|
) -> ModelVersion:
|
286
338
|
"""
|
@@ -303,12 +355,12 @@ class Registry:
|
|
303
355
|
to specify a dependency. It is a recommended way to specify your dependencies using conda. When channel
|
304
356
|
is not specified, Snowflake Anaconda Channel will be used. Defaults to None.
|
305
357
|
pip_requirements: List of Pip package specifications. Defaults to None.
|
306
|
-
Models
|
307
|
-
|
308
|
-
|
309
|
-
|
358
|
+
Models running in a Snowflake Warehouse must also specify a pip artifact repository (see
|
359
|
+
`artifact_repository_map`). Otherwise, models with pip requirements are runnable only in Snowpark
|
360
|
+
Container Services. See
|
361
|
+
https://docs.snowflake.com/en/developer-guide/snowflake-ml/model-registry/container for more.
|
310
362
|
artifact_repository_map: Specifies a mapping of package channels or platforms to custom artifact
|
311
|
-
repositories. Defaults to None. Currently, the mapping applies only to
|
363
|
+
repositories. Defaults to None. Currently, the mapping applies only to Warehouse execution.
|
312
364
|
Note : This feature is currently in Public Preview.
|
313
365
|
Format: {channel_name: artifact_repository_name}, where:
|
314
366
|
- channel_name: Currently must be 'pip'.
|
@@ -316,10 +368,13 @@ class Registry:
|
|
316
368
|
`snowflake.snowpark.pypi_shared_repository`.
|
317
369
|
resource_constraint: Mapping of resource constraint keys and values, e.g. {"architecture": "x86"}.
|
318
370
|
target_platforms: List of target platforms to run the model. The only acceptable inputs are a combination of
|
319
|
-
"WAREHOUSE" and "SNOWPARK_CONTAINER_SERVICES":
|
320
|
-
- ["WAREHOUSE"]
|
321
|
-
- ["SNOWPARK_CONTAINER_SERVICES"]
|
322
|
-
|
371
|
+
"WAREHOUSE" and "SNOWPARK_CONTAINER_SERVICES", or a target platform constant:
|
372
|
+
- ["WAREHOUSE"] or snowflake.ml.model.target_platform.WAREHOUSE_ONLY (Warehouse only)
|
373
|
+
- ["SNOWPARK_CONTAINER_SERVICES"] or
|
374
|
+
snowflake.ml.model.target_platform.SNOWPARK_CONTAINER_SERVICES_ONLY
|
375
|
+
(Snowpark Container Services only)
|
376
|
+
- ["WAREHOUSE", "SNOWPARK_CONTAINER_SERVICES"] or
|
377
|
+
snowflake.ml.model.target_platform.BOTH_WAREHOUSE_AND_SNOWPARK_CONTAINER_SERVICES (Both)
|
323
378
|
Defaults to None. When None, the target platforms will be both.
|
324
379
|
python_version: Python version in which the model is run. Defaults to None.
|
325
380
|
signatures: Model data signatures for inputs and outputs for various target methods. If it is None,
|
@@ -366,6 +421,7 @@ class Registry:
|
|
366
421
|
|
367
422
|
Raises:
|
368
423
|
ValueError: If extra arguments are specified ModelVersion is provided.
|
424
|
+
Exception: If the model logging fails.
|
369
425
|
|
370
426
|
Returns:
|
371
427
|
ModelVersion: ModelVersion object corresponding to the model just logged.
|
@@ -421,7 +477,7 @@ class Registry:
|
|
421
477
|
if task is not model_types.Task.UNKNOWN:
|
422
478
|
raise ValueError("`task` cannot be specified when calling log_model with a ModelVersion.")
|
423
479
|
|
424
|
-
if pip_requirements and not artifact_repository_map:
|
480
|
+
if pip_requirements and not artifact_repository_map and self._targets_warehouse(target_platforms):
|
425
481
|
warnings.warn(
|
426
482
|
"Models logged specifying `pip_requirements` cannot be executed in a Snowflake Warehouse "
|
427
483
|
"without specifying `artifact_repository_map`. This model can be run in Snowpark Container "
|
@@ -429,27 +485,39 @@ class Registry:
|
|
429
485
|
category=UserWarning,
|
430
486
|
stacklevel=1,
|
431
487
|
)
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
488
|
+
|
489
|
+
event_handler = RegistryEventHandler()
|
490
|
+
with event_handler.status("Logging model to registry...") as status:
|
491
|
+
# Perform the actual model logging
|
492
|
+
try:
|
493
|
+
result = self._model_manager.log_model(
|
494
|
+
model=model,
|
495
|
+
model_name=model_name,
|
496
|
+
version_name=version_name,
|
497
|
+
comment=comment,
|
498
|
+
metrics=metrics,
|
499
|
+
conda_dependencies=conda_dependencies,
|
500
|
+
pip_requirements=pip_requirements,
|
501
|
+
artifact_repository_map=artifact_repository_map,
|
502
|
+
resource_constraint=resource_constraint,
|
503
|
+
target_platforms=target_platforms,
|
504
|
+
python_version=python_version,
|
505
|
+
signatures=signatures,
|
506
|
+
sample_input_data=sample_input_data,
|
507
|
+
user_files=user_files,
|
508
|
+
code_paths=code_paths,
|
509
|
+
ext_modules=ext_modules,
|
510
|
+
task=task,
|
511
|
+
options=options,
|
512
|
+
statement_params=statement_params,
|
513
|
+
event_handler=event_handler,
|
514
|
+
)
|
515
|
+
status.update(label="Model logged successfully!", state="complete", expanded=False)
|
516
|
+
return result
|
517
|
+
except Exception as e:
|
518
|
+
event_handler.update("❌ Model logging failed!")
|
519
|
+
status.update(label="Model logging failed!", state="error", expanded=False)
|
520
|
+
raise e
|
453
521
|
|
454
522
|
@telemetry.send_api_usage_telemetry(
|
455
523
|
project=_TELEMETRY_PROJECT,
|
@@ -626,3 +694,12 @@ class Registry:
|
|
626
694
|
if not self.enable_monitoring:
|
627
695
|
raise ValueError(_MODEL_MONITORING_DISABLED_ERROR)
|
628
696
|
self._model_monitor_manager.delete_monitor(name)
|
697
|
+
|
698
|
+
@staticmethod
|
699
|
+
def _targets_warehouse(target_platforms: Optional[list[model_types.SupportedTargetPlatformType]]) -> bool:
|
700
|
+
"""Returns True if warehouse is a target platform (None defaults to True)."""
|
701
|
+
return (
|
702
|
+
target_platforms is None
|
703
|
+
or model_types.TargetPlatform.WAREHOUSE in target_platforms
|
704
|
+
or "WAREHOUSE" in target_platforms
|
705
|
+
)
|
snowflake/ml/version.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# This is parsed by regex in conda recipe meta file. Make sure not to break it.
|
2
|
-
VERSION = "1.
|
2
|
+
VERSION = "1.9.0"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: snowflake-ml-python
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.9.0
|
4
4
|
Summary: The machine learning client library that is used for interacting with Snowflake to build machine learning solutions.
|
5
5
|
Author-email: "Snowflake, Inc" <support@snowflake.com>
|
6
6
|
License:
|
@@ -408,13 +408,48 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
|
|
408
408
|
|
409
409
|
# Release History
|
410
410
|
|
411
|
+
## 1.9.0
|
412
|
+
|
413
|
+
### Bug Fixes
|
414
|
+
|
415
|
+
- Registry: Fixed bug causing snowpark to pandas dataframe conversion to fail when `QUOTED_IDENTIFIERS_IGNORE_CASE`
|
416
|
+
parameter is enabled
|
417
|
+
- Registry: Fixed duplicate UserWarning logs during model packaging
|
418
|
+
|
419
|
+
### Behavior Changes
|
420
|
+
|
421
|
+
- ML Job: The `list_jobs()` API has been modified. The `scope` parameter has been removed,
|
422
|
+
optional `database` and `schema` parameters have been added, the return type has changed
|
423
|
+
from `snowpark.DataFrame` to `pandas.DataFrame`, and the returned columns have been updated
|
424
|
+
to `name`, `status`, `message`, `database_name`, `schema_name`, `owner`, `compute_pool`,
|
425
|
+
`target_instances`, `created_time`, and `completed_time`.
|
426
|
+
- Registry: Set `relax_version` to false when pip_requirements are specified while logging model
|
427
|
+
- Registry: UserWarning will now be raised based on specified target_platforms (addresses spurious warnings)
|
428
|
+
|
429
|
+
### New Features
|
430
|
+
|
431
|
+
- Registry: `target_platforms` supports `TargetPlatformMode`: `WAREHOUSE_ONLY`, `SNOWPARK_CONTAINER_SERVICES_ONLY`,
|
432
|
+
or `BOTH_WAREHOUSE_AND_SNOWPARK_CONTAINER_SERVICES`.
|
433
|
+
- Registry: Introduce `snowflake.ml.model.target_platform.TargetPlatform`, target platform constants, and
|
434
|
+
`snowflake.ml.model.task.Task`.
|
435
|
+
- ML Job: Single-node ML Jobs are now in GA. Multi-node support is now in PuPr
|
436
|
+
- Moved less frequently used job submission parameters to `**kwargs`
|
437
|
+
- Platform metrics are now enabled by default
|
438
|
+
- `list_jobs()` behavior changed, see [Behavior Changes](#behavior-changes) for more info
|
439
|
+
|
411
440
|
## 1.8.6
|
412
441
|
|
413
442
|
### Bug Fixes
|
414
443
|
|
444
|
+
- Fixed fatal errors from internal telemetry wrappers.
|
445
|
+
|
415
446
|
### New Features
|
416
447
|
|
417
448
|
- Registry: Add service container info to logs.
|
449
|
+
- ML Job (PuPr): Add new `submit_from_stage()` API for submitting a payload from an existing stage path.
|
450
|
+
- ML Job (PuPr): Add support for `snowpark.Session` objects in the argument list of
|
451
|
+
`@remote` decorated functions. `Session` object will be injected from context in
|
452
|
+
the job execution environment.
|
418
453
|
|
419
454
|
## 1.8.5
|
420
455
|
|
@@ -425,17 +460,17 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
|
|
425
460
|
- Explainability: bump minimum streamlit version down to 1.30
|
426
461
|
- Modeling: Make XGBoost a required dependency (xgboost is not a required dependency in snowflake-ml-python 1.8.4).
|
427
462
|
|
428
|
-
###
|
463
|
+
### Behavior Changes
|
429
464
|
|
430
|
-
- ML Job: Rename argument `num_instances` to `target_instances` in job submission APIs and
|
465
|
+
- ML Job (Multi-node PrPr): Rename argument `num_instances` to `target_instances` in job submission APIs and
|
431
466
|
change type from `Optional[int]` to `int`
|
432
467
|
|
433
468
|
### New Features
|
434
469
|
|
435
470
|
- Registry: No longer checks if the snowflake-ml-python version is available in the Snowflake Conda channel when logging
|
436
471
|
an SPCS-only model.
|
437
|
-
- ML Job: Add `min_instances` argument to the job decorator to allow waiting for workers to be ready.
|
438
|
-
- ML Job: Adjust polling behavior to reduce number of SQL calls.
|
472
|
+
- ML Job (PuPr): Add `min_instances` argument to the job decorator to allow waiting for workers to be ready.
|
473
|
+
- ML Job (PuPr): Adjust polling behavior to reduce number of SQL calls.
|
439
474
|
|
440
475
|
### Deprecations
|
441
476
|
|
@@ -450,18 +485,19 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
|
|
450
485
|
- Registry: Fixed a bug when logging pytroch and tensorflow models that caused
|
451
486
|
`UnboundLocalError: local variable 'multiple_inputs' referenced before assignment`.
|
452
487
|
|
453
|
-
###
|
488
|
+
### Behavior Changes
|
454
489
|
|
455
|
-
- ML Job
|
456
|
-
|
490
|
+
- ML Job (PuPr) Updated property `id` to be fully qualified name; Introduced new property `name`
|
491
|
+
to represent the ML Job name
|
492
|
+
- ML Job (PuPr) Modified `list_jobs()` to return ML Job `name` instead of `id`
|
457
493
|
- Registry: Error in `log_model` if `enable_explainability` is True and model is only deployed to
|
458
494
|
Snowpark Container Services, instead of just user warning.
|
459
495
|
|
460
496
|
### New Features
|
461
497
|
|
462
|
-
- ML Job: Extend `@remote` function decorator, `submit_file()` and `submit_directory()` to accept `database` and
|
498
|
+
- ML Job (PuPr): Extend `@remote` function decorator, `submit_file()` and `submit_directory()` to accept `database` and
|
463
499
|
`schema` parameters
|
464
|
-
- ML Job: Support querying by fully qualified name in `get_job()`
|
500
|
+
- ML Job (PuPr): Support querying by fully qualified name in `get_job()`
|
465
501
|
- Explainability: Added visualization functions to `snowflake.ml.monitoring` to plot explanations in notebooks.
|
466
502
|
- Explainability: Support explain for categorical transforms for sklearn pipeline
|
467
503
|
- Support categorical type for `xgboost.DMatrix` inputs.
|
@@ -471,7 +507,7 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
|
|
471
507
|
### New Features
|
472
508
|
|
473
509
|
- Registry: Default to the runtime cuda version if available when logging a GPU model in Container Runtime.
|
474
|
-
- ML Job: Added `as_list` argument to `MLJob.get_logs()` to enable retrieving logs
|
510
|
+
- ML Job (PuPr): Added `as_list` argument to `MLJob.get_logs()` to enable retrieving logs
|
475
511
|
as a list of strings
|
476
512
|
- Registry: Support `ModelVersion.run_job` to run inference with a single-node Snowpark Container Services job.
|
477
513
|
- DataConnector: Removed PrPr decorators
|
@@ -482,11 +518,11 @@ NOTE: Version 1.7.0 is used as example here. Please choose the the latest versio
|
|
482
518
|
### New Features
|
483
519
|
|
484
520
|
- ML Job now available as a PuPr feature
|
485
|
-
-
|
486
|
-
|
487
|
-
|
488
|
-
-
|
489
|
-
|
521
|
+
- Add ability to retrieve results for `@remote` decorated functions using
|
522
|
+
new `MLJobWithResult.result()` API, which will return the unpickled result
|
523
|
+
or raise an exception if the job execution failed.
|
524
|
+
- Pre-created Snowpark Session is now available inside job payloads using
|
525
|
+
`snowflake.snowpark.context.get_active_session()`
|
490
526
|
- Registry: Introducing `save_location` to `log_model` using the `options` argument.
|
491
527
|
User's can provide the path to write the model version's files that get stored in Snowflake's stage.
|
492
528
|
|
@@ -10,7 +10,7 @@ snowflake/cortex/_sse_client.py,sha256=sLYgqAfTOPADCnaWH2RWAJi8KbU_7gSRsTUDcDD5T
|
|
10
10
|
snowflake/cortex/_summarize.py,sha256=7GH8zqfIdOiHA5w4b6EvJEKEWhaTrL4YA6iDGbn7BNM,1307
|
11
11
|
snowflake/cortex/_translate.py,sha256=9ZGjvAnJFisbzJ_bXnt4pyug5UzhHJRXW8AhGQEersM,1652
|
12
12
|
snowflake/cortex/_util.py,sha256=krNTpbkFLXwdFqy1bd0xi7ZmOzOHRnIfHdQCPiLZJxk,3288
|
13
|
-
snowflake/ml/version.py,sha256=
|
13
|
+
snowflake/ml/version.py,sha256=UTrGrSYSFfbGixnYeTcCTHPZkoH52lAVaVnxGidBygY,98
|
14
14
|
snowflake/ml/_internal/env.py,sha256=EY_2KVe8oR3LgKWdaeRb5rRU-NDNXJppPDsFJmMZUUY,265
|
15
15
|
snowflake/ml/_internal/env_utils.py,sha256=tzz8BziiwJEnZwkzDEYCMO20Sb-mnXwDtSakGfgG--M,29364
|
16
16
|
snowflake/ml/_internal/file_utils.py,sha256=7sA6loOeSfmGP4yx16P4usT9ZtRqG3ycnXu7_Tk7dOs,14206
|
@@ -37,9 +37,10 @@ snowflake/ml/_internal/lineage/lineage_utils.py,sha256=-_PKuznsL_w38rVj3wXgbPdm6
|
|
37
37
|
snowflake/ml/_internal/utils/connection_params.py,sha256=ejtI-_vYt7tpxCZKjOBzuGyrOxh251xc-ekahQP9XZ4,8196
|
38
38
|
snowflake/ml/_internal/utils/db_utils.py,sha256=HlxdMrgV8UpnxvfKDM-ZR5N566eWZLC-mE291ByrPEQ,1662
|
39
39
|
snowflake/ml/_internal/utils/formatting.py,sha256=PswZ6Xas7sx3Ok1MBLoH2o7nfXOxaJqpUPg_UqXrQb8,3676
|
40
|
-
snowflake/ml/_internal/utils/identifier.py,sha256=
|
40
|
+
snowflake/ml/_internal/utils/identifier.py,sha256=HrcCBOyn93fRjMj4K1YJG37ONtw7e3EZnt29LzhEgLA,12586
|
41
41
|
snowflake/ml/_internal/utils/import_utils.py,sha256=msvUDaCcJpAcNCS-5Ynz4F1CvUhXjRsuZyOv1rN6Yhk,3213
|
42
42
|
snowflake/ml/_internal/utils/jwt_generator.py,sha256=bj7Ltnw68WjRcxtV9t5xrTRvV5ETnvovB-o3Y8QWNBg,5357
|
43
|
+
snowflake/ml/_internal/utils/mixins.py,sha256=ZE76Oc7EEbPtlwtm1oALozKdjQATE4n3WzhkNQeiUZg,2847
|
43
44
|
snowflake/ml/_internal/utils/parallelize.py,sha256=l8Zjo-hp8zqoLgHxBlpz9Zmn2Z-MRQ0fS_NnrR4jWR8,4522
|
44
45
|
snowflake/ml/_internal/utils/pkg_version_utils.py,sha256=EaY_3IsVOZ9BCH28F5VLjp-0AiEqDlL7L715vkPsgrY,5149
|
45
46
|
snowflake/ml/_internal/utils/query_result_checker.py,sha256=1PR41Xn9BUIXvp-UmJ9FgEbj8WfgU7RUhz3PqvvVQ5E,10656
|
@@ -95,14 +96,15 @@ snowflake/ml/fileset/sfcfs.py,sha256=FJFc9-gc0KXaNyc10ZovN_87aUCShb0WztVwa02t0io
|
|
95
96
|
snowflake/ml/fileset/snowfs.py,sha256=uF5QluYtiJ-HezGIhF55dONi3t0E6N7ByaVAIAlM3nk,5133
|
96
97
|
snowflake/ml/fileset/stage_fs.py,sha256=V4pysouSKKDPLzuW3u_extxfvjkQa5OlwIRES9Srpzo,20151
|
97
98
|
snowflake/ml/jobs/__init__.py,sha256=v-v9-SA1Vy-M98B31-NlqJgpI6uEg9jEEghJLub1RUY,468
|
98
|
-
snowflake/ml/jobs/decorators.py,sha256=
|
99
|
-
snowflake/ml/jobs/job.py,sha256=
|
100
|
-
snowflake/ml/jobs/manager.py,sha256=
|
101
|
-
snowflake/ml/jobs/_utils/constants.py,sha256=
|
99
|
+
snowflake/ml/jobs/decorators.py,sha256=mQgdWvvCwD7q79cSFKZHKegXGh2j1u8WM64UD3lCKr4,3428
|
100
|
+
snowflake/ml/jobs/job.py,sha256=0DXIl8CM7Ld9_GQOo0r5cAChf48j8uiGX1ye9MdvYMw,21945
|
101
|
+
snowflake/ml/jobs/manager.py,sha256=XjKGQPVO1i1nzyAx3KPiQY37Mstz-O5Qr-UFZaSlqqc,21384
|
102
|
+
snowflake/ml/jobs/_utils/constants.py,sha256=tFZzFcWNA1okEjhjrfsDwa9ugb2qVdhk3csVOwk95E8,3642
|
102
103
|
snowflake/ml/jobs/_utils/function_payload_utils.py,sha256=4LBaStMdhRxcqwRkwFje-WwiEKRWnBfkaOYouF3N3Kg,1308
|
103
|
-
snowflake/ml/jobs/_utils/interop_utils.py,sha256=
|
104
|
-
snowflake/ml/jobs/_utils/payload_utils.py,sha256=
|
105
|
-
snowflake/ml/jobs/_utils/
|
104
|
+
snowflake/ml/jobs/_utils/interop_utils.py,sha256=7mODMTjKCLXkJloACG6_9b2wvmRgjXF0Jx3wpWYyJeA,21413
|
105
|
+
snowflake/ml/jobs/_utils/payload_utils.py,sha256=Fjf5mZpgsleZsPA9lFJELnb80mEB3Lkwb0sYiU2xmnM,24362
|
106
|
+
snowflake/ml/jobs/_utils/query_helper.py,sha256=vCRA3TqSo77L0xJcDjGhojxAD6SHDPLDVh4HGqOJx1Q,386
|
107
|
+
snowflake/ml/jobs/_utils/spec_utils.py,sha256=bwAvRiV4VUffWC1iFQO8kIv9q__11WFeXjnSPr9bB1Y,13254
|
106
108
|
snowflake/ml/jobs/_utils/stage_utils.py,sha256=RrJPKHFBmEqOoRe3Lr9ypq0A-tuf8uqmfzxAy-yo9o4,4053
|
107
109
|
snowflake/ml/jobs/_utils/types.py,sha256=l4onybhHhW1hhsbtXVhJ_RmzptClAPHY-fZRTIIcSLY,1087
|
108
110
|
snowflake/ml/jobs/_utils/scripts/constants.py,sha256=PtqQp-KFUjsBBoQIs5TyphmauYJzd5R1m4L31FOWBr0,912
|
@@ -115,14 +117,16 @@ snowflake/ml/lineage/lineage_node.py,sha256=jCxCwQRvUkH-5nyF1PvdKAyRombOjWDYs5ZJ
|
|
115
117
|
snowflake/ml/model/__init__.py,sha256=EvPtblqPN6_T6dyVfaYUxCfo_M7D2CQ1OR5giIH4TsQ,314
|
116
118
|
snowflake/ml/model/custom_model.py,sha256=fDhMObqlyzD_qQG1Bq6HHkBN1w3Qzg9e81JWPiqRfc4,12249
|
117
119
|
snowflake/ml/model/model_signature.py,sha256=bVRdMx4JEj31gLe2dr10y7aVy9fPDfPlcKYlE1NBOeQ,32265
|
118
|
-
snowflake/ml/model/
|
120
|
+
snowflake/ml/model/target_platform.py,sha256=H5d-wtuKQyVlq9x33vPtYZAlR5ka0ytcKRYgwlKl0bQ,390
|
121
|
+
snowflake/ml/model/task.py,sha256=Zp5JaLB-YfX5p_HSaw81P3J7UnycQq5EMa87A35VOaQ,286
|
122
|
+
snowflake/ml/model/type_hints.py,sha256=F0EW6lbSpZyv5prXc7HBZkPga6LeeCdBpV59CfLdUI4,9309
|
119
123
|
snowflake/ml/model/_client/model/model_impl.py,sha256=Yabrbir5vPMOnsVmQJ23YN7vqhi756Jcm6pfO8Aq92o,17469
|
120
124
|
snowflake/ml/model/_client/model/model_version_impl.py,sha256=TGBSIr4JrdxSfFZyd9G0jW4CKW0aP-ReY4ZNb05CJyY,47033
|
121
125
|
snowflake/ml/model/_client/ops/metadata_ops.py,sha256=qpK6PL3OyfuhyOmpvLCpHLy6vCxbZbp1HlEvakFGwv4,4884
|
122
|
-
snowflake/ml/model/_client/ops/model_ops.py,sha256
|
123
|
-
snowflake/ml/model/_client/ops/service_ops.py,sha256=
|
126
|
+
snowflake/ml/model/_client/ops/model_ops.py,sha256=z3T71w9ZNIU5eEA5G59Ous59WzEBs3YBcPO1_zeMI8M,48586
|
127
|
+
snowflake/ml/model/_client/ops/service_ops.py,sha256=LqwuIYwlT0RDinM9dUzPBF3v5ZoZZ5KcaJymEDboObQ,29401
|
124
128
|
snowflake/ml/model/_client/service/model_deployment_spec.py,sha256=V1j1WJ-gYrXN9SBsbg-908MbsJejl86rmaXHg4-tZiw,17508
|
125
|
-
snowflake/ml/model/_client/service/model_deployment_spec_schema.py,sha256=
|
129
|
+
snowflake/ml/model/_client/service/model_deployment_spec_schema.py,sha256=sQ13qPYSe3Po-gZDT0ZCOa3-n6zdK1ggln5AcrCY1tw,1948
|
126
130
|
snowflake/ml/model/_client/sql/_base.py,sha256=Qrm8M92g3MHb-QnSLUlbd8iVKCRxLhG_zr5M2qmXwJ8,1473
|
127
131
|
snowflake/ml/model/_client/sql/model.py,sha256=nstZ8zR7MkXVEfhqLt7PWMik6dZr06nzq7VsF5NVNow,5840
|
128
132
|
snowflake/ml/model/_client/sql/model_version.py,sha256=QwzFlDH5laTqK2qF7SJQSbt28DgspWj3R11l-yD1Da0,23496
|
@@ -130,7 +134,7 @@ snowflake/ml/model/_client/sql/service.py,sha256=i8BDpFs7AJQ8D8UXcE4rW_iNJbXGUYt
|
|
130
134
|
snowflake/ml/model/_client/sql/stage.py,sha256=2gxYNtmEXricwxeACVUr63OUDCy_iQvCi-kRT4qQtBA,887
|
131
135
|
snowflake/ml/model/_client/sql/tag.py,sha256=9sI0VoldKmsfToWSjMQddozPPGCxYUI6n0gPBiqd6x8,4333
|
132
136
|
snowflake/ml/model/_model_composer/model_composer.py,sha256=SJyaw8Pcp-n_VYLEraIxrispRYMkIU90DuEisZj4z-U,11631
|
133
|
-
snowflake/ml/model/_model_composer/model_manifest/model_manifest.py,sha256=
|
137
|
+
snowflake/ml/model/_model_composer/model_manifest/model_manifest.py,sha256=Ux7YBWhnv_jsyzV0Z2bAab7kWRjt1Dz_fa2Nh1Vwh-8,10628
|
134
138
|
snowflake/ml/model/_model_composer/model_manifest/model_manifest_schema.py,sha256=eqv-4-tvA9Lgrp7kQAQGS_CJVR9D6uOd8-SxADNOkeM,2887
|
135
139
|
snowflake/ml/model/_model_composer/model_method/constants.py,sha256=hoJwIopSdZiYn0fGq15_NiirC0l02d5LEs2D-4J_tPk,35
|
136
140
|
snowflake/ml/model/_model_composer/model_method/function_generator.py,sha256=nnUJki3bJVCTF3gZ-usZW3xQ6wwlJ08EfNsPAgsnI3s,2625
|
@@ -141,7 +145,7 @@ snowflake/ml/model/_model_composer/model_method/model_method.py,sha256=NhTAkjRlf
|
|
141
145
|
snowflake/ml/model/_model_composer/model_user_file/model_user_file.py,sha256=dYNgg8P9p6nRH47-OLxZIbt_Ja3t1VPGNQ0qJtpGuAw,1018
|
142
146
|
snowflake/ml/model/_packager/model_handler.py,sha256=qZB5FVRWZD5wDdm6vuuoXnDFar7i2nHarbe8iZRCLPo,2630
|
143
147
|
snowflake/ml/model/_packager/model_packager.py,sha256=FBuepy_W8ZTd4gsQHLnCj-EhO0H2wvjL556YRKOKsO8,6061
|
144
|
-
snowflake/ml/model/_packager/model_env/model_env.py,sha256=
|
148
|
+
snowflake/ml/model/_packager/model_env/model_env.py,sha256=tWZVz0KOt5CixAk5P317XzdejNPbN3EG_oWlIg-9EC0,19571
|
145
149
|
snowflake/ml/model/_packager/model_handlers/_base.py,sha256=OZhGv7nyej3PqaoBz021uGa40T06d9rv-kDcKUY3VnM,7152
|
146
150
|
snowflake/ml/model/_packager/model_handlers/_utils.py,sha256=8y-LfiBfoj2txQD4Yh_GM0eEEOrm1S0R1149J5z31O0,12572
|
147
151
|
snowflake/ml/model/_packager/model_handlers/catboost.py,sha256=dbI2QizGZS04l6ehgXb3oy5YSXrlwRHz8YENVefEbms,10676
|
@@ -150,7 +154,7 @@ snowflake/ml/model/_packager/model_handlers/huggingface_pipeline.py,sha256=dBxSq
|
|
150
154
|
snowflake/ml/model/_packager/model_handlers/keras.py,sha256=JKBCiJEjc41zaoEhsen7rnlyPo2RBuEqG9Vq6JR_Cq0,8696
|
151
155
|
snowflake/ml/model/_packager/model_handlers/lightgbm.py,sha256=DAFMiqpXEUmKqeq5rgn5j6rtuwScNnuiMUBwS4OyC7Q,11074
|
152
156
|
snowflake/ml/model/_packager/model_handlers/mlflow.py,sha256=xSpoXO0UOfBUpzx2W1O8P2WF0Xi1vrZ_J-DdgzQG0o8,9177
|
153
|
-
snowflake/ml/model/_packager/model_handlers/pytorch.py,sha256=
|
157
|
+
snowflake/ml/model/_packager/model_handlers/pytorch.py,sha256=mF-pzH1kqL7egpYA3kP1NVwOLNPYdOViEkywdzRXYJc,9867
|
154
158
|
snowflake/ml/model/_packager/model_handlers/sentence_transformers.py,sha256=sKp-bt-fAnruDMZJ5cN6F_m9dJRY0G2FjJ4-KjNLgcg,11380
|
155
159
|
snowflake/ml/model/_packager/model_handlers/sklearn.py,sha256=dH6S7FhJBqVOWPPXyEhN9Kj9tzDdDrD0phaGacoXQ14,18094
|
156
160
|
snowflake/ml/model/_packager/model_handlers/snowmlmodel.py,sha256=uvz-hosuNbtcQFprnS8GzjnM8fWULBDMRbXq8immW9Q,18352
|
@@ -163,7 +167,7 @@ snowflake/ml/model/_packager/model_handlers_migrator/tensorflow_migrator_2023_12
|
|
163
167
|
snowflake/ml/model/_packager/model_handlers_migrator/tensorflow_migrator_2025_01_01.py,sha256=0DxwZtXFgXpxb5LQEAfTUfEFV7zgbG4j3F-oNHLkTgE,769
|
164
168
|
snowflake/ml/model/_packager/model_handlers_migrator/torchscript_migrator_2023_12_01.py,sha256=MDOAGV6kML9sJh_hnYjnrPH4GtECP5DDCjaRT7NmYpU,768
|
165
169
|
snowflake/ml/model/_packager/model_meta/model_blob_meta.py,sha256=CzY_MhiSshKi9dWzXc4lrC9PysU0FCdHG2oRlz1vCb8,1943
|
166
|
-
snowflake/ml/model/_packager/model_meta/model_meta.py,sha256=
|
170
|
+
snowflake/ml/model/_packager/model_meta/model_meta.py,sha256=CctjNVwdC7ghVIPqbhb62t43SOFsmk2j2FdoZMZ8KXs,20063
|
167
171
|
snowflake/ml/model/_packager/model_meta/model_meta_schema.py,sha256=e4TUbWl998xQOZUzEWvb9CrUyHwGHBGb0TNbtezAeQ0,3707
|
168
172
|
snowflake/ml/model/_packager/model_meta_migrator/base_migrator.py,sha256=8zTgq3n6TBXv7Vcwmf7b9wjK3m-9HHMsY0Qy1Rs-sZ4,1305
|
169
173
|
snowflake/ml/model/_packager/model_meta_migrator/migrator_plans.py,sha256=5butM-lyaDRhCAO2BaCOIQufpAxAfSAinsNuGqbbjMU,1029
|
@@ -178,7 +182,7 @@ snowflake/ml/model/_signatures/dmatrix_handler.py,sha256=ldcWqadJ9fJp9cOaZ3Mn-hT
|
|
178
182
|
snowflake/ml/model/_signatures/numpy_handler.py,sha256=xy7mBEAs9U5eM8F51NLabLbWXRmyQUffhVweO6jmLBA,5461
|
179
183
|
snowflake/ml/model/_signatures/pandas_handler.py,sha256=rYgSaqdh8d-w22e_ZDt4kCFCkPWEhs-KwL9wyoLUacI,10704
|
180
184
|
snowflake/ml/model/_signatures/pytorch_handler.py,sha256=Xy-ITCCX_EgHcyIIqeYSDUIvE2kiqECa8swy1hmohyc,5036
|
181
|
-
snowflake/ml/model/_signatures/snowpark_handler.py,sha256=
|
185
|
+
snowflake/ml/model/_signatures/snowpark_handler.py,sha256=YOBC_Wx-H8bQ967A47nYgqcqLjEA15FbZK69TyAEgvU,7590
|
182
186
|
snowflake/ml/model/_signatures/tensorflow_handler.py,sha256=_yrvMg-w_jJoYuyrGXKPX4Dv7Vt8z1e6xIKiWGuZcc4,5660
|
183
187
|
snowflake/ml/model/_signatures/utils.py,sha256=WLaHpb-4BPB7IBFg2sOkH2N7AojXt2PQR7M8hmtNkXA,17164
|
184
188
|
snowflake/ml/model/models/huggingface_pipeline.py,sha256=7tYyhcqLATtzidWBAnip0qSsUstqtLBaiCUO78qgMvY,10311
|
@@ -329,7 +333,7 @@ snowflake/ml/modeling/metrics/__init__.py,sha256=1lc1DCVNeo7D-gvvCjmpI5tFIIrOsEd
|
|
329
333
|
snowflake/ml/modeling/metrics/classification.py,sha256=E-Dx3xSmZQrF_MXf2BHAjrDstbCXVyU5g6x6CeizosQ,66411
|
330
334
|
snowflake/ml/modeling/metrics/correlation.py,sha256=Roi17Sx5F81VlJaLQTeBAe5qZ7sZYc31UkIuC6z4qkQ,4803
|
331
335
|
snowflake/ml/modeling/metrics/covariance.py,sha256=HxJK1mwyt6lMSg8yonHFQ8IxAEa62MHeb1M3eHEtqlk,4672
|
332
|
-
snowflake/ml/modeling/metrics/metrics_utils.py,sha256=
|
336
|
+
snowflake/ml/modeling/metrics/metrics_utils.py,sha256=XuAjYfL437LCeBY8RMElunk8jgVzemAgln573JzS3Qk,13315
|
333
337
|
snowflake/ml/modeling/metrics/ranking.py,sha256=znjIIRkGqnGzid7BAGhBowGHbau7mTV5gc-RY_HVfoQ,17760
|
334
338
|
snowflake/ml/modeling/metrics/regression.py,sha256=TcqnADqfL9_1XY47HQeul09t3DMPBkPSVtHP5Z9SyV4,26043
|
335
339
|
snowflake/ml/modeling/mixture/__init__.py,sha256=rY5qSOkHj59bHiTV6LhBiEhUA0StoCb0ACNR2vkV4v0,297
|
@@ -408,15 +412,15 @@ snowflake/ml/monitoring/_client/queries/rmse.ssql,sha256=OEJiSStRz9-qKoZaFvmubtY
|
|
408
412
|
snowflake/ml/monitoring/_manager/model_monitor_manager.py,sha256=0jpT1-aRU2tsxSM87I-C2kfJeLevCgM-a-OwU_-VUdI,10302
|
409
413
|
snowflake/ml/monitoring/entities/model_monitor_config.py,sha256=1W6TFTPicC6YAbjD7A0w8WMhWireyUxyuEy0RQXmqyY,1787
|
410
414
|
snowflake/ml/registry/__init__.py,sha256=XdPQK9ejYkSJVrSQ7HD3jKQO0hKq2mC4bPCB6qrtH3U,76
|
411
|
-
snowflake/ml/registry/registry.py,sha256=
|
412
|
-
snowflake/ml/registry/_manager/model_manager.py,sha256=
|
415
|
+
snowflake/ml/registry/registry.py,sha256=D87X05zQG4HRkWX3SF0Zf_2Pn2PwDixx-9i4btuVkBU,34932
|
416
|
+
snowflake/ml/registry/_manager/model_manager.py,sha256=rqtpWL6epksv7k1syOoQUTFKApmSuzArGfsEbEx6tfE,18811
|
413
417
|
snowflake/ml/utils/authentication.py,sha256=E1at4TIAQRDZDsMXSbrKvSJaT6_kSYJBkkr37vU9P2s,2606
|
414
418
|
snowflake/ml/utils/connection_params.py,sha256=JuadbzKlgDZLZ5vJ9cnyAiSitvZT9jGSfSSNjIY9P1Q,8282
|
415
419
|
snowflake/ml/utils/html_utils.py,sha256=L4pzpvFd20SIk4rie2kTAtcQjbxBHfjKmxonMAT2OoA,7665
|
416
420
|
snowflake/ml/utils/sparse.py,sha256=zLBNh-ynhGpKH5TFtopk0YLkHGvv0yq1q-sV59YQKgg,3819
|
417
421
|
snowflake/ml/utils/sql_client.py,sha256=pSe2od6Pkh-8NwG3D-xqN76_uNf-ohOtVbT55HeQg1Y,668
|
418
|
-
snowflake_ml_python-1.
|
419
|
-
snowflake_ml_python-1.
|
420
|
-
snowflake_ml_python-1.
|
421
|
-
snowflake_ml_python-1.
|
422
|
-
snowflake_ml_python-1.
|
422
|
+
snowflake_ml_python-1.9.0.dist-info/licenses/LICENSE.txt,sha256=PdEp56Av5m3_kl21iFkVTX_EbHJKFGEdmYeIO1pL_Yk,11365
|
423
|
+
snowflake_ml_python-1.9.0.dist-info/METADATA,sha256=H98YP36JCenEz7IdiYeStZWdsP0ourCqqBFD2RZ1_sg,87105
|
424
|
+
snowflake_ml_python-1.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
425
|
+
snowflake_ml_python-1.9.0.dist-info/top_level.txt,sha256=TY0gFSHKDdZy3THb0FGomyikWQasEGldIR1O0HGOHVw,10
|
426
|
+
snowflake_ml_python-1.9.0.dist-info/RECORD,,
|
File without changes
|
{snowflake_ml_python-1.8.6.dist-info → snowflake_ml_python-1.9.0.dist-info}/licenses/LICENSE.txt
RENAMED
File without changes
|
File without changes
|