oracle-ads 2.13.8__py3-none-any.whl → 2.13.9rc0__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.
- {oracle_ads-2.13.8.dist-info → oracle_ads-2.13.9rc0.dist-info}/METADATA +151 -151
- oracle_ads-2.13.9rc0.dist-info/RECORD +9 -0
- {oracle_ads-2.13.8.dist-info → oracle_ads-2.13.9rc0.dist-info}/WHEEL +2 -1
- {oracle_ads-2.13.8.dist-info → oracle_ads-2.13.9rc0.dist-info}/entry_points.txt +1 -2
- oracle_ads-2.13.9rc0.dist-info/top_level.txt +1 -0
- ads/aqua/__init__.py +0 -40
- ads/aqua/app.py +0 -506
- ads/aqua/cli.py +0 -96
- ads/aqua/client/__init__.py +0 -3
- ads/aqua/client/client.py +0 -836
- ads/aqua/client/openai_client.py +0 -305
- ads/aqua/common/__init__.py +0 -5
- ads/aqua/common/decorator.py +0 -125
- ads/aqua/common/entities.py +0 -266
- ads/aqua/common/enums.py +0 -122
- ads/aqua/common/errors.py +0 -109
- ads/aqua/common/utils.py +0 -1285
- ads/aqua/config/__init__.py +0 -4
- ads/aqua/config/container_config.py +0 -248
- ads/aqua/config/evaluation/__init__.py +0 -4
- ads/aqua/config/evaluation/evaluation_service_config.py +0 -147
- ads/aqua/config/utils/__init__.py +0 -4
- ads/aqua/config/utils/serializer.py +0 -339
- ads/aqua/constants.py +0 -114
- ads/aqua/data.py +0 -14
- ads/aqua/dummy_data/icon.txt +0 -1
- ads/aqua/dummy_data/oci_model_deployments.json +0 -56
- ads/aqua/dummy_data/oci_models.json +0 -1
- ads/aqua/dummy_data/readme.md +0 -26
- ads/aqua/evaluation/__init__.py +0 -8
- ads/aqua/evaluation/constants.py +0 -53
- ads/aqua/evaluation/entities.py +0 -186
- ads/aqua/evaluation/errors.py +0 -70
- ads/aqua/evaluation/evaluation.py +0 -1814
- ads/aqua/extension/__init__.py +0 -42
- ads/aqua/extension/aqua_ws_msg_handler.py +0 -76
- ads/aqua/extension/base_handler.py +0 -90
- ads/aqua/extension/common_handler.py +0 -121
- ads/aqua/extension/common_ws_msg_handler.py +0 -36
- ads/aqua/extension/deployment_handler.py +0 -298
- ads/aqua/extension/deployment_ws_msg_handler.py +0 -54
- ads/aqua/extension/errors.py +0 -30
- ads/aqua/extension/evaluation_handler.py +0 -129
- ads/aqua/extension/evaluation_ws_msg_handler.py +0 -61
- ads/aqua/extension/finetune_handler.py +0 -96
- ads/aqua/extension/model_handler.py +0 -390
- ads/aqua/extension/models/__init__.py +0 -0
- ads/aqua/extension/models/ws_models.py +0 -145
- ads/aqua/extension/models_ws_msg_handler.py +0 -50
- ads/aqua/extension/ui_handler.py +0 -282
- ads/aqua/extension/ui_websocket_handler.py +0 -130
- ads/aqua/extension/utils.py +0 -133
- ads/aqua/finetuning/__init__.py +0 -7
- ads/aqua/finetuning/constants.py +0 -23
- ads/aqua/finetuning/entities.py +0 -181
- ads/aqua/finetuning/finetuning.py +0 -731
- ads/aqua/model/__init__.py +0 -8
- ads/aqua/model/constants.py +0 -60
- ads/aqua/model/entities.py +0 -306
- ads/aqua/model/enums.py +0 -30
- ads/aqua/model/model.py +0 -2080
- ads/aqua/modeldeployment/__init__.py +0 -8
- ads/aqua/modeldeployment/constants.py +0 -10
- ads/aqua/modeldeployment/deployment.py +0 -1324
- ads/aqua/modeldeployment/entities.py +0 -653
- ads/aqua/modeldeployment/inference.py +0 -74
- ads/aqua/modeldeployment/utils.py +0 -543
- ads/aqua/resources/gpu_shapes_index.json +0 -94
- ads/aqua/server/__init__.py +0 -4
- ads/aqua/server/__main__.py +0 -24
- ads/aqua/server/app.py +0 -47
- ads/aqua/server/aqua_spec.yml +0 -1291
- ads/aqua/training/__init__.py +0 -4
- ads/aqua/training/exceptions.py +0 -476
- ads/aqua/ui.py +0 -499
- ads/automl/__init__.py +0 -9
- ads/automl/driver.py +0 -330
- ads/automl/provider.py +0 -975
- ads/bds/__init__.py +0 -5
- ads/bds/auth.py +0 -127
- ads/bds/big_data_service.py +0 -255
- ads/catalog/__init__.py +0 -19
- ads/catalog/model.py +0 -1576
- ads/catalog/notebook.py +0 -461
- ads/catalog/project.py +0 -468
- ads/catalog/summary.py +0 -178
- ads/common/__init__.py +0 -11
- ads/common/analyzer.py +0 -65
- ads/common/artifact/.model-ignore +0 -63
- ads/common/artifact/__init__.py +0 -10
- ads/common/auth.py +0 -1122
- ads/common/card_identifier.py +0 -83
- ads/common/config.py +0 -647
- ads/common/data.py +0 -165
- ads/common/decorator/__init__.py +0 -9
- ads/common/decorator/argument_to_case.py +0 -88
- ads/common/decorator/deprecate.py +0 -69
- ads/common/decorator/require_nonempty_arg.py +0 -65
- ads/common/decorator/runtime_dependency.py +0 -178
- ads/common/decorator/threaded.py +0 -97
- ads/common/decorator/utils.py +0 -35
- ads/common/dsc_file_system.py +0 -303
- ads/common/error.py +0 -14
- ads/common/extended_enum.py +0 -81
- ads/common/function/__init__.py +0 -5
- ads/common/function/fn_util.py +0 -142
- ads/common/function/func_conf.yaml +0 -25
- ads/common/ipython.py +0 -76
- ads/common/model.py +0 -679
- ads/common/model_artifact.py +0 -1759
- ads/common/model_artifact_schema.json +0 -107
- ads/common/model_export_util.py +0 -664
- ads/common/model_metadata.py +0 -24
- ads/common/object_storage_details.py +0 -296
- ads/common/oci_client.py +0 -175
- ads/common/oci_datascience.py +0 -46
- ads/common/oci_logging.py +0 -1144
- ads/common/oci_mixin.py +0 -957
- ads/common/oci_resource.py +0 -136
- ads/common/serializer.py +0 -559
- ads/common/utils.py +0 -1852
- ads/common/word_lists.py +0 -1491
- ads/common/work_request.py +0 -189
- ads/data_labeling/__init__.py +0 -13
- ads/data_labeling/boundingbox.py +0 -253
- ads/data_labeling/constants.py +0 -47
- ads/data_labeling/data_labeling_service.py +0 -244
- ads/data_labeling/interface/__init__.py +0 -5
- ads/data_labeling/interface/loader.py +0 -16
- ads/data_labeling/interface/parser.py +0 -16
- ads/data_labeling/interface/reader.py +0 -23
- ads/data_labeling/loader/__init__.py +0 -5
- ads/data_labeling/loader/file_loader.py +0 -241
- ads/data_labeling/metadata.py +0 -110
- ads/data_labeling/mixin/__init__.py +0 -5
- ads/data_labeling/mixin/data_labeling.py +0 -232
- ads/data_labeling/ner.py +0 -129
- ads/data_labeling/parser/__init__.py +0 -5
- ads/data_labeling/parser/dls_record_parser.py +0 -388
- ads/data_labeling/parser/export_metadata_parser.py +0 -94
- ads/data_labeling/parser/export_record_parser.py +0 -473
- ads/data_labeling/reader/__init__.py +0 -5
- ads/data_labeling/reader/dataset_reader.py +0 -574
- ads/data_labeling/reader/dls_record_reader.py +0 -121
- ads/data_labeling/reader/export_record_reader.py +0 -62
- ads/data_labeling/reader/jsonl_reader.py +0 -75
- ads/data_labeling/reader/metadata_reader.py +0 -203
- ads/data_labeling/reader/record_reader.py +0 -263
- ads/data_labeling/record.py +0 -52
- ads/data_labeling/visualizer/__init__.py +0 -5
- ads/data_labeling/visualizer/image_visualizer.py +0 -525
- ads/data_labeling/visualizer/text_visualizer.py +0 -357
- ads/database/__init__.py +0 -5
- ads/database/connection.py +0 -338
- ads/dataset/__init__.py +0 -10
- ads/dataset/capabilities.md +0 -51
- ads/dataset/classification_dataset.py +0 -339
- ads/dataset/correlation.py +0 -226
- ads/dataset/correlation_plot.py +0 -563
- ads/dataset/dask_series.py +0 -173
- ads/dataset/dataframe_transformer.py +0 -110
- ads/dataset/dataset.py +0 -1979
- ads/dataset/dataset_browser.py +0 -360
- ads/dataset/dataset_with_target.py +0 -995
- ads/dataset/exception.py +0 -25
- ads/dataset/factory.py +0 -987
- ads/dataset/feature_engineering_transformer.py +0 -35
- ads/dataset/feature_selection.py +0 -107
- ads/dataset/forecasting_dataset.py +0 -26
- ads/dataset/helper.py +0 -1450
- ads/dataset/label_encoder.py +0 -99
- ads/dataset/mixin/__init__.py +0 -5
- ads/dataset/mixin/dataset_accessor.py +0 -134
- ads/dataset/pipeline.py +0 -58
- ads/dataset/plot.py +0 -710
- ads/dataset/progress.py +0 -86
- ads/dataset/recommendation.py +0 -297
- ads/dataset/recommendation_transformer.py +0 -502
- ads/dataset/regression_dataset.py +0 -14
- ads/dataset/sampled_dataset.py +0 -1050
- ads/dataset/target.py +0 -98
- ads/dataset/timeseries.py +0 -18
- ads/dbmixin/__init__.py +0 -5
- ads/dbmixin/db_pandas_accessor.py +0 -153
- ads/environment/__init__.py +0 -9
- ads/environment/ml_runtime.py +0 -66
- ads/evaluations/README.md +0 -14
- ads/evaluations/__init__.py +0 -109
- ads/evaluations/evaluation_plot.py +0 -983
- ads/evaluations/evaluator.py +0 -1334
- ads/evaluations/statistical_metrics.py +0 -543
- ads/experiments/__init__.py +0 -9
- ads/experiments/capabilities.md +0 -0
- ads/explanations/__init__.py +0 -21
- ads/explanations/base_explainer.py +0 -142
- ads/explanations/capabilities.md +0 -83
- ads/explanations/explainer.py +0 -190
- ads/explanations/mlx_global_explainer.py +0 -1050
- ads/explanations/mlx_interface.py +0 -386
- ads/explanations/mlx_local_explainer.py +0 -287
- ads/explanations/mlx_whatif_explainer.py +0 -201
- ads/feature_engineering/__init__.py +0 -20
- ads/feature_engineering/accessor/__init__.py +0 -5
- ads/feature_engineering/accessor/dataframe_accessor.py +0 -535
- ads/feature_engineering/accessor/mixin/__init__.py +0 -5
- ads/feature_engineering/accessor/mixin/correlation.py +0 -166
- ads/feature_engineering/accessor/mixin/eda_mixin.py +0 -266
- ads/feature_engineering/accessor/mixin/eda_mixin_series.py +0 -85
- ads/feature_engineering/accessor/mixin/feature_types_mixin.py +0 -211
- ads/feature_engineering/accessor/mixin/utils.py +0 -65
- ads/feature_engineering/accessor/series_accessor.py +0 -431
- ads/feature_engineering/adsimage/__init__.py +0 -5
- ads/feature_engineering/adsimage/image.py +0 -192
- ads/feature_engineering/adsimage/image_reader.py +0 -170
- ads/feature_engineering/adsimage/interface/__init__.py +0 -5
- ads/feature_engineering/adsimage/interface/reader.py +0 -19
- ads/feature_engineering/adsstring/__init__.py +0 -7
- ads/feature_engineering/adsstring/oci_language/__init__.py +0 -8
- ads/feature_engineering/adsstring/string/__init__.py +0 -8
- ads/feature_engineering/data_schema.json +0 -57
- ads/feature_engineering/dataset/__init__.py +0 -5
- ads/feature_engineering/dataset/zip_code_data.py +0 -42062
- ads/feature_engineering/exceptions.py +0 -40
- ads/feature_engineering/feature_type/__init__.py +0 -133
- ads/feature_engineering/feature_type/address.py +0 -184
- ads/feature_engineering/feature_type/adsstring/__init__.py +0 -5
- ads/feature_engineering/feature_type/adsstring/common_regex_mixin.py +0 -164
- ads/feature_engineering/feature_type/adsstring/oci_language.py +0 -93
- ads/feature_engineering/feature_type/adsstring/parsers/__init__.py +0 -5
- ads/feature_engineering/feature_type/adsstring/parsers/base.py +0 -47
- ads/feature_engineering/feature_type/adsstring/parsers/nltk_parser.py +0 -96
- ads/feature_engineering/feature_type/adsstring/parsers/spacy_parser.py +0 -221
- ads/feature_engineering/feature_type/adsstring/string.py +0 -258
- ads/feature_engineering/feature_type/base.py +0 -58
- ads/feature_engineering/feature_type/boolean.py +0 -183
- ads/feature_engineering/feature_type/category.py +0 -146
- ads/feature_engineering/feature_type/constant.py +0 -137
- ads/feature_engineering/feature_type/continuous.py +0 -151
- ads/feature_engineering/feature_type/creditcard.py +0 -314
- ads/feature_engineering/feature_type/datetime.py +0 -190
- ads/feature_engineering/feature_type/discrete.py +0 -134
- ads/feature_engineering/feature_type/document.py +0 -43
- ads/feature_engineering/feature_type/gis.py +0 -251
- ads/feature_engineering/feature_type/handler/__init__.py +0 -5
- ads/feature_engineering/feature_type/handler/feature_validator.py +0 -524
- ads/feature_engineering/feature_type/handler/feature_warning.py +0 -319
- ads/feature_engineering/feature_type/handler/warnings.py +0 -128
- ads/feature_engineering/feature_type/integer.py +0 -142
- ads/feature_engineering/feature_type/ip_address.py +0 -144
- ads/feature_engineering/feature_type/ip_address_v4.py +0 -138
- ads/feature_engineering/feature_type/ip_address_v6.py +0 -138
- ads/feature_engineering/feature_type/lat_long.py +0 -256
- ads/feature_engineering/feature_type/object.py +0 -43
- ads/feature_engineering/feature_type/ordinal.py +0 -132
- ads/feature_engineering/feature_type/phone_number.py +0 -135
- ads/feature_engineering/feature_type/string.py +0 -171
- ads/feature_engineering/feature_type/text.py +0 -93
- ads/feature_engineering/feature_type/unknown.py +0 -43
- ads/feature_engineering/feature_type/zip_code.py +0 -164
- ads/feature_engineering/feature_type_manager.py +0 -406
- ads/feature_engineering/schema.py +0 -795
- ads/feature_engineering/utils.py +0 -245
- ads/feature_store/.readthedocs.yaml +0 -19
- ads/feature_store/README.md +0 -65
- ads/feature_store/__init__.py +0 -9
- ads/feature_store/common/__init__.py +0 -0
- ads/feature_store/common/enums.py +0 -339
- ads/feature_store/common/exceptions.py +0 -18
- ads/feature_store/common/spark_session_singleton.py +0 -125
- ads/feature_store/common/utils/__init__.py +0 -0
- ads/feature_store/common/utils/base64_encoder_decoder.py +0 -72
- ads/feature_store/common/utils/feature_schema_mapper.py +0 -283
- ads/feature_store/common/utils/transformation_utils.py +0 -82
- ads/feature_store/common/utils/utility.py +0 -403
- ads/feature_store/data_validation/__init__.py +0 -0
- ads/feature_store/data_validation/great_expectation.py +0 -129
- ads/feature_store/dataset.py +0 -1230
- ads/feature_store/dataset_job.py +0 -530
- ads/feature_store/docs/Dockerfile +0 -7
- ads/feature_store/docs/Makefile +0 -44
- ads/feature_store/docs/conf.py +0 -28
- ads/feature_store/docs/requirements.txt +0 -14
- ads/feature_store/docs/source/ads.feature_store.query.rst +0 -20
- ads/feature_store/docs/source/cicd.rst +0 -137
- ads/feature_store/docs/source/conf.py +0 -86
- ads/feature_store/docs/source/data_versioning.rst +0 -33
- ads/feature_store/docs/source/dataset.rst +0 -388
- ads/feature_store/docs/source/dataset_job.rst +0 -27
- ads/feature_store/docs/source/demo.rst +0 -70
- ads/feature_store/docs/source/entity.rst +0 -78
- ads/feature_store/docs/source/feature_group.rst +0 -624
- ads/feature_store/docs/source/feature_group_job.rst +0 -29
- ads/feature_store/docs/source/feature_store.rst +0 -122
- ads/feature_store/docs/source/feature_store_class.rst +0 -123
- ads/feature_store/docs/source/feature_validation.rst +0 -66
- ads/feature_store/docs/source/figures/cicd.png +0 -0
- ads/feature_store/docs/source/figures/data_validation.png +0 -0
- ads/feature_store/docs/source/figures/data_versioning.png +0 -0
- ads/feature_store/docs/source/figures/dataset.gif +0 -0
- ads/feature_store/docs/source/figures/dataset.png +0 -0
- ads/feature_store/docs/source/figures/dataset_lineage.png +0 -0
- ads/feature_store/docs/source/figures/dataset_statistics.png +0 -0
- ads/feature_store/docs/source/figures/dataset_statistics_viz.png +0 -0
- ads/feature_store/docs/source/figures/dataset_validation_results.png +0 -0
- ads/feature_store/docs/source/figures/dataset_validation_summary.png +0 -0
- ads/feature_store/docs/source/figures/drift_monitoring.png +0 -0
- ads/feature_store/docs/source/figures/entity.png +0 -0
- ads/feature_store/docs/source/figures/feature_group.png +0 -0
- ads/feature_store/docs/source/figures/feature_group_lineage.png +0 -0
- ads/feature_store/docs/source/figures/feature_group_statistics_viz.png +0 -0
- ads/feature_store/docs/source/figures/feature_store_deployment.png +0 -0
- ads/feature_store/docs/source/figures/feature_store_overview.png +0 -0
- ads/feature_store/docs/source/figures/featuregroup.gif +0 -0
- ads/feature_store/docs/source/figures/lineage_d1.png +0 -0
- ads/feature_store/docs/source/figures/lineage_d2.png +0 -0
- ads/feature_store/docs/source/figures/lineage_fg.png +0 -0
- ads/feature_store/docs/source/figures/logo-dark-mode.png +0 -0
- ads/feature_store/docs/source/figures/logo-light-mode.png +0 -0
- ads/feature_store/docs/source/figures/overview.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager_feature_store_stack.png +0 -0
- ads/feature_store/docs/source/figures/resource_manager_home.png +0 -0
- ads/feature_store/docs/source/figures/stats_1.png +0 -0
- ads/feature_store/docs/source/figures/stats_2.png +0 -0
- ads/feature_store/docs/source/figures/stats_d.png +0 -0
- ads/feature_store/docs/source/figures/stats_fg.png +0 -0
- ads/feature_store/docs/source/figures/transformation.png +0 -0
- ads/feature_store/docs/source/figures/transformations.gif +0 -0
- ads/feature_store/docs/source/figures/validation.png +0 -0
- ads/feature_store/docs/source/figures/validation_fg.png +0 -0
- ads/feature_store/docs/source/figures/validation_results.png +0 -0
- ads/feature_store/docs/source/figures/validation_summary.png +0 -0
- ads/feature_store/docs/source/index.rst +0 -81
- ads/feature_store/docs/source/module.rst +0 -8
- ads/feature_store/docs/source/notebook.rst +0 -94
- ads/feature_store/docs/source/overview.rst +0 -47
- ads/feature_store/docs/source/quickstart.rst +0 -176
- ads/feature_store/docs/source/release_notes.rst +0 -194
- ads/feature_store/docs/source/setup_feature_store.rst +0 -81
- ads/feature_store/docs/source/statistics.rst +0 -58
- ads/feature_store/docs/source/transformation.rst +0 -199
- ads/feature_store/docs/source/ui.rst +0 -65
- ads/feature_store/docs/source/user_guides.setup.feature_store_operator.rst +0 -66
- ads/feature_store/docs/source/user_guides.setup.helm_chart.rst +0 -192
- ads/feature_store/docs/source/user_guides.setup.terraform.rst +0 -338
- ads/feature_store/entity.py +0 -718
- ads/feature_store/execution_strategy/__init__.py +0 -0
- ads/feature_store/execution_strategy/delta_lake/__init__.py +0 -0
- ads/feature_store/execution_strategy/delta_lake/delta_lake_service.py +0 -375
- ads/feature_store/execution_strategy/engine/__init__.py +0 -0
- ads/feature_store/execution_strategy/engine/spark_engine.py +0 -316
- ads/feature_store/execution_strategy/execution_strategy.py +0 -113
- ads/feature_store/execution_strategy/execution_strategy_provider.py +0 -47
- ads/feature_store/execution_strategy/spark/__init__.py +0 -0
- ads/feature_store/execution_strategy/spark/spark_execution.py +0 -618
- ads/feature_store/feature.py +0 -192
- ads/feature_store/feature_group.py +0 -1494
- ads/feature_store/feature_group_expectation.py +0 -346
- ads/feature_store/feature_group_job.py +0 -602
- ads/feature_store/feature_lineage/__init__.py +0 -0
- ads/feature_store/feature_lineage/graphviz_service.py +0 -180
- ads/feature_store/feature_option_details.py +0 -50
- ads/feature_store/feature_statistics/__init__.py +0 -0
- ads/feature_store/feature_statistics/statistics_service.py +0 -99
- ads/feature_store/feature_store.py +0 -699
- ads/feature_store/feature_store_registrar.py +0 -518
- ads/feature_store/input_feature_detail.py +0 -149
- ads/feature_store/mixin/__init__.py +0 -4
- ads/feature_store/mixin/oci_feature_store.py +0 -145
- ads/feature_store/model_details.py +0 -73
- ads/feature_store/query/__init__.py +0 -0
- ads/feature_store/query/filter.py +0 -266
- ads/feature_store/query/generator/__init__.py +0 -0
- ads/feature_store/query/generator/query_generator.py +0 -298
- ads/feature_store/query/join.py +0 -161
- ads/feature_store/query/query.py +0 -403
- ads/feature_store/query/validator/__init__.py +0 -0
- ads/feature_store/query/validator/query_validator.py +0 -57
- ads/feature_store/response/__init__.py +0 -0
- ads/feature_store/response/response_builder.py +0 -68
- ads/feature_store/service/__init__.py +0 -0
- ads/feature_store/service/oci_dataset.py +0 -139
- ads/feature_store/service/oci_dataset_job.py +0 -199
- ads/feature_store/service/oci_entity.py +0 -125
- ads/feature_store/service/oci_feature_group.py +0 -164
- ads/feature_store/service/oci_feature_group_job.py +0 -214
- ads/feature_store/service/oci_feature_store.py +0 -182
- ads/feature_store/service/oci_lineage.py +0 -87
- ads/feature_store/service/oci_transformation.py +0 -104
- ads/feature_store/statistics/__init__.py +0 -0
- ads/feature_store/statistics/abs_feature_value.py +0 -49
- ads/feature_store/statistics/charts/__init__.py +0 -0
- ads/feature_store/statistics/charts/abstract_feature_plot.py +0 -37
- ads/feature_store/statistics/charts/box_plot.py +0 -148
- ads/feature_store/statistics/charts/frequency_distribution.py +0 -65
- ads/feature_store/statistics/charts/probability_distribution.py +0 -68
- ads/feature_store/statistics/charts/top_k_frequent_elements.py +0 -98
- ads/feature_store/statistics/feature_stat.py +0 -126
- ads/feature_store/statistics/generic_feature_value.py +0 -33
- ads/feature_store/statistics/statistics.py +0 -41
- ads/feature_store/statistics_config.py +0 -101
- ads/feature_store/templates/feature_store_template.yaml +0 -45
- ads/feature_store/transformation.py +0 -499
- ads/feature_store/validation_output.py +0 -57
- ads/hpo/__init__.py +0 -9
- ads/hpo/_imports.py +0 -91
- ads/hpo/ads_search_space.py +0 -439
- ads/hpo/distributions.py +0 -325
- ads/hpo/objective.py +0 -280
- ads/hpo/search_cv.py +0 -1657
- ads/hpo/stopping_criterion.py +0 -75
- ads/hpo/tuner_artifact.py +0 -413
- ads/hpo/utils.py +0 -91
- ads/hpo/validation.py +0 -140
- ads/hpo/visualization/__init__.py +0 -5
- ads/hpo/visualization/_contour.py +0 -23
- ads/hpo/visualization/_edf.py +0 -20
- ads/hpo/visualization/_intermediate_values.py +0 -21
- ads/hpo/visualization/_optimization_history.py +0 -25
- ads/hpo/visualization/_parallel_coordinate.py +0 -169
- ads/hpo/visualization/_param_importances.py +0 -26
- ads/jobs/__init__.py +0 -53
- ads/jobs/ads_job.py +0 -663
- ads/jobs/builders/__init__.py +0 -5
- ads/jobs/builders/base.py +0 -156
- ads/jobs/builders/infrastructure/__init__.py +0 -6
- ads/jobs/builders/infrastructure/base.py +0 -165
- ads/jobs/builders/infrastructure/dataflow.py +0 -1252
- ads/jobs/builders/infrastructure/dsc_job.py +0 -1894
- ads/jobs/builders/infrastructure/dsc_job_runtime.py +0 -1233
- ads/jobs/builders/infrastructure/utils.py +0 -65
- ads/jobs/builders/runtimes/__init__.py +0 -5
- ads/jobs/builders/runtimes/artifact.py +0 -338
- ads/jobs/builders/runtimes/base.py +0 -325
- ads/jobs/builders/runtimes/container_runtime.py +0 -242
- ads/jobs/builders/runtimes/python_runtime.py +0 -1016
- ads/jobs/builders/runtimes/pytorch_runtime.py +0 -204
- ads/jobs/cli.py +0 -104
- ads/jobs/env_var_parser.py +0 -131
- ads/jobs/extension.py +0 -160
- ads/jobs/schema/__init__.py +0 -5
- ads/jobs/schema/infrastructure_schema.json +0 -116
- ads/jobs/schema/job_schema.json +0 -42
- ads/jobs/schema/runtime_schema.json +0 -183
- ads/jobs/schema/validator.py +0 -141
- ads/jobs/serializer.py +0 -296
- ads/jobs/templates/__init__.py +0 -5
- ads/jobs/templates/container.py +0 -6
- ads/jobs/templates/driver_notebook.py +0 -177
- ads/jobs/templates/driver_oci.py +0 -500
- ads/jobs/templates/driver_python.py +0 -48
- ads/jobs/templates/driver_pytorch.py +0 -852
- ads/jobs/templates/driver_utils.py +0 -615
- ads/jobs/templates/hostname_from_env.c +0 -55
- ads/jobs/templates/oci_metrics.py +0 -181
- ads/jobs/utils.py +0 -104
- ads/llm/__init__.py +0 -28
- ads/llm/autogen/__init__.py +0 -2
- ads/llm/autogen/constants.py +0 -15
- ads/llm/autogen/reports/__init__.py +0 -2
- ads/llm/autogen/reports/base.py +0 -67
- ads/llm/autogen/reports/data.py +0 -103
- ads/llm/autogen/reports/session.py +0 -526
- ads/llm/autogen/reports/templates/chat_box.html +0 -13
- ads/llm/autogen/reports/templates/chat_box_lt.html +0 -5
- ads/llm/autogen/reports/templates/chat_box_rt.html +0 -6
- ads/llm/autogen/reports/utils.py +0 -56
- ads/llm/autogen/v02/__init__.py +0 -4
- ads/llm/autogen/v02/client.py +0 -295
- ads/llm/autogen/v02/log_handlers/__init__.py +0 -2
- ads/llm/autogen/v02/log_handlers/oci_file_handler.py +0 -83
- ads/llm/autogen/v02/loggers/__init__.py +0 -6
- ads/llm/autogen/v02/loggers/metric_logger.py +0 -320
- ads/llm/autogen/v02/loggers/session_logger.py +0 -580
- ads/llm/autogen/v02/loggers/utils.py +0 -86
- ads/llm/autogen/v02/runtime_logging.py +0 -163
- ads/llm/chain.py +0 -268
- ads/llm/chat_template.py +0 -31
- ads/llm/deploy.py +0 -63
- ads/llm/guardrails/__init__.py +0 -5
- ads/llm/guardrails/base.py +0 -442
- ads/llm/guardrails/huggingface.py +0 -44
- ads/llm/langchain/__init__.py +0 -5
- ads/llm/langchain/plugins/__init__.py +0 -5
- ads/llm/langchain/plugins/chat_models/__init__.py +0 -5
- ads/llm/langchain/plugins/chat_models/oci_data_science.py +0 -1027
- ads/llm/langchain/plugins/embeddings/__init__.py +0 -4
- ads/llm/langchain/plugins/embeddings/oci_data_science_model_deployment_endpoint.py +0 -184
- ads/llm/langchain/plugins/llms/__init__.py +0 -5
- ads/llm/langchain/plugins/llms/oci_data_science_model_deployment_endpoint.py +0 -979
- ads/llm/requirements.txt +0 -3
- ads/llm/serialize.py +0 -219
- ads/llm/serializers/__init__.py +0 -0
- ads/llm/serializers/retrieval_qa.py +0 -153
- ads/llm/serializers/runnable_parallel.py +0 -27
- ads/llm/templates/score_chain.jinja2 +0 -155
- ads/llm/templates/tool_chat_template_hermes.jinja +0 -130
- ads/llm/templates/tool_chat_template_mistral_parallel.jinja +0 -94
- ads/model/__init__.py +0 -52
- ads/model/artifact.py +0 -573
- ads/model/artifact_downloader.py +0 -254
- ads/model/artifact_uploader.py +0 -267
- ads/model/base_properties.py +0 -238
- ads/model/common/.model-ignore +0 -66
- ads/model/common/__init__.py +0 -5
- ads/model/common/utils.py +0 -142
- ads/model/datascience_model.py +0 -2635
- ads/model/deployment/__init__.py +0 -20
- ads/model/deployment/common/__init__.py +0 -5
- ads/model/deployment/common/utils.py +0 -308
- ads/model/deployment/model_deployer.py +0 -466
- ads/model/deployment/model_deployment.py +0 -1846
- ads/model/deployment/model_deployment_infrastructure.py +0 -671
- ads/model/deployment/model_deployment_properties.py +0 -493
- ads/model/deployment/model_deployment_runtime.py +0 -838
- ads/model/extractor/__init__.py +0 -5
- ads/model/extractor/automl_extractor.py +0 -74
- ads/model/extractor/embedding_onnx_extractor.py +0 -80
- ads/model/extractor/huggingface_extractor.py +0 -88
- ads/model/extractor/keras_extractor.py +0 -84
- ads/model/extractor/lightgbm_extractor.py +0 -93
- ads/model/extractor/model_info_extractor.py +0 -114
- ads/model/extractor/model_info_extractor_factory.py +0 -105
- ads/model/extractor/pytorch_extractor.py +0 -87
- ads/model/extractor/sklearn_extractor.py +0 -112
- ads/model/extractor/spark_extractor.py +0 -89
- ads/model/extractor/tensorflow_extractor.py +0 -85
- ads/model/extractor/xgboost_extractor.py +0 -94
- ads/model/framework/__init__.py +0 -5
- ads/model/framework/automl_model.py +0 -178
- ads/model/framework/embedding_onnx_model.py +0 -438
- ads/model/framework/huggingface_model.py +0 -399
- ads/model/framework/lightgbm_model.py +0 -266
- ads/model/framework/pytorch_model.py +0 -266
- ads/model/framework/sklearn_model.py +0 -250
- ads/model/framework/spark_model.py +0 -326
- ads/model/framework/tensorflow_model.py +0 -254
- ads/model/framework/xgboost_model.py +0 -258
- ads/model/generic_model.py +0 -3518
- ads/model/model_artifact_boilerplate/README.md +0 -381
- ads/model/model_artifact_boilerplate/__init__.py +0 -5
- ads/model/model_artifact_boilerplate/artifact_introspection_test/__init__.py +0 -5
- ads/model/model_artifact_boilerplate/artifact_introspection_test/model_artifact_validate.py +0 -427
- ads/model/model_artifact_boilerplate/artifact_introspection_test/requirements.txt +0 -2
- ads/model/model_artifact_boilerplate/runtime.yaml +0 -7
- ads/model/model_artifact_boilerplate/score.py +0 -61
- ads/model/model_file_description_schema.json +0 -68
- ads/model/model_introspect.py +0 -331
- ads/model/model_metadata.py +0 -1810
- ads/model/model_metadata_mixin.py +0 -460
- ads/model/model_properties.py +0 -63
- ads/model/model_version_set.py +0 -739
- ads/model/runtime/__init__.py +0 -5
- ads/model/runtime/env_info.py +0 -306
- ads/model/runtime/model_deployment_details.py +0 -37
- ads/model/runtime/model_provenance_details.py +0 -58
- ads/model/runtime/runtime_info.py +0 -81
- ads/model/runtime/schemas/inference_env_info_schema.yaml +0 -16
- ads/model/runtime/schemas/model_provenance_schema.yaml +0 -36
- ads/model/runtime/schemas/training_env_info_schema.yaml +0 -16
- ads/model/runtime/utils.py +0 -201
- ads/model/serde/__init__.py +0 -5
- ads/model/serde/common.py +0 -40
- ads/model/serde/model_input.py +0 -547
- ads/model/serde/model_serializer.py +0 -1184
- ads/model/service/__init__.py +0 -5
- ads/model/service/oci_datascience_model.py +0 -1076
- ads/model/service/oci_datascience_model_deployment.py +0 -500
- ads/model/service/oci_datascience_model_version_set.py +0 -176
- ads/model/transformer/__init__.py +0 -5
- ads/model/transformer/onnx_transformer.py +0 -324
- ads/mysqldb/__init__.py +0 -5
- ads/mysqldb/mysql_db.py +0 -227
- ads/opctl/__init__.py +0 -18
- ads/opctl/anomaly_detection.py +0 -11
- ads/opctl/backend/__init__.py +0 -5
- ads/opctl/backend/ads_dataflow.py +0 -353
- ads/opctl/backend/ads_ml_job.py +0 -710
- ads/opctl/backend/ads_ml_pipeline.py +0 -164
- ads/opctl/backend/ads_model_deployment.py +0 -209
- ads/opctl/backend/base.py +0 -146
- ads/opctl/backend/local.py +0 -1053
- ads/opctl/backend/marketplace/__init__.py +0 -9
- ads/opctl/backend/marketplace/helm_helper.py +0 -173
- ads/opctl/backend/marketplace/local_marketplace.py +0 -271
- ads/opctl/backend/marketplace/marketplace_backend_runner.py +0 -71
- ads/opctl/backend/marketplace/marketplace_operator_interface.py +0 -44
- ads/opctl/backend/marketplace/marketplace_operator_runner.py +0 -24
- ads/opctl/backend/marketplace/marketplace_utils.py +0 -212
- ads/opctl/backend/marketplace/models/__init__.py +0 -5
- ads/opctl/backend/marketplace/models/bearer_token.py +0 -94
- ads/opctl/backend/marketplace/models/marketplace_type.py +0 -70
- ads/opctl/backend/marketplace/models/ocir_details.py +0 -56
- ads/opctl/backend/marketplace/prerequisite_checker.py +0 -238
- ads/opctl/cli.py +0 -707
- ads/opctl/cmds.py +0 -869
- ads/opctl/conda/__init__.py +0 -5
- ads/opctl/conda/cli.py +0 -193
- ads/opctl/conda/cmds.py +0 -749
- ads/opctl/conda/config.yaml +0 -34
- ads/opctl/conda/manifest_template.yaml +0 -13
- ads/opctl/conda/multipart_uploader.py +0 -188
- ads/opctl/conda/pack.py +0 -89
- ads/opctl/config/__init__.py +0 -5
- ads/opctl/config/base.py +0 -57
- ads/opctl/config/diagnostics/__init__.py +0 -5
- ads/opctl/config/diagnostics/distributed/default_requirements_config.yaml +0 -62
- ads/opctl/config/merger.py +0 -255
- ads/opctl/config/resolver.py +0 -297
- ads/opctl/config/utils.py +0 -79
- ads/opctl/config/validator.py +0 -17
- ads/opctl/config/versioner.py +0 -68
- ads/opctl/config/yaml_parsers/__init__.py +0 -7
- ads/opctl/config/yaml_parsers/base.py +0 -58
- ads/opctl/config/yaml_parsers/distributed/__init__.py +0 -7
- ads/opctl/config/yaml_parsers/distributed/yaml_parser.py +0 -201
- ads/opctl/constants.py +0 -66
- ads/opctl/decorator/__init__.py +0 -5
- ads/opctl/decorator/common.py +0 -129
- ads/opctl/diagnostics/__init__.py +0 -5
- ads/opctl/diagnostics/__main__.py +0 -25
- ads/opctl/diagnostics/check_distributed_job_requirements.py +0 -212
- ads/opctl/diagnostics/check_requirements.py +0 -144
- ads/opctl/diagnostics/requirement_exception.py +0 -9
- ads/opctl/distributed/README.md +0 -109
- ads/opctl/distributed/__init__.py +0 -5
- ads/opctl/distributed/certificates.py +0 -32
- ads/opctl/distributed/cli.py +0 -207
- ads/opctl/distributed/cmds.py +0 -731
- ads/opctl/distributed/common/__init__.py +0 -5
- ads/opctl/distributed/common/abstract_cluster_provider.py +0 -449
- ads/opctl/distributed/common/abstract_framework_spec_builder.py +0 -88
- ads/opctl/distributed/common/cluster_config_helper.py +0 -103
- ads/opctl/distributed/common/cluster_provider_factory.py +0 -21
- ads/opctl/distributed/common/cluster_runner.py +0 -54
- ads/opctl/distributed/common/framework_factory.py +0 -29
- ads/opctl/docker/Dockerfile.job +0 -103
- ads/opctl/docker/Dockerfile.job.arm +0 -107
- ads/opctl/docker/Dockerfile.job.gpu +0 -175
- ads/opctl/docker/base-env.yaml +0 -13
- ads/opctl/docker/cuda.repo +0 -6
- ads/opctl/docker/operator/.dockerignore +0 -0
- ads/opctl/docker/operator/Dockerfile +0 -41
- ads/opctl/docker/operator/Dockerfile.gpu +0 -85
- ads/opctl/docker/operator/cuda.repo +0 -6
- ads/opctl/docker/operator/environment.yaml +0 -8
- ads/opctl/forecast.py +0 -11
- ads/opctl/index.yaml +0 -3
- ads/opctl/model/__init__.py +0 -5
- ads/opctl/model/cli.py +0 -65
- ads/opctl/model/cmds.py +0 -73
- ads/opctl/operator/README.md +0 -4
- ads/opctl/operator/__init__.py +0 -31
- ads/opctl/operator/cli.py +0 -344
- ads/opctl/operator/cmd.py +0 -596
- ads/opctl/operator/common/__init__.py +0 -5
- ads/opctl/operator/common/backend_factory.py +0 -460
- ads/opctl/operator/common/const.py +0 -27
- ads/opctl/operator/common/data/synthetic.csv +0 -16001
- ads/opctl/operator/common/dictionary_merger.py +0 -148
- ads/opctl/operator/common/errors.py +0 -42
- ads/opctl/operator/common/operator_config.py +0 -99
- ads/opctl/operator/common/operator_loader.py +0 -811
- ads/opctl/operator/common/operator_schema.yaml +0 -130
- ads/opctl/operator/common/operator_yaml_generator.py +0 -152
- ads/opctl/operator/common/utils.py +0 -208
- ads/opctl/operator/lowcode/__init__.py +0 -5
- ads/opctl/operator/lowcode/anomaly/MLoperator +0 -16
- ads/opctl/operator/lowcode/anomaly/README.md +0 -207
- ads/opctl/operator/lowcode/anomaly/__init__.py +0 -5
- ads/opctl/operator/lowcode/anomaly/__main__.py +0 -103
- ads/opctl/operator/lowcode/anomaly/cmd.py +0 -35
- ads/opctl/operator/lowcode/anomaly/const.py +0 -167
- ads/opctl/operator/lowcode/anomaly/environment.yaml +0 -10
- ads/opctl/operator/lowcode/anomaly/model/__init__.py +0 -5
- ads/opctl/operator/lowcode/anomaly/model/anomaly_dataset.py +0 -146
- ads/opctl/operator/lowcode/anomaly/model/anomaly_merlion.py +0 -162
- ads/opctl/operator/lowcode/anomaly/model/automlx.py +0 -99
- ads/opctl/operator/lowcode/anomaly/model/autots.py +0 -115
- ads/opctl/operator/lowcode/anomaly/model/base_model.py +0 -404
- ads/opctl/operator/lowcode/anomaly/model/factory.py +0 -110
- ads/opctl/operator/lowcode/anomaly/model/isolationforest.py +0 -78
- ads/opctl/operator/lowcode/anomaly/model/oneclasssvm.py +0 -78
- ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py +0 -120
- ads/opctl/operator/lowcode/anomaly/model/tods.py +0 -119
- ads/opctl/operator/lowcode/anomaly/operator_config.py +0 -127
- ads/opctl/operator/lowcode/anomaly/schema.yaml +0 -401
- ads/opctl/operator/lowcode/anomaly/utils.py +0 -88
- ads/opctl/operator/lowcode/common/__init__.py +0 -5
- ads/opctl/operator/lowcode/common/const.py +0 -10
- ads/opctl/operator/lowcode/common/data.py +0 -116
- ads/opctl/operator/lowcode/common/errors.py +0 -47
- ads/opctl/operator/lowcode/common/transformations.py +0 -296
- ads/opctl/operator/lowcode/common/utils.py +0 -293
- ads/opctl/operator/lowcode/feature_store_marketplace/MLoperator +0 -13
- ads/opctl/operator/lowcode/feature_store_marketplace/README.md +0 -30
- ads/opctl/operator/lowcode/feature_store_marketplace/__init__.py +0 -5
- ads/opctl/operator/lowcode/feature_store_marketplace/__main__.py +0 -116
- ads/opctl/operator/lowcode/feature_store_marketplace/cmd.py +0 -85
- ads/opctl/operator/lowcode/feature_store_marketplace/const.py +0 -15
- ads/opctl/operator/lowcode/feature_store_marketplace/environment.yaml +0 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/__init__.py +0 -4
- ads/opctl/operator/lowcode/feature_store_marketplace/models/apigw_config.py +0 -32
- ads/opctl/operator/lowcode/feature_store_marketplace/models/db_config.py +0 -43
- ads/opctl/operator/lowcode/feature_store_marketplace/models/mysql_config.py +0 -120
- ads/opctl/operator/lowcode/feature_store_marketplace/models/serializable_yaml_model.py +0 -34
- ads/opctl/operator/lowcode/feature_store_marketplace/operator_utils.py +0 -386
- ads/opctl/operator/lowcode/feature_store_marketplace/schema.yaml +0 -160
- ads/opctl/operator/lowcode/forecast/MLoperator +0 -25
- ads/opctl/operator/lowcode/forecast/README.md +0 -209
- ads/opctl/operator/lowcode/forecast/__init__.py +0 -5
- ads/opctl/operator/lowcode/forecast/__main__.py +0 -89
- ads/opctl/operator/lowcode/forecast/cmd.py +0 -40
- ads/opctl/operator/lowcode/forecast/const.py +0 -92
- ads/opctl/operator/lowcode/forecast/environment.yaml +0 -20
- ads/opctl/operator/lowcode/forecast/errors.py +0 -26
- ads/opctl/operator/lowcode/forecast/model/__init__.py +0 -5
- ads/opctl/operator/lowcode/forecast/model/arima.py +0 -279
- ads/opctl/operator/lowcode/forecast/model/automlx.py +0 -542
- ads/opctl/operator/lowcode/forecast/model/autots.py +0 -312
- ads/opctl/operator/lowcode/forecast/model/base_model.py +0 -863
- ads/opctl/operator/lowcode/forecast/model/factory.py +0 -106
- ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +0 -492
- ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +0 -243
- ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +0 -486
- ads/opctl/operator/lowcode/forecast/model/prophet.py +0 -445
- ads/opctl/operator/lowcode/forecast/model_evaluator.py +0 -244
- ads/opctl/operator/lowcode/forecast/operator_config.py +0 -234
- ads/opctl/operator/lowcode/forecast/schema.yaml +0 -506
- ads/opctl/operator/lowcode/forecast/utils.py +0 -413
- ads/opctl/operator/lowcode/forecast/whatifserve/__init__.py +0 -7
- ads/opctl/operator/lowcode/forecast/whatifserve/deployment_manager.py +0 -285
- ads/opctl/operator/lowcode/forecast/whatifserve/score.py +0 -246
- ads/opctl/operator/lowcode/pii/MLoperator +0 -17
- ads/opctl/operator/lowcode/pii/README.md +0 -208
- ads/opctl/operator/lowcode/pii/__init__.py +0 -5
- ads/opctl/operator/lowcode/pii/__main__.py +0 -78
- ads/opctl/operator/lowcode/pii/cmd.py +0 -39
- ads/opctl/operator/lowcode/pii/constant.py +0 -84
- ads/opctl/operator/lowcode/pii/environment.yaml +0 -17
- ads/opctl/operator/lowcode/pii/errors.py +0 -27
- ads/opctl/operator/lowcode/pii/model/__init__.py +0 -5
- ads/opctl/operator/lowcode/pii/model/factory.py +0 -82
- ads/opctl/operator/lowcode/pii/model/guardrails.py +0 -167
- ads/opctl/operator/lowcode/pii/model/pii.py +0 -145
- ads/opctl/operator/lowcode/pii/model/processor/__init__.py +0 -34
- ads/opctl/operator/lowcode/pii/model/processor/email_replacer.py +0 -34
- ads/opctl/operator/lowcode/pii/model/processor/mbi_replacer.py +0 -35
- ads/opctl/operator/lowcode/pii/model/processor/name_replacer.py +0 -225
- ads/opctl/operator/lowcode/pii/model/processor/number_replacer.py +0 -73
- ads/opctl/operator/lowcode/pii/model/processor/remover.py +0 -26
- ads/opctl/operator/lowcode/pii/model/report.py +0 -487
- ads/opctl/operator/lowcode/pii/operator_config.py +0 -95
- ads/opctl/operator/lowcode/pii/schema.yaml +0 -108
- ads/opctl/operator/lowcode/pii/utils.py +0 -43
- ads/opctl/operator/lowcode/recommender/MLoperator +0 -16
- ads/opctl/operator/lowcode/recommender/README.md +0 -206
- ads/opctl/operator/lowcode/recommender/__init__.py +0 -5
- ads/opctl/operator/lowcode/recommender/__main__.py +0 -82
- ads/opctl/operator/lowcode/recommender/cmd.py +0 -33
- ads/opctl/operator/lowcode/recommender/constant.py +0 -30
- ads/opctl/operator/lowcode/recommender/environment.yaml +0 -11
- ads/opctl/operator/lowcode/recommender/model/base_model.py +0 -212
- ads/opctl/operator/lowcode/recommender/model/factory.py +0 -56
- ads/opctl/operator/lowcode/recommender/model/recommender_dataset.py +0 -25
- ads/opctl/operator/lowcode/recommender/model/svd.py +0 -106
- ads/opctl/operator/lowcode/recommender/operator_config.py +0 -81
- ads/opctl/operator/lowcode/recommender/schema.yaml +0 -265
- ads/opctl/operator/lowcode/recommender/utils.py +0 -13
- ads/opctl/operator/runtime/__init__.py +0 -5
- ads/opctl/operator/runtime/const.py +0 -17
- ads/opctl/operator/runtime/container_runtime_schema.yaml +0 -50
- ads/opctl/operator/runtime/marketplace_runtime.py +0 -50
- ads/opctl/operator/runtime/python_marketplace_runtime_schema.yaml +0 -21
- ads/opctl/operator/runtime/python_runtime_schema.yaml +0 -21
- ads/opctl/operator/runtime/runtime.py +0 -115
- ads/opctl/schema.yaml.yml +0 -36
- ads/opctl/script.py +0 -40
- ads/opctl/spark/__init__.py +0 -5
- ads/opctl/spark/cli.py +0 -43
- ads/opctl/spark/cmds.py +0 -147
- ads/opctl/templates/diagnostic_report_template.jinja2 +0 -102
- ads/opctl/utils.py +0 -344
- ads/oracledb/__init__.py +0 -5
- ads/oracledb/oracle_db.py +0 -346
- ads/pipeline/__init__.py +0 -39
- ads/pipeline/ads_pipeline.py +0 -2279
- ads/pipeline/ads_pipeline_run.py +0 -772
- ads/pipeline/ads_pipeline_step.py +0 -605
- ads/pipeline/builders/__init__.py +0 -5
- ads/pipeline/builders/infrastructure/__init__.py +0 -5
- ads/pipeline/builders/infrastructure/custom_script.py +0 -32
- ads/pipeline/cli.py +0 -119
- ads/pipeline/extension.py +0 -291
- ads/pipeline/schema/__init__.py +0 -5
- ads/pipeline/schema/cs_step_schema.json +0 -35
- ads/pipeline/schema/ml_step_schema.json +0 -31
- ads/pipeline/schema/pipeline_schema.json +0 -71
- ads/pipeline/visualizer/__init__.py +0 -5
- ads/pipeline/visualizer/base.py +0 -570
- ads/pipeline/visualizer/graph_renderer.py +0 -272
- ads/pipeline/visualizer/text_renderer.py +0 -84
- ads/secrets/__init__.py +0 -11
- ads/secrets/adb.py +0 -386
- ads/secrets/auth_token.py +0 -86
- ads/secrets/big_data_service.py +0 -365
- ads/secrets/mysqldb.py +0 -149
- ads/secrets/oracledb.py +0 -160
- ads/secrets/secrets.py +0 -407
- ads/telemetry/__init__.py +0 -7
- ads/telemetry/base.py +0 -69
- ads/telemetry/client.py +0 -125
- ads/telemetry/telemetry.py +0 -257
- ads/templates/dataflow_pyspark.jinja2 +0 -13
- ads/templates/dataflow_sparksql.jinja2 +0 -22
- ads/templates/func.jinja2 +0 -20
- ads/templates/schemas/openapi.json +0 -1740
- ads/templates/score-pkl.jinja2 +0 -173
- ads/templates/score.jinja2 +0 -322
- ads/templates/score_embedding_onnx.jinja2 +0 -202
- ads/templates/score_generic.jinja2 +0 -165
- ads/templates/score_huggingface_pipeline.jinja2 +0 -217
- ads/templates/score_lightgbm.jinja2 +0 -185
- ads/templates/score_onnx.jinja2 +0 -407
- ads/templates/score_onnx_new.jinja2 +0 -473
- ads/templates/score_oracle_automl.jinja2 +0 -185
- ads/templates/score_pyspark.jinja2 +0 -154
- ads/templates/score_pytorch.jinja2 +0 -219
- ads/templates/score_scikit-learn.jinja2 +0 -184
- ads/templates/score_tensorflow.jinja2 +0 -184
- ads/templates/score_xgboost.jinja2 +0 -178
- ads/text_dataset/__init__.py +0 -5
- ads/text_dataset/backends.py +0 -211
- ads/text_dataset/dataset.py +0 -445
- ads/text_dataset/extractor.py +0 -207
- ads/text_dataset/options.py +0 -53
- ads/text_dataset/udfs.py +0 -22
- ads/text_dataset/utils.py +0 -49
- ads/type_discovery/__init__.py +0 -9
- ads/type_discovery/abstract_detector.py +0 -21
- ads/type_discovery/constant_detector.py +0 -41
- ads/type_discovery/continuous_detector.py +0 -54
- ads/type_discovery/credit_card_detector.py +0 -99
- ads/type_discovery/datetime_detector.py +0 -92
- ads/type_discovery/discrete_detector.py +0 -118
- ads/type_discovery/document_detector.py +0 -146
- ads/type_discovery/ip_detector.py +0 -68
- ads/type_discovery/latlon_detector.py +0 -90
- ads/type_discovery/phone_number_detector.py +0 -63
- ads/type_discovery/type_discovery_driver.py +0 -87
- ads/type_discovery/typed_feature.py +0 -594
- ads/type_discovery/unknown_detector.py +0 -41
- ads/type_discovery/zipcode_detector.py +0 -48
- ads/vault/__init__.py +0 -7
- ads/vault/vault.py +0 -237
- oracle_ads-2.13.8.dist-info/RECORD +0 -858
- {oracle_ads-2.13.8.dist-info → oracle_ads-2.13.9rc0.dist-info}/licenses/LICENSE.txt +0 -0
ads/opctl/backend/local.py
DELETED
@@ -1,1053 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python
|
2
|
-
# -*- coding: utf-8; -*-
|
3
|
-
|
4
|
-
# Copyright (c) 2022, 2023 Oracle and/or its affiliates.
|
5
|
-
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
6
|
-
|
7
|
-
import copy
|
8
|
-
import json
|
9
|
-
import os
|
10
|
-
import runpy
|
11
|
-
import sys
|
12
|
-
import tempfile
|
13
|
-
from concurrent.futures import Future, ThreadPoolExecutor
|
14
|
-
from time import sleep
|
15
|
-
from typing import Dict, List, Optional, Union
|
16
|
-
|
17
|
-
from oci.data_science.models import PipelineStepRun
|
18
|
-
|
19
|
-
from ads.common.auth import AuthContext, create_signer
|
20
|
-
from ads.common.decorator.runtime_dependency import (
|
21
|
-
OptionalDependency,
|
22
|
-
runtime_dependency,
|
23
|
-
)
|
24
|
-
from ads.common.oci_client import OCIClientFactory
|
25
|
-
from ads.config import NO_CONTAINER
|
26
|
-
from ads.model.model_metadata import ModelCustomMetadata
|
27
|
-
from ads.model.runtime.runtime_info import RuntimeInfo
|
28
|
-
from ads.opctl import logger
|
29
|
-
from ads.opctl.backend.base import Backend
|
30
|
-
from ads.opctl.conda.cmds import _install
|
31
|
-
from ads.opctl.config.resolver import ConfigResolver
|
32
|
-
from ads.opctl.constants import (
|
33
|
-
DEFAULT_IMAGE_CONDA_DIR,
|
34
|
-
DEFAULT_IMAGE_HOME_DIR,
|
35
|
-
DEFAULT_IMAGE_SCRIPT_DIR,
|
36
|
-
DEFAULT_MODEL_DEPLOYMENT_FOLDER,
|
37
|
-
DEFAULT_MODEL_FOLDER,
|
38
|
-
DEFAULT_NOTEBOOK_SESSION_CONDA_DIR,
|
39
|
-
DEFAULT_NOTEBOOK_SESSION_SPARK_CONF_DIR,
|
40
|
-
ML_JOB_GPU_IMAGE,
|
41
|
-
ML_JOB_IMAGE,
|
42
|
-
)
|
43
|
-
from ads.opctl.distributed.cmds import load_ini, local_run
|
44
|
-
from ads.opctl.model.cmds import _download_model
|
45
|
-
from ads.opctl.operator import __operators__
|
46
|
-
from ads.opctl.operator.common.const import ENV_OPERATOR_ARGS
|
47
|
-
from ads.opctl.operator.common.operator_loader import OperatorInfo, OperatorLoader
|
48
|
-
from ads.opctl.operator.runtime import const as operator_runtime_const
|
49
|
-
from ads.opctl.operator.runtime import runtime as operator_runtime
|
50
|
-
from ads.opctl.spark.cmds import (
|
51
|
-
generate_core_site_properties,
|
52
|
-
generate_core_site_properties_str,
|
53
|
-
)
|
54
|
-
from ads.opctl.utils import (
|
55
|
-
build_image,
|
56
|
-
get_docker_client,
|
57
|
-
is_in_notebook_session,
|
58
|
-
run_command,
|
59
|
-
run_container,
|
60
|
-
)
|
61
|
-
from ads.pipeline.ads_pipeline import Pipeline, PipelineStep
|
62
|
-
|
63
|
-
|
64
|
-
class CondaPackNotFound(Exception): # pragma: no cover
|
65
|
-
pass
|
66
|
-
|
67
|
-
|
68
|
-
class LocalBackend(Backend):
|
69
|
-
def __init__(self, config: Dict) -> None:
|
70
|
-
"""
|
71
|
-
Initialize a LocalBackend object with given config.
|
72
|
-
|
73
|
-
Parameters
|
74
|
-
----------
|
75
|
-
config: dict
|
76
|
-
dictionary of configurations
|
77
|
-
"""
|
78
|
-
super().__init__(config=config)
|
79
|
-
|
80
|
-
def run(self):
|
81
|
-
if self.config.get("version") == "v1.0":
|
82
|
-
docker_image = self.config["spec"]["Infrastructure"]["spec"]["dockerImage"]
|
83
|
-
# TODO: don't hard code api keys
|
84
|
-
bind_volumes = {
|
85
|
-
os.path.expanduser("~/.oci"): {
|
86
|
-
"bind": os.path.join(DEFAULT_IMAGE_HOME_DIR, ".oci"),
|
87
|
-
"mode": "ro",
|
88
|
-
}
|
89
|
-
}
|
90
|
-
self._run_with_image_v1(bind_volumes)
|
91
|
-
|
92
|
-
else:
|
93
|
-
bind_volumes = {}
|
94
|
-
if not is_in_notebook_session():
|
95
|
-
bind_volumes = {
|
96
|
-
os.path.expanduser(
|
97
|
-
os.path.dirname(self.config["execution"]["oci_config"])
|
98
|
-
): {"bind": os.path.join(DEFAULT_IMAGE_HOME_DIR, ".oci")}
|
99
|
-
}
|
100
|
-
if self.config["execution"].get("conda_slug", None):
|
101
|
-
exit_code = self._run_with_conda_pack(bind_volumes)
|
102
|
-
elif self.config["execution"].get("image"):
|
103
|
-
exit_code = self._run_with_image(bind_volumes)
|
104
|
-
else:
|
105
|
-
raise ValueError("Either conda pack info or image should be specified.")
|
106
|
-
|
107
|
-
if exit_code != 0:
|
108
|
-
raise RuntimeError(
|
109
|
-
f"Job did not complete successfully. Exit code: {exit_code}. "
|
110
|
-
f"Run with the --debug argument to view container logs."
|
111
|
-
)
|
112
|
-
|
113
|
-
@runtime_dependency(module="docker", install_from=OptionalDependency.OPCTL)
|
114
|
-
def init_vscode_container(self) -> None:
|
115
|
-
"""
|
116
|
-
Create a .devcontainer.json file for development with VSCode.
|
117
|
-
|
118
|
-
Returns
|
119
|
-
-------
|
120
|
-
None
|
121
|
-
"""
|
122
|
-
source_folder = self.config["execution"].get("source_folder", None)
|
123
|
-
if source_folder:
|
124
|
-
source_folder = os.path.abspath(source_folder)
|
125
|
-
if not os.path.exists(source_folder):
|
126
|
-
raise FileNotFoundError(
|
127
|
-
f"source folder {source_folder} does not exist."
|
128
|
-
)
|
129
|
-
if self.config["execution"].get("gpu", False):
|
130
|
-
image = self.config["execution"].get("image", ML_JOB_GPU_IMAGE)
|
131
|
-
else:
|
132
|
-
image = self.config["execution"].get("image", ML_JOB_IMAGE)
|
133
|
-
oci_config_folder = os.path.expanduser(
|
134
|
-
os.path.dirname(self.config["execution"]["oci_config"])
|
135
|
-
)
|
136
|
-
dev_container = {
|
137
|
-
"image": image,
|
138
|
-
"extensions": ["ms-python.python"],
|
139
|
-
"mounts": [
|
140
|
-
f"source={oci_config_folder},target={os.path.join(DEFAULT_IMAGE_HOME_DIR, '.oci')},type=bind",
|
141
|
-
],
|
142
|
-
"workspaceMount": f"source={source_folder},target={os.path.join(DEFAULT_IMAGE_HOME_DIR, os.path.basename(source_folder))},type=bind",
|
143
|
-
"workspaceFolder": DEFAULT_IMAGE_HOME_DIR,
|
144
|
-
"name": f"{image}-dev-env",
|
145
|
-
}
|
146
|
-
if image == ML_JOB_IMAGE or image == ML_JOB_GPU_IMAGE:
|
147
|
-
conda_folder = os.path.expanduser(
|
148
|
-
self.config["execution"]["conda_pack_folder"]
|
149
|
-
)
|
150
|
-
dev_container["mounts"].append(
|
151
|
-
f"source={conda_folder},target={DEFAULT_IMAGE_CONDA_DIR},type=bind"
|
152
|
-
)
|
153
|
-
dev_container[
|
154
|
-
"postCreateCommand"
|
155
|
-
] = "conda init bash && source ~/.bashrc"
|
156
|
-
else:
|
157
|
-
raise ValueError(
|
158
|
-
"`--source-folder` option works with image `ml-job`, `ml-job-gpu` only. Those can be build with `ads opctl build-image`. Please check `ads opctl build-image -h`."
|
159
|
-
)
|
160
|
-
else:
|
161
|
-
image = self.config["execution"].get("image", None)
|
162
|
-
if not image:
|
163
|
-
raise ValueError("Image must be specified.")
|
164
|
-
else:
|
165
|
-
dev_container = {
|
166
|
-
"image": image,
|
167
|
-
"mounts": [],
|
168
|
-
"extensions": ["ms-python.python"],
|
169
|
-
}
|
170
|
-
|
171
|
-
dev_container["containerEnv"] = self.config["execution"].get("env_vars", {})
|
172
|
-
for k, v in self.config["execution"]["volumes"].items():
|
173
|
-
dev_container["mounts"].append(
|
174
|
-
f"source={os.path.abspath(k)},target={v['bind']},type=bind"
|
175
|
-
)
|
176
|
-
|
177
|
-
try:
|
178
|
-
client = get_docker_client()
|
179
|
-
client.api.inspect_image(image)
|
180
|
-
except docker.errors.ImageNotFound:
|
181
|
-
cmd = None
|
182
|
-
if image == ML_JOB_IMAGE:
|
183
|
-
cmd = "ads opctl build-image job-local"
|
184
|
-
elif image == ML_JOB_GPU_IMAGE:
|
185
|
-
cmd = "ads opctl build-image job-local -g"
|
186
|
-
if cmd:
|
187
|
-
raise RuntimeError(
|
188
|
-
f"Image {image} not found. Please run `{cmd}` to build the image."
|
189
|
-
)
|
190
|
-
else:
|
191
|
-
raise RuntimeError(f"Image {image} not found.")
|
192
|
-
if source_folder:
|
193
|
-
with open(
|
194
|
-
os.path.join(os.path.abspath(source_folder), ".devcontainer.json"), "w"
|
195
|
-
) as f:
|
196
|
-
f.write(json.dumps(dev_container, indent=2))
|
197
|
-
print(f"File {os.path.join(source_folder, '.devcontainer.json')} created.")
|
198
|
-
else:
|
199
|
-
with open(os.path.abspath(".devcontainer.json"), "w") as f:
|
200
|
-
f.write(json.dumps(dev_container, indent=2))
|
201
|
-
print(f"File {os.path.abspath('.devcontainer.json')} created.")
|
202
|
-
|
203
|
-
def _run_with_conda_pack(
|
204
|
-
self,
|
205
|
-
bind_volumes: Dict,
|
206
|
-
extra_cmd: str = "",
|
207
|
-
install: bool = False,
|
208
|
-
conda_uri: str = "",
|
209
|
-
) -> int:
|
210
|
-
env_vars = self.config["execution"].get("env_vars", {})
|
211
|
-
slug = self.config["execution"]["conda_slug"]
|
212
|
-
image = self.config["execution"].get("image", None)
|
213
|
-
|
214
|
-
# bind_volumes is modified in-place and does not need to be returned
|
215
|
-
# it is returned just to be explicit that it is changed during this function call
|
216
|
-
bind_volumes, env_vars = self._check_conda_pack_and_install_if_applicable(
|
217
|
-
slug, bind_volumes, env_vars, install=install, conda_uri=conda_uri
|
218
|
-
)
|
219
|
-
bind_volumes = self._mount_source_folder_if_exists(bind_volumes)
|
220
|
-
command = self._build_command_for_conda_run(extra_cmd)
|
221
|
-
if is_in_notebook_session():
|
222
|
-
run_command(command, shell=True)
|
223
|
-
else:
|
224
|
-
conda_pack_path = os.path.join(
|
225
|
-
os.path.expanduser(self.config["execution"]["conda_pack_folder"]), slug
|
226
|
-
)
|
227
|
-
if os.path.exists(os.path.join(conda_pack_path, "spark-defaults.conf")):
|
228
|
-
env_vars["SPARK_CONF_DIR"] = os.path.join(DEFAULT_IMAGE_CONDA_DIR, slug)
|
229
|
-
logger.info(
|
230
|
-
f"Running with conda pack in a container with command {command}"
|
231
|
-
)
|
232
|
-
return self._activate_conda_env_and_run(
|
233
|
-
image, slug, command, bind_volumes, env_vars
|
234
|
-
)
|
235
|
-
|
236
|
-
def _build_command_for_conda_run(self, extra_cmd: str = "") -> str:
|
237
|
-
if ConfigResolver(self.config)._is_ads_operator():
|
238
|
-
if is_in_notebook_session():
|
239
|
-
curr_dir = os.path.dirname(os.path.abspath(__file__))
|
240
|
-
script = os.path.abspath(
|
241
|
-
os.path.join(curr_dir, "..", "operators", "run.py")
|
242
|
-
)
|
243
|
-
else:
|
244
|
-
script = os.path.join(DEFAULT_IMAGE_SCRIPT_DIR, "operators/run.py")
|
245
|
-
command = f"python {script} "
|
246
|
-
if self.config["execution"]["auth"] == "resource_principal":
|
247
|
-
command += "-r "
|
248
|
-
else:
|
249
|
-
entry_script = self.config["execution"].get("entrypoint")
|
250
|
-
if not entry_script:
|
251
|
-
raise ValueError(
|
252
|
-
"An entrypoint script must be specified when running with conda pack. "
|
253
|
-
"Use `--entrypoint`."
|
254
|
-
)
|
255
|
-
if not os.path.exists(
|
256
|
-
os.path.join(self.config["execution"]["source_folder"], entry_script)
|
257
|
-
):
|
258
|
-
raise FileNotFoundError(
|
259
|
-
f"{os.path.join(self.config['execution']['source_folder'], entry_script)} is not found."
|
260
|
-
)
|
261
|
-
if is_in_notebook_session():
|
262
|
-
source_folder = os.path.join(self.config["execution"]["source_folder"])
|
263
|
-
else:
|
264
|
-
source_folder = os.path.join(
|
265
|
-
DEFAULT_IMAGE_SCRIPT_DIR,
|
266
|
-
"operators",
|
267
|
-
os.path.basename(self.config["execution"]["source_folder"]),
|
268
|
-
)
|
269
|
-
if os.path.splitext(entry_script)[-1] == ".py":
|
270
|
-
command = f"python {os.path.join(source_folder, entry_script)} "
|
271
|
-
if is_in_notebook_session():
|
272
|
-
command = (
|
273
|
-
f"source activate {os.path.join(DEFAULT_NOTEBOOK_SESSION_CONDA_DIR, self.config['execution']['conda_slug'])} && "
|
274
|
-
+ command
|
275
|
-
)
|
276
|
-
elif os.path.splitext(entry_script)[-1] == ".sh":
|
277
|
-
command = f"cd {source_folder} && /bin/bash {entry_script} "
|
278
|
-
else:
|
279
|
-
logger.warn(
|
280
|
-
"ML Job only support .py and .sh files."
|
281
|
-
"If you intend to submit to ML Job later, please update file extension."
|
282
|
-
)
|
283
|
-
command = f"cd {source_folder} && {entry_script} "
|
284
|
-
if self.config["execution"].get("command"):
|
285
|
-
command += f"{self.config['execution']['command']}"
|
286
|
-
command += extra_cmd
|
287
|
-
return command
|
288
|
-
|
289
|
-
def _run_with_image(self, bind_volumes: Dict) -> int:
|
290
|
-
env_vars = self.config["execution"]["env_vars"]
|
291
|
-
image = self.config["execution"]["image"]
|
292
|
-
if ConfigResolver(self.config)._is_ads_operator():
|
293
|
-
# running operators
|
294
|
-
command = (
|
295
|
-
f"python {os.path.join(DEFAULT_IMAGE_SCRIPT_DIR, 'operators/run.py')} "
|
296
|
-
)
|
297
|
-
entrypoint = None
|
298
|
-
if self.config["execution"].get("command", None):
|
299
|
-
command += f"{self.config['execution']['command']}"
|
300
|
-
else:
|
301
|
-
# in case of running a user image, entrypoint is not required
|
302
|
-
entrypoint = self.config["execution"].get("entrypoint", None)
|
303
|
-
command = self.config["execution"].get("command", None)
|
304
|
-
if self.config["execution"].get("source_folder", None):
|
305
|
-
bind_volumes.update(self._mount_source_folder_if_exists(bind_volumes))
|
306
|
-
bind_volumes.update(self.config["execution"]["volumes"])
|
307
|
-
|
308
|
-
return run_container(image, bind_volumes, env_vars, command, entrypoint)
|
309
|
-
|
310
|
-
def _run_with_image_v1(self, bind_volumes: Dict) -> int:
|
311
|
-
env_vars = [
|
312
|
-
str(d["name"]) + "=" + str(d["value"])
|
313
|
-
for d in self.config["spec"]["Runtime"]["spec"]["environmentVariables"]
|
314
|
-
]
|
315
|
-
image = self.config["spec"]["Infrastructure"]["spec"]["dockerImage"]
|
316
|
-
command = self.config["spec"]["Runtime"]["spec"]["entrypoint"]
|
317
|
-
entrypoint = "python /etc/datascience/operator/cluster_helper.py"
|
318
|
-
|
319
|
-
print("looking to bind volume")
|
320
|
-
bind_volumes.update(self.config["spec"]["Framework"]["spec"]["bindVolumes"])
|
321
|
-
return run_container(
|
322
|
-
image=image,
|
323
|
-
bind_volumes=bind_volumes,
|
324
|
-
env_vars=env_vars,
|
325
|
-
command=command,
|
326
|
-
entrypoint=entrypoint,
|
327
|
-
)
|
328
|
-
|
329
|
-
def _check_conda_pack_and_install_if_applicable(
|
330
|
-
self,
|
331
|
-
slug: str,
|
332
|
-
bind_volumes: Dict,
|
333
|
-
env_vars: Dict,
|
334
|
-
install: bool = False,
|
335
|
-
conda_uri: str = None,
|
336
|
-
) -> Dict:
|
337
|
-
conda_pack_folder = os.path.abspath(
|
338
|
-
os.path.expanduser(self.config["execution"]["conda_pack_folder"])
|
339
|
-
)
|
340
|
-
conda_pack_path = os.path.join(conda_pack_folder, slug)
|
341
|
-
if not os.path.exists(conda_pack_path):
|
342
|
-
if install:
|
343
|
-
logger.info(
|
344
|
-
f"Downloading a `{slug}` to the `{conda_pack_folder}`. If this conda pack is already installed locally in a different location, pass in `conda_pack_folder` to avoid downloading it again."
|
345
|
-
)
|
346
|
-
_install(
|
347
|
-
conda_uri=conda_uri,
|
348
|
-
conda_pack_folder=conda_pack_folder,
|
349
|
-
oci_config=self.oci_config,
|
350
|
-
oci_profile=self.profile,
|
351
|
-
auth_type=self.auth_type,
|
352
|
-
)
|
353
|
-
else:
|
354
|
-
raise CondaPackNotFound(
|
355
|
-
f"Conda pack {conda_pack_path} not found. Please run `ads opctl conda create` or `ads opctl conda install`."
|
356
|
-
)
|
357
|
-
if os.path.exists(os.path.join(conda_pack_path, "spark-defaults.conf")):
|
358
|
-
if not is_in_notebook_session():
|
359
|
-
env_vars["SPARK_CONF_DIR"] = os.path.join(DEFAULT_IMAGE_CONDA_DIR, slug)
|
360
|
-
# write core_site.xml
|
361
|
-
if self.config["execution"]["auth"] == "api_key":
|
362
|
-
properties = generate_core_site_properties(
|
363
|
-
"api_key",
|
364
|
-
self.config["execution"]["oci_config"],
|
365
|
-
self.config["execution"]["oci_profile"],
|
366
|
-
)
|
367
|
-
# key path cannot have "~/"
|
368
|
-
oci_config_folder = os.path.expanduser(
|
369
|
-
os.path.dirname(self.config["execution"]["oci_config"])
|
370
|
-
)
|
371
|
-
properties[-1] = (
|
372
|
-
properties[-1][0],
|
373
|
-
os.path.join(
|
374
|
-
DEFAULT_IMAGE_HOME_DIR,
|
375
|
-
".oci",
|
376
|
-
os.path.relpath(
|
377
|
-
os.path.expanduser(properties[-1][1]), oci_config_folder
|
378
|
-
),
|
379
|
-
),
|
380
|
-
)
|
381
|
-
else:
|
382
|
-
properties = generate_core_site_properties("resource_principal")
|
383
|
-
|
384
|
-
core_site_str = generate_core_site_properties_str(properties)
|
385
|
-
if is_in_notebook_session():
|
386
|
-
with open(
|
387
|
-
os.path.join(
|
388
|
-
DEFAULT_NOTEBOOK_SESSION_SPARK_CONF_DIR, "core-site.xml"
|
389
|
-
),
|
390
|
-
"w",
|
391
|
-
) as f:
|
392
|
-
f.write(core_site_str)
|
393
|
-
else:
|
394
|
-
with open(os.path.join(conda_pack_path, "core-site.xml"), "w") as f:
|
395
|
-
f.write(core_site_str)
|
396
|
-
bind_volumes[
|
397
|
-
os.path.abspath(
|
398
|
-
os.path.expanduser(
|
399
|
-
os.path.join(self.config["execution"]["conda_pack_folder"], slug)
|
400
|
-
)
|
401
|
-
)
|
402
|
-
] = {"bind": os.path.join(DEFAULT_IMAGE_CONDA_DIR, slug)}
|
403
|
-
return bind_volumes, env_vars
|
404
|
-
|
405
|
-
def _mount_source_folder_if_exists(self, bind_volumes: Dict) -> Dict:
|
406
|
-
source_folder = os.path.abspath(self.config["execution"]["source_folder"])
|
407
|
-
if not os.path.exists(source_folder):
|
408
|
-
raise FileNotFoundError(f"source folder {source_folder} does not exist.")
|
409
|
-
mount_path = os.path.join(
|
410
|
-
DEFAULT_IMAGE_SCRIPT_DIR,
|
411
|
-
"operators",
|
412
|
-
os.path.basename(self.config["execution"]["source_folder"]),
|
413
|
-
)
|
414
|
-
bind_volumes[source_folder] = {"bind": mount_path}
|
415
|
-
return bind_volumes
|
416
|
-
|
417
|
-
@staticmethod
|
418
|
-
@runtime_dependency(module="docker", install_from=OptionalDependency.OPCTL)
|
419
|
-
def _activate_conda_env_and_run(
|
420
|
-
image: str, slug: str, command: List[str], bind_volumes: Dict, env_vars: Dict
|
421
|
-
) -> int:
|
422
|
-
import docker
|
423
|
-
|
424
|
-
try:
|
425
|
-
client = get_docker_client()
|
426
|
-
client.api.inspect_image(image)
|
427
|
-
except docker.errors.ImageNotFound:
|
428
|
-
logger.info(f"Image {image} not found. Attempt building it now....")
|
429
|
-
if image == ML_JOB_IMAGE:
|
430
|
-
build_image("job-local", gpu=False)
|
431
|
-
else:
|
432
|
-
build_image("job-local", gpu=True)
|
433
|
-
with tempfile.TemporaryDirectory(dir=os.path.expanduser("~")) as td:
|
434
|
-
with open(os.path.join(td, "entryscript.sh"), "w") as f:
|
435
|
-
f.write(
|
436
|
-
f"""
|
437
|
-
#!/bin/bash
|
438
|
-
source {os.path.join(DEFAULT_IMAGE_CONDA_DIR, slug, 'bin/activate')}
|
439
|
-
{command}
|
440
|
-
"""
|
441
|
-
)
|
442
|
-
bind_volumes[os.path.join(td, "entryscript.sh")] = {
|
443
|
-
"bind": os.path.join(DEFAULT_IMAGE_SCRIPT_DIR, "entryscript.sh")
|
444
|
-
}
|
445
|
-
env_vars["conda_slug"] = slug
|
446
|
-
return run_container(
|
447
|
-
image,
|
448
|
-
bind_volumes,
|
449
|
-
env_vars,
|
450
|
-
command=f"bash {os.path.join(DEFAULT_IMAGE_SCRIPT_DIR, 'entryscript.sh')}",
|
451
|
-
)
|
452
|
-
|
453
|
-
|
454
|
-
class LocalBackendDistributed(LocalBackend):
|
455
|
-
def __init__(self, config: Dict) -> None:
|
456
|
-
"""
|
457
|
-
Initialize a LocalBackendDistributed object with given config. This serves local single node(docker) testing
|
458
|
-
for Distributed Tranining
|
459
|
-
|
460
|
-
|
461
|
-
Parameters
|
462
|
-
----------
|
463
|
-
config: dict
|
464
|
-
dictionary of configurations
|
465
|
-
"""
|
466
|
-
self.config = config
|
467
|
-
|
468
|
-
def run(self):
|
469
|
-
local_run(self.config, load_ini())
|
470
|
-
|
471
|
-
|
472
|
-
class LocalPipelineBackend(Backend):
|
473
|
-
LOG_PREFIX = "Local Pipeline:"
|
474
|
-
DEFAULT_PARALLEL_CONTAINER_MAXIMUM = 4
|
475
|
-
DEFAULT_STATUS_POLL_INTERVAL_SECONDS = 5
|
476
|
-
|
477
|
-
def __init__(self, config: Dict) -> None:
|
478
|
-
"""
|
479
|
-
Initialize a LocalPipelineBackend object with given config.
|
480
|
-
|
481
|
-
Parameters
|
482
|
-
----------
|
483
|
-
config: dict
|
484
|
-
dictionary of configurations
|
485
|
-
"""
|
486
|
-
self.config = config
|
487
|
-
|
488
|
-
def run(self) -> None:
|
489
|
-
pipeline = Pipeline.from_dict(self.config)
|
490
|
-
|
491
|
-
self._log_orchestration_message(f"Starting pipeline {pipeline.name} locally.")
|
492
|
-
if pipeline.dag:
|
493
|
-
self._log_orchestration_message(f"Pipeline DAG:")
|
494
|
-
for d in pipeline.dag:
|
495
|
-
self._log_orchestration_message(f" {d}")
|
496
|
-
|
497
|
-
completed_status = {}
|
498
|
-
waiting_steps = {}
|
499
|
-
for s in pipeline.step_details:
|
500
|
-
waiting_steps[s.name] = s
|
501
|
-
futures = {}
|
502
|
-
pipeline_failure = False
|
503
|
-
done = False
|
504
|
-
|
505
|
-
if "max_parallel_containers" in self.config["infrastructure"]:
|
506
|
-
max_parallel_containers = int(
|
507
|
-
self.config["infrastructure"]["max_parallel_containers"]
|
508
|
-
)
|
509
|
-
else:
|
510
|
-
max_parallel_containers = min(
|
511
|
-
self.DEFAULT_PARALLEL_CONTAINER_MAXIMUM, os.cpu_count()
|
512
|
-
)
|
513
|
-
logger.warn(
|
514
|
-
f"max_parallel_containers not specified in the config. Defaulting to {max_parallel_containers}."
|
515
|
-
" Run `ads opctl configure` to define your local backend config."
|
516
|
-
)
|
517
|
-
|
518
|
-
poll_interval_seconds = int(
|
519
|
-
self.config["infrastructure"].get(
|
520
|
-
"pipeline_status_poll_interval_seconds",
|
521
|
-
self.DEFAULT_STATUS_POLL_INTERVAL_SECONDS,
|
522
|
-
)
|
523
|
-
)
|
524
|
-
|
525
|
-
with ThreadPoolExecutor(max_workers=max_parallel_containers) as executor:
|
526
|
-
while not done:
|
527
|
-
# Check if any running steps have completed
|
528
|
-
for s in list(futures):
|
529
|
-
if futures[s].done():
|
530
|
-
if futures[s].exception() is None:
|
531
|
-
self._log_orchestration_message(
|
532
|
-
f"Step {s} completed successfully."
|
533
|
-
)
|
534
|
-
completed_status[
|
535
|
-
s
|
536
|
-
] = PipelineStepRun.LIFECYCLE_STATE_SUCCEEDED
|
537
|
-
else:
|
538
|
-
pipeline_failure = True
|
539
|
-
self._log_orchestration_message(f"Step {s} failed:")
|
540
|
-
logger.error(futures[s].exception())
|
541
|
-
completed_status[s] = PipelineStepRun.LIFECYCLE_STATE_FAILED
|
542
|
-
del futures[s]
|
543
|
-
|
544
|
-
for s in list(waiting_steps):
|
545
|
-
# Cancel all waiting steps if a failure is encountered
|
546
|
-
if pipeline_failure:
|
547
|
-
self._log_orchestration_message(
|
548
|
-
f"Skipping step {s} - pipeline failure encountered."
|
549
|
-
)
|
550
|
-
completed_status[s] = PipelineStepRun.LIFECYCLE_STATE_SKIPPED
|
551
|
-
del waiting_steps[s]
|
552
|
-
continue
|
553
|
-
|
554
|
-
# Start a waiting step if all of its dependencies have completed successfully
|
555
|
-
completed_deps = [
|
556
|
-
dep
|
557
|
-
for dep in waiting_steps[s].depends_on
|
558
|
-
if dep in completed_status
|
559
|
-
]
|
560
|
-
if len(waiting_steps[s].depends_on) == len(completed_deps):
|
561
|
-
self._log_orchestration_message(f"Starting step {s}")
|
562
|
-
futures[s] = self._start_pipeline_step(
|
563
|
-
waiting_steps[s], executor
|
564
|
-
)
|
565
|
-
del waiting_steps[s]
|
566
|
-
|
567
|
-
if len(completed_status) == len(pipeline.step_details):
|
568
|
-
done = True
|
569
|
-
else:
|
570
|
-
sleep(poll_interval_seconds)
|
571
|
-
|
572
|
-
self._log_orchestration_message("Pipeline run complete!")
|
573
|
-
self._log_orchestration_message("Summary:")
|
574
|
-
for step in pipeline.step_details:
|
575
|
-
self._log_orchestration_message(
|
576
|
-
f" {step.name} - {completed_status[step.name]}"
|
577
|
-
)
|
578
|
-
|
579
|
-
def _start_pipeline_step(
|
580
|
-
self, step: PipelineStep, executor: ThreadPoolExecutor
|
581
|
-
) -> Future:
|
582
|
-
"""
|
583
|
-
Starts a single pipeline step.
|
584
|
-
|
585
|
-
Parameters
|
586
|
-
----------
|
587
|
-
step: PipelineStep
|
588
|
-
The pipeline step to start
|
589
|
-
executor: ThreadPoolExecutor
|
590
|
-
The executor used to run the pipeline step.
|
591
|
-
|
592
|
-
Returns
|
593
|
-
-------
|
594
|
-
future: Future
|
595
|
-
The Future that can be used to query the status of the pipeline step.
|
596
|
-
"""
|
597
|
-
step_config = self._create_step_config(step)
|
598
|
-
|
599
|
-
# Have a local job backend execute the step using the updated step config
|
600
|
-
local_job = LocalBackend(step_config)
|
601
|
-
return executor.submit(local_job.run)
|
602
|
-
|
603
|
-
def _create_step_config(self, pipeline_step: PipelineStep) -> Dict:
|
604
|
-
"""
|
605
|
-
Creates the config for local execution of an individual pipeline step.
|
606
|
-
|
607
|
-
Parameters
|
608
|
-
----------
|
609
|
-
pipeline_step: PipelineStep
|
610
|
-
The pipeline step whose config should be generated
|
611
|
-
|
612
|
-
Returns
|
613
|
-
-------
|
614
|
-
step_config: Dict
|
615
|
-
The config for the individual pipeline step.
|
616
|
-
"""
|
617
|
-
if pipeline_step.kind.upper() != "CUSTOM_SCRIPT":
|
618
|
-
raise ValueError(
|
619
|
-
f"Step {pipeline_step.name} has unsupported kind. "
|
620
|
-
f"Local pipeline execution only supports pipeline steps with kind customScript."
|
621
|
-
)
|
622
|
-
|
623
|
-
step_config = copy.deepcopy(self.config)
|
624
|
-
step_config["kind"] = pipeline_step.kind
|
625
|
-
step_config["type"] = pipeline_step.type
|
626
|
-
del step_config["spec"]
|
627
|
-
step_execution_config = step_config["execution"]
|
628
|
-
step_execution_config["conda_slug"] = pipeline_step.runtime.conda["slug"]
|
629
|
-
step_execution_config["env_vars"] = pipeline_step.runtime.envs
|
630
|
-
|
631
|
-
if pipeline_step.runtime.type == "script":
|
632
|
-
step_execution_config["entrypoint"] = pipeline_step.runtime.script_uri
|
633
|
-
elif pipeline_step.runtime.type == "python":
|
634
|
-
step_execution_config["entrypoint"] = pipeline_step.runtime.script_uri
|
635
|
-
step_execution_config["source_folder"] = pipeline_step.runtime.working_dir
|
636
|
-
elif pipeline_step.runtime.type == "notebook":
|
637
|
-
step_execution_config["entrypoint"] = pipeline_step.runtime.notebook_uri
|
638
|
-
else:
|
639
|
-
raise ValueError(
|
640
|
-
f"Step {pipeline_step.name} has unsupported runtime. "
|
641
|
-
f"Supported values are: script, python, notebook"
|
642
|
-
)
|
643
|
-
|
644
|
-
if not step_execution_config.get("source_folder"):
|
645
|
-
logger.warn(
|
646
|
-
"No source_folder provided; defaulting to the current working directory. To specify a source"
|
647
|
-
"folder for all pipeline steps, use the --source-folder parameter. To specify a source folder"
|
648
|
-
"for individual steps, use a runtime with type python and specify the workingDir property."
|
649
|
-
)
|
650
|
-
step_execution_config["source_folder"] = os.getcwd()
|
651
|
-
|
652
|
-
ConfigResolver(step_config).process()
|
653
|
-
return step_config
|
654
|
-
|
655
|
-
def _log_orchestration_message(self, str: str) -> None:
|
656
|
-
"""
|
657
|
-
Logs a message related to pipeline run orchestration
|
658
|
-
|
659
|
-
Parameters
|
660
|
-
----------
|
661
|
-
str: str
|
662
|
-
The message to log
|
663
|
-
"""
|
664
|
-
logger.info(f"{self.LOG_PREFIX}: {str}")
|
665
|
-
|
666
|
-
|
667
|
-
class LocalModelDeploymentBackend(LocalBackend):
|
668
|
-
def __init__(self, config: Dict) -> None:
|
669
|
-
"""
|
670
|
-
Initialize a LocalModelDeploymentBackend object with given config.
|
671
|
-
|
672
|
-
Parameters
|
673
|
-
----------
|
674
|
-
config: dict
|
675
|
-
dictionary of configurations
|
676
|
-
"""
|
677
|
-
super().__init__(config)
|
678
|
-
self.oci_auth = create_signer(
|
679
|
-
self.auth_type,
|
680
|
-
self.oci_config,
|
681
|
-
self.profile,
|
682
|
-
)
|
683
|
-
self.client = OCIClientFactory(**self.oci_auth).data_science
|
684
|
-
|
685
|
-
def predict(self) -> None:
|
686
|
-
"""
|
687
|
-
Conducts local verify.
|
688
|
-
|
689
|
-
Returns
|
690
|
-
-------
|
691
|
-
None
|
692
|
-
Nothing.
|
693
|
-
"""
|
694
|
-
|
695
|
-
# model artifact in artifact directory
|
696
|
-
artifact_directory = self.config["execution"].get("artifact_directory")
|
697
|
-
ocid = self.config["execution"].get("ocid")
|
698
|
-
|
699
|
-
model_folder = os.path.expanduser(
|
700
|
-
self.config["execution"].get("model_save_folder", DEFAULT_MODEL_FOLDER)
|
701
|
-
)
|
702
|
-
artifact_directory = artifact_directory or os.path.join(model_folder, str(ocid))
|
703
|
-
if ocid and (
|
704
|
-
not os.path.exists(artifact_directory)
|
705
|
-
or len(os.listdir(artifact_directory)) == 0
|
706
|
-
):
|
707
|
-
region = self.config["execution"].get("region", None)
|
708
|
-
bucket_uri = self.config["execution"].get("bucket_uri", None)
|
709
|
-
timeout = self.config["execution"].get("timeout", None)
|
710
|
-
logger.info(
|
711
|
-
f"No cached model found. Downloading the model {ocid} to {artifact_directory}. If you already have a copy of the model, specify `artifact_directory` instead of `ocid`. You can specify `model_save_folder` to decide where to store the model artifacts."
|
712
|
-
)
|
713
|
-
|
714
|
-
_download_model(
|
715
|
-
auth=self.auth_type,
|
716
|
-
profile=self.profile,
|
717
|
-
ocid=ocid,
|
718
|
-
artifact_directory=artifact_directory,
|
719
|
-
region=region,
|
720
|
-
bucket_uri=bucket_uri,
|
721
|
-
timeout=timeout,
|
722
|
-
force_overwrite=True,
|
723
|
-
)
|
724
|
-
|
725
|
-
# conda
|
726
|
-
conda_slug = self.config["execution"].get("conda_slug")
|
727
|
-
conda_path = self.config["execution"].get("conda_path")
|
728
|
-
if not conda_slug and not conda_path and ocid:
|
729
|
-
conda_slug, conda_path = self._get_conda_info_from_custom_metadata(ocid)
|
730
|
-
if not conda_slug and not conda_path:
|
731
|
-
conda_slug, conda_path = self._get_conda_info_from_runtime(
|
732
|
-
artifact_dir=artifact_directory
|
733
|
-
)
|
734
|
-
if "conda_slug" not in self.config["execution"]:
|
735
|
-
self.config["execution"]["conda_slug"] = (
|
736
|
-
conda_path.split("/")[-1] if conda_path else conda_slug
|
737
|
-
)
|
738
|
-
|
739
|
-
self.config["execution"]["image"] = ML_JOB_IMAGE
|
740
|
-
|
741
|
-
# bind_volumnes
|
742
|
-
bind_volumes = {}
|
743
|
-
SCRIPT = "script.py"
|
744
|
-
dir_path = os.path.dirname(os.path.realpath(__file__))
|
745
|
-
if not is_in_notebook_session():
|
746
|
-
bind_volumes = {
|
747
|
-
os.path.expanduser(
|
748
|
-
os.path.dirname(self.config["execution"]["oci_config"])
|
749
|
-
): {"bind": os.path.join(DEFAULT_IMAGE_HOME_DIR, ".oci")}
|
750
|
-
}
|
751
|
-
|
752
|
-
self.config["execution"]["source_folder"] = os.path.abspath(
|
753
|
-
os.path.join(dir_path, "..")
|
754
|
-
)
|
755
|
-
self.config["execution"]["entrypoint"] = SCRIPT
|
756
|
-
bind_volumes[artifact_directory] = {"bind": DEFAULT_MODEL_DEPLOYMENT_FOLDER}
|
757
|
-
|
758
|
-
# extra cmd
|
759
|
-
data = self.config["execution"].get("payload")
|
760
|
-
extra_cmd = f"--payload '{data}' " + f"--auth {self.auth_type} "
|
761
|
-
if self.auth_type != "resource_principal":
|
762
|
-
extra_cmd += f"--profile {self.profile}"
|
763
|
-
|
764
|
-
if is_in_notebook_session() or NO_CONTAINER:
|
765
|
-
# _run_with_conda_pack has code to handle notebook session case,
|
766
|
-
# however, it activate the conda pack and then run the script.
|
767
|
-
# For the deployment, we just take the current conda env and run it.
|
768
|
-
# Hence we just handle the notebook case directly here.
|
769
|
-
script_path = os.path.join(os.path.join(dir_path, ".."), SCRIPT)
|
770
|
-
cmd = (
|
771
|
-
f"python {script_path} "
|
772
|
-
+ f"--artifact-directory {artifact_directory} "
|
773
|
-
+ extra_cmd
|
774
|
-
)
|
775
|
-
logger.info(f"Running in a notebook or NO_CONTAINER with command {cmd}")
|
776
|
-
run_command(cmd=cmd, shell=True)
|
777
|
-
else:
|
778
|
-
extra_cmd = (
|
779
|
-
f"--artifact-directory {DEFAULT_MODEL_DEPLOYMENT_FOLDER} " + extra_cmd
|
780
|
-
)
|
781
|
-
exit_code = self._run_with_conda_pack(
|
782
|
-
bind_volumes, extra_cmd, install=True, conda_uri=conda_path
|
783
|
-
)
|
784
|
-
if exit_code != 0:
|
785
|
-
raise RuntimeError(
|
786
|
-
f"`predict` did not complete successfully. Exit code: {exit_code}. "
|
787
|
-
f"Run with the --debug argument to view container logs."
|
788
|
-
)
|
789
|
-
|
790
|
-
def _get_conda_info_from_custom_metadata(self, ocid):
|
791
|
-
"""
|
792
|
-
Get conda env info from custom metadata from model catalog.
|
793
|
-
|
794
|
-
Returns
|
795
|
-
-------
|
796
|
-
(str, str)
|
797
|
-
conda slug and conda path.
|
798
|
-
"""
|
799
|
-
response = self.client.get_model(ocid)
|
800
|
-
custom_metadata = ModelCustomMetadata._from_oci_metadata(
|
801
|
-
response.data.custom_metadata_list
|
802
|
-
)
|
803
|
-
conda_slug, conda_path = None, None
|
804
|
-
if "CondaEnvironmentPath" in custom_metadata.keys:
|
805
|
-
conda_path = custom_metadata["CondaEnvironmentPath"].value
|
806
|
-
if "SlugName" in custom_metadata.keys:
|
807
|
-
conda_slug = custom_metadata["SlugName"].value
|
808
|
-
return conda_slug, conda_path
|
809
|
-
|
810
|
-
@staticmethod
|
811
|
-
def _get_conda_info_from_runtime(artifact_dir):
|
812
|
-
"""
|
813
|
-
Get conda env info from runtime yaml file.
|
814
|
-
|
815
|
-
Returns
|
816
|
-
-------
|
817
|
-
(str, str)
|
818
|
-
conda slug and conda path.
|
819
|
-
"""
|
820
|
-
runtime_yaml_file = os.path.join(artifact_dir, "runtime.yaml")
|
821
|
-
runtime_info = RuntimeInfo.from_yaml(uri=runtime_yaml_file)
|
822
|
-
conda_slug = (
|
823
|
-
runtime_info.model_deployment.inference_conda_env.inference_env_slug
|
824
|
-
)
|
825
|
-
conda_path = (
|
826
|
-
runtime_info.model_deployment.inference_conda_env.inference_env_path
|
827
|
-
)
|
828
|
-
return conda_slug, conda_path
|
829
|
-
|
830
|
-
|
831
|
-
class LocalOperatorBackend(Backend):
|
832
|
-
"""
|
833
|
-
The local operator backend to execute operator in the local environment.
|
834
|
-
Currently supported two scenarios:
|
835
|
-
* Running operator within local conda environment.
|
836
|
-
* Running operator within local container.
|
837
|
-
|
838
|
-
Attributes
|
839
|
-
----------
|
840
|
-
runtime_config: (Dict)
|
841
|
-
The runtime config for the operator.
|
842
|
-
operator_config: (Dict)
|
843
|
-
The operator specification config.
|
844
|
-
operator_type: str
|
845
|
-
The type of the operator.
|
846
|
-
operator_info: OperatorInfo
|
847
|
-
The detailed information about the operator.
|
848
|
-
"""
|
849
|
-
|
850
|
-
def __init__(
|
851
|
-
self, config: Optional[Dict], operator_info: OperatorInfo = None
|
852
|
-
) -> None:
|
853
|
-
"""
|
854
|
-
Instantiates the operator backend.
|
855
|
-
|
856
|
-
Parameters
|
857
|
-
----------
|
858
|
-
config: (Dict)
|
859
|
-
The configuration file containing operator's specification details and execution section.
|
860
|
-
operator_info: (OperatorInfo, optional)
|
861
|
-
The operator's detailed information extracted from the operator.__init__ file.
|
862
|
-
Will be extracted from the operator type in case if not provided.
|
863
|
-
"""
|
864
|
-
super().__init__(config=config or {})
|
865
|
-
|
866
|
-
self.runtime_config = self.config.get("runtime", {})
|
867
|
-
self.operator_config = {
|
868
|
-
**{
|
869
|
-
key: value
|
870
|
-
for key, value in self.config.items()
|
871
|
-
if key not in ("runtime", "infrastructure", "execution")
|
872
|
-
}
|
873
|
-
}
|
874
|
-
self.operator_type = self.operator_config.get("type")
|
875
|
-
|
876
|
-
self._RUNTIME_MAP = {
|
877
|
-
operator_runtime.ContainerRuntime.type: self._run_with_container,
|
878
|
-
operator_runtime.PythonRuntime.type: self._run_with_python,
|
879
|
-
}
|
880
|
-
|
881
|
-
self.operator_info = operator_info
|
882
|
-
|
883
|
-
def _run_with_python(self, **kwargs: Dict) -> int:
|
884
|
-
"""Runs the operator within a local python environment.
|
885
|
-
|
886
|
-
Returns
|
887
|
-
-------
|
888
|
-
int
|
889
|
-
The operator's run exit code.
|
890
|
-
"""
|
891
|
-
|
892
|
-
# build runtime object
|
893
|
-
runtime = operator_runtime.PythonRuntime.from_dict(
|
894
|
-
self.runtime_config, ignore_unknown=True
|
895
|
-
)
|
896
|
-
|
897
|
-
# run operator
|
898
|
-
operator_spec = json.dumps(self.operator_config)
|
899
|
-
sys.argv = [self.operator_info.type, "--spec", operator_spec]
|
900
|
-
|
901
|
-
logger.info(f"{'*' * 50} Runtime Config {'*' * 50}")
|
902
|
-
logger.info(runtime.to_yaml())
|
903
|
-
|
904
|
-
try:
|
905
|
-
runpy.run_module(self.operator_info.type, run_name="__main__")
|
906
|
-
except SystemExit as exception:
|
907
|
-
return exception.code
|
908
|
-
else:
|
909
|
-
return 0
|
910
|
-
|
911
|
-
def _run_with_container(self, **kwargs: Dict) -> int:
|
912
|
-
"""Runs the operator within a container.
|
913
|
-
|
914
|
-
Returns
|
915
|
-
-------
|
916
|
-
int
|
917
|
-
The operator's run exit code.
|
918
|
-
"""
|
919
|
-
|
920
|
-
# build runtime object
|
921
|
-
runtime: operator_runtime.ContainerRuntime = (
|
922
|
-
operator_runtime.ContainerRuntime.from_dict(
|
923
|
-
self.runtime_config, ignore_unknown=True
|
924
|
-
)
|
925
|
-
)
|
926
|
-
# prepare environment variables
|
927
|
-
env_vars = {
|
928
|
-
**{env["name"]: env["value"] for env in runtime.spec.env},
|
929
|
-
ENV_OPERATOR_ARGS: json.dumps(self.operator_config),
|
930
|
-
}
|
931
|
-
|
932
|
-
# prepare container volumes
|
933
|
-
bind_volumes = {}
|
934
|
-
for volume in runtime.spec.volume:
|
935
|
-
host_path, container_path = volume.split(":")
|
936
|
-
bind_volumes[host_path.lstrip().rstrip()] = {
|
937
|
-
"bind": container_path.lstrip().rstrip()
|
938
|
-
}
|
939
|
-
|
940
|
-
logger.info(f"{'*' * 50} Runtime Config {'*' * 50}")
|
941
|
-
logger.info(runtime.to_yaml())
|
942
|
-
|
943
|
-
return run_container(
|
944
|
-
image=runtime.spec.image,
|
945
|
-
bind_volumes=bind_volumes,
|
946
|
-
env_vars=env_vars,
|
947
|
-
command=f"'python3 -m {self.operator_info.type}'",
|
948
|
-
)
|
949
|
-
|
950
|
-
def run(self, **kwargs: Dict) -> Dict:
|
951
|
-
"""Runs the operator."""
|
952
|
-
|
953
|
-
# extract runtime
|
954
|
-
runtime_type = self.runtime_config.get(
|
955
|
-
"type", operator_runtime.OPERATOR_LOCAL_RUNTIME_TYPE.PYTHON
|
956
|
-
)
|
957
|
-
|
958
|
-
if runtime_type not in self._RUNTIME_MAP:
|
959
|
-
raise RuntimeError(
|
960
|
-
f"Not supported runtime - {runtime_type} for local backend. "
|
961
|
-
f"Supported values: {self._RUNTIME_MAP.keys()}"
|
962
|
-
)
|
963
|
-
|
964
|
-
if not self.operator_info:
|
965
|
-
self.operator_info = OperatorLoader.from_uri(self.operator_type).load()
|
966
|
-
|
967
|
-
if self.config.get("dry_run"):
|
968
|
-
logger.info(
|
969
|
-
"The dry run option is not supported for "
|
970
|
-
"the local backends and will be ignored."
|
971
|
-
)
|
972
|
-
|
973
|
-
# run operator with provided runtime
|
974
|
-
exit_code = self._RUNTIME_MAP.get(runtime_type, lambda: None)(**kwargs)
|
975
|
-
|
976
|
-
if exit_code != 0:
|
977
|
-
raise RuntimeError(
|
978
|
-
f"Operation did not complete successfully. Exit code: {exit_code}. "
|
979
|
-
f"Run with the --debug argument to view logs."
|
980
|
-
)
|
981
|
-
|
982
|
-
def init(
|
983
|
-
self,
|
984
|
-
uri: Union[str, None] = None,
|
985
|
-
overwrite: bool = False,
|
986
|
-
runtime_type: Union[str, None] = None,
|
987
|
-
**kwargs: Dict,
|
988
|
-
) -> Union[str, None]:
|
989
|
-
"""Generates a starter YAML specification for the operator local runtime.
|
990
|
-
|
991
|
-
Parameters
|
992
|
-
----------
|
993
|
-
overwrite: (bool, optional). Defaults to False.
|
994
|
-
Overwrites the result specification YAML if exists.
|
995
|
-
uri: (str, optional), Defaults to None.
|
996
|
-
The filename to save the resulting specification template YAML.
|
997
|
-
runtime_type: (str, optional). Defaults to None.
|
998
|
-
The resource runtime type.
|
999
|
-
**kwargs: Dict
|
1000
|
-
The optional arguments.
|
1001
|
-
|
1002
|
-
Returns
|
1003
|
-
-------
|
1004
|
-
Union[str, None]
|
1005
|
-
The YAML specification for the given resource if `uri` was not provided.
|
1006
|
-
`None` otherwise.
|
1007
|
-
"""
|
1008
|
-
runtime_type = runtime_type or operator_runtime.ContainerRuntime.type
|
1009
|
-
if runtime_type not in operator_runtime_const.RUNTIME_TYPE_MAP:
|
1010
|
-
raise ValueError(
|
1011
|
-
f"Not supported runtime type {runtime_type}. "
|
1012
|
-
f"Supported values: {operator_runtime_const.RUNTIME_TYPE_MAP.keys()}"
|
1013
|
-
)
|
1014
|
-
|
1015
|
-
RUNTIME_KWARGS_MAP = {
|
1016
|
-
operator_runtime.ContainerRuntime.type: {
|
1017
|
-
"image": f"{self.operator_config['type']}:{self.operator_config['version']}",
|
1018
|
-
"volume": [
|
1019
|
-
os.path.expanduser(
|
1020
|
-
os.path.dirname(self.config["execution"]["oci_config"])
|
1021
|
-
)
|
1022
|
-
+ ":"
|
1023
|
-
+ "/root/.oci"
|
1024
|
-
],
|
1025
|
-
"env": [
|
1026
|
-
{
|
1027
|
-
"name": "operator",
|
1028
|
-
"value": f"{self.operator_config['type']}:{self.operator_config['version']}",
|
1029
|
-
}
|
1030
|
-
],
|
1031
|
-
},
|
1032
|
-
operator_runtime.PythonRuntime.type: {},
|
1033
|
-
}
|
1034
|
-
|
1035
|
-
with AuthContext(auth=self.auth_type, profile=self.profile):
|
1036
|
-
note = (
|
1037
|
-
"# This YAML specification was auto generated by the "
|
1038
|
-
"`ads operator init` command.\n"
|
1039
|
-
"# The more details about the operator's runtime YAML "
|
1040
|
-
"specification can be found in the ADS documentation:\n"
|
1041
|
-
"# https://accelerated-data-science.readthedocs.io/en/latest \n\n"
|
1042
|
-
)
|
1043
|
-
|
1044
|
-
return (
|
1045
|
-
operator_runtime_const.RUNTIME_TYPE_MAP[runtime_type]
|
1046
|
-
.init(**RUNTIME_KWARGS_MAP[runtime_type])
|
1047
|
-
.to_yaml(
|
1048
|
-
uri=uri,
|
1049
|
-
overwrite=overwrite,
|
1050
|
-
note=note,
|
1051
|
-
**kwargs,
|
1052
|
-
)
|
1053
|
-
)
|