snowflake-ml-python 1.6.2__py3-none-any.whl → 1.6.3__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.
Files changed (262) hide show
  1. snowflake/cortex/__init__.py +4 -0
  2. snowflake/cortex/_classify_text.py +2 -2
  3. snowflake/cortex/_embed_text_1024.py +37 -0
  4. snowflake/cortex/_embed_text_768.py +37 -0
  5. snowflake/cortex/_extract_answer.py +2 -2
  6. snowflake/cortex/_sentiment.py +2 -2
  7. snowflake/cortex/_summarize.py +2 -2
  8. snowflake/cortex/_translate.py +2 -2
  9. snowflake/cortex/_util.py +4 -4
  10. snowflake/ml/_internal/env_utils.py +5 -5
  11. snowflake/ml/_internal/exceptions/error_codes.py +2 -0
  12. snowflake/ml/_internal/utils/db_utils.py +50 -0
  13. snowflake/ml/_internal/utils/service_logger.py +63 -0
  14. snowflake/ml/_internal/utils/sql_identifier.py +25 -1
  15. snowflake/ml/data/_internal/arrow_ingestor.py +1 -11
  16. snowflake/ml/data/ingestor_utils.py +20 -10
  17. snowflake/ml/feature_store/access_manager.py +3 -3
  18. snowflake/ml/feature_store/feature_store.py +19 -2
  19. snowflake/ml/feature_store/feature_view.py +82 -28
  20. snowflake/ml/fileset/stage_fs.py +2 -1
  21. snowflake/ml/lineage/lineage_node.py +7 -2
  22. snowflake/ml/model/__init__.py +1 -2
  23. snowflake/ml/model/_client/model/model_version_impl.py +78 -9
  24. snowflake/ml/model/_client/ops/model_ops.py +89 -7
  25. snowflake/ml/model/_client/ops/service_ops.py +200 -91
  26. snowflake/ml/model/_client/service/model_deployment_spec.py +4 -0
  27. snowflake/ml/model/_client/service/model_deployment_spec_schema.py +1 -0
  28. snowflake/ml/model/_client/sql/_base.py +5 -0
  29. snowflake/ml/model/_client/sql/model.py +1 -0
  30. snowflake/ml/model/_client/sql/model_version.py +9 -5
  31. snowflake/ml/model/_client/sql/service.py +47 -13
  32. snowflake/ml/model/_model_composer/model_composer.py +11 -41
  33. snowflake/ml/model/_model_composer/model_manifest/model_manifest.py +29 -4
  34. snowflake/ml/model/_packager/model_env/model_env.py +4 -38
  35. snowflake/ml/model/_packager/model_handlers/_utils.py +106 -32
  36. snowflake/ml/model/_packager/model_handlers/catboost.py +26 -27
  37. snowflake/ml/model/_packager/model_handlers/huggingface_pipeline.py +3 -3
  38. snowflake/ml/model/_packager/model_handlers/lightgbm.py +21 -6
  39. snowflake/ml/model/_packager/model_handlers/mlflow.py +3 -5
  40. snowflake/ml/model/_packager/model_handlers/model_objective_utils.py +111 -58
  41. snowflake/ml/model/_packager/model_handlers/sentence_transformers.py +15 -8
  42. snowflake/ml/model/_packager/model_handlers/sklearn.py +50 -66
  43. snowflake/ml/model/_packager/model_handlers/snowmlmodel.py +36 -17
  44. snowflake/ml/model/_packager/model_handlers/xgboost.py +22 -7
  45. snowflake/ml/model/_packager/model_meta/model_meta.py +16 -45
  46. snowflake/ml/model/_packager/model_meta/model_meta_schema.py +1 -6
  47. snowflake/ml/model/_packager/model_packager.py +14 -10
  48. snowflake/ml/model/_packager/model_runtime/model_runtime.py +11 -0
  49. snowflake/ml/model/_signatures/snowpark_handler.py +3 -2
  50. snowflake/ml/model/type_hints.py +11 -152
  51. snowflake/ml/modeling/_internal/snowpark_implementations/distributed_hpo_trainer.py +0 -2
  52. snowflake/ml/modeling/_internal/snowpark_implementations/snowpark_trainer.py +17 -6
  53. snowflake/ml/modeling/_internal/snowpark_implementations/xgboost_external_memory_trainer.py +0 -1
  54. snowflake/ml/modeling/calibration/calibrated_classifier_cv.py +1 -0
  55. snowflake/ml/modeling/cluster/affinity_propagation.py +1 -0
  56. snowflake/ml/modeling/cluster/agglomerative_clustering.py +1 -0
  57. snowflake/ml/modeling/cluster/birch.py +1 -0
  58. snowflake/ml/modeling/cluster/bisecting_k_means.py +1 -0
  59. snowflake/ml/modeling/cluster/dbscan.py +1 -0
  60. snowflake/ml/modeling/cluster/feature_agglomeration.py +1 -0
  61. snowflake/ml/modeling/cluster/k_means.py +1 -0
  62. snowflake/ml/modeling/cluster/mean_shift.py +1 -0
  63. snowflake/ml/modeling/cluster/mini_batch_k_means.py +1 -0
  64. snowflake/ml/modeling/cluster/optics.py +1 -0
  65. snowflake/ml/modeling/cluster/spectral_biclustering.py +1 -0
  66. snowflake/ml/modeling/cluster/spectral_clustering.py +1 -0
  67. snowflake/ml/modeling/cluster/spectral_coclustering.py +1 -0
  68. snowflake/ml/modeling/compose/column_transformer.py +1 -0
  69. snowflake/ml/modeling/compose/transformed_target_regressor.py +1 -0
  70. snowflake/ml/modeling/covariance/elliptic_envelope.py +1 -0
  71. snowflake/ml/modeling/covariance/empirical_covariance.py +1 -0
  72. snowflake/ml/modeling/covariance/graphical_lasso.py +1 -0
  73. snowflake/ml/modeling/covariance/graphical_lasso_cv.py +1 -0
  74. snowflake/ml/modeling/covariance/ledoit_wolf.py +1 -0
  75. snowflake/ml/modeling/covariance/min_cov_det.py +1 -0
  76. snowflake/ml/modeling/covariance/oas.py +1 -0
  77. snowflake/ml/modeling/covariance/shrunk_covariance.py +1 -0
  78. snowflake/ml/modeling/decomposition/dictionary_learning.py +1 -0
  79. snowflake/ml/modeling/decomposition/factor_analysis.py +1 -0
  80. snowflake/ml/modeling/decomposition/fast_ica.py +1 -0
  81. snowflake/ml/modeling/decomposition/incremental_pca.py +1 -0
  82. snowflake/ml/modeling/decomposition/kernel_pca.py +1 -0
  83. snowflake/ml/modeling/decomposition/mini_batch_dictionary_learning.py +1 -0
  84. snowflake/ml/modeling/decomposition/mini_batch_sparse_pca.py +1 -0
  85. snowflake/ml/modeling/decomposition/pca.py +1 -0
  86. snowflake/ml/modeling/decomposition/sparse_pca.py +1 -0
  87. snowflake/ml/modeling/decomposition/truncated_svd.py +1 -0
  88. snowflake/ml/modeling/discriminant_analysis/linear_discriminant_analysis.py +1 -0
  89. snowflake/ml/modeling/discriminant_analysis/quadratic_discriminant_analysis.py +1 -0
  90. snowflake/ml/modeling/ensemble/ada_boost_classifier.py +1 -0
  91. snowflake/ml/modeling/ensemble/ada_boost_regressor.py +1 -0
  92. snowflake/ml/modeling/ensemble/bagging_classifier.py +1 -0
  93. snowflake/ml/modeling/ensemble/bagging_regressor.py +1 -0
  94. snowflake/ml/modeling/ensemble/extra_trees_classifier.py +1 -0
  95. snowflake/ml/modeling/ensemble/extra_trees_regressor.py +1 -0
  96. snowflake/ml/modeling/ensemble/gradient_boosting_classifier.py +1 -0
  97. snowflake/ml/modeling/ensemble/gradient_boosting_regressor.py +1 -0
  98. snowflake/ml/modeling/ensemble/hist_gradient_boosting_classifier.py +1 -0
  99. snowflake/ml/modeling/ensemble/hist_gradient_boosting_regressor.py +1 -0
  100. snowflake/ml/modeling/ensemble/isolation_forest.py +1 -0
  101. snowflake/ml/modeling/ensemble/random_forest_classifier.py +1 -0
  102. snowflake/ml/modeling/ensemble/random_forest_regressor.py +1 -0
  103. snowflake/ml/modeling/ensemble/stacking_regressor.py +1 -0
  104. snowflake/ml/modeling/ensemble/voting_classifier.py +1 -0
  105. snowflake/ml/modeling/ensemble/voting_regressor.py +1 -0
  106. snowflake/ml/modeling/feature_selection/generic_univariate_select.py +1 -0
  107. snowflake/ml/modeling/feature_selection/select_fdr.py +1 -0
  108. snowflake/ml/modeling/feature_selection/select_fpr.py +1 -0
  109. snowflake/ml/modeling/feature_selection/select_fwe.py +1 -0
  110. snowflake/ml/modeling/feature_selection/select_k_best.py +1 -0
  111. snowflake/ml/modeling/feature_selection/select_percentile.py +1 -0
  112. snowflake/ml/modeling/feature_selection/sequential_feature_selector.py +1 -0
  113. snowflake/ml/modeling/feature_selection/variance_threshold.py +1 -0
  114. snowflake/ml/modeling/gaussian_process/gaussian_process_classifier.py +1 -0
  115. snowflake/ml/modeling/gaussian_process/gaussian_process_regressor.py +1 -0
  116. snowflake/ml/modeling/impute/iterative_imputer.py +1 -0
  117. snowflake/ml/modeling/impute/knn_imputer.py +1 -0
  118. snowflake/ml/modeling/impute/missing_indicator.py +1 -0
  119. snowflake/ml/modeling/kernel_approximation/additive_chi2_sampler.py +1 -0
  120. snowflake/ml/modeling/kernel_approximation/nystroem.py +1 -0
  121. snowflake/ml/modeling/kernel_approximation/polynomial_count_sketch.py +1 -0
  122. snowflake/ml/modeling/kernel_approximation/rbf_sampler.py +1 -0
  123. snowflake/ml/modeling/kernel_approximation/skewed_chi2_sampler.py +1 -0
  124. snowflake/ml/modeling/kernel_ridge/kernel_ridge.py +1 -0
  125. snowflake/ml/modeling/lightgbm/lgbm_classifier.py +1 -0
  126. snowflake/ml/modeling/lightgbm/lgbm_regressor.py +1 -0
  127. snowflake/ml/modeling/linear_model/ard_regression.py +1 -0
  128. snowflake/ml/modeling/linear_model/bayesian_ridge.py +1 -0
  129. snowflake/ml/modeling/linear_model/elastic_net.py +1 -0
  130. snowflake/ml/modeling/linear_model/elastic_net_cv.py +1 -0
  131. snowflake/ml/modeling/linear_model/gamma_regressor.py +1 -0
  132. snowflake/ml/modeling/linear_model/huber_regressor.py +1 -0
  133. snowflake/ml/modeling/linear_model/lars.py +1 -0
  134. snowflake/ml/modeling/linear_model/lars_cv.py +1 -0
  135. snowflake/ml/modeling/linear_model/lasso.py +1 -0
  136. snowflake/ml/modeling/linear_model/lasso_cv.py +1 -0
  137. snowflake/ml/modeling/linear_model/lasso_lars.py +1 -0
  138. snowflake/ml/modeling/linear_model/lasso_lars_cv.py +1 -0
  139. snowflake/ml/modeling/linear_model/lasso_lars_ic.py +1 -0
  140. snowflake/ml/modeling/linear_model/linear_regression.py +1 -0
  141. snowflake/ml/modeling/linear_model/logistic_regression.py +1 -0
  142. snowflake/ml/modeling/linear_model/logistic_regression_cv.py +1 -0
  143. snowflake/ml/modeling/linear_model/multi_task_elastic_net.py +1 -0
  144. snowflake/ml/modeling/linear_model/multi_task_elastic_net_cv.py +1 -0
  145. snowflake/ml/modeling/linear_model/multi_task_lasso.py +1 -0
  146. snowflake/ml/modeling/linear_model/multi_task_lasso_cv.py +1 -0
  147. snowflake/ml/modeling/linear_model/orthogonal_matching_pursuit.py +1 -0
  148. snowflake/ml/modeling/linear_model/passive_aggressive_classifier.py +1 -0
  149. snowflake/ml/modeling/linear_model/passive_aggressive_regressor.py +1 -0
  150. snowflake/ml/modeling/linear_model/perceptron.py +1 -0
  151. snowflake/ml/modeling/linear_model/poisson_regressor.py +1 -0
  152. snowflake/ml/modeling/linear_model/ransac_regressor.py +1 -0
  153. snowflake/ml/modeling/linear_model/ridge.py +1 -0
  154. snowflake/ml/modeling/linear_model/ridge_classifier.py +1 -0
  155. snowflake/ml/modeling/linear_model/ridge_classifier_cv.py +1 -0
  156. snowflake/ml/modeling/linear_model/ridge_cv.py +1 -0
  157. snowflake/ml/modeling/linear_model/sgd_classifier.py +1 -0
  158. snowflake/ml/modeling/linear_model/sgd_one_class_svm.py +1 -0
  159. snowflake/ml/modeling/linear_model/sgd_regressor.py +1 -0
  160. snowflake/ml/modeling/linear_model/theil_sen_regressor.py +1 -0
  161. snowflake/ml/modeling/linear_model/tweedie_regressor.py +1 -0
  162. snowflake/ml/modeling/manifold/isomap.py +1 -0
  163. snowflake/ml/modeling/manifold/mds.py +1 -0
  164. snowflake/ml/modeling/manifold/spectral_embedding.py +1 -0
  165. snowflake/ml/modeling/manifold/tsne.py +1 -0
  166. snowflake/ml/modeling/metrics/metrics_utils.py +2 -2
  167. snowflake/ml/modeling/metrics/ranking.py +0 -3
  168. snowflake/ml/modeling/metrics/regression.py +0 -3
  169. snowflake/ml/modeling/mixture/bayesian_gaussian_mixture.py +1 -0
  170. snowflake/ml/modeling/mixture/gaussian_mixture.py +1 -0
  171. snowflake/ml/modeling/multiclass/one_vs_one_classifier.py +1 -0
  172. snowflake/ml/modeling/multiclass/one_vs_rest_classifier.py +1 -0
  173. snowflake/ml/modeling/multiclass/output_code_classifier.py +1 -0
  174. snowflake/ml/modeling/naive_bayes/bernoulli_nb.py +1 -0
  175. snowflake/ml/modeling/naive_bayes/categorical_nb.py +1 -0
  176. snowflake/ml/modeling/naive_bayes/complement_nb.py +1 -0
  177. snowflake/ml/modeling/naive_bayes/gaussian_nb.py +1 -0
  178. snowflake/ml/modeling/naive_bayes/multinomial_nb.py +1 -0
  179. snowflake/ml/modeling/neighbors/k_neighbors_classifier.py +1 -0
  180. snowflake/ml/modeling/neighbors/k_neighbors_regressor.py +1 -0
  181. snowflake/ml/modeling/neighbors/kernel_density.py +1 -0
  182. snowflake/ml/modeling/neighbors/local_outlier_factor.py +1 -0
  183. snowflake/ml/modeling/neighbors/nearest_centroid.py +1 -0
  184. snowflake/ml/modeling/neighbors/nearest_neighbors.py +1 -0
  185. snowflake/ml/modeling/neighbors/neighborhood_components_analysis.py +1 -0
  186. snowflake/ml/modeling/neighbors/radius_neighbors_classifier.py +1 -0
  187. snowflake/ml/modeling/neighbors/radius_neighbors_regressor.py +1 -0
  188. snowflake/ml/modeling/neural_network/bernoulli_rbm.py +1 -0
  189. snowflake/ml/modeling/neural_network/mlp_classifier.py +1 -0
  190. snowflake/ml/modeling/neural_network/mlp_regressor.py +1 -0
  191. snowflake/ml/modeling/pipeline/pipeline.py +0 -1
  192. snowflake/ml/modeling/preprocessing/polynomial_features.py +1 -0
  193. snowflake/ml/modeling/semi_supervised/label_propagation.py +1 -0
  194. snowflake/ml/modeling/semi_supervised/label_spreading.py +1 -0
  195. snowflake/ml/modeling/svm/linear_svc.py +1 -0
  196. snowflake/ml/modeling/svm/linear_svr.py +1 -0
  197. snowflake/ml/modeling/svm/nu_svc.py +1 -0
  198. snowflake/ml/modeling/svm/nu_svr.py +1 -0
  199. snowflake/ml/modeling/svm/svc.py +1 -0
  200. snowflake/ml/modeling/svm/svr.py +1 -0
  201. snowflake/ml/modeling/tree/decision_tree_classifier.py +1 -0
  202. snowflake/ml/modeling/tree/decision_tree_regressor.py +1 -0
  203. snowflake/ml/modeling/tree/extra_tree_classifier.py +1 -0
  204. snowflake/ml/modeling/tree/extra_tree_regressor.py +1 -0
  205. snowflake/ml/modeling/xgboost/xgb_classifier.py +1 -0
  206. snowflake/ml/modeling/xgboost/xgb_regressor.py +1 -0
  207. snowflake/ml/modeling/xgboost/xgbrf_classifier.py +1 -0
  208. snowflake/ml/modeling/xgboost/xgbrf_regressor.py +1 -0
  209. snowflake/ml/monitoring/_client/model_monitor.py +126 -0
  210. snowflake/ml/monitoring/_client/model_monitor_manager.py +361 -0
  211. snowflake/ml/monitoring/_client/model_monitor_version.py +1 -0
  212. snowflake/ml/monitoring/_client/monitor_sql_client.py +1335 -0
  213. snowflake/ml/monitoring/_client/queries/record_count.ssql +14 -0
  214. snowflake/ml/monitoring/_client/queries/rmse.ssql +28 -0
  215. snowflake/ml/monitoring/entities/model_monitor_config.py +28 -0
  216. snowflake/ml/monitoring/entities/model_monitor_interval.py +46 -0
  217. snowflake/ml/monitoring/entities/output_score_type.py +90 -0
  218. snowflake/ml/registry/_manager/model_manager.py +4 -4
  219. snowflake/ml/registry/registry.py +165 -6
  220. snowflake/ml/version.py +1 -1
  221. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/METADATA +24 -9
  222. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/RECORD +225 -249
  223. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/WHEEL +1 -1
  224. snowflake/ml/_internal/container_services/image_registry/credential.py +0 -84
  225. snowflake/ml/_internal/container_services/image_registry/http_client.py +0 -127
  226. snowflake/ml/_internal/container_services/image_registry/imagelib.py +0 -400
  227. snowflake/ml/_internal/container_services/image_registry/registry_client.py +0 -212
  228. snowflake/ml/_internal/utils/log_stream_processor.py +0 -30
  229. snowflake/ml/_internal/utils/session_token_manager.py +0 -46
  230. snowflake/ml/_internal/utils/spcs_attribution_utils.py +0 -122
  231. snowflake/ml/_internal/utils/uri.py +0 -77
  232. snowflake/ml/model/_api.py +0 -568
  233. snowflake/ml/model/_deploy_client/image_builds/base_image_builder.py +0 -12
  234. snowflake/ml/model/_deploy_client/image_builds/client_image_builder.py +0 -249
  235. snowflake/ml/model/_deploy_client/image_builds/docker_context.py +0 -130
  236. snowflake/ml/model/_deploy_client/image_builds/gunicorn_run.sh +0 -36
  237. snowflake/ml/model/_deploy_client/image_builds/inference_server/main.py +0 -268
  238. snowflake/ml/model/_deploy_client/image_builds/server_image_builder.py +0 -215
  239. snowflake/ml/model/_deploy_client/image_builds/templates/dockerfile_template +0 -53
  240. snowflake/ml/model/_deploy_client/image_builds/templates/image_build_job_spec_template +0 -38
  241. snowflake/ml/model/_deploy_client/image_builds/templates/kaniko_shell_script_template +0 -105
  242. snowflake/ml/model/_deploy_client/snowservice/deploy.py +0 -611
  243. snowflake/ml/model/_deploy_client/snowservice/deploy_options.py +0 -116
  244. snowflake/ml/model/_deploy_client/snowservice/instance_types.py +0 -10
  245. snowflake/ml/model/_deploy_client/snowservice/templates/service_spec_template +0 -28
  246. snowflake/ml/model/_deploy_client/snowservice/templates/service_spec_template_with_model +0 -21
  247. snowflake/ml/model/_deploy_client/utils/constants.py +0 -48
  248. snowflake/ml/model/_deploy_client/utils/snowservice_client.py +0 -280
  249. snowflake/ml/model/_deploy_client/warehouse/deploy.py +0 -202
  250. snowflake/ml/model/_deploy_client/warehouse/infer_template.py +0 -99
  251. snowflake/ml/model/_packager/model_handlers/llm.py +0 -269
  252. snowflake/ml/model/_packager/model_meta/_core_requirements.py +0 -11
  253. snowflake/ml/model/deploy_platforms.py +0 -6
  254. snowflake/ml/model/models/llm.py +0 -106
  255. snowflake/ml/monitoring/monitor.py +0 -203
  256. snowflake/ml/registry/_initial_schema.py +0 -142
  257. snowflake/ml/registry/_schema.py +0 -82
  258. snowflake/ml/registry/_schema_upgrade_plans.py +0 -116
  259. snowflake/ml/registry/_schema_version_manager.py +0 -163
  260. snowflake/ml/registry/model_registry.py +0 -2048
  261. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/LICENSE.txt +0 -0
  262. {snowflake_ml_python-1.6.2.dist-info → snowflake_ml_python-1.6.3.dist-info}/top_level.txt +0 -0
@@ -379,7 +379,6 @@ class Pipeline(base.BaseTransformer):
379
379
  anonymous=True,
380
380
  imports=imports, # type: ignore[arg-type]
381
381
  statement_params=sproc_statement_params,
382
- execute_as="caller",
383
382
  )
384
383
 
385
384
  sproc_export_file_name: str = pipeline_within_one_sproc(
@@ -535,6 +535,7 @@ class PolynomialFeatures(BaseTransformer):
535
535
  """
536
536
  self._infer_input_output_cols(dataset)
537
537
  super()._check_dataset_type(dataset)
538
+
538
539
  model_trainer = ModelTrainerBuilder.build_fit_transform(
539
540
  estimator=self._sklearn_object,
540
541
  dataset=dataset,
@@ -537,6 +537,7 @@ class LabelPropagation(BaseTransformer):
537
537
  """
538
538
  self._infer_input_output_cols(dataset)
539
539
  super()._check_dataset_type(dataset)
540
+
540
541
  model_trainer = ModelTrainerBuilder.build_fit_transform(
541
542
  estimator=self._sklearn_object,
542
543
  dataset=dataset,
@@ -546,6 +546,7 @@ class LabelSpreading(BaseTransformer):
546
546
  """
547
547
  self._infer_input_output_cols(dataset)
548
548
  super()._check_dataset_type(dataset)
549
+
549
550
  model_trainer = ModelTrainerBuilder.build_fit_transform(
550
551
  estimator=self._sklearn_object,
551
552
  dataset=dataset,
@@ -602,6 +602,7 @@ class LinearSVC(BaseTransformer):
602
602
  """
603
603
  self._infer_input_output_cols(dataset)
604
604
  super()._check_dataset_type(dataset)
605
+
605
606
  model_trainer = ModelTrainerBuilder.build_fit_transform(
606
607
  estimator=self._sklearn_object,
607
608
  dataset=dataset,
@@ -574,6 +574,7 @@ class LinearSVR(BaseTransformer):
574
574
  """
575
575
  self._infer_input_output_cols(dataset)
576
576
  super()._check_dataset_type(dataset)
577
+
577
578
  model_trainer = ModelTrainerBuilder.build_fit_transform(
578
579
  estimator=self._sklearn_object,
579
580
  dataset=dataset,
@@ -608,6 +608,7 @@ class NuSVC(BaseTransformer):
608
608
  """
609
609
  self._infer_input_output_cols(dataset)
610
610
  super()._check_dataset_type(dataset)
611
+
611
612
  model_trainer = ModelTrainerBuilder.build_fit_transform(
612
613
  estimator=self._sklearn_object,
613
614
  dataset=dataset,
@@ -569,6 +569,7 @@ class NuSVR(BaseTransformer):
569
569
  """
570
570
  self._infer_input_output_cols(dataset)
571
571
  super()._check_dataset_type(dataset)
572
+
572
573
  model_trainer = ModelTrainerBuilder.build_fit_transform(
573
574
  estimator=self._sklearn_object,
574
575
  dataset=dataset,
@@ -611,6 +611,7 @@ class SVC(BaseTransformer):
611
611
  """
612
612
  self._infer_input_output_cols(dataset)
613
613
  super()._check_dataset_type(dataset)
614
+
614
615
  model_trainer = ModelTrainerBuilder.build_fit_transform(
615
616
  estimator=self._sklearn_object,
616
617
  dataset=dataset,
@@ -572,6 +572,7 @@ class SVR(BaseTransformer):
572
572
  """
573
573
  self._infer_input_output_cols(dataset)
574
574
  super()._check_dataset_type(dataset)
575
+
575
576
  model_trainer = ModelTrainerBuilder.build_fit_transform(
576
577
  estimator=self._sklearn_object,
577
578
  dataset=dataset,
@@ -639,6 +639,7 @@ class DecisionTreeClassifier(BaseTransformer):
639
639
  """
640
640
  self._infer_input_output_cols(dataset)
641
641
  super()._check_dataset_type(dataset)
642
+
642
643
  model_trainer = ModelTrainerBuilder.build_fit_transform(
643
644
  estimator=self._sklearn_object,
644
645
  dataset=dataset,
@@ -621,6 +621,7 @@ class DecisionTreeRegressor(BaseTransformer):
621
621
  """
622
622
  self._infer_input_output_cols(dataset)
623
623
  super()._check_dataset_type(dataset)
624
+
624
625
  model_trainer = ModelTrainerBuilder.build_fit_transform(
625
626
  estimator=self._sklearn_object,
626
627
  dataset=dataset,
@@ -631,6 +631,7 @@ class ExtraTreeClassifier(BaseTransformer):
631
631
  """
632
632
  self._infer_input_output_cols(dataset)
633
633
  super()._check_dataset_type(dataset)
634
+
634
635
  model_trainer = ModelTrainerBuilder.build_fit_transform(
635
636
  estimator=self._sklearn_object,
636
637
  dataset=dataset,
@@ -613,6 +613,7 @@ class ExtraTreeRegressor(BaseTransformer):
613
613
  """
614
614
  self._infer_input_output_cols(dataset)
615
615
  super()._check_dataset_type(dataset)
616
+
616
617
  model_trainer = ModelTrainerBuilder.build_fit_transform(
617
618
  estimator=self._sklearn_object,
618
619
  dataset=dataset,
@@ -732,6 +732,7 @@ class XGBClassifier(BaseTransformer):
732
732
  """
733
733
  self._infer_input_output_cols(dataset)
734
734
  super()._check_dataset_type(dataset)
735
+
735
736
  model_trainer = ModelTrainerBuilder.build_fit_transform(
736
737
  estimator=self._sklearn_object,
737
738
  dataset=dataset,
@@ -731,6 +731,7 @@ class XGBRegressor(BaseTransformer):
731
731
  """
732
732
  self._infer_input_output_cols(dataset)
733
733
  super()._check_dataset_type(dataset)
734
+
734
735
  model_trainer = ModelTrainerBuilder.build_fit_transform(
735
736
  estimator=self._sklearn_object,
736
737
  dataset=dataset,
@@ -736,6 +736,7 @@ class XGBRFClassifier(BaseTransformer):
736
736
  """
737
737
  self._infer_input_output_cols(dataset)
738
738
  super()._check_dataset_type(dataset)
739
+
739
740
  model_trainer = ModelTrainerBuilder.build_fit_transform(
740
741
  estimator=self._sklearn_object,
741
742
  dataset=dataset,
@@ -736,6 +736,7 @@ class XGBRFRegressor(BaseTransformer):
736
736
  """
737
737
  self._infer_input_output_cols(dataset)
738
738
  super()._check_dataset_type(dataset)
739
+
739
740
  model_trainer = ModelTrainerBuilder.build_fit_transform(
740
741
  estimator=self._sklearn_object,
741
742
  dataset=dataset,
@@ -0,0 +1,126 @@
1
+ from typing import List, Union
2
+
3
+ import pandas as pd
4
+
5
+ from snowflake import snowpark
6
+ from snowflake.ml._internal import telemetry
7
+ from snowflake.ml._internal.utils import sql_identifier
8
+ from snowflake.ml.monitoring._client import monitor_sql_client
9
+
10
+
11
+ class ModelMonitor:
12
+ """Class to manage instrumentation of Model Monitoring and Observability"""
13
+
14
+ name: sql_identifier.SqlIdentifier
15
+ _model_monitor_client: monitor_sql_client._ModelMonitorSQLClient
16
+ _fully_qualified_model_name: str
17
+ _version_name: sql_identifier.SqlIdentifier
18
+ _function_name: sql_identifier.SqlIdentifier
19
+ _prediction_columns: List[sql_identifier.SqlIdentifier]
20
+ _label_columns: List[sql_identifier.SqlIdentifier]
21
+
22
+ def __init__(self) -> None:
23
+ raise RuntimeError("ModelMonitor's initializer is not meant to be used.")
24
+
25
+ @classmethod
26
+ def _ref(
27
+ cls,
28
+ model_monitor_client: monitor_sql_client._ModelMonitorSQLClient,
29
+ name: sql_identifier.SqlIdentifier,
30
+ *,
31
+ fully_qualified_model_name: str,
32
+ version_name: sql_identifier.SqlIdentifier,
33
+ function_name: sql_identifier.SqlIdentifier,
34
+ prediction_columns: List[sql_identifier.SqlIdentifier],
35
+ label_columns: List[sql_identifier.SqlIdentifier],
36
+ ) -> "ModelMonitor":
37
+ self: "ModelMonitor" = object.__new__(cls)
38
+ self.name = name
39
+ self._model_monitor_client = model_monitor_client
40
+ self._fully_qualified_model_name = fully_qualified_model_name
41
+ self._version_name = version_name
42
+ self._function_name = function_name
43
+ self._prediction_columns = prediction_columns
44
+ self._label_columns = label_columns
45
+ return self
46
+
47
+ @telemetry.send_api_usage_telemetry(
48
+ project=telemetry.TelemetryProject.MLOPS.value,
49
+ subproject=telemetry.TelemetrySubProject.MONITORING.value,
50
+ )
51
+ def set_baseline(self, baseline_df: Union[pd.DataFrame, snowpark.DataFrame]) -> None:
52
+ """
53
+ The baseline dataframe is compared with the monitored data once monitoring is enabled.
54
+ The columns of the dataframe should match the columns of the source table that the
55
+ ModelMonitor was configured with. Calling this method overwrites any existing baseline split data.
56
+
57
+ Args:
58
+ baseline_df: Snowpark dataframe containing baseline data.
59
+
60
+ Raises:
61
+ ValueError: baseline_df does not contain prediction or label columns
62
+ """
63
+ statement_params = telemetry.get_statement_params(
64
+ project=telemetry.TelemetryProject.MLOPS.value,
65
+ subproject=telemetry.TelemetrySubProject.MONITORING.value,
66
+ )
67
+
68
+ if isinstance(baseline_df, pd.DataFrame):
69
+ baseline_df = self._model_monitor_client._sql_client._session.create_dataframe(baseline_df)
70
+
71
+ column_names_identifiers: List[sql_identifier.SqlIdentifier] = [
72
+ sql_identifier.SqlIdentifier(column_name) for column_name in baseline_df.columns
73
+ ]
74
+ prediction_cols_not_found = any(
75
+ [prediction_col not in column_names_identifiers for prediction_col in self._prediction_columns]
76
+ )
77
+ label_cols_not_found = any(
78
+ [label_col.identifier() not in column_names_identifiers for label_col in self._label_columns]
79
+ )
80
+
81
+ if prediction_cols_not_found:
82
+ raise ValueError(
83
+ "Specified prediction columns were not found in the baseline dataframe. "
84
+ f"Columns provided were: {column_names_identifiers}. "
85
+ f"Configured prediction columns were: {self._prediction_columns}."
86
+ )
87
+ if label_cols_not_found:
88
+ raise ValueError(
89
+ "Specified label columns were not found in the baseline dataframe."
90
+ f"Columns provided in the baseline dataframe were: {column_names_identifiers}."
91
+ f"Configured label columns were: {self._label_columns}."
92
+ )
93
+
94
+ # Create the table by materializing the df
95
+ self._model_monitor_client.materialize_baseline_dataframe(
96
+ baseline_df,
97
+ self._fully_qualified_model_name,
98
+ self._version_name,
99
+ statement_params=statement_params,
100
+ )
101
+
102
+ def suspend(self) -> None:
103
+ """Suspend pipeline for ModelMonitor"""
104
+ statement_params = telemetry.get_statement_params(
105
+ telemetry.TelemetryProject.MLOPS.value,
106
+ telemetry.TelemetrySubProject.MONITORING.value,
107
+ )
108
+ _, _, model_name = sql_identifier.parse_fully_qualified_name(self._fully_qualified_model_name)
109
+ self._model_monitor_client.suspend_monitor_dynamic_tables(
110
+ model_name=model_name,
111
+ version_name=self._version_name,
112
+ statement_params=statement_params,
113
+ )
114
+
115
+ def resume(self) -> None:
116
+ """Resume pipeline for ModelMonitor"""
117
+ statement_params = telemetry.get_statement_params(
118
+ telemetry.TelemetryProject.MLOPS.value,
119
+ telemetry.TelemetrySubProject.MONITORING.value,
120
+ )
121
+ _, _, model_name = sql_identifier.parse_fully_qualified_name(self._fully_qualified_model_name)
122
+ self._model_monitor_client.resume_monitor_dynamic_tables(
123
+ model_name=model_name,
124
+ version_name=self._version_name,
125
+ statement_params=statement_params,
126
+ )
@@ -0,0 +1,361 @@
1
+ from typing import Any, Dict, List, Optional
2
+
3
+ from snowflake import snowpark
4
+ from snowflake.ml._internal import telemetry
5
+ from snowflake.ml._internal.utils import db_utils, sql_identifier
6
+ from snowflake.ml.model import type_hints
7
+ from snowflake.ml.model._client.model import model_version_impl
8
+ from snowflake.ml.model._model_composer.model_manifest import model_manifest_schema
9
+ from snowflake.ml.monitoring._client import model_monitor, monitor_sql_client
10
+ from snowflake.ml.monitoring.entities import (
11
+ model_monitor_config,
12
+ model_monitor_interval,
13
+ )
14
+ from snowflake.snowpark import session
15
+
16
+
17
+ def _validate_name_constraints(model_version: model_version_impl.ModelVersion) -> None:
18
+ system_table_prefixes = [
19
+ monitor_sql_client._SNOWML_MONITORING_TABLE_NAME_PREFIX,
20
+ monitor_sql_client._SNOWML_MONITORING_ACCURACY_TABLE_NAME_PREFIX,
21
+ ]
22
+
23
+ max_allowed_model_name_and_version_length = (
24
+ db_utils.MAX_IDENTIFIER_LENGTH - max(len(prefix) for prefix in system_table_prefixes) - 1
25
+ ) # -1 includes '_' between model_name + model_version
26
+ if len(model_version.model_name) + len(model_version.version_name) > max_allowed_model_name_and_version_length:
27
+ error_msg = f"Model name and version name exceeds maximum length of {max_allowed_model_name_and_version_length}"
28
+ raise ValueError(error_msg)
29
+
30
+
31
+ class ModelMonitorManager:
32
+ """Class to manage internal operations for Model Monitor workflows.""" # TODO: Move to Registry.
33
+
34
+ @staticmethod
35
+ def setup(session: session.Session, database_name: str, schema_name: str) -> None:
36
+ """Static method to set up schema for Model Monitoring resources.
37
+
38
+ Args:
39
+ session: The Snowpark Session to connect with Snowflake.
40
+ database_name: The name of the database. If None, the current database of the session
41
+ will be used. Defaults to None.
42
+ schema_name: The name of the schema. If None, the current schema of the session
43
+ will be used. If there is no active schema, the PUBLIC schema will be used. Defaults to None.
44
+ """
45
+ statement_params = telemetry.get_statement_params(
46
+ project=telemetry.TelemetryProject.MLOPS.value,
47
+ subproject=telemetry.TelemetrySubProject.MONITORING.value,
48
+ )
49
+ database_name_id = sql_identifier.SqlIdentifier(database_name)
50
+ schema_name_id = sql_identifier.SqlIdentifier(schema_name)
51
+ monitor_sql_client._ModelMonitorSQLClient.initialize_monitoring_schema(
52
+ session, database_name_id, schema_name_id, statement_params=statement_params
53
+ )
54
+
55
+ def _fetch_task_from_model_version(
56
+ self,
57
+ model_version: model_version_impl.ModelVersion,
58
+ ) -> type_hints.Task:
59
+ task = model_version.get_model_task()
60
+ if task == type_hints.Task.UNKNOWN:
61
+ raise ValueError("Registry model must be logged with task in order to be monitored.")
62
+ return task
63
+
64
+ def __init__(
65
+ self,
66
+ session: session.Session,
67
+ database_name: sql_identifier.SqlIdentifier,
68
+ schema_name: sql_identifier.SqlIdentifier,
69
+ *,
70
+ create_if_not_exists: bool = False,
71
+ statement_params: Optional[Dict[str, Any]] = None,
72
+ ) -> None:
73
+ """
74
+ Opens a ModelMonitorManager for a given database and schema.
75
+ Optionally sets up the schema for Model Monitoring.
76
+
77
+ Args:
78
+ session: The Snowpark Session to connect with Snowflake.
79
+ database_name: The name of the database.
80
+ schema_name: The name of the schema.
81
+ create_if_not_exists: Flag whether to initialize resources in the schema needed for Model Monitoring.
82
+ statement_params: Optional set of statement params.
83
+
84
+ Raises:
85
+ ValueError: When there is no specified or active database in the session.
86
+ """
87
+ self._database_name = database_name
88
+ self._schema_name = schema_name
89
+ self.statement_params = statement_params
90
+ self._model_monitor_client = monitor_sql_client._ModelMonitorSQLClient(
91
+ session,
92
+ database_name=self._database_name,
93
+ schema_name=self._schema_name,
94
+ )
95
+ if create_if_not_exists:
96
+ monitor_sql_client._ModelMonitorSQLClient.initialize_monitoring_schema(
97
+ session, self._database_name, self._schema_name, self.statement_params
98
+ )
99
+ elif not self._model_monitor_client._validate_is_initialized():
100
+ raise ValueError(
101
+ "Monitoring has not been setup. Set create_if_not_exists or call ModelMonitorManager.setup"
102
+ )
103
+
104
+ def _get_and_validate_model_function_from_model_version(
105
+ self, function: str, model_version: model_version_impl.ModelVersion
106
+ ) -> model_manifest_schema.ModelFunctionInfo:
107
+ functions = model_version.show_functions()
108
+ for f in functions:
109
+ if f["target_method"] == function:
110
+ return f
111
+ existing_target_methods = {f["target_method"] for f in functions}
112
+ raise ValueError(
113
+ f"Function with name {function} does not exist in the given model version. "
114
+ f"Found: {existing_target_methods}."
115
+ )
116
+
117
+ def _validate_monitor_config_or_raise(
118
+ self,
119
+ table_config: model_monitor_config.ModelMonitorTableConfig,
120
+ model_monitor_config: model_monitor_config.ModelMonitorConfig,
121
+ ) -> None:
122
+ """Validate provided config for model monitor.
123
+
124
+ Args:
125
+ table_config: Config for model monitor tables.
126
+ model_monitor_config: Config for ModelMonitor.
127
+
128
+ Raises:
129
+ ValueError: If warehouse provided does not exist.
130
+ """
131
+
132
+ # Validate naming will not exceed 255 chars
133
+ _validate_name_constraints(model_monitor_config.model_version)
134
+
135
+ if len(table_config.prediction_columns) != len(table_config.label_columns):
136
+ raise ValueError("Prediction and Label column names must be of the same length.")
137
+ # output and ground cols are list to keep interface extensible.
138
+ # for prpr only one label and one output col will be supported
139
+ if len(table_config.prediction_columns) != 1 or len(table_config.label_columns) != 1:
140
+ raise ValueError("Multiple Output columns are not supported in monitoring")
141
+
142
+ # Validate warehouse exists.
143
+ warehouse_name_id = sql_identifier.SqlIdentifier(model_monitor_config.background_compute_warehouse_name)
144
+ self._model_monitor_client.validate_monitor_warehouse(warehouse_name_id, statement_params=self.statement_params)
145
+
146
+ # Validate refresh interval.
147
+ try:
148
+ num_units, time_units = model_monitor_config.refresh_interval.strip().split(" ")
149
+ int(num_units) # try to cast
150
+ if time_units.lower() not in {"seconds", "minutes", "hours", "days"}:
151
+ raise ValueError(
152
+ """Invalid time unit in refresh interval. Provide '<num> <seconds | minutes | hours | days>'.
153
+ See https://docs.snowflake.com/en/sql-reference/sql/create-dynamic-table#required-parameters for more info."""
154
+ )
155
+ except Exception as e: # TODO: Link to DT page.
156
+ raise ValueError(
157
+ f"""Failed to parse refresh interval with exception {e}.
158
+ Provide '<num> <seconds | minutes | hours | days>'.
159
+ See https://docs.snowflake.com/en/sql-reference/sql/create-dynamic-table#required-parameters for more info."""
160
+ )
161
+
162
+ def add_monitor(
163
+ self,
164
+ name: str,
165
+ table_config: model_monitor_config.ModelMonitorTableConfig,
166
+ model_monitor_config: model_monitor_config.ModelMonitorConfig,
167
+ *,
168
+ add_dashboard_udtfs: bool = False,
169
+ ) -> model_monitor.ModelMonitor:
170
+ """Add a new Model Monitor.
171
+
172
+ Args:
173
+ name: Name of Model Monitor to create.
174
+ table_config: Configuration options for the source table used in ModelMonitor.
175
+ model_monitor_config: Configuration options of ModelMonitor.
176
+ add_dashboard_udtfs: Add UDTFs useful for creating a dashboard.
177
+
178
+ Returns:
179
+ The newly added ModelMonitor object.
180
+ """
181
+ # Validates configuration or raise.
182
+ self._validate_monitor_config_or_raise(table_config, model_monitor_config)
183
+ model_function = self._get_and_validate_model_function_from_model_version(
184
+ model_monitor_config.model_function_name, model_monitor_config.model_version
185
+ )
186
+ monitor_refresh_interval = model_monitor_interval.ModelMonitorRefreshInterval(
187
+ model_monitor_config.refresh_interval
188
+ )
189
+ name_id = sql_identifier.SqlIdentifier(name)
190
+ source_table_name_id = sql_identifier.SqlIdentifier(table_config.source_table)
191
+ prediction_columns = [
192
+ sql_identifier.SqlIdentifier(column_name) for column_name in table_config.prediction_columns
193
+ ]
194
+ label_columns = [sql_identifier.SqlIdentifier(column_name) for column_name in table_config.label_columns]
195
+ id_columns = [sql_identifier.SqlIdentifier(column_name) for column_name in table_config.id_columns]
196
+ ts_column = sql_identifier.SqlIdentifier(table_config.timestamp_column)
197
+
198
+ # Validate source table
199
+ self._model_monitor_client.validate_source_table(
200
+ source_table_name=source_table_name_id,
201
+ timestamp_column=ts_column,
202
+ prediction_columns=prediction_columns,
203
+ label_columns=label_columns,
204
+ id_columns=id_columns,
205
+ model_function=model_function,
206
+ )
207
+
208
+ task = self._fetch_task_from_model_version(model_version=model_monitor_config.model_version)
209
+ score_type = self._model_monitor_client.get_score_type(task, source_table_name_id, prediction_columns)
210
+
211
+ # Insert monitoring metadata for new model version.
212
+ self._model_monitor_client.create_monitor_on_model_version(
213
+ monitor_name=name_id,
214
+ source_table_name=source_table_name_id,
215
+ fully_qualified_model_name=model_monitor_config.model_version.fully_qualified_model_name,
216
+ version_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.version_name),
217
+ function_name=model_monitor_config.model_function_name,
218
+ timestamp_column=ts_column,
219
+ prediction_columns=prediction_columns,
220
+ label_columns=label_columns,
221
+ id_columns=id_columns,
222
+ task=task,
223
+ statement_params=self.statement_params,
224
+ )
225
+
226
+ # Create Dynamic tables for model monitor.
227
+ self._model_monitor_client.create_dynamic_tables_for_monitor(
228
+ model_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.model_name),
229
+ model_version_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.version_name),
230
+ task=task,
231
+ source_table_name=source_table_name_id,
232
+ refresh_interval=monitor_refresh_interval,
233
+ aggregation_window=model_monitor_config.aggregation_window,
234
+ warehouse_name=sql_identifier.SqlIdentifier(model_monitor_config.background_compute_warehouse_name),
235
+ timestamp_column=sql_identifier.SqlIdentifier(table_config.timestamp_column),
236
+ id_columns=id_columns,
237
+ prediction_columns=prediction_columns,
238
+ label_columns=label_columns,
239
+ score_type=score_type,
240
+ )
241
+
242
+ # Initialize baseline table.
243
+ self._model_monitor_client.initialize_baseline_table(
244
+ model_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.model_name),
245
+ version_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.version_name),
246
+ source_table_name=table_config.source_table,
247
+ columns_to_drop=[ts_column, *id_columns],
248
+ statement_params=self.statement_params,
249
+ )
250
+
251
+ # Add udtfs helpful for dashboard queries.
252
+ # TODO(apgupta) Make this true by default.
253
+ if add_dashboard_udtfs:
254
+ self._model_monitor_client.add_dashboard_udtfs(
255
+ name_id,
256
+ model_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.model_name),
257
+ model_version_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.version_name),
258
+ task=task,
259
+ score_type=score_type,
260
+ output_columns=prediction_columns,
261
+ ground_truth_columns=label_columns,
262
+ )
263
+
264
+ return model_monitor.ModelMonitor._ref(
265
+ model_monitor_client=self._model_monitor_client,
266
+ name=name_id,
267
+ fully_qualified_model_name=model_monitor_config.model_version.fully_qualified_model_name,
268
+ version_name=sql_identifier.SqlIdentifier(model_monitor_config.model_version.version_name),
269
+ function_name=sql_identifier.SqlIdentifier(model_monitor_config.model_function_name),
270
+ prediction_columns=prediction_columns,
271
+ label_columns=label_columns,
272
+ )
273
+
274
+ def get_monitor_by_model_version(
275
+ self, model_version: model_version_impl.ModelVersion
276
+ ) -> model_monitor.ModelMonitor:
277
+ fq_model_name = model_version.fully_qualified_model_name
278
+ version_name = sql_identifier.SqlIdentifier(model_version.version_name)
279
+ if self._model_monitor_client.validate_existence(fq_model_name, version_name, self.statement_params):
280
+ model_db, model_schema, model_name = sql_identifier.parse_fully_qualified_name(fq_model_name)
281
+ if model_db is None or model_schema is None:
282
+ raise ValueError("Failed to parse model name")
283
+
284
+ model_monitor_params: monitor_sql_client._ModelMonitorParams = (
285
+ self._model_monitor_client.get_model_monitor_by_model_version(
286
+ model_db=model_db,
287
+ model_schema=model_schema,
288
+ model_name=model_name,
289
+ version_name=version_name,
290
+ statement_params=self.statement_params,
291
+ )
292
+ )
293
+ return model_monitor.ModelMonitor._ref(
294
+ model_monitor_client=self._model_monitor_client,
295
+ name=sql_identifier.SqlIdentifier(model_monitor_params["monitor_name"]),
296
+ fully_qualified_model_name=fq_model_name,
297
+ version_name=version_name,
298
+ function_name=sql_identifier.SqlIdentifier(model_monitor_params["function_name"]),
299
+ prediction_columns=model_monitor_params["prediction_columns"],
300
+ label_columns=model_monitor_params["label_columns"],
301
+ )
302
+
303
+ else:
304
+ raise ValueError(
305
+ f"ModelMonitor not found for model version {model_version.model_name} - {model_version.version_name}"
306
+ )
307
+
308
+ def get_monitor(self, name: str) -> model_monitor.ModelMonitor:
309
+ """Get a Model Monitor from the Registry
310
+
311
+ Args:
312
+ name: Name of Model Monitor to retrieve.
313
+
314
+ Raises:
315
+ ValueError: If model monitor is not found.
316
+
317
+ Returns:
318
+ The fetched ModelMonitor.
319
+ """
320
+ name_id = sql_identifier.SqlIdentifier(name)
321
+
322
+ if not self._model_monitor_client.validate_existence_by_name(
323
+ monitor_name=name_id,
324
+ statement_params=self.statement_params,
325
+ ):
326
+ raise ValueError(f"Unable to find model monitor '{name}'")
327
+ model_monitor_params: monitor_sql_client._ModelMonitorParams = (
328
+ self._model_monitor_client.get_model_monitor_by_name(name_id, statement_params=self.statement_params)
329
+ )
330
+
331
+ return model_monitor.ModelMonitor._ref(
332
+ model_monitor_client=self._model_monitor_client,
333
+ name=name_id,
334
+ fully_qualified_model_name=model_monitor_params["fully_qualified_model_name"],
335
+ version_name=sql_identifier.SqlIdentifier(model_monitor_params["version_name"]),
336
+ function_name=sql_identifier.SqlIdentifier(model_monitor_params["function_name"]),
337
+ prediction_columns=model_monitor_params["prediction_columns"],
338
+ label_columns=model_monitor_params["label_columns"],
339
+ )
340
+
341
+ def show_model_monitors(self) -> List[snowpark.Row]:
342
+ """Show all model monitors in the registry.
343
+
344
+ Returns:
345
+ List of snowpark.Row containing metadata for each model monitor.
346
+ """
347
+ return self._model_monitor_client.get_all_model_monitor_metadata()
348
+
349
+ def delete_monitor(self, name: str) -> None:
350
+ """Delete a Model Monitor from the Registry
351
+
352
+ Args:
353
+ name: Name of the Model Monitor to delete.
354
+ """
355
+ name_id = sql_identifier.SqlIdentifier(name)
356
+ monitor_params = self._model_monitor_client.get_model_monitor_by_name(name_id)
357
+ _, _, model = sql_identifier.parse_fully_qualified_name(monitor_params["fully_qualified_model_name"])
358
+ version = sql_identifier.SqlIdentifier(monitor_params["version_name"])
359
+ self._model_monitor_client.delete_monitor_metadata(name_id)
360
+ self._model_monitor_client.delete_baseline_table(model, version)
361
+ self._model_monitor_client.delete_dynamic_tables(model, version)
@@ -0,0 +1 @@
1
+ SNOWFLAKE_ML_MONITORING_MIN_VERSION = "1.7.0"