oracle-ads 2.13.9rc0__py3-none-any.whl → 2.13.9rc1__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.
- ads/aqua/__init__.py +40 -0
- ads/aqua/app.py +506 -0
- ads/aqua/cli.py +96 -0
- ads/aqua/client/__init__.py +3 -0
- ads/aqua/client/client.py +836 -0
- ads/aqua/client/openai_client.py +305 -0
- ads/aqua/common/__init__.py +5 -0
- ads/aqua/common/decorator.py +125 -0
- ads/aqua/common/entities.py +269 -0
- ads/aqua/common/enums.py +122 -0
- ads/aqua/common/errors.py +109 -0
- ads/aqua/common/utils.py +1285 -0
- ads/aqua/config/__init__.py +4 -0
- ads/aqua/config/container_config.py +248 -0
- ads/aqua/config/evaluation/__init__.py +4 -0
- ads/aqua/config/evaluation/evaluation_service_config.py +147 -0
- ads/aqua/config/utils/__init__.py +4 -0
- ads/aqua/config/utils/serializer.py +339 -0
- ads/aqua/constants.py +116 -0
- ads/aqua/data.py +14 -0
- ads/aqua/dummy_data/icon.txt +1 -0
- ads/aqua/dummy_data/oci_model_deployments.json +56 -0
- ads/aqua/dummy_data/oci_models.json +1 -0
- ads/aqua/dummy_data/readme.md +26 -0
- ads/aqua/evaluation/__init__.py +8 -0
- ads/aqua/evaluation/constants.py +53 -0
- ads/aqua/evaluation/entities.py +186 -0
- ads/aqua/evaluation/errors.py +70 -0
- ads/aqua/evaluation/evaluation.py +1814 -0
- ads/aqua/extension/__init__.py +42 -0
- ads/aqua/extension/aqua_ws_msg_handler.py +76 -0
- ads/aqua/extension/base_handler.py +90 -0
- ads/aqua/extension/common_handler.py +121 -0
- ads/aqua/extension/common_ws_msg_handler.py +36 -0
- ads/aqua/extension/deployment_handler.py +298 -0
- ads/aqua/extension/deployment_ws_msg_handler.py +54 -0
- ads/aqua/extension/errors.py +30 -0
- ads/aqua/extension/evaluation_handler.py +129 -0
- ads/aqua/extension/evaluation_ws_msg_handler.py +61 -0
- ads/aqua/extension/finetune_handler.py +96 -0
- ads/aqua/extension/model_handler.py +390 -0
- ads/aqua/extension/models/__init__.py +0 -0
- ads/aqua/extension/models/ws_models.py +145 -0
- ads/aqua/extension/models_ws_msg_handler.py +50 -0
- ads/aqua/extension/ui_handler.py +282 -0
- ads/aqua/extension/ui_websocket_handler.py +130 -0
- ads/aqua/extension/utils.py +133 -0
- ads/aqua/finetuning/__init__.py +7 -0
- ads/aqua/finetuning/constants.py +23 -0
- ads/aqua/finetuning/entities.py +181 -0
- ads/aqua/finetuning/finetuning.py +749 -0
- ads/aqua/model/__init__.py +8 -0
- ads/aqua/model/constants.py +60 -0
- ads/aqua/model/entities.py +385 -0
- ads/aqua/model/enums.py +32 -0
- ads/aqua/model/model.py +2114 -0
- ads/aqua/modeldeployment/__init__.py +8 -0
- ads/aqua/modeldeployment/constants.py +10 -0
- ads/aqua/modeldeployment/deployment.py +1326 -0
- ads/aqua/modeldeployment/entities.py +653 -0
- ads/aqua/modeldeployment/inference.py +74 -0
- ads/aqua/modeldeployment/utils.py +543 -0
- ads/aqua/resources/gpu_shapes_index.json +94 -0
- ads/aqua/server/__init__.py +4 -0
- ads/aqua/server/__main__.py +24 -0
- ads/aqua/server/app.py +47 -0
- ads/aqua/server/aqua_spec.yml +1291 -0
- ads/aqua/training/__init__.py +4 -0
- ads/aqua/training/exceptions.py +476 -0
- ads/aqua/ui.py +499 -0
- ads/automl/__init__.py +9 -0
- ads/automl/driver.py +330 -0
- ads/automl/provider.py +975 -0
- ads/bds/__init__.py +5 -0
- ads/bds/auth.py +127 -0
- ads/bds/big_data_service.py +255 -0
- ads/catalog/__init__.py +19 -0
- ads/catalog/model.py +1576 -0
- ads/catalog/notebook.py +461 -0
- ads/catalog/project.py +468 -0
- ads/catalog/summary.py +178 -0
- ads/common/__init__.py +11 -0
- ads/common/analyzer.py +65 -0
- ads/common/artifact/.model-ignore +63 -0
- ads/common/artifact/__init__.py +10 -0
- ads/common/auth.py +1122 -0
- ads/common/card_identifier.py +83 -0
- ads/common/config.py +647 -0
- ads/common/data.py +165 -0
- ads/common/decorator/__init__.py +9 -0
- ads/common/decorator/argument_to_case.py +88 -0
- ads/common/decorator/deprecate.py +69 -0
- ads/common/decorator/require_nonempty_arg.py +65 -0
- ads/common/decorator/runtime_dependency.py +178 -0
- ads/common/decorator/threaded.py +97 -0
- ads/common/decorator/utils.py +35 -0
- ads/common/dsc_file_system.py +303 -0
- ads/common/error.py +14 -0
- ads/common/extended_enum.py +81 -0
- ads/common/function/__init__.py +5 -0
- ads/common/function/fn_util.py +142 -0
- ads/common/function/func_conf.yaml +25 -0
- ads/common/ipython.py +76 -0
- ads/common/model.py +679 -0
- ads/common/model_artifact.py +1759 -0
- ads/common/model_artifact_schema.json +107 -0
- ads/common/model_export_util.py +664 -0
- ads/common/model_metadata.py +24 -0
- ads/common/object_storage_details.py +296 -0
- ads/common/oci_client.py +175 -0
- ads/common/oci_datascience.py +46 -0
- ads/common/oci_logging.py +1144 -0
- ads/common/oci_mixin.py +957 -0
- ads/common/oci_resource.py +136 -0
- ads/common/serializer.py +559 -0
- ads/common/utils.py +1852 -0
- ads/common/word_lists.py +1491 -0
- ads/common/work_request.py +189 -0
- ads/data_labeling/__init__.py +13 -0
- ads/data_labeling/boundingbox.py +253 -0
- ads/data_labeling/constants.py +47 -0
- ads/data_labeling/data_labeling_service.py +244 -0
- ads/data_labeling/interface/__init__.py +5 -0
- ads/data_labeling/interface/loader.py +16 -0
- ads/data_labeling/interface/parser.py +16 -0
- ads/data_labeling/interface/reader.py +23 -0
- ads/data_labeling/loader/__init__.py +5 -0
- ads/data_labeling/loader/file_loader.py +241 -0
- ads/data_labeling/metadata.py +110 -0
- ads/data_labeling/mixin/__init__.py +5 -0
- ads/data_labeling/mixin/data_labeling.py +232 -0
- ads/data_labeling/ner.py +129 -0
- ads/data_labeling/parser/__init__.py +5 -0
- ads/data_labeling/parser/dls_record_parser.py +388 -0
- ads/data_labeling/parser/export_metadata_parser.py +94 -0
- ads/data_labeling/parser/export_record_parser.py +473 -0
- ads/data_labeling/reader/__init__.py +5 -0
- ads/data_labeling/reader/dataset_reader.py +574 -0
- ads/data_labeling/reader/dls_record_reader.py +121 -0
- ads/data_labeling/reader/export_record_reader.py +62 -0
- ads/data_labeling/reader/jsonl_reader.py +75 -0
- ads/data_labeling/reader/metadata_reader.py +203 -0
- ads/data_labeling/reader/record_reader.py +263 -0
- ads/data_labeling/record.py +52 -0
- ads/data_labeling/visualizer/__init__.py +5 -0
- ads/data_labeling/visualizer/image_visualizer.py +525 -0
- ads/data_labeling/visualizer/text_visualizer.py +357 -0
- ads/database/__init__.py +5 -0
- ads/database/connection.py +338 -0
- ads/dataset/__init__.py +10 -0
- ads/dataset/capabilities.md +51 -0
- ads/dataset/classification_dataset.py +339 -0
- ads/dataset/correlation.py +226 -0
- ads/dataset/correlation_plot.py +563 -0
- ads/dataset/dask_series.py +173 -0
- ads/dataset/dataframe_transformer.py +110 -0
- ads/dataset/dataset.py +1979 -0
- ads/dataset/dataset_browser.py +360 -0
- ads/dataset/dataset_with_target.py +995 -0
- ads/dataset/exception.py +25 -0
- ads/dataset/factory.py +987 -0
- ads/dataset/feature_engineering_transformer.py +35 -0
- ads/dataset/feature_selection.py +107 -0
- ads/dataset/forecasting_dataset.py +26 -0
- ads/dataset/helper.py +1450 -0
- ads/dataset/label_encoder.py +99 -0
- ads/dataset/mixin/__init__.py +5 -0
- ads/dataset/mixin/dataset_accessor.py +134 -0
- ads/dataset/pipeline.py +58 -0
- ads/dataset/plot.py +710 -0
- ads/dataset/progress.py +86 -0
- ads/dataset/recommendation.py +297 -0
- ads/dataset/recommendation_transformer.py +502 -0
- ads/dataset/regression_dataset.py +14 -0
- ads/dataset/sampled_dataset.py +1050 -0
- ads/dataset/target.py +98 -0
- ads/dataset/timeseries.py +18 -0
- ads/dbmixin/__init__.py +5 -0
- ads/dbmixin/db_pandas_accessor.py +153 -0
- ads/environment/__init__.py +9 -0
- ads/environment/ml_runtime.py +66 -0
- ads/evaluations/README.md +14 -0
- ads/evaluations/__init__.py +109 -0
- ads/evaluations/evaluation_plot.py +983 -0
- ads/evaluations/evaluator.py +1334 -0
- ads/evaluations/statistical_metrics.py +543 -0
- ads/experiments/__init__.py +9 -0
- ads/experiments/capabilities.md +0 -0
- ads/explanations/__init__.py +21 -0
- ads/explanations/base_explainer.py +142 -0
- ads/explanations/capabilities.md +83 -0
- ads/explanations/explainer.py +190 -0
- ads/explanations/mlx_global_explainer.py +1050 -0
- ads/explanations/mlx_interface.py +386 -0
- ads/explanations/mlx_local_explainer.py +287 -0
- ads/explanations/mlx_whatif_explainer.py +201 -0
- ads/feature_engineering/__init__.py +20 -0
- ads/feature_engineering/accessor/__init__.py +5 -0
- ads/feature_engineering/accessor/dataframe_accessor.py +535 -0
- ads/feature_engineering/accessor/mixin/__init__.py +5 -0
- ads/feature_engineering/accessor/mixin/correlation.py +166 -0
- ads/feature_engineering/accessor/mixin/eda_mixin.py +266 -0
- ads/feature_engineering/accessor/mixin/eda_mixin_series.py +85 -0
- ads/feature_engineering/accessor/mixin/feature_types_mixin.py +211 -0
- ads/feature_engineering/accessor/mixin/utils.py +65 -0
- ads/feature_engineering/accessor/series_accessor.py +431 -0
- ads/feature_engineering/adsimage/__init__.py +5 -0
- ads/feature_engineering/adsimage/image.py +192 -0
- ads/feature_engineering/adsimage/image_reader.py +170 -0
- ads/feature_engineering/adsimage/interface/__init__.py +5 -0
- ads/feature_engineering/adsimage/interface/reader.py +19 -0
- ads/feature_engineering/adsstring/__init__.py +7 -0
- ads/feature_engineering/adsstring/oci_language/__init__.py +8 -0
- ads/feature_engineering/adsstring/string/__init__.py +8 -0
- ads/feature_engineering/data_schema.json +57 -0
- ads/feature_engineering/dataset/__init__.py +5 -0
- ads/feature_engineering/dataset/zip_code_data.py +42062 -0
- ads/feature_engineering/exceptions.py +40 -0
- ads/feature_engineering/feature_type/__init__.py +133 -0
- ads/feature_engineering/feature_type/address.py +184 -0
- ads/feature_engineering/feature_type/adsstring/__init__.py +5 -0
- ads/feature_engineering/feature_type/adsstring/common_regex_mixin.py +164 -0
- ads/feature_engineering/feature_type/adsstring/oci_language.py +93 -0
- ads/feature_engineering/feature_type/adsstring/parsers/__init__.py +5 -0
- ads/feature_engineering/feature_type/adsstring/parsers/base.py +47 -0
- ads/feature_engineering/feature_type/adsstring/parsers/nltk_parser.py +96 -0
- ads/feature_engineering/feature_type/adsstring/parsers/spacy_parser.py +221 -0
- ads/feature_engineering/feature_type/adsstring/string.py +258 -0
- ads/feature_engineering/feature_type/base.py +58 -0
- ads/feature_engineering/feature_type/boolean.py +183 -0
- ads/feature_engineering/feature_type/category.py +146 -0
- ads/feature_engineering/feature_type/constant.py +137 -0
- ads/feature_engineering/feature_type/continuous.py +151 -0
- ads/feature_engineering/feature_type/creditcard.py +314 -0
- ads/feature_engineering/feature_type/datetime.py +190 -0
- ads/feature_engineering/feature_type/discrete.py +134 -0
- ads/feature_engineering/feature_type/document.py +43 -0
- ads/feature_engineering/feature_type/gis.py +251 -0
- ads/feature_engineering/feature_type/handler/__init__.py +5 -0
- ads/feature_engineering/feature_type/handler/feature_validator.py +524 -0
- ads/feature_engineering/feature_type/handler/feature_warning.py +319 -0
- ads/feature_engineering/feature_type/handler/warnings.py +128 -0
- ads/feature_engineering/feature_type/integer.py +142 -0
- ads/feature_engineering/feature_type/ip_address.py +144 -0
- ads/feature_engineering/feature_type/ip_address_v4.py +138 -0
- ads/feature_engineering/feature_type/ip_address_v6.py +138 -0
- ads/feature_engineering/feature_type/lat_long.py +256 -0
- ads/feature_engineering/feature_type/object.py +43 -0
- ads/feature_engineering/feature_type/ordinal.py +132 -0
- ads/feature_engineering/feature_type/phone_number.py +135 -0
- ads/feature_engineering/feature_type/string.py +171 -0
- ads/feature_engineering/feature_type/text.py +93 -0
- ads/feature_engineering/feature_type/unknown.py +43 -0
- ads/feature_engineering/feature_type/zip_code.py +164 -0
- ads/feature_engineering/feature_type_manager.py +406 -0
- ads/feature_engineering/schema.py +795 -0
- ads/feature_engineering/utils.py +245 -0
- ads/feature_store/.readthedocs.yaml +19 -0
- ads/feature_store/README.md +65 -0
- ads/feature_store/__init__.py +9 -0
- ads/feature_store/common/__init__.py +0 -0
- ads/feature_store/common/enums.py +339 -0
- ads/feature_store/common/exceptions.py +18 -0
- ads/feature_store/common/spark_session_singleton.py +125 -0
- ads/feature_store/common/utils/__init__.py +0 -0
- ads/feature_store/common/utils/base64_encoder_decoder.py +72 -0
- ads/feature_store/common/utils/feature_schema_mapper.py +283 -0
- ads/feature_store/common/utils/transformation_utils.py +82 -0
- ads/feature_store/common/utils/utility.py +403 -0
- ads/feature_store/data_validation/__init__.py +0 -0
- ads/feature_store/data_validation/great_expectation.py +129 -0
- ads/feature_store/dataset.py +1230 -0
- ads/feature_store/dataset_job.py +530 -0
- ads/feature_store/docs/Dockerfile +7 -0
- ads/feature_store/docs/Makefile +44 -0
- ads/feature_store/docs/conf.py +28 -0
- ads/feature_store/docs/requirements.txt +14 -0
- ads/feature_store/docs/source/ads.feature_store.query.rst +20 -0
- ads/feature_store/docs/source/cicd.rst +137 -0
- ads/feature_store/docs/source/conf.py +86 -0
- ads/feature_store/docs/source/data_versioning.rst +33 -0
- ads/feature_store/docs/source/dataset.rst +388 -0
- ads/feature_store/docs/source/dataset_job.rst +27 -0
- ads/feature_store/docs/source/demo.rst +70 -0
- ads/feature_store/docs/source/entity.rst +78 -0
- ads/feature_store/docs/source/feature_group.rst +624 -0
- ads/feature_store/docs/source/feature_group_job.rst +29 -0
- ads/feature_store/docs/source/feature_store.rst +122 -0
- ads/feature_store/docs/source/feature_store_class.rst +123 -0
- ads/feature_store/docs/source/feature_validation.rst +66 -0
- 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 +81 -0
- ads/feature_store/docs/source/module.rst +8 -0
- ads/feature_store/docs/source/notebook.rst +94 -0
- ads/feature_store/docs/source/overview.rst +47 -0
- ads/feature_store/docs/source/quickstart.rst +176 -0
- ads/feature_store/docs/source/release_notes.rst +194 -0
- ads/feature_store/docs/source/setup_feature_store.rst +81 -0
- ads/feature_store/docs/source/statistics.rst +58 -0
- ads/feature_store/docs/source/transformation.rst +199 -0
- ads/feature_store/docs/source/ui.rst +65 -0
- ads/feature_store/docs/source/user_guides.setup.feature_store_operator.rst +66 -0
- ads/feature_store/docs/source/user_guides.setup.helm_chart.rst +192 -0
- ads/feature_store/docs/source/user_guides.setup.terraform.rst +338 -0
- ads/feature_store/entity.py +718 -0
- 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 +375 -0
- ads/feature_store/execution_strategy/engine/__init__.py +0 -0
- ads/feature_store/execution_strategy/engine/spark_engine.py +316 -0
- ads/feature_store/execution_strategy/execution_strategy.py +113 -0
- ads/feature_store/execution_strategy/execution_strategy_provider.py +47 -0
- ads/feature_store/execution_strategy/spark/__init__.py +0 -0
- ads/feature_store/execution_strategy/spark/spark_execution.py +618 -0
- ads/feature_store/feature.py +192 -0
- ads/feature_store/feature_group.py +1494 -0
- ads/feature_store/feature_group_expectation.py +346 -0
- ads/feature_store/feature_group_job.py +602 -0
- ads/feature_store/feature_lineage/__init__.py +0 -0
- ads/feature_store/feature_lineage/graphviz_service.py +180 -0
- ads/feature_store/feature_option_details.py +50 -0
- ads/feature_store/feature_statistics/__init__.py +0 -0
- ads/feature_store/feature_statistics/statistics_service.py +99 -0
- ads/feature_store/feature_store.py +699 -0
- ads/feature_store/feature_store_registrar.py +518 -0
- ads/feature_store/input_feature_detail.py +149 -0
- ads/feature_store/mixin/__init__.py +4 -0
- ads/feature_store/mixin/oci_feature_store.py +145 -0
- ads/feature_store/model_details.py +73 -0
- ads/feature_store/query/__init__.py +0 -0
- ads/feature_store/query/filter.py +266 -0
- ads/feature_store/query/generator/__init__.py +0 -0
- ads/feature_store/query/generator/query_generator.py +298 -0
- ads/feature_store/query/join.py +161 -0
- ads/feature_store/query/query.py +403 -0
- ads/feature_store/query/validator/__init__.py +0 -0
- ads/feature_store/query/validator/query_validator.py +57 -0
- ads/feature_store/response/__init__.py +0 -0
- ads/feature_store/response/response_builder.py +68 -0
- ads/feature_store/service/__init__.py +0 -0
- ads/feature_store/service/oci_dataset.py +139 -0
- ads/feature_store/service/oci_dataset_job.py +199 -0
- ads/feature_store/service/oci_entity.py +125 -0
- ads/feature_store/service/oci_feature_group.py +164 -0
- ads/feature_store/service/oci_feature_group_job.py +214 -0
- ads/feature_store/service/oci_feature_store.py +182 -0
- ads/feature_store/service/oci_lineage.py +87 -0
- ads/feature_store/service/oci_transformation.py +104 -0
- ads/feature_store/statistics/__init__.py +0 -0
- ads/feature_store/statistics/abs_feature_value.py +49 -0
- ads/feature_store/statistics/charts/__init__.py +0 -0
- ads/feature_store/statistics/charts/abstract_feature_plot.py +37 -0
- ads/feature_store/statistics/charts/box_plot.py +148 -0
- ads/feature_store/statistics/charts/frequency_distribution.py +65 -0
- ads/feature_store/statistics/charts/probability_distribution.py +68 -0
- ads/feature_store/statistics/charts/top_k_frequent_elements.py +98 -0
- ads/feature_store/statistics/feature_stat.py +126 -0
- ads/feature_store/statistics/generic_feature_value.py +33 -0
- ads/feature_store/statistics/statistics.py +41 -0
- ads/feature_store/statistics_config.py +101 -0
- ads/feature_store/templates/feature_store_template.yaml +45 -0
- ads/feature_store/transformation.py +499 -0
- ads/feature_store/validation_output.py +57 -0
- ads/hpo/__init__.py +9 -0
- ads/hpo/_imports.py +91 -0
- ads/hpo/ads_search_space.py +439 -0
- ads/hpo/distributions.py +325 -0
- ads/hpo/objective.py +280 -0
- ads/hpo/search_cv.py +1657 -0
- ads/hpo/stopping_criterion.py +75 -0
- ads/hpo/tuner_artifact.py +413 -0
- ads/hpo/utils.py +91 -0
- ads/hpo/validation.py +140 -0
- ads/hpo/visualization/__init__.py +5 -0
- ads/hpo/visualization/_contour.py +23 -0
- ads/hpo/visualization/_edf.py +20 -0
- ads/hpo/visualization/_intermediate_values.py +21 -0
- ads/hpo/visualization/_optimization_history.py +25 -0
- ads/hpo/visualization/_parallel_coordinate.py +169 -0
- ads/hpo/visualization/_param_importances.py +26 -0
- ads/jobs/__init__.py +53 -0
- ads/jobs/ads_job.py +663 -0
- ads/jobs/builders/__init__.py +5 -0
- ads/jobs/builders/base.py +156 -0
- ads/jobs/builders/infrastructure/__init__.py +6 -0
- ads/jobs/builders/infrastructure/base.py +165 -0
- ads/jobs/builders/infrastructure/dataflow.py +1252 -0
- ads/jobs/builders/infrastructure/dsc_job.py +1894 -0
- ads/jobs/builders/infrastructure/dsc_job_runtime.py +1233 -0
- ads/jobs/builders/infrastructure/utils.py +65 -0
- ads/jobs/builders/runtimes/__init__.py +5 -0
- ads/jobs/builders/runtimes/artifact.py +338 -0
- ads/jobs/builders/runtimes/base.py +325 -0
- ads/jobs/builders/runtimes/container_runtime.py +242 -0
- ads/jobs/builders/runtimes/python_runtime.py +1016 -0
- ads/jobs/builders/runtimes/pytorch_runtime.py +204 -0
- ads/jobs/cli.py +104 -0
- ads/jobs/env_var_parser.py +131 -0
- ads/jobs/extension.py +160 -0
- ads/jobs/schema/__init__.py +5 -0
- ads/jobs/schema/infrastructure_schema.json +116 -0
- ads/jobs/schema/job_schema.json +42 -0
- ads/jobs/schema/runtime_schema.json +183 -0
- ads/jobs/schema/validator.py +141 -0
- ads/jobs/serializer.py +296 -0
- ads/jobs/templates/__init__.py +5 -0
- ads/jobs/templates/container.py +6 -0
- ads/jobs/templates/driver_notebook.py +177 -0
- ads/jobs/templates/driver_oci.py +500 -0
- ads/jobs/templates/driver_python.py +48 -0
- ads/jobs/templates/driver_pytorch.py +852 -0
- ads/jobs/templates/driver_utils.py +615 -0
- ads/jobs/templates/hostname_from_env.c +55 -0
- ads/jobs/templates/oci_metrics.py +181 -0
- ads/jobs/utils.py +104 -0
- ads/llm/__init__.py +28 -0
- ads/llm/autogen/__init__.py +2 -0
- ads/llm/autogen/constants.py +15 -0
- ads/llm/autogen/reports/__init__.py +2 -0
- ads/llm/autogen/reports/base.py +67 -0
- ads/llm/autogen/reports/data.py +103 -0
- ads/llm/autogen/reports/session.py +526 -0
- ads/llm/autogen/reports/templates/chat_box.html +13 -0
- ads/llm/autogen/reports/templates/chat_box_lt.html +5 -0
- ads/llm/autogen/reports/templates/chat_box_rt.html +6 -0
- ads/llm/autogen/reports/utils.py +56 -0
- ads/llm/autogen/v02/__init__.py +4 -0
- ads/llm/autogen/v02/client.py +295 -0
- ads/llm/autogen/v02/log_handlers/__init__.py +2 -0
- ads/llm/autogen/v02/log_handlers/oci_file_handler.py +83 -0
- ads/llm/autogen/v02/loggers/__init__.py +6 -0
- ads/llm/autogen/v02/loggers/metric_logger.py +320 -0
- ads/llm/autogen/v02/loggers/session_logger.py +580 -0
- ads/llm/autogen/v02/loggers/utils.py +86 -0
- ads/llm/autogen/v02/runtime_logging.py +163 -0
- ads/llm/chain.py +268 -0
- ads/llm/chat_template.py +31 -0
- ads/llm/deploy.py +63 -0
- ads/llm/guardrails/__init__.py +5 -0
- ads/llm/guardrails/base.py +442 -0
- ads/llm/guardrails/huggingface.py +44 -0
- ads/llm/langchain/__init__.py +5 -0
- ads/llm/langchain/plugins/__init__.py +5 -0
- ads/llm/langchain/plugins/chat_models/__init__.py +5 -0
- ads/llm/langchain/plugins/chat_models/oci_data_science.py +1027 -0
- ads/llm/langchain/plugins/embeddings/__init__.py +4 -0
- ads/llm/langchain/plugins/embeddings/oci_data_science_model_deployment_endpoint.py +184 -0
- ads/llm/langchain/plugins/llms/__init__.py +5 -0
- ads/llm/langchain/plugins/llms/oci_data_science_model_deployment_endpoint.py +979 -0
- ads/llm/requirements.txt +3 -0
- ads/llm/serialize.py +219 -0
- ads/llm/serializers/__init__.py +0 -0
- ads/llm/serializers/retrieval_qa.py +153 -0
- ads/llm/serializers/runnable_parallel.py +27 -0
- ads/llm/templates/score_chain.jinja2 +155 -0
- ads/llm/templates/tool_chat_template_hermes.jinja +130 -0
- ads/llm/templates/tool_chat_template_mistral_parallel.jinja +94 -0
- ads/model/__init__.py +52 -0
- ads/model/artifact.py +573 -0
- ads/model/artifact_downloader.py +254 -0
- ads/model/artifact_uploader.py +267 -0
- ads/model/base_properties.py +238 -0
- ads/model/common/.model-ignore +66 -0
- ads/model/common/__init__.py +5 -0
- ads/model/common/utils.py +142 -0
- ads/model/datascience_model.py +2635 -0
- ads/model/deployment/__init__.py +20 -0
- ads/model/deployment/common/__init__.py +5 -0
- ads/model/deployment/common/utils.py +308 -0
- ads/model/deployment/model_deployer.py +466 -0
- ads/model/deployment/model_deployment.py +1846 -0
- ads/model/deployment/model_deployment_infrastructure.py +671 -0
- ads/model/deployment/model_deployment_properties.py +493 -0
- ads/model/deployment/model_deployment_runtime.py +838 -0
- ads/model/extractor/__init__.py +5 -0
- ads/model/extractor/automl_extractor.py +74 -0
- ads/model/extractor/embedding_onnx_extractor.py +80 -0
- ads/model/extractor/huggingface_extractor.py +88 -0
- ads/model/extractor/keras_extractor.py +84 -0
- ads/model/extractor/lightgbm_extractor.py +93 -0
- ads/model/extractor/model_info_extractor.py +114 -0
- ads/model/extractor/model_info_extractor_factory.py +105 -0
- ads/model/extractor/pytorch_extractor.py +87 -0
- ads/model/extractor/sklearn_extractor.py +112 -0
- ads/model/extractor/spark_extractor.py +89 -0
- ads/model/extractor/tensorflow_extractor.py +85 -0
- ads/model/extractor/xgboost_extractor.py +94 -0
- ads/model/framework/__init__.py +5 -0
- ads/model/framework/automl_model.py +178 -0
- ads/model/framework/embedding_onnx_model.py +438 -0
- ads/model/framework/huggingface_model.py +399 -0
- ads/model/framework/lightgbm_model.py +266 -0
- ads/model/framework/pytorch_model.py +266 -0
- ads/model/framework/sklearn_model.py +250 -0
- ads/model/framework/spark_model.py +326 -0
- ads/model/framework/tensorflow_model.py +254 -0
- ads/model/framework/xgboost_model.py +258 -0
- ads/model/generic_model.py +3518 -0
- ads/model/model_artifact_boilerplate/README.md +381 -0
- ads/model/model_artifact_boilerplate/__init__.py +5 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/__init__.py +5 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/model_artifact_validate.py +427 -0
- ads/model/model_artifact_boilerplate/artifact_introspection_test/requirements.txt +2 -0
- ads/model/model_artifact_boilerplate/runtime.yaml +7 -0
- ads/model/model_artifact_boilerplate/score.py +61 -0
- ads/model/model_file_description_schema.json +68 -0
- ads/model/model_introspect.py +331 -0
- ads/model/model_metadata.py +1810 -0
- ads/model/model_metadata_mixin.py +460 -0
- ads/model/model_properties.py +63 -0
- ads/model/model_version_set.py +739 -0
- ads/model/runtime/__init__.py +5 -0
- ads/model/runtime/env_info.py +306 -0
- ads/model/runtime/model_deployment_details.py +37 -0
- ads/model/runtime/model_provenance_details.py +58 -0
- ads/model/runtime/runtime_info.py +81 -0
- ads/model/runtime/schemas/inference_env_info_schema.yaml +16 -0
- ads/model/runtime/schemas/model_provenance_schema.yaml +36 -0
- ads/model/runtime/schemas/training_env_info_schema.yaml +16 -0
- ads/model/runtime/utils.py +201 -0
- ads/model/serde/__init__.py +5 -0
- ads/model/serde/common.py +40 -0
- ads/model/serde/model_input.py +547 -0
- ads/model/serde/model_serializer.py +1184 -0
- ads/model/service/__init__.py +5 -0
- ads/model/service/oci_datascience_model.py +1076 -0
- ads/model/service/oci_datascience_model_deployment.py +500 -0
- ads/model/service/oci_datascience_model_version_set.py +176 -0
- ads/model/transformer/__init__.py +5 -0
- ads/model/transformer/onnx_transformer.py +324 -0
- ads/mysqldb/__init__.py +5 -0
- ads/mysqldb/mysql_db.py +227 -0
- ads/opctl/__init__.py +18 -0
- ads/opctl/anomaly_detection.py +11 -0
- ads/opctl/backend/__init__.py +5 -0
- ads/opctl/backend/ads_dataflow.py +353 -0
- ads/opctl/backend/ads_ml_job.py +710 -0
- ads/opctl/backend/ads_ml_pipeline.py +164 -0
- ads/opctl/backend/ads_model_deployment.py +209 -0
- ads/opctl/backend/base.py +146 -0
- ads/opctl/backend/local.py +1053 -0
- ads/opctl/backend/marketplace/__init__.py +9 -0
- ads/opctl/backend/marketplace/helm_helper.py +173 -0
- ads/opctl/backend/marketplace/local_marketplace.py +271 -0
- ads/opctl/backend/marketplace/marketplace_backend_runner.py +71 -0
- ads/opctl/backend/marketplace/marketplace_operator_interface.py +44 -0
- ads/opctl/backend/marketplace/marketplace_operator_runner.py +24 -0
- ads/opctl/backend/marketplace/marketplace_utils.py +212 -0
- ads/opctl/backend/marketplace/models/__init__.py +5 -0
- ads/opctl/backend/marketplace/models/bearer_token.py +94 -0
- ads/opctl/backend/marketplace/models/marketplace_type.py +70 -0
- ads/opctl/backend/marketplace/models/ocir_details.py +56 -0
- ads/opctl/backend/marketplace/prerequisite_checker.py +238 -0
- ads/opctl/cli.py +707 -0
- ads/opctl/cmds.py +869 -0
- ads/opctl/conda/__init__.py +5 -0
- ads/opctl/conda/cli.py +193 -0
- ads/opctl/conda/cmds.py +749 -0
- ads/opctl/conda/config.yaml +34 -0
- ads/opctl/conda/manifest_template.yaml +13 -0
- ads/opctl/conda/multipart_uploader.py +188 -0
- ads/opctl/conda/pack.py +89 -0
- ads/opctl/config/__init__.py +5 -0
- ads/opctl/config/base.py +57 -0
- ads/opctl/config/diagnostics/__init__.py +5 -0
- ads/opctl/config/diagnostics/distributed/default_requirements_config.yaml +62 -0
- ads/opctl/config/merger.py +255 -0
- ads/opctl/config/resolver.py +297 -0
- ads/opctl/config/utils.py +79 -0
- ads/opctl/config/validator.py +17 -0
- ads/opctl/config/versioner.py +68 -0
- ads/opctl/config/yaml_parsers/__init__.py +7 -0
- ads/opctl/config/yaml_parsers/base.py +58 -0
- ads/opctl/config/yaml_parsers/distributed/__init__.py +7 -0
- ads/opctl/config/yaml_parsers/distributed/yaml_parser.py +201 -0
- ads/opctl/constants.py +66 -0
- ads/opctl/decorator/__init__.py +5 -0
- ads/opctl/decorator/common.py +129 -0
- ads/opctl/diagnostics/__init__.py +5 -0
- ads/opctl/diagnostics/__main__.py +25 -0
- ads/opctl/diagnostics/check_distributed_job_requirements.py +212 -0
- ads/opctl/diagnostics/check_requirements.py +144 -0
- ads/opctl/diagnostics/requirement_exception.py +9 -0
- ads/opctl/distributed/README.md +109 -0
- ads/opctl/distributed/__init__.py +5 -0
- ads/opctl/distributed/certificates.py +32 -0
- ads/opctl/distributed/cli.py +207 -0
- ads/opctl/distributed/cmds.py +731 -0
- ads/opctl/distributed/common/__init__.py +5 -0
- ads/opctl/distributed/common/abstract_cluster_provider.py +449 -0
- ads/opctl/distributed/common/abstract_framework_spec_builder.py +88 -0
- ads/opctl/distributed/common/cluster_config_helper.py +103 -0
- ads/opctl/distributed/common/cluster_provider_factory.py +21 -0
- ads/opctl/distributed/common/cluster_runner.py +54 -0
- ads/opctl/distributed/common/framework_factory.py +29 -0
- ads/opctl/docker/Dockerfile.job +103 -0
- ads/opctl/docker/Dockerfile.job.arm +107 -0
- ads/opctl/docker/Dockerfile.job.gpu +175 -0
- ads/opctl/docker/base-env.yaml +13 -0
- ads/opctl/docker/cuda.repo +6 -0
- ads/opctl/docker/operator/.dockerignore +0 -0
- ads/opctl/docker/operator/Dockerfile +41 -0
- ads/opctl/docker/operator/Dockerfile.gpu +85 -0
- ads/opctl/docker/operator/cuda.repo +6 -0
- ads/opctl/docker/operator/environment.yaml +8 -0
- ads/opctl/forecast.py +11 -0
- ads/opctl/index.yaml +3 -0
- ads/opctl/model/__init__.py +5 -0
- ads/opctl/model/cli.py +65 -0
- ads/opctl/model/cmds.py +73 -0
- ads/opctl/operator/README.md +4 -0
- ads/opctl/operator/__init__.py +31 -0
- ads/opctl/operator/cli.py +344 -0
- ads/opctl/operator/cmd.py +596 -0
- ads/opctl/operator/common/__init__.py +5 -0
- ads/opctl/operator/common/backend_factory.py +460 -0
- ads/opctl/operator/common/const.py +27 -0
- ads/opctl/operator/common/data/synthetic.csv +16001 -0
- ads/opctl/operator/common/dictionary_merger.py +148 -0
- ads/opctl/operator/common/errors.py +42 -0
- ads/opctl/operator/common/operator_config.py +99 -0
- ads/opctl/operator/common/operator_loader.py +811 -0
- ads/opctl/operator/common/operator_schema.yaml +130 -0
- ads/opctl/operator/common/operator_yaml_generator.py +152 -0
- ads/opctl/operator/common/utils.py +208 -0
- ads/opctl/operator/lowcode/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/MLoperator +16 -0
- ads/opctl/operator/lowcode/anomaly/README.md +207 -0
- ads/opctl/operator/lowcode/anomaly/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/__main__.py +103 -0
- ads/opctl/operator/lowcode/anomaly/cmd.py +35 -0
- ads/opctl/operator/lowcode/anomaly/const.py +167 -0
- ads/opctl/operator/lowcode/anomaly/environment.yaml +10 -0
- ads/opctl/operator/lowcode/anomaly/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/anomaly/model/anomaly_dataset.py +146 -0
- ads/opctl/operator/lowcode/anomaly/model/anomaly_merlion.py +162 -0
- ads/opctl/operator/lowcode/anomaly/model/automlx.py +99 -0
- ads/opctl/operator/lowcode/anomaly/model/autots.py +115 -0
- ads/opctl/operator/lowcode/anomaly/model/base_model.py +404 -0
- ads/opctl/operator/lowcode/anomaly/model/factory.py +110 -0
- ads/opctl/operator/lowcode/anomaly/model/isolationforest.py +78 -0
- ads/opctl/operator/lowcode/anomaly/model/oneclasssvm.py +78 -0
- ads/opctl/operator/lowcode/anomaly/model/randomcutforest.py +120 -0
- ads/opctl/operator/lowcode/anomaly/model/tods.py +119 -0
- ads/opctl/operator/lowcode/anomaly/operator_config.py +127 -0
- ads/opctl/operator/lowcode/anomaly/schema.yaml +401 -0
- ads/opctl/operator/lowcode/anomaly/utils.py +88 -0
- ads/opctl/operator/lowcode/common/__init__.py +5 -0
- ads/opctl/operator/lowcode/common/const.py +10 -0
- ads/opctl/operator/lowcode/common/data.py +116 -0
- ads/opctl/operator/lowcode/common/errors.py +47 -0
- ads/opctl/operator/lowcode/common/transformations.py +296 -0
- ads/opctl/operator/lowcode/common/utils.py +384 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/MLoperator +13 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/README.md +30 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/__init__.py +5 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/__main__.py +116 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/cmd.py +85 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/const.py +15 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/environment.yaml +0 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/__init__.py +4 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/apigw_config.py +32 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/db_config.py +43 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/mysql_config.py +120 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/models/serializable_yaml_model.py +34 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/operator_utils.py +386 -0
- ads/opctl/operator/lowcode/feature_store_marketplace/schema.yaml +160 -0
- ads/opctl/operator/lowcode/forecast/MLoperator +25 -0
- ads/opctl/operator/lowcode/forecast/README.md +209 -0
- ads/opctl/operator/lowcode/forecast/__init__.py +5 -0
- ads/opctl/operator/lowcode/forecast/__main__.py +89 -0
- ads/opctl/operator/lowcode/forecast/cmd.py +40 -0
- ads/opctl/operator/lowcode/forecast/const.py +92 -0
- ads/opctl/operator/lowcode/forecast/environment.yaml +20 -0
- ads/opctl/operator/lowcode/forecast/errors.py +26 -0
- ads/opctl/operator/lowcode/forecast/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/forecast/model/arima.py +279 -0
- ads/opctl/operator/lowcode/forecast/model/automlx.py +553 -0
- ads/opctl/operator/lowcode/forecast/model/autots.py +312 -0
- ads/opctl/operator/lowcode/forecast/model/base_model.py +875 -0
- ads/opctl/operator/lowcode/forecast/model/factory.py +106 -0
- ads/opctl/operator/lowcode/forecast/model/forecast_datasets.py +492 -0
- ads/opctl/operator/lowcode/forecast/model/ml_forecast.py +243 -0
- ads/opctl/operator/lowcode/forecast/model/neuralprophet.py +482 -0
- ads/opctl/operator/lowcode/forecast/model/prophet.py +445 -0
- ads/opctl/operator/lowcode/forecast/model_evaluator.py +244 -0
- ads/opctl/operator/lowcode/forecast/operator_config.py +234 -0
- ads/opctl/operator/lowcode/forecast/schema.yaml +506 -0
- ads/opctl/operator/lowcode/forecast/utils.py +397 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/__init__.py +7 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/deployment_manager.py +285 -0
- ads/opctl/operator/lowcode/forecast/whatifserve/score.py +246 -0
- ads/opctl/operator/lowcode/pii/MLoperator +17 -0
- ads/opctl/operator/lowcode/pii/README.md +208 -0
- ads/opctl/operator/lowcode/pii/__init__.py +5 -0
- ads/opctl/operator/lowcode/pii/__main__.py +78 -0
- ads/opctl/operator/lowcode/pii/cmd.py +39 -0
- ads/opctl/operator/lowcode/pii/constant.py +84 -0
- ads/opctl/operator/lowcode/pii/environment.yaml +17 -0
- ads/opctl/operator/lowcode/pii/errors.py +27 -0
- ads/opctl/operator/lowcode/pii/model/__init__.py +5 -0
- ads/opctl/operator/lowcode/pii/model/factory.py +82 -0
- ads/opctl/operator/lowcode/pii/model/guardrails.py +167 -0
- ads/opctl/operator/lowcode/pii/model/pii.py +145 -0
- ads/opctl/operator/lowcode/pii/model/processor/__init__.py +34 -0
- ads/opctl/operator/lowcode/pii/model/processor/email_replacer.py +34 -0
- ads/opctl/operator/lowcode/pii/model/processor/mbi_replacer.py +35 -0
- ads/opctl/operator/lowcode/pii/model/processor/name_replacer.py +225 -0
- ads/opctl/operator/lowcode/pii/model/processor/number_replacer.py +73 -0
- ads/opctl/operator/lowcode/pii/model/processor/remover.py +26 -0
- ads/opctl/operator/lowcode/pii/model/report.py +487 -0
- ads/opctl/operator/lowcode/pii/operator_config.py +95 -0
- ads/opctl/operator/lowcode/pii/schema.yaml +108 -0
- ads/opctl/operator/lowcode/pii/utils.py +43 -0
- ads/opctl/operator/lowcode/recommender/MLoperator +16 -0
- ads/opctl/operator/lowcode/recommender/README.md +206 -0
- ads/opctl/operator/lowcode/recommender/__init__.py +5 -0
- ads/opctl/operator/lowcode/recommender/__main__.py +82 -0
- ads/opctl/operator/lowcode/recommender/cmd.py +33 -0
- ads/opctl/operator/lowcode/recommender/constant.py +30 -0
- ads/opctl/operator/lowcode/recommender/environment.yaml +11 -0
- ads/opctl/operator/lowcode/recommender/model/base_model.py +212 -0
- ads/opctl/operator/lowcode/recommender/model/factory.py +56 -0
- ads/opctl/operator/lowcode/recommender/model/recommender_dataset.py +25 -0
- ads/opctl/operator/lowcode/recommender/model/svd.py +106 -0
- ads/opctl/operator/lowcode/recommender/operator_config.py +81 -0
- ads/opctl/operator/lowcode/recommender/schema.yaml +265 -0
- ads/opctl/operator/lowcode/recommender/utils.py +13 -0
- ads/opctl/operator/runtime/__init__.py +5 -0
- ads/opctl/operator/runtime/const.py +17 -0
- ads/opctl/operator/runtime/container_runtime_schema.yaml +50 -0
- ads/opctl/operator/runtime/marketplace_runtime.py +50 -0
- ads/opctl/operator/runtime/python_marketplace_runtime_schema.yaml +21 -0
- ads/opctl/operator/runtime/python_runtime_schema.yaml +21 -0
- ads/opctl/operator/runtime/runtime.py +115 -0
- ads/opctl/schema.yaml.yml +36 -0
- ads/opctl/script.py +40 -0
- ads/opctl/spark/__init__.py +5 -0
- ads/opctl/spark/cli.py +43 -0
- ads/opctl/spark/cmds.py +147 -0
- ads/opctl/templates/diagnostic_report_template.jinja2 +102 -0
- ads/opctl/utils.py +344 -0
- ads/oracledb/__init__.py +5 -0
- ads/oracledb/oracle_db.py +346 -0
- ads/pipeline/__init__.py +39 -0
- ads/pipeline/ads_pipeline.py +2279 -0
- ads/pipeline/ads_pipeline_run.py +772 -0
- ads/pipeline/ads_pipeline_step.py +605 -0
- ads/pipeline/builders/__init__.py +5 -0
- ads/pipeline/builders/infrastructure/__init__.py +5 -0
- ads/pipeline/builders/infrastructure/custom_script.py +32 -0
- ads/pipeline/cli.py +119 -0
- ads/pipeline/extension.py +291 -0
- ads/pipeline/schema/__init__.py +5 -0
- ads/pipeline/schema/cs_step_schema.json +35 -0
- ads/pipeline/schema/ml_step_schema.json +31 -0
- ads/pipeline/schema/pipeline_schema.json +71 -0
- ads/pipeline/visualizer/__init__.py +5 -0
- ads/pipeline/visualizer/base.py +570 -0
- ads/pipeline/visualizer/graph_renderer.py +272 -0
- ads/pipeline/visualizer/text_renderer.py +84 -0
- ads/secrets/__init__.py +11 -0
- ads/secrets/adb.py +386 -0
- ads/secrets/auth_token.py +86 -0
- ads/secrets/big_data_service.py +365 -0
- ads/secrets/mysqldb.py +149 -0
- ads/secrets/oracledb.py +160 -0
- ads/secrets/secrets.py +407 -0
- ads/telemetry/__init__.py +7 -0
- ads/telemetry/base.py +69 -0
- ads/telemetry/client.py +125 -0
- ads/telemetry/telemetry.py +257 -0
- ads/templates/dataflow_pyspark.jinja2 +13 -0
- ads/templates/dataflow_sparksql.jinja2 +22 -0
- ads/templates/func.jinja2 +20 -0
- ads/templates/schemas/openapi.json +1740 -0
- ads/templates/score-pkl.jinja2 +173 -0
- ads/templates/score.jinja2 +322 -0
- ads/templates/score_embedding_onnx.jinja2 +202 -0
- ads/templates/score_generic.jinja2 +165 -0
- ads/templates/score_huggingface_pipeline.jinja2 +217 -0
- ads/templates/score_lightgbm.jinja2 +185 -0
- ads/templates/score_onnx.jinja2 +407 -0
- ads/templates/score_onnx_new.jinja2 +473 -0
- ads/templates/score_oracle_automl.jinja2 +185 -0
- ads/templates/score_pyspark.jinja2 +154 -0
- ads/templates/score_pytorch.jinja2 +219 -0
- ads/templates/score_scikit-learn.jinja2 +184 -0
- ads/templates/score_tensorflow.jinja2 +184 -0
- ads/templates/score_xgboost.jinja2 +178 -0
- ads/text_dataset/__init__.py +5 -0
- ads/text_dataset/backends.py +211 -0
- ads/text_dataset/dataset.py +445 -0
- ads/text_dataset/extractor.py +207 -0
- ads/text_dataset/options.py +53 -0
- ads/text_dataset/udfs.py +22 -0
- ads/text_dataset/utils.py +49 -0
- ads/type_discovery/__init__.py +9 -0
- ads/type_discovery/abstract_detector.py +21 -0
- ads/type_discovery/constant_detector.py +41 -0
- ads/type_discovery/continuous_detector.py +54 -0
- ads/type_discovery/credit_card_detector.py +99 -0
- ads/type_discovery/datetime_detector.py +92 -0
- ads/type_discovery/discrete_detector.py +118 -0
- ads/type_discovery/document_detector.py +146 -0
- ads/type_discovery/ip_detector.py +68 -0
- ads/type_discovery/latlon_detector.py +90 -0
- ads/type_discovery/phone_number_detector.py +63 -0
- ads/type_discovery/type_discovery_driver.py +87 -0
- ads/type_discovery/typed_feature.py +594 -0
- ads/type_discovery/unknown_detector.py +41 -0
- ads/type_discovery/zipcode_detector.py +48 -0
- ads/vault/__init__.py +7 -0
- ads/vault/vault.py +237 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/METADATA +150 -150
- oracle_ads-2.13.9rc1.dist-info/RECORD +858 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/WHEEL +1 -2
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/entry_points.txt +2 -1
- oracle_ads-2.13.9rc0.dist-info/RECORD +0 -9
- oracle_ads-2.13.9rc0.dist-info/top_level.txt +0 -1
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.9rc1.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,500 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8; -*-
|
3
|
+
|
4
|
+
# Copyright (c) 2021, 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
|
+
This is a driver script from Oracle ADS to run Python script in OCI Data Science Jobs.
|
8
|
+
The following environment variables are used:
|
9
|
+
GIT_URL:
|
10
|
+
URL to the Git repository.
|
11
|
+
GIT_BRANCH:
|
12
|
+
Optional, the Git branch to checkout.
|
13
|
+
GIT_COMMIT:
|
14
|
+
Optional, the Git commit to checkout. By default, the most recent git commit will be checked out.
|
15
|
+
CODE_DIR:
|
16
|
+
Optional, the directory for saving the user code from Git repository. Defaults to "~/Code"
|
17
|
+
GIT_ENTRYPOINT:
|
18
|
+
Relative path to the entry script/module file in the Git repository.
|
19
|
+
ENTRY_FUNCTION:
|
20
|
+
Optional, function name in the entry script/module to be invoked.
|
21
|
+
If this is not specified, the entry script will be run as Python script.
|
22
|
+
PYTHON_PATH:
|
23
|
+
Optional, additional paths to be added to sys.path for looking up modules and packages.
|
24
|
+
The root of the Git repository will be added by default.
|
25
|
+
Multiple paths can be separated by os.pathsep, which is colon(:) for Linux and Mac, semicolon(;) for Windows.
|
26
|
+
OUTPUT_DIR:
|
27
|
+
Optional, output directory to be copied to object storage.
|
28
|
+
OUTPUT_URI:
|
29
|
+
Optional, object storage URI for saving files from the output directory.
|
30
|
+
GIT_SECRET_OCID:
|
31
|
+
The OCID of the OCI vault secret storing the SSH key for Git commands.
|
32
|
+
SKIP_METADATA_UPDATE:
|
33
|
+
If this variable exists, the update metadata step will be skipped.
|
34
|
+
OCI_IAM_TYPE:
|
35
|
+
Authentication method for OCI services.
|
36
|
+
OCI API key will be used if this is set to api_key.
|
37
|
+
Otherwise resource principal will be used.
|
38
|
+
OCI_CONFIG_LOCATION:
|
39
|
+
The location of OCI API key when OCI_IAM_TYPE is set to api_key.
|
40
|
+
If this is not set, oci.config.DEFAULT_LOCATION will be used.
|
41
|
+
OCI_CONFIG_PROFILE:
|
42
|
+
The profile name to be used for API key authentication.
|
43
|
+
If this is not set, oci.config.DEFAULT_PROFILE will be used.
|
44
|
+
OCI__GIT_SSH_KEY_PATH:
|
45
|
+
The location to save the SSH Key for accessing the git repository.
|
46
|
+
|
47
|
+
JOB_RUN_OCID:
|
48
|
+
The OCID of the job run. This is set by the job run.
|
49
|
+
|
50
|
+
This module requires the following packages:
|
51
|
+
oci
|
52
|
+
requests
|
53
|
+
GitPython
|
54
|
+
git
|
55
|
+
openssh
|
56
|
+
|
57
|
+
"""
|
58
|
+
import base64
|
59
|
+
import logging
|
60
|
+
import os
|
61
|
+
import random
|
62
|
+
import shutil
|
63
|
+
import string
|
64
|
+
import traceback
|
65
|
+
import uuid
|
66
|
+
from time import sleep, time
|
67
|
+
from typing import Optional
|
68
|
+
from urllib.parse import urlparse
|
69
|
+
from urllib.request import getproxies
|
70
|
+
|
71
|
+
import git
|
72
|
+
import oci
|
73
|
+
import requests
|
74
|
+
from oci.data_science import DataScienceClient
|
75
|
+
|
76
|
+
try:
|
77
|
+
# This is used in a job run.
|
78
|
+
import driver_utils
|
79
|
+
except ImportError:
|
80
|
+
# This is used when importing by other ADS module and testing.
|
81
|
+
from . import driver_utils
|
82
|
+
|
83
|
+
|
84
|
+
CONST_ENV_ENTRYPOINT = "GIT_ENTRYPOINT"
|
85
|
+
CONST_ENV_GIT_URL = "GIT_URL"
|
86
|
+
CONST_ENV_GIT_BRANCH = "GIT_BRANCH"
|
87
|
+
CONST_ENV_GIT_COMMIT = "GIT_COMMIT"
|
88
|
+
CONST_ENV_SECRET_OCID = "GIT_SECRET_OCID"
|
89
|
+
|
90
|
+
DEFAULT_CODE_DIR = "~/Code/"
|
91
|
+
SSH_DIR = os.path.join("/home", "datascience", "ssh_" + str(uuid.uuid4()))
|
92
|
+
SSH_KEY_FILE_PATH = os.path.join(SSH_DIR, "id_rsa")
|
93
|
+
SSH_CONFIG_FILE_PATH = os.path.join(SSH_DIR, "config")
|
94
|
+
|
95
|
+
|
96
|
+
logger = logging.getLogger(__name__)
|
97
|
+
logger = driver_utils.set_log_level(logger)
|
98
|
+
|
99
|
+
|
100
|
+
class GitManager:
|
101
|
+
"""Contains methods for fetching code from Git repository"""
|
102
|
+
|
103
|
+
def __init__(
|
104
|
+
self,
|
105
|
+
repo_url: str,
|
106
|
+
code_dir: str = os.environ.get(driver_utils.CONST_ENV_CODE_DIR),
|
107
|
+
):
|
108
|
+
"""Initialize the GitManager
|
109
|
+
|
110
|
+
Parameters
|
111
|
+
----------
|
112
|
+
repo_url : str
|
113
|
+
The URL of the repository.
|
114
|
+
code_dir : str
|
115
|
+
The local directory for storing the code from Git repository.
|
116
|
+
|
117
|
+
Raises
|
118
|
+
------
|
119
|
+
ValueError
|
120
|
+
URL is not specified.
|
121
|
+
"""
|
122
|
+
if not repo_url:
|
123
|
+
raise ValueError("Specify the URL of Git repository.")
|
124
|
+
self.repo_url = repo_url
|
125
|
+
# Use default directory if code_dir is set to None or empty string.
|
126
|
+
if not code_dir:
|
127
|
+
code_dir = os.path.join(
|
128
|
+
DEFAULT_CODE_DIR, os.path.basename(repo_url).split(".", 1)[0]
|
129
|
+
)
|
130
|
+
self.code_dir = os.path.abspath(os.path.expanduser(code_dir))
|
131
|
+
|
132
|
+
logger.info("Initializing code directory at %s", self.code_dir)
|
133
|
+
# Rename the existing directory if one already exists
|
134
|
+
if os.path.exists(self.code_dir) and os.listdir(self.code_dir):
|
135
|
+
logger.warning(
|
136
|
+
"Directory %s already exists and is not empty.", self.code_dir
|
137
|
+
)
|
138
|
+
new_name = (
|
139
|
+
self.code_dir
|
140
|
+
+ "_"
|
141
|
+
+ "".join(random.choice(string.ascii_lowercase) for i in range(5))
|
142
|
+
)
|
143
|
+
shutil.move(
|
144
|
+
self.code_dir,
|
145
|
+
new_name,
|
146
|
+
)
|
147
|
+
logger.warning("Renamed %s to %s", self.code_dir, new_name)
|
148
|
+
os.makedirs(self.code_dir, exist_ok=True)
|
149
|
+
|
150
|
+
self.repo = None
|
151
|
+
self.commit = None
|
152
|
+
|
153
|
+
def _config_ssh_proxy(self, proxy):
|
154
|
+
return_code = driver_utils.JobRunner.run_command(
|
155
|
+
"command -v socat", level=logging.DEBUG
|
156
|
+
)
|
157
|
+
if return_code:
|
158
|
+
logger.warning(
|
159
|
+
"You have ssh_proxy configured. "
|
160
|
+
"Please install the 'socat' package into your environment "
|
161
|
+
"if you would like to use proxy for Git clone via SSH."
|
162
|
+
)
|
163
|
+
else:
|
164
|
+
ssh_config = f"ProxyCommand socat - PROXY:{proxy.hostname}:%h:%p,proxyport={proxy.port}"
|
165
|
+
logger.debug("Adding proxy for SSH: %s", ssh_config)
|
166
|
+
with open(SSH_CONFIG_FILE_PATH, "a", encoding="utf-8") as f:
|
167
|
+
f.write(ssh_config)
|
168
|
+
logger.debug("SSH config saved to %s", SSH_CONFIG_FILE_PATH)
|
169
|
+
|
170
|
+
def _config_known_hosts(self, host: str):
|
171
|
+
if driver_utils.JobRunner.run_command(
|
172
|
+
f"ssh-keyscan -H {host} >> {SSH_DIR}/known_hosts", level=logging.DEBUG
|
173
|
+
):
|
174
|
+
logger.debug("Added %s to known hosts.", host)
|
175
|
+
else:
|
176
|
+
logger.warning(
|
177
|
+
"Failed to add %s to known hosts."
|
178
|
+
"You may need to configure your subnet security list to allow traffic on port 22.",
|
179
|
+
host,
|
180
|
+
)
|
181
|
+
# Test the connection, for debugging purpose
|
182
|
+
if logger.level == logging.DEBUG:
|
183
|
+
os.system(f"ssh -vT git@{host}")
|
184
|
+
|
185
|
+
def _config_ssh_key(self):
|
186
|
+
if os.path.exists(SSH_KEY_FILE_PATH):
|
187
|
+
# Ignore the fingerprint checking
|
188
|
+
ssh_cmd = f'ssh -i "{SSH_KEY_FILE_PATH}" '
|
189
|
+
if os.path.exists(SSH_CONFIG_FILE_PATH):
|
190
|
+
ssh_cmd += f'-F "{SSH_CONFIG_FILE_PATH}" '
|
191
|
+
ssh_cmd += (
|
192
|
+
'-o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" '
|
193
|
+
)
|
194
|
+
if logger.level == logging.DEBUG:
|
195
|
+
ssh_cmd += "-v "
|
196
|
+
logger.debug("SSH command: %s", ssh_cmd)
|
197
|
+
return {"GIT_SSH_COMMAND": ssh_cmd}
|
198
|
+
return None
|
199
|
+
|
200
|
+
def fetch_repo(self):
|
201
|
+
"""Clones the Git repository."""
|
202
|
+
logger.debug("Cloning from %s", self.repo_url)
|
203
|
+
env = None
|
204
|
+
if self.repo_url.startswith(("git@", "ssh://")):
|
205
|
+
proxies = getproxies()
|
206
|
+
if ("http" in proxies or "https" in proxies) and "ssh" not in proxies:
|
207
|
+
logger.warning(
|
208
|
+
"You have http/https proxy configured. "
|
209
|
+
"Please set ssh_proxy in environment variable and install the 'socat' package "
|
210
|
+
"if you would like to use the proxy for Git clone via SSH. "
|
211
|
+
"conda install -c conda-forge socat"
|
212
|
+
)
|
213
|
+
if "ssh" in proxies:
|
214
|
+
proxy = urlparse(proxies["ssh"])
|
215
|
+
self._config_ssh_proxy(proxy=proxy)
|
216
|
+
env = self._config_ssh_key()
|
217
|
+
|
218
|
+
if logger.level == logging.DEBUG:
|
219
|
+
os.system("git --version")
|
220
|
+
|
221
|
+
self.repo = git.Repo.clone_from(self.repo_url, self.code_dir, env=env)
|
222
|
+
logger.info("Cloned repo to: %s", self.code_dir)
|
223
|
+
return self
|
224
|
+
|
225
|
+
def checkout_code(self, branch: Optional[str] = None, commit: Optional[str] = None):
|
226
|
+
"""Checkouts the branch or commit of the Git repository.
|
227
|
+
|
228
|
+
If neither branch nor commit is specified, the tip of the default branch will be used.
|
229
|
+
If both branch and commit are specified, the commit will be used.
|
230
|
+
|
231
|
+
Parameters
|
232
|
+
----------
|
233
|
+
branch : str, optional
|
234
|
+
The name of the branch, by default None
|
235
|
+
commit : str, optional
|
236
|
+
The commit ID (SHA1 hash), by default None
|
237
|
+
|
238
|
+
"""
|
239
|
+
if commit:
|
240
|
+
logger.info("Checking out commit: %s", commit)
|
241
|
+
self.repo.git.checkout(commit)
|
242
|
+
elif branch:
|
243
|
+
logger.info("Checking out branch: %s", branch)
|
244
|
+
self.repo.git.checkout(branch)
|
245
|
+
else:
|
246
|
+
logger.info(
|
247
|
+
"Checking out the latest commit %s", self.repo.head.commit.hexsha
|
248
|
+
)
|
249
|
+
self.commit = self.repo.head.commit.hexsha
|
250
|
+
return self
|
251
|
+
|
252
|
+
|
253
|
+
class CredentialManager:
|
254
|
+
@staticmethod
|
255
|
+
def read_secret(secret_id):
|
256
|
+
"""Reads and decode the value of of a secret from OCI vault.
|
257
|
+
|
258
|
+
Parameters
|
259
|
+
----------
|
260
|
+
secret_id : str
|
261
|
+
OCID of the secret
|
262
|
+
|
263
|
+
Returns
|
264
|
+
-------
|
265
|
+
str
|
266
|
+
The value of the secret decoded with ASCII.
|
267
|
+
"""
|
268
|
+
secret_client = driver_utils.OCIHelper.init_oci_client(
|
269
|
+
oci.secrets.SecretsClient
|
270
|
+
)
|
271
|
+
secret_bundle = secret_client.get_secret_bundle(secret_id)
|
272
|
+
base64_secret_bytes = secret_bundle.data.secret_bundle_content.content.encode(
|
273
|
+
"ascii"
|
274
|
+
)
|
275
|
+
base64_message_bytes = base64.b64decode(base64_secret_bytes)
|
276
|
+
secret_content = base64_message_bytes.decode("ascii")
|
277
|
+
return secret_content
|
278
|
+
|
279
|
+
|
280
|
+
class GitSSHKey:
|
281
|
+
def __init__(self, secret_id) -> None:
|
282
|
+
self.secret_id = secret_id
|
283
|
+
self.key_file_path = os.path.expanduser(
|
284
|
+
os.environ.get("OCI__GIT_SSH_KEY_PATH", SSH_KEY_FILE_PATH)
|
285
|
+
)
|
286
|
+
self.existing_git_ssh_cmd = None
|
287
|
+
self.backup_file_path = None
|
288
|
+
|
289
|
+
def _set_ssh_key(self):
|
290
|
+
"""Setup SSH key for Git command"""
|
291
|
+
content = CredentialManager().read_secret(self.secret_id)
|
292
|
+
# Add a new line to the SSH key in case the user forget to do so
|
293
|
+
# SSH key without a new line at the end is considered "invalid format".
|
294
|
+
if not content.endswith("\n"):
|
295
|
+
content += "\n"
|
296
|
+
os.makedirs(os.path.dirname(self.key_file_path), exist_ok=True)
|
297
|
+
with open(self.key_file_path, "w", encoding="utf-8") as f:
|
298
|
+
f.write(content)
|
299
|
+
# Set the correct permission for the SSH key.
|
300
|
+
os.chmod(self.key_file_path, 0o600)
|
301
|
+
logger.info("SSH key saved to %s", self.key_file_path)
|
302
|
+
|
303
|
+
def _backup_ssh_key(self):
|
304
|
+
"""Backup the existing SSH key if one exists at the same file location."""
|
305
|
+
if not os.path.exists(self.key_file_path):
|
306
|
+
return
|
307
|
+
suffix = (
|
308
|
+
"."
|
309
|
+
+ "".join(random.choice(string.ascii_lowercase) for i in range(10))
|
310
|
+
+ ".bak"
|
311
|
+
)
|
312
|
+
self.backup_file_path = self.key_file_path + suffix
|
313
|
+
os.rename(self.key_file_path, self.backup_file_path)
|
314
|
+
|
315
|
+
def _restore_backup(self):
|
316
|
+
"""Restore the SSH key from backup."""
|
317
|
+
if self.backup_file_path and os.path.exists(self.backup_file_path):
|
318
|
+
os.rename(self.backup_file_path, self.key_file_path)
|
319
|
+
|
320
|
+
def __enter__(self):
|
321
|
+
"""Setup the SSH key for Git command"""
|
322
|
+
if self.secret_id:
|
323
|
+
self._backup_ssh_key()
|
324
|
+
self._set_ssh_key()
|
325
|
+
|
326
|
+
def __exit__(self, tp, value, tb):
|
327
|
+
"""Remove the SSH key and reset the git command option"""
|
328
|
+
if not self.key_file_path:
|
329
|
+
return
|
330
|
+
# Remove the ssh key file only if there is secret
|
331
|
+
if self.secret_id:
|
332
|
+
try:
|
333
|
+
os.remove(self.key_file_path)
|
334
|
+
self._restore_backup()
|
335
|
+
except OSError:
|
336
|
+
# Since this will not affect any job outputs,
|
337
|
+
# ignore the error if the file operation failed for some reason.
|
338
|
+
pass
|
339
|
+
|
340
|
+
|
341
|
+
class GitJobRunner(driver_utils.JobRunner):
|
342
|
+
"""Contains methods for running the job."""
|
343
|
+
|
344
|
+
def __init__(
|
345
|
+
self,
|
346
|
+
git_manager: GitManager,
|
347
|
+
job_run_ocid: str = os.environ.get(driver_utils.CONST_ENV_JOB_RUN_OCID),
|
348
|
+
):
|
349
|
+
"""Initialize the job runner
|
350
|
+
|
351
|
+
Parameters
|
352
|
+
----------
|
353
|
+
job_run_ocid : str, optional
|
354
|
+
Job run OCID, by default "".
|
355
|
+
For local testing purpose, job run OCID can be set to empty string
|
356
|
+
"""
|
357
|
+
self.job_run_ocid = job_run_ocid
|
358
|
+
self.git_manager = git_manager
|
359
|
+
self.artifacts = []
|
360
|
+
self.source_info = {}
|
361
|
+
super().__init__(code_dir=git_manager.code_dir)
|
362
|
+
|
363
|
+
def run(
|
364
|
+
self,
|
365
|
+
entrypoint: str = os.environ.get(CONST_ENV_ENTRYPOINT),
|
366
|
+
entry_function: str = os.environ.get(driver_utils.CONST_ENV_ENTRY_FUNC),
|
367
|
+
):
|
368
|
+
"""Runs the job
|
369
|
+
|
370
|
+
Parameters
|
371
|
+
----------
|
372
|
+
argv : list, optional
|
373
|
+
A list of arguments for the entry script/function, by default None
|
374
|
+
|
375
|
+
"""
|
376
|
+
self.source_info = {
|
377
|
+
"repo": self.git_manager.repo_url,
|
378
|
+
"commit": self.git_manager.commit,
|
379
|
+
"module": entrypoint,
|
380
|
+
"method": entry_function if entry_function else "",
|
381
|
+
}
|
382
|
+
|
383
|
+
# For git, the entrypoint is relative to the root of the repository
|
384
|
+
entrypoint = os.path.join(self.code_dir, entrypoint)
|
385
|
+
|
386
|
+
return super().run(entrypoint=entrypoint, entry_function=entry_function)
|
387
|
+
|
388
|
+
@staticmethod
|
389
|
+
def _raise_for_error(response: requests.Response):
|
390
|
+
if response.status_code >= 400:
|
391
|
+
try:
|
392
|
+
message = response.json().get("message", "")
|
393
|
+
except:
|
394
|
+
message = response.content
|
395
|
+
error = f"{response.status_code} {response.reason} Error for {response.url}\n{message}"
|
396
|
+
raise requests.exceptions.HTTPError(error, response=response)
|
397
|
+
|
398
|
+
def update_job_run_metadata_with_rest_api(
|
399
|
+
self, client: DataScienceClient, metadata: dict
|
400
|
+
) -> None:
|
401
|
+
"""Updates the metadata of the job run by call OCI REST API.
|
402
|
+
|
403
|
+
Parameters
|
404
|
+
----------
|
405
|
+
client : DataScienceClient
|
406
|
+
OCI DataScienceClient
|
407
|
+
metadata : dict
|
408
|
+
Metadata to be saved as freeform tags.
|
409
|
+
"""
|
410
|
+
endpoint = f"{client.base_client.endpoint}/jobRuns/{self.job_run_ocid}"
|
411
|
+
logger.debug("Request endpoint: %s", endpoint)
|
412
|
+
headers = {"accept": "application/json", "content-type": "application/json"}
|
413
|
+
signer = client.base_client.signer
|
414
|
+
# Get the existing tags
|
415
|
+
response = requests.get(endpoint, headers=headers, auth=signer)
|
416
|
+
self._raise_for_error(response)
|
417
|
+
|
418
|
+
tags = response.json().get("freeformTags", {})
|
419
|
+
tags.update(metadata)
|
420
|
+
body = {
|
421
|
+
"definedTags": None,
|
422
|
+
"displayName": None,
|
423
|
+
"freeformTags": tags,
|
424
|
+
}
|
425
|
+
# Additional Headers for PUT request
|
426
|
+
headers.update(
|
427
|
+
{
|
428
|
+
"expect": "100-continue",
|
429
|
+
"opc-request-id": client.base_client.build_request_id(),
|
430
|
+
}
|
431
|
+
)
|
432
|
+
response = requests.put(endpoint, headers=headers, json=body, auth=signer)
|
433
|
+
self._raise_for_error(response)
|
434
|
+
logger.debug(response.json())
|
435
|
+
|
436
|
+
def save_metadata(self) -> None:
|
437
|
+
"""Saves the metadata to job run"""
|
438
|
+
logger.info("Saving metadata to job run...")
|
439
|
+
tags = {}
|
440
|
+
# Source info
|
441
|
+
for key, val in self.source_info.items():
|
442
|
+
logger.debug("%s = %s", key, val)
|
443
|
+
if val:
|
444
|
+
tags[key] = str(val)
|
445
|
+
# Output files
|
446
|
+
if self.artifacts:
|
447
|
+
prefix = "oci://" + os.path.commonprefix(self.artifacts)
|
448
|
+
logger.debug("Job output: %s", prefix)
|
449
|
+
tags["outputs"] = prefix
|
450
|
+
|
451
|
+
client = driver_utils.OCIHelper.init_oci_client(DataScienceClient)
|
452
|
+
oci.retry.DEFAULT_RETRY_STRATEGY.make_retrying_call(
|
453
|
+
self.update_job_run_metadata_with_rest_api, client, tags
|
454
|
+
)
|
455
|
+
logger.debug("Updated Job Run metadata.")
|
456
|
+
|
457
|
+
|
458
|
+
def main():
|
459
|
+
"""The main function for running the job."""
|
460
|
+
second_started = time()
|
461
|
+
|
462
|
+
with GitSSHKey(os.environ.get(CONST_ENV_SECRET_OCID)):
|
463
|
+
git_manager = (
|
464
|
+
GitManager(os.environ.get(CONST_ENV_GIT_URL))
|
465
|
+
.fetch_repo()
|
466
|
+
.checkout_code(
|
467
|
+
branch=os.environ.get(CONST_ENV_GIT_BRANCH, None),
|
468
|
+
commit=os.environ.get(CONST_ENV_GIT_COMMIT, None),
|
469
|
+
)
|
470
|
+
)
|
471
|
+
|
472
|
+
runner = GitJobRunner(git_manager)
|
473
|
+
runner.set_working_dir().setup_python_path().run()
|
474
|
+
|
475
|
+
# Copy outputs
|
476
|
+
runner.artifacts = driver_utils.OCIHelper.copy_outputs()
|
477
|
+
|
478
|
+
# Save metadata only if job run OCID is available
|
479
|
+
if (
|
480
|
+
os.environ.get(driver_utils.CONST_ENV_JOB_RUN_OCID)
|
481
|
+
and "SKIP_METADATA_UPDATE" not in os.environ
|
482
|
+
):
|
483
|
+
try:
|
484
|
+
# Wait before updating the metadata.
|
485
|
+
# Job run might still be in the ACCEPTED state shortly after it started,
|
486
|
+
# Cannot update job run while in ACCEPTED, CANCELLING, DELETED or NEEDS_ATTENTION state
|
487
|
+
second_elapsed = time() - second_started
|
488
|
+
if second_elapsed < 90:
|
489
|
+
sleep(90 - second_elapsed)
|
490
|
+
runner.save_metadata()
|
491
|
+
except Exception:
|
492
|
+
logger.error("An error occurred when saving the metadata.")
|
493
|
+
# Allow the job run to finish successfully even if the driver script failed to save the metadata.
|
494
|
+
logger.debug(traceback.format_exc())
|
495
|
+
|
496
|
+
logger.info("Job completed.")
|
497
|
+
|
498
|
+
|
499
|
+
if __name__ == "__main__":
|
500
|
+
main()
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8; -*-
|
3
|
+
|
4
|
+
# Copyright (c) 2021, 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
|
+
This is a driver script auto-generated by Oracle ADS to run Python script in OCI Data Science Jobs.
|
8
|
+
|
9
|
+
The following environment variables are used:
|
10
|
+
CODE_ENTRYPOINT:
|
11
|
+
Relative path to the entry script/module file in the user code directory.
|
12
|
+
ENTRY_FUNCTION:
|
13
|
+
Optional, function name in the entry script/module to be invoked.
|
14
|
+
If this is not specified, the entry script will be run as Python script.
|
15
|
+
PYTHON_PATH:
|
16
|
+
Optional, additional paths to be added to sys.path for looking up modules and packages.
|
17
|
+
The root of the user code will be added by default.
|
18
|
+
Multiple paths can be separated by os.pathsep, which is colon(:) for Linux and Mac, semicolon(;) for Windows.
|
19
|
+
OUTPUT_DIR:
|
20
|
+
Optional, output directory to be copied to object storage.
|
21
|
+
OUTPUT_URI:
|
22
|
+
Optional, object storage URI for saving files from the output directory.
|
23
|
+
WORKING_DIR:
|
24
|
+
Optional, the working directory of the user code.
|
25
|
+
This can be specified as a relative path from /home/datascience/decompressed_artifact/code
|
26
|
+
If this is not specified, the working directory will be /home/datascience/decompressed_artifact/code
|
27
|
+
|
28
|
+
This module requires the following package:
|
29
|
+
oci
|
30
|
+
|
31
|
+
|
32
|
+
"""
|
33
|
+
try:
|
34
|
+
# This is used by ADS and testing
|
35
|
+
from .driver_utils import OCIHelper, JobRunner
|
36
|
+
except ImportError:
|
37
|
+
# This is used when the script is in a job run.
|
38
|
+
from driver_utils import OCIHelper, JobRunner
|
39
|
+
|
40
|
+
|
41
|
+
def main():
|
42
|
+
"""The main function for running the job."""
|
43
|
+
JobRunner().set_working_dir().conda_unpack().setup_python_path().run()
|
44
|
+
OCIHelper.copy_outputs()
|
45
|
+
|
46
|
+
|
47
|
+
if __name__ == "__main__":
|
48
|
+
main()
|