oracle-ads 2.13.9rc0__py3-none-any.whl → 2.13.10__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 +507 -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 +274 -0
- ads/aqua/common/enums.py +134 -0
- ads/aqua/common/errors.py +109 -0
- ads/aqua/common/utils.py +1295 -0
- ads/aqua/config/__init__.py +4 -0
- ads/aqua/config/container_config.py +246 -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 +381 -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 +300 -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 +2134 -0
- ads/aqua/model/utils.py +52 -0
- ads/aqua/modeldeployment/__init__.py +6 -0
- ads/aqua/modeldeployment/constants.py +10 -0
- ads/aqua/modeldeployment/deployment.py +1315 -0
- ads/aqua/modeldeployment/entities.py +653 -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 +519 -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 +179 -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/config.py +1 -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 +450 -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 +122 -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.10.dist-info}/METADATA +150 -149
- oracle_ads-2.13.10.dist-info/RECORD +858 -0
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10.dist-info}/WHEEL +1 -2
- {oracle_ads-2.13.9rc0.dist-info → oracle_ads-2.13.10.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.10.dist-info}/licenses/LICENSE.txt +0 -0
@@ -0,0 +1,615 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# -*- coding: utf-8; -*-
|
3
|
+
|
4
|
+
# Copyright (c) 2023, 2024 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
|
+
import contextlib
|
7
|
+
import importlib
|
8
|
+
import json
|
9
|
+
import logging
|
10
|
+
import os
|
11
|
+
import runpy
|
12
|
+
import shlex
|
13
|
+
import stat
|
14
|
+
import subprocess
|
15
|
+
import sys
|
16
|
+
import time
|
17
|
+
import traceback
|
18
|
+
from io import DEFAULT_BUFFER_SIZE
|
19
|
+
from typing import List, Optional
|
20
|
+
from urllib import request
|
21
|
+
from urllib.parse import urlparse
|
22
|
+
|
23
|
+
|
24
|
+
import oci
|
25
|
+
|
26
|
+
|
27
|
+
CONST_ENV_LOG_LEVEL = "OCI_LOG_LEVEL"
|
28
|
+
CONST_ENV_WORKING_DIR = "WORKING_DIR"
|
29
|
+
CONST_ENV_CODE_DIR = "CODE_DIR"
|
30
|
+
CONST_ENV_JOB_RUN_OCID = "JOB_RUN_OCID"
|
31
|
+
CONST_ENV_PYTHON_PATH = "PYTHON_PATH"
|
32
|
+
CONST_ENV_ENTRYPOINT = "CODE_ENTRYPOINT"
|
33
|
+
CONST_ENV_ENTRY_FUNC = "ENTRY_FUNCTION"
|
34
|
+
CONST_ENV_OUTPUT_DIR = "OUTPUT_DIR"
|
35
|
+
CONST_ENV_OUTPUT_URI = "OUTPUT_URI"
|
36
|
+
CONST_ENV_OCI_RP = "OCI_RESOURCE_PRINCIPAL_VERSION"
|
37
|
+
CONST_ENV_ADS_IAM = "OCI_IAM_TYPE"
|
38
|
+
CONST_ENV_INPUT_MAPPINGS = "OCI__INPUT_MAPPINGS"
|
39
|
+
CONST_ENV_PIP_REQ = "OCI__PIP_REQUIREMENTS"
|
40
|
+
CONST_ENV_PIP_PKG = "OCI__PIP_PKG"
|
41
|
+
CONST_API_KEY = "api_key"
|
42
|
+
|
43
|
+
|
44
|
+
DEFAULT_CODE_DIR = os.path.join(
|
45
|
+
os.path.dirname(os.path.abspath(__file__)),
|
46
|
+
os.environ.get(CONST_ENV_CODE_DIR, "code"),
|
47
|
+
)
|
48
|
+
|
49
|
+
|
50
|
+
def set_log_level(the_logger: logging.Logger):
|
51
|
+
"""Sets the log level of a logger based on the environment variable.
|
52
|
+
This will also set the log level of logging.lastResort.
|
53
|
+
|
54
|
+
Parameters
|
55
|
+
----------
|
56
|
+
the_logger : logging.Logger
|
57
|
+
A logger object.
|
58
|
+
"""
|
59
|
+
# Do nothing if env var is not set or is empty/None
|
60
|
+
if not os.environ.get(CONST_ENV_LOG_LEVEL):
|
61
|
+
return the_logger
|
62
|
+
log_level = os.environ.get(CONST_ENV_LOG_LEVEL)
|
63
|
+
try:
|
64
|
+
the_logger.setLevel(log_level)
|
65
|
+
logging.lastResort.setLevel(log_level)
|
66
|
+
the_logger.info(f"Log level set to {log_level}")
|
67
|
+
except Exception:
|
68
|
+
# Catching all exceptions here
|
69
|
+
# Setting log level should not interrupt the job run even if there is an exception.
|
70
|
+
the_logger.warning("Failed to set log level.")
|
71
|
+
the_logger.debug(traceback.format_exc())
|
72
|
+
return the_logger
|
73
|
+
|
74
|
+
|
75
|
+
logger = logging.getLogger(__name__)
|
76
|
+
set_log_level(logger)
|
77
|
+
|
78
|
+
|
79
|
+
class OCIHelper:
|
80
|
+
"""Contains helper functions to call OCI APIs"""
|
81
|
+
|
82
|
+
@staticmethod
|
83
|
+
def init_oci_client(client_class):
|
84
|
+
"""Initializes OCI client with API key or Resource Principal.
|
85
|
+
|
86
|
+
Parameters
|
87
|
+
----------
|
88
|
+
client_class :
|
89
|
+
The class of OCI client to be initialized.
|
90
|
+
"""
|
91
|
+
if (
|
92
|
+
os.environ.get(CONST_ENV_ADS_IAM, "").lower() == CONST_API_KEY
|
93
|
+
or CONST_ENV_OCI_RP not in os.environ
|
94
|
+
):
|
95
|
+
logger.info("Initializing %s with API Key...", {client_class.__name__})
|
96
|
+
client = client_class(
|
97
|
+
oci.config.from_file(
|
98
|
+
file_location=os.environ.get(
|
99
|
+
"OCI_CONFIG_LOCATION", oci.config.DEFAULT_LOCATION
|
100
|
+
),
|
101
|
+
profile_name=os.environ.get(
|
102
|
+
"OCI_CONFIG_PROFILE", oci.config.DEFAULT_PROFILE
|
103
|
+
),
|
104
|
+
)
|
105
|
+
)
|
106
|
+
else:
|
107
|
+
logger.info(
|
108
|
+
"Initializing %s with Resource Principal...", client_class.__name__
|
109
|
+
)
|
110
|
+
client = client_class(
|
111
|
+
{}, signer=oci.auth.signers.get_resource_principals_signer()
|
112
|
+
)
|
113
|
+
return client
|
114
|
+
|
115
|
+
@staticmethod
|
116
|
+
def copy_to_oci_object_storage(
|
117
|
+
output_dir: str, namespace: str, bucket: str, prefix: str
|
118
|
+
) -> List[str]:
|
119
|
+
"""Copies the output files to OCI object storage
|
120
|
+
|
121
|
+
Parameters
|
122
|
+
----------
|
123
|
+
output_dir : str
|
124
|
+
Path of the output directory containing files to be copied.
|
125
|
+
namespace : str
|
126
|
+
Namespace of the object storage location.
|
127
|
+
bucket : str
|
128
|
+
Bucket name of the object storage location.
|
129
|
+
prefix : str
|
130
|
+
Prefix (path) of the object storage location.
|
131
|
+
|
132
|
+
Returns
|
133
|
+
-------
|
134
|
+
list
|
135
|
+
A list of URIs for files that are copied to output_uri
|
136
|
+
"""
|
137
|
+
client = OCIHelper.init_oci_client(oci.object_storage.ObjectStorageClient)
|
138
|
+
|
139
|
+
if not prefix:
|
140
|
+
prefix = ""
|
141
|
+
prefix = prefix.strip("/")
|
142
|
+
|
143
|
+
copied = []
|
144
|
+
for path, _, files in os.walk(output_dir):
|
145
|
+
for name in files:
|
146
|
+
file_path = os.path.join(path, name)
|
147
|
+
# Get the relative path of the file to keep the directory structure
|
148
|
+
relative_path = os.path.relpath(file_path, output_dir)
|
149
|
+
if prefix:
|
150
|
+
file_prefix = os.path.join(prefix, relative_path)
|
151
|
+
else:
|
152
|
+
# Save file to bucket root if prefix is empty.
|
153
|
+
file_prefix = relative_path
|
154
|
+
|
155
|
+
logger.debug(
|
156
|
+
"Saving %s to %s@%s/%s",
|
157
|
+
relative_path,
|
158
|
+
bucket,
|
159
|
+
namespace,
|
160
|
+
file_prefix,
|
161
|
+
)
|
162
|
+
|
163
|
+
with open(file_path, "rb") as pkf:
|
164
|
+
client.put_object(
|
165
|
+
namespace,
|
166
|
+
bucket,
|
167
|
+
file_prefix,
|
168
|
+
pkf,
|
169
|
+
)
|
170
|
+
copied.append(f"{bucket}@{namespace}/{file_prefix}")
|
171
|
+
return copied
|
172
|
+
|
173
|
+
@staticmethod
|
174
|
+
def substitute_output_uri(output_uri):
|
175
|
+
"""Expand shell variables of form $var and ${var}.
|
176
|
+
Unknown variables are left unchanged.
|
177
|
+
"""
|
178
|
+
try:
|
179
|
+
return os.path.expandvars(output_uri)
|
180
|
+
except Exception:
|
181
|
+
logger.warning("Failed to expand output URI with environment variables.")
|
182
|
+
logger.debug(traceback.format_exc())
|
183
|
+
# Do nothing if there is an error.
|
184
|
+
return output_uri
|
185
|
+
|
186
|
+
@staticmethod
|
187
|
+
def copy_outputs(
|
188
|
+
output_dir: str = os.environ.get("OUTPUT_DIR"),
|
189
|
+
output_uri: str = os.environ.get("OUTPUT_URI"),
|
190
|
+
) -> List[str]:
|
191
|
+
"""Copies the output files to remote URI.
|
192
|
+
|
193
|
+
No file will be copied if either output_dir or output_uri is empty or None.
|
194
|
+
|
195
|
+
Parameters
|
196
|
+
----------
|
197
|
+
output_dir : str
|
198
|
+
Path of the output directory containing files to be copied.
|
199
|
+
By default, os.environ.get("OUTPUT_DIR")
|
200
|
+
output_uri : str
|
201
|
+
URI of the object storage path to store the output files.
|
202
|
+
By default, os.environ.get("OUTPUT_URI")
|
203
|
+
|
204
|
+
Returns
|
205
|
+
-------
|
206
|
+
list
|
207
|
+
A list of URIs for files that are copied to output_uri
|
208
|
+
"""
|
209
|
+
if not output_dir:
|
210
|
+
logger.info("OUTPUT_DIR is not defined. No file is copied.")
|
211
|
+
return
|
212
|
+
output_dir = os.path.abspath(os.path.expanduser(output_dir))
|
213
|
+
if not os.path.exists(output_dir):
|
214
|
+
logger.error("Output directory %s not found.", output_dir)
|
215
|
+
return
|
216
|
+
|
217
|
+
if not output_uri:
|
218
|
+
logger.info("OUTPUT_URI is not defined. No file is copied.")
|
219
|
+
return
|
220
|
+
output_uri = OCIHelper.substitute_output_uri(output_uri)
|
221
|
+
|
222
|
+
logger.debug("Copying files in %s to %s...", output_dir, output_uri)
|
223
|
+
parsed = urlparse(output_uri)
|
224
|
+
# Only OCI object storage is supported at the moment
|
225
|
+
|
226
|
+
bucket = parsed.username
|
227
|
+
namespace = parsed.hostname
|
228
|
+
if not bucket or not namespace:
|
229
|
+
logger.error(
|
230
|
+
"Invalid bucket name or namespace in output URI: %s", output_uri
|
231
|
+
)
|
232
|
+
logger.error(
|
233
|
+
"Output URI should have the format of oci://bucket@namespace/path/to/dir"
|
234
|
+
)
|
235
|
+
return
|
236
|
+
|
237
|
+
prefix = parsed.path
|
238
|
+
return OCIHelper.copy_to_oci_object_storage(
|
239
|
+
output_dir, namespace, bucket, prefix
|
240
|
+
)
|
241
|
+
|
242
|
+
@staticmethod
|
243
|
+
def _download_with_urlopen(src, dest):
|
244
|
+
url_response = request.urlopen(src)
|
245
|
+
with contextlib.closing(url_response) as f:
|
246
|
+
logger.debug("Downloading from %s", src)
|
247
|
+
with open(dest, "wb") as out_file:
|
248
|
+
block_size = DEFAULT_BUFFER_SIZE * 8
|
249
|
+
while True:
|
250
|
+
block = f.read(block_size)
|
251
|
+
if not block:
|
252
|
+
break
|
253
|
+
out_file.write(block)
|
254
|
+
|
255
|
+
@staticmethod
|
256
|
+
def _download_with_fsspec(src, dest):
|
257
|
+
import fsspec
|
258
|
+
|
259
|
+
scheme = urlparse(src).scheme
|
260
|
+
fs = fsspec.filesystem(scheme)
|
261
|
+
fs.get(
|
262
|
+
src,
|
263
|
+
dest,
|
264
|
+
recursive=True,
|
265
|
+
callback=fsspec.callbacks.TqdmCallback(),
|
266
|
+
)
|
267
|
+
|
268
|
+
@staticmethod
|
269
|
+
def copy_inputs(mappings: dict = None):
|
270
|
+
if not mappings and CONST_ENV_INPUT_MAPPINGS in os.environ:
|
271
|
+
mappings = json.loads(os.environ[CONST_ENV_INPUT_MAPPINGS])
|
272
|
+
logger.debug("Inputs specified from ENV: %s", mappings)
|
273
|
+
|
274
|
+
if not mappings:
|
275
|
+
logger.debug("No inputs specified.")
|
276
|
+
return
|
277
|
+
|
278
|
+
for src, dest in mappings.items():
|
279
|
+
logger.debug("Copying %s to %s", src, os.path.abspath(dest))
|
280
|
+
# Create the dest dir if one does not exist.
|
281
|
+
if str(dest).endswith("/"):
|
282
|
+
dest_dir = dest
|
283
|
+
else:
|
284
|
+
dest_dir = os.path.dirname(dest)
|
285
|
+
|
286
|
+
# Do not make dirs if user is using cwd.
|
287
|
+
if dest_dir:
|
288
|
+
os.makedirs(dest_dir, exist_ok=True)
|
289
|
+
|
290
|
+
# Use native Python to download http/ftp.
|
291
|
+
scheme = urlparse(src).scheme
|
292
|
+
if scheme in ["http", "https", "ftp"]:
|
293
|
+
OCIHelper._download_with_urlopen(src, dest)
|
294
|
+
else:
|
295
|
+
OCIHelper._download_with_fsspec(src, dest)
|
296
|
+
return
|
297
|
+
|
298
|
+
|
299
|
+
class ArgumentParser:
|
300
|
+
"""Contains methods for parsing arguments for entry function."""
|
301
|
+
|
302
|
+
def __init__(self, argument_list: list) -> None:
|
303
|
+
"""Initialize the parser with a list of arguments
|
304
|
+
|
305
|
+
Parameters
|
306
|
+
----------
|
307
|
+
argument_list : list
|
308
|
+
A list of arguments.
|
309
|
+
"""
|
310
|
+
self.argument_list = argument_list
|
311
|
+
|
312
|
+
def parse(self):
|
313
|
+
"""Parses the arguments into args and kwargs.
|
314
|
+
args is a list of positional arguments.
|
315
|
+
kwargs is a dictionary of keyword arguments.
|
316
|
+
The "--" will be removed from the keywords.
|
317
|
+
|
318
|
+
Returns
|
319
|
+
-------
|
320
|
+
(list, dict)
|
321
|
+
A tuple of positional arguments (list) and keyword arguments (dict).
|
322
|
+
"""
|
323
|
+
args = []
|
324
|
+
kwargs = {}
|
325
|
+
key = None
|
326
|
+
for arg in self.argument_list:
|
327
|
+
if not isinstance(arg, str):
|
328
|
+
args.append(arg)
|
329
|
+
elif len(arg) > 2 and arg.startswith("--"):
|
330
|
+
key = arg[2:]
|
331
|
+
kwargs[key] = None
|
332
|
+
elif key:
|
333
|
+
kwargs[key] = arg
|
334
|
+
key = None
|
335
|
+
else:
|
336
|
+
args.append(arg)
|
337
|
+
|
338
|
+
return args, kwargs
|
339
|
+
|
340
|
+
|
341
|
+
class JobRunner:
|
342
|
+
def __init__(self, code_dir: str = DEFAULT_CODE_DIR) -> None:
|
343
|
+
"""Initialize the job runner
|
344
|
+
|
345
|
+
Parameters
|
346
|
+
----------
|
347
|
+
code_dir : str
|
348
|
+
The path to the directory containing the user code.
|
349
|
+
"""
|
350
|
+
logger.info("Job Run ID is: %s", os.environ.get(CONST_ENV_JOB_RUN_OCID))
|
351
|
+
self.code_dir = code_dir
|
352
|
+
self.conda_prefix = sys.executable.split("/bin/python", 1)[0]
|
353
|
+
|
354
|
+
@staticmethod
|
355
|
+
def run_command(
|
356
|
+
command: str, conda_prefix: str = None, level: Optional[int] = None, check=False
|
357
|
+
) -> int:
|
358
|
+
"""Runs a shell command and logs the outputs with specific log level.
|
359
|
+
|
360
|
+
Parameters
|
361
|
+
----------
|
362
|
+
command : str
|
363
|
+
The shell command
|
364
|
+
conda_prefix : str, optional
|
365
|
+
Prefix of the conda environment for running the command.
|
366
|
+
Defaults to None.
|
367
|
+
level : int, optional
|
368
|
+
Logging level for the command outputs, by default None.
|
369
|
+
If this is set to a log level from logging, e.g. logging.DEBUG,
|
370
|
+
the command outputs will be logged with the level.
|
371
|
+
If this is None, the command outputs will be printed.
|
372
|
+
|
373
|
+
Returns
|
374
|
+
-------
|
375
|
+
int
|
376
|
+
The return code of the command.
|
377
|
+
"""
|
378
|
+
# Add a small time delay so the existing outputs will not intersect with the command outputs.
|
379
|
+
time.sleep(0.05)
|
380
|
+
logger.info(">>> %s", command)
|
381
|
+
if conda_prefix:
|
382
|
+
# Conda activate
|
383
|
+
# https://docs.conda.io/projects/conda/en/latest/release-notes.html#id241
|
384
|
+
cmd = (
|
385
|
+
"CONDA_BASE=$(conda info --base) && "
|
386
|
+
+ "source $CONDA_BASE/etc/profile.d/conda.sh && "
|
387
|
+
+ f"conda activate {conda_prefix}; "
|
388
|
+
+ command
|
389
|
+
)
|
390
|
+
else:
|
391
|
+
cmd = command
|
392
|
+
process = subprocess.Popen(
|
393
|
+
cmd,
|
394
|
+
stdout=subprocess.PIPE,
|
395
|
+
stderr=subprocess.STDOUT,
|
396
|
+
env=os.environ.copy(),
|
397
|
+
shell=True,
|
398
|
+
)
|
399
|
+
# Stream the outputs
|
400
|
+
logger.debug("Streaming command output from subprocess %s", process.pid)
|
401
|
+
while True:
|
402
|
+
output = process.stdout.readline()
|
403
|
+
if process.poll() is not None and output == b"":
|
404
|
+
break
|
405
|
+
if output:
|
406
|
+
msg = output.decode()
|
407
|
+
if level is None:
|
408
|
+
# output already contains the line break
|
409
|
+
print(msg, flush=True, end="")
|
410
|
+
else:
|
411
|
+
# logging will flush outputs by default
|
412
|
+
# logging will add line break
|
413
|
+
msg = msg.rstrip("\n")
|
414
|
+
logger.log(level=level, msg=msg)
|
415
|
+
if "pdsh@" in msg and "ssh exited with exit code 1" in msg:
|
416
|
+
print("DeepSpeed Failed.")
|
417
|
+
sys.exit(1)
|
418
|
+
# Add a small delay so that
|
419
|
+
# outputs from the subsequent code will have different timestamp for oci logging
|
420
|
+
time.sleep(0.02)
|
421
|
+
logger.debug(
|
422
|
+
"subprocess %s returned exit code %s", process.pid, process.returncode
|
423
|
+
)
|
424
|
+
if check and process.returncode != 0:
|
425
|
+
# If there is an error, exit the main process with the same return code.
|
426
|
+
sys.exit(process.returncode)
|
427
|
+
return process.returncode
|
428
|
+
|
429
|
+
def conda_unpack(self):
|
430
|
+
if self.run_command("conda-unpack", level=logging.DEBUG):
|
431
|
+
logger.info("conda-unpack exits with non-zero return code.")
|
432
|
+
return self
|
433
|
+
|
434
|
+
def install_pip_requirements(self, req_path: str = None):
|
435
|
+
if not req_path:
|
436
|
+
req_path = os.environ.get(CONST_ENV_PIP_REQ)
|
437
|
+
if not req_path:
|
438
|
+
return self
|
439
|
+
self.run_command(
|
440
|
+
f"pip install -r {req_path}", conda_prefix=self.conda_prefix, check=True
|
441
|
+
)
|
442
|
+
return self
|
443
|
+
|
444
|
+
def install_pip_packages(self, packages: str = None):
|
445
|
+
if not packages:
|
446
|
+
packages = os.environ.get(CONST_ENV_PIP_PKG)
|
447
|
+
if not packages:
|
448
|
+
return self
|
449
|
+
# The package requirement may contain special character like '>'.
|
450
|
+
# Here we wrap each package requirement with single quote to make sure they can be installed correctly
|
451
|
+
package_list = shlex.split(packages)
|
452
|
+
packages = " ".join([f"'{package}'" for package in package_list])
|
453
|
+
self.run_command(
|
454
|
+
f"pip install {packages}", conda_prefix=self.conda_prefix, check=True
|
455
|
+
)
|
456
|
+
return self
|
457
|
+
|
458
|
+
def install_dependencies(self):
|
459
|
+
return self.install_pip_requirements().install_pip_packages()
|
460
|
+
|
461
|
+
def set_working_dir(self, working_dir: str = os.environ.get(CONST_ENV_WORKING_DIR)):
|
462
|
+
"""Sets the working directory for the job run.
|
463
|
+
|
464
|
+
Parameters
|
465
|
+
----------
|
466
|
+
working_dir : str, optional
|
467
|
+
Working directory, by default os.environ.get("WORKING_DIR")
|
468
|
+
If working_dir is not set, the working dir will be set to the code dir.
|
469
|
+
If working_dir is a relative path, it will be joined with the code dir.
|
470
|
+
|
471
|
+
"""
|
472
|
+
if working_dir:
|
473
|
+
working_dir = os.path.join(self.code_dir, working_dir)
|
474
|
+
else:
|
475
|
+
working_dir = self.code_dir
|
476
|
+
os.chdir(working_dir)
|
477
|
+
logger.debug("Working directory set to %s", working_dir)
|
478
|
+
# Add working dir to sys.path
|
479
|
+
if working_dir not in sys.path:
|
480
|
+
sys.path.append(working_dir)
|
481
|
+
logger.debug("Added %s to sys.path", working_dir)
|
482
|
+
return self
|
483
|
+
|
484
|
+
def setup_python_path(
|
485
|
+
self, python_path: str = os.environ.get(CONST_ENV_PYTHON_PATH, "")
|
486
|
+
):
|
487
|
+
"""Adds additional python paths.
|
488
|
+
Relative paths are expanded based on the current working directory.
|
489
|
+
This method should be called after setting the working directory (if needed).
|
490
|
+
|
491
|
+
Parameters
|
492
|
+
----------
|
493
|
+
python_path : str
|
494
|
+
Additional python paths to be added to sys.path,
|
495
|
+
by default, os.environ.get("PYTHON_PATH", "")
|
496
|
+
Multiple paths can be separated by os.pathsep, which is colon(:) for Linux and Mac.
|
497
|
+
|
498
|
+
"""
|
499
|
+
if not python_path:
|
500
|
+
return self
|
501
|
+
path_list = python_path.split(os.pathsep)
|
502
|
+
path_list.append(self.code_dir)
|
503
|
+
for path in path_list:
|
504
|
+
abs_path = os.path.abspath(os.path.expanduser(path))
|
505
|
+
if abs_path not in sys.path:
|
506
|
+
sys.path.append(abs_path)
|
507
|
+
logger.debug("Added %s to sys.path", abs_path)
|
508
|
+
logger.debug("Python Path: %s", sys.path)
|
509
|
+
return self
|
510
|
+
|
511
|
+
def _run_function(self, module_path: str, entry_function: str, argv: list):
|
512
|
+
"""Runs the entry function in module specified by module path.
|
513
|
+
|
514
|
+
Parameters
|
515
|
+
----------
|
516
|
+
module_path : str
|
517
|
+
The path to the module containing the entry function.
|
518
|
+
entry_function : str
|
519
|
+
The name of the entry function.
|
520
|
+
argv : list
|
521
|
+
Argument list from command line.
|
522
|
+
This list will be parsed into positional arguments and keyword arguments.
|
523
|
+
"""
|
524
|
+
spec = importlib.util.spec_from_file_location("module", module_path)
|
525
|
+
module = importlib.util.module_from_spec(spec)
|
526
|
+
spec.loader.exec_module(module)
|
527
|
+
method = getattr(module, entry_function)
|
528
|
+
|
529
|
+
args, kwargs = ArgumentParser(argv).parse()
|
530
|
+
|
531
|
+
logger.debug(
|
532
|
+
"Invoking method: %s with args: %s, kwargs: %s",
|
533
|
+
entry_function,
|
534
|
+
args,
|
535
|
+
kwargs,
|
536
|
+
)
|
537
|
+
method(*args, **kwargs)
|
538
|
+
|
539
|
+
def _run_script(self, entrypoint: str):
|
540
|
+
if (
|
541
|
+
os.path.isdir(entrypoint)
|
542
|
+
or entrypoint.endswith(".py")
|
543
|
+
or entrypoint.endswith(".zip")
|
544
|
+
):
|
545
|
+
logger.info("Running script: %s", entrypoint)
|
546
|
+
# The file path may refer directly to a Python script
|
547
|
+
# or else it may refer to a zipfile or directory containing a top level __main__.py script.
|
548
|
+
# See https://docs.python.org/3/library/runpy.html#runpy.run_path
|
549
|
+
# Arguments from sys.argv will be passed into the script
|
550
|
+
runpy.run_path(entrypoint, run_name="__main__")
|
551
|
+
else:
|
552
|
+
if os.path.exists(entrypoint):
|
553
|
+
# User should make the file executable before committing it to Git
|
554
|
+
# e.g. git update-index --chmod=+x my_script.sh
|
555
|
+
# Here we make the entrypoint executable just in case
|
556
|
+
try:
|
557
|
+
st = os.stat(entrypoint)
|
558
|
+
os.chmod(entrypoint, st.st_mode | stat.S_IEXEC)
|
559
|
+
except Exception:
|
560
|
+
# Ignore any error here and continue to try to run the script.
|
561
|
+
# Show the exception for debugging
|
562
|
+
logger.debug(traceback.format_exc())
|
563
|
+
# Run the entrypoint as shell command with conda activated
|
564
|
+
cmd = shlex.join([entrypoint] + sys.argv[1:])
|
565
|
+
return_code = self.run_command(cmd, conda_prefix=self.conda_prefix)
|
566
|
+
# Exit the job run with the same return code if it is non-zero.
|
567
|
+
if return_code:
|
568
|
+
logger.error("CMD exited with return code %s.", return_code)
|
569
|
+
sys.exit(return_code)
|
570
|
+
|
571
|
+
def run(
|
572
|
+
self,
|
573
|
+
entrypoint: str = os.environ.get(CONST_ENV_ENTRYPOINT),
|
574
|
+
entry_function: str = os.environ.get(CONST_ENV_ENTRY_FUNC),
|
575
|
+
):
|
576
|
+
"""Runs the user code
|
577
|
+
|
578
|
+
Parameters
|
579
|
+
----------
|
580
|
+
entrypoint : str
|
581
|
+
Path to the file serve as the entrypoint,
|
582
|
+
by default, os.environ.get("CODE_ENTRYPOINT")
|
583
|
+
|
584
|
+
entry_function : str, optional
|
585
|
+
Name of the function in the entrypoint,
|
586
|
+
by default, os.environ.get("ENTRY_FUNCTION").
|
587
|
+
If this is not set, the entrypoint will be run as a python script.
|
588
|
+
|
589
|
+
"""
|
590
|
+
if not entrypoint:
|
591
|
+
raise ValueError(f"Invalid entrypoint: {str(entrypoint)}")
|
592
|
+
entrypoint_abs_path = os.path.abspath(os.path.expanduser(entrypoint))
|
593
|
+
if not os.path.exists(entrypoint_abs_path):
|
594
|
+
raise ValueError(f"Entrypoint {entrypoint_abs_path} not found.")
|
595
|
+
|
596
|
+
if entry_function:
|
597
|
+
logger.info("Running function: %s in %s", entry_function, entrypoint)
|
598
|
+
self._run_function(entrypoint, entry_function, sys.argv[1:])
|
599
|
+
elif entrypoint.endswith(".ipynb"):
|
600
|
+
from driver_notebook import run_notebook
|
601
|
+
|
602
|
+
logger.info("Running notebook: %s", entrypoint)
|
603
|
+
# Exclude tags
|
604
|
+
tags = os.environ.get("NOTEBOOK_EXCLUDE_TAGS")
|
605
|
+
if tags:
|
606
|
+
tags = json.loads(tags)
|
607
|
+
logger.info("Excluding cells with any of the following tags: %s", tags)
|
608
|
+
# Pass in the absolute path to make sure the working dir is notebook directory
|
609
|
+
run_notebook(
|
610
|
+
os.path.abspath(os.path.expanduser(entrypoint)), exclude_tags=tags
|
611
|
+
)
|
612
|
+
else:
|
613
|
+
self._run_script(entrypoint_abs_path)
|
614
|
+
logger.info("Job run completed.")
|
615
|
+
return self
|
@@ -0,0 +1,55 @@
|
|
1
|
+
// -*- coding: utf-8; -*-
|
2
|
+
|
3
|
+
// Copyright (c) 2023 Oracle and/or its affiliates.
|
4
|
+
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.
|
5
|
+
|
6
|
+
// Compile the file and save it into the lib directory:
|
7
|
+
// $ gcc -fPIC -shared -Wl,-soname,libhostname.so.1 -ldl -o ${CONDA_PREFIX}/lib/libhostname.so.1 hostname_from_env.c
|
8
|
+
// Run the script with two environment variables:
|
9
|
+
// $ LD_PRELOAD=${CONDA_PREFIX}/lib/libhostname.so.1 OCI__HOSTNAME=<> python script.py
|
10
|
+
#define _GNU_SOURCE
|
11
|
+
#include <dlfcn.h>
|
12
|
+
#include <netdb.h>
|
13
|
+
#include <string.h>
|
14
|
+
#include <stdlib.h>
|
15
|
+
|
16
|
+
/** @brief Returns a hostname specified as the value of environment variable.
|
17
|
+
*
|
18
|
+
* The parameters are the same as the original gethostname function.
|
19
|
+
* See: https://www.gnu.org/software/libc/manual/html_node/Host-Identification.html#index-gethostname
|
20
|
+
*
|
21
|
+
* @param name The hostname to be returned. This will contain the value from environment variable OCI__HOSTNAME
|
22
|
+
* @param size The length of the string s.
|
23
|
+
* @return The return value is 0 on success and -1 if the environment variable is not set.
|
24
|
+
*/
|
25
|
+
int gethostname(char *name, size_t size)
|
26
|
+
{
|
27
|
+
if (getenv("OCI__HOSTNAME"))
|
28
|
+
{
|
29
|
+
strncpy(name, getenv("OCI__HOSTNAME"), size);
|
30
|
+
return 0;
|
31
|
+
}
|
32
|
+
return -1;
|
33
|
+
}
|
34
|
+
|
35
|
+
/** @brief A wrapper of gethostbyaddr_r, to return the hostname based on the environment variable.
|
36
|
+
*
|
37
|
+
* The parameters are the same as the original gethostbyaddr_r function.
|
38
|
+
* See: https://www.gnu.org/software/libc/manual/html_node/Host-Names.html#index-gethostbyaddr_005fr
|
39
|
+
*
|
40
|
+
* When addr is the same as the value of environment variable OCI__HOSTNAME,
|
41
|
+
* The returned value ret->h_name will have the same value as environment variable OCI__HOSTNAME.
|
42
|
+
*/
|
43
|
+
int gethostbyaddr_r(const void *addr, socklen_t len, int type,
|
44
|
+
struct hostent *ret, char *buf, size_t buflen,
|
45
|
+
struct hostent **result, int *h_errnop)
|
46
|
+
{
|
47
|
+
int (*originalFunc)(const void *, socklen_t, int, struct hostent *, char *, size_t, struct hostent **, int *) = dlsym(RTLD_NEXT, "gethostbyaddr_r");
|
48
|
+
int originalReturn = originalFunc(addr, len, type, ret, buf, buflen, result, h_errnop);
|
49
|
+
|
50
|
+
if (strcmp(getenv("OCI__HOSTNAME"), (char *)addr))
|
51
|
+
{
|
52
|
+
ret->h_name = getenv("OCI__HOSTNAME");
|
53
|
+
}
|
54
|
+
return originalReturn;
|
55
|
+
}
|