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,74 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
|
3
|
+
# Copyright (c) 2024, 2025 Oracle and/or its affiliates.
|
4
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
5
|
+
|
6
|
+
import json
|
7
|
+
from dataclasses import dataclass, field
|
8
|
+
|
9
|
+
import requests
|
10
|
+
|
11
|
+
from ads.aqua.app import AquaApp
|
12
|
+
from ads.aqua.modeldeployment.entities import ModelParams
|
13
|
+
from ads.common.auth import default_signer
|
14
|
+
from ads.telemetry import telemetry
|
15
|
+
|
16
|
+
|
17
|
+
@dataclass
|
18
|
+
class MDInferenceResponse(AquaApp):
|
19
|
+
"""Contains APIs for Aqua Model deployments Inference.
|
20
|
+
|
21
|
+
Attributes
|
22
|
+
----------
|
23
|
+
|
24
|
+
model_params: Dict
|
25
|
+
prompt: string
|
26
|
+
|
27
|
+
Methods
|
28
|
+
-------
|
29
|
+
get_model_deployment_response(self, **kwargs) -> "String"
|
30
|
+
Creates an instance of model deployment via Aqua
|
31
|
+
"""
|
32
|
+
|
33
|
+
prompt: str = None
|
34
|
+
model_params: field(default_factory=ModelParams) = None
|
35
|
+
|
36
|
+
@telemetry(entry_point="plugin=inference&action=get_response", name="aqua")
|
37
|
+
def get_model_deployment_response(self, endpoint):
|
38
|
+
"""
|
39
|
+
Returns MD inference response
|
40
|
+
|
41
|
+
Parameters
|
42
|
+
----------
|
43
|
+
endpoint: str
|
44
|
+
MD predict url
|
45
|
+
prompt: str
|
46
|
+
User prompt.
|
47
|
+
|
48
|
+
model_params: (Dict, optional)
|
49
|
+
Model parameters to be associated with the message.
|
50
|
+
Currently supported VLLM+OpenAI parameters.
|
51
|
+
|
52
|
+
--model-params '{
|
53
|
+
"max_tokens":500,
|
54
|
+
"temperature": 0.5,
|
55
|
+
"top_k": 10,
|
56
|
+
"top_p": 0.5,
|
57
|
+
"model": "/opt/ds/model/deployed_model",
|
58
|
+
...}'
|
59
|
+
|
60
|
+
Returns
|
61
|
+
-------
|
62
|
+
model_response_content
|
63
|
+
"""
|
64
|
+
|
65
|
+
params_dict = self.model_params.to_dict()
|
66
|
+
params_dict = {
|
67
|
+
key: value for key, value in params_dict.items() if value is not None
|
68
|
+
}
|
69
|
+
body = {"prompt": self.prompt, **params_dict}
|
70
|
+
request_kwargs = {"json": body, "headers": {"Content-Type": "application/json"}}
|
71
|
+
response = requests.post(
|
72
|
+
endpoint, auth=default_signer()["signer"], **request_kwargs
|
73
|
+
)
|
74
|
+
return json.loads(response.content)
|
@@ -0,0 +1,543 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
# Copyright (c) 2025 Oracle and/or its affiliates.
|
3
|
+
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
|
4
|
+
"""AQUA model deployment utils"""
|
5
|
+
|
6
|
+
import copy
|
7
|
+
import itertools
|
8
|
+
import logging
|
9
|
+
import math
|
10
|
+
from concurrent.futures import ThreadPoolExecutor
|
11
|
+
from typing import Dict, List, Optional
|
12
|
+
|
13
|
+
from ads.aqua.app import AquaApp
|
14
|
+
from ads.aqua.common.entities import ComputeShapeSummary, ModelConfigResult
|
15
|
+
from ads.aqua.model.constants import AquaModelMetadataKeys
|
16
|
+
from ads.aqua.modeldeployment.entities import (
|
17
|
+
AquaDeploymentConfig,
|
18
|
+
ConfigurationItem,
|
19
|
+
GPUModelAllocation,
|
20
|
+
GPUShapeAllocation,
|
21
|
+
ModelDeploymentConfigSummary,
|
22
|
+
MultiModelConfig,
|
23
|
+
)
|
24
|
+
from ads.config import AQUA_MODEL_DEPLOYMENT_CONFIG
|
25
|
+
|
26
|
+
logger = logging.getLogger("ads.aqua")
|
27
|
+
|
28
|
+
|
29
|
+
class MultiModelDeploymentConfigLoader:
|
30
|
+
"""
|
31
|
+
Processes multiple model deployment configurations to determine compatible GPU shapes
|
32
|
+
and calculate optimal GPU allocations.
|
33
|
+
"""
|
34
|
+
|
35
|
+
MAX_WORKERS = 10 # Number of workers for asynchronous models detail loading
|
36
|
+
|
37
|
+
def __init__(self, deployment_app: AquaApp):
|
38
|
+
"""
|
39
|
+
Initializes the processor with a reference to the `AquaDeploymentApp` to fetch model configurations.
|
40
|
+
|
41
|
+
Parameters
|
42
|
+
----------
|
43
|
+
deployment_app : AquaDeploymentApp
|
44
|
+
An instance of AquaDeploymentApp used to fetch model deployment configurations.
|
45
|
+
"""
|
46
|
+
self.deployment_app = deployment_app
|
47
|
+
|
48
|
+
def load(
|
49
|
+
self,
|
50
|
+
shapes: List[ComputeShapeSummary],
|
51
|
+
model_ids: List[str],
|
52
|
+
primary_model_id: Optional[str] = None,
|
53
|
+
) -> ModelDeploymentConfigSummary:
|
54
|
+
"""
|
55
|
+
Retrieves deployment configurations for multiple/single model and calculates compatible GPU allocations.
|
56
|
+
|
57
|
+
Parameters
|
58
|
+
----------
|
59
|
+
shapes : List[ComputeShapeSummary]
|
60
|
+
Model deployment available shapes.
|
61
|
+
model_ids : List[str]
|
62
|
+
A list of OCIDs for the Aqua models.
|
63
|
+
primary_model_id : Optional[str], optional
|
64
|
+
The OCID of the primary Aqua model. If provided, GPU allocation prioritizes this model.
|
65
|
+
Otherwise, GPUs are evenly allocated.
|
66
|
+
|
67
|
+
Returns
|
68
|
+
-------
|
69
|
+
ModelDeploymentConfigSummary
|
70
|
+
A summary of the deployment configurations and GPU allocations. If GPU allocation
|
71
|
+
cannot be determined, an appropriate error message is included in the summary.
|
72
|
+
"""
|
73
|
+
return self._load_multi_model_deployment_configuration(
|
74
|
+
shapes=shapes, model_ids=model_ids, primary_model_id=primary_model_id
|
75
|
+
)
|
76
|
+
|
77
|
+
def _load_multi_model_deployment_configuration(
|
78
|
+
self,
|
79
|
+
shapes: List[ComputeShapeSummary],
|
80
|
+
model_ids: List[str],
|
81
|
+
primary_model_id: Optional[str] = None,
|
82
|
+
) -> ModelDeploymentConfigSummary:
|
83
|
+
"""
|
84
|
+
Retrieves deployment configurations for multiple models and calculates compatible GPU allocations.
|
85
|
+
|
86
|
+
Parameters
|
87
|
+
----------
|
88
|
+
shapes : List[ComputeShapeSummary]
|
89
|
+
Model deployment available shapes.
|
90
|
+
model_ids : List[str]
|
91
|
+
A list of OCIDs for the Aqua models.
|
92
|
+
primary_model_id : Optional[str], optional
|
93
|
+
The OCID of the primary Aqua model. If provided, GPU allocation prioritizes this model.
|
94
|
+
Otherwise, GPUs are evenly allocated.
|
95
|
+
|
96
|
+
Returns
|
97
|
+
-------
|
98
|
+
ModelDeploymentConfigSummary
|
99
|
+
A summary of the deployment configurations and GPU allocations. If GPU allocation
|
100
|
+
cannot be determined, an appropriate error message is included in the summary.
|
101
|
+
"""
|
102
|
+
model_shape_gpu, available_shapes, summary = self._fetch_model_shape_gpu(
|
103
|
+
shapes=shapes, model_ids=model_ids
|
104
|
+
)
|
105
|
+
|
106
|
+
# Identify common deployment shapes among all models.
|
107
|
+
common_shapes, empty_configs = self._get_common_shapes(model_shape_gpu)
|
108
|
+
logger.debug(f"Common Shapes: {common_shapes} from: {model_shape_gpu}")
|
109
|
+
|
110
|
+
# If all models' shape configs are empty, use default deployment shapes instead
|
111
|
+
common_shapes = (
|
112
|
+
available_shapes
|
113
|
+
if empty_configs
|
114
|
+
else [
|
115
|
+
shape_name
|
116
|
+
for shape_name in common_shapes
|
117
|
+
if shape_name.upper() in available_shapes
|
118
|
+
]
|
119
|
+
)
|
120
|
+
logger.debug(f"Available Common Shapes: {common_shapes}")
|
121
|
+
|
122
|
+
if not common_shapes:
|
123
|
+
summary.error_message = (
|
124
|
+
"The selected models do not share any available common deployment shapes. "
|
125
|
+
"Please ensure that all chosen models are compatible for multi-model deployment."
|
126
|
+
)
|
127
|
+
logger.debug(
|
128
|
+
f"No common deployment shapes found among selected models: {model_ids}"
|
129
|
+
)
|
130
|
+
return summary
|
131
|
+
|
132
|
+
# Compute GPU allocations based on the common shapes and optionally prioritize a primary model.
|
133
|
+
gpu_allocation = self._compute_gpu_allocation(
|
134
|
+
shapes=shapes,
|
135
|
+
common_shapes=common_shapes,
|
136
|
+
model_shape_gpu=model_shape_gpu,
|
137
|
+
primary_model_id=primary_model_id,
|
138
|
+
)
|
139
|
+
|
140
|
+
logger.debug(f"GPU Allocation: {gpu_allocation}")
|
141
|
+
|
142
|
+
if not gpu_allocation:
|
143
|
+
summary.error_message = (
|
144
|
+
"The selected models do not have a valid GPU allocation based on their current configurations. "
|
145
|
+
"Please select a different model group. If you are deploying custom models that lack AQUA service configuration, "
|
146
|
+
"refer to the deployment guidelines here: "
|
147
|
+
"https://github.com/oracle-samples/oci-data-science-ai-samples/blob/main/ai-quick-actions/multimodel-deployment-tips.md#custom_models"
|
148
|
+
)
|
149
|
+
|
150
|
+
logger.debug(
|
151
|
+
f"GPU allocation computation failed for selected models: {model_ids}"
|
152
|
+
)
|
153
|
+
|
154
|
+
return summary
|
155
|
+
|
156
|
+
summary.gpu_allocation = gpu_allocation
|
157
|
+
return summary
|
158
|
+
|
159
|
+
def _fetch_model_shape_gpu(
|
160
|
+
self, shapes: List[ComputeShapeSummary], model_ids: List[str]
|
161
|
+
):
|
162
|
+
"""Fetches dict of model shape and gpu, list of available shapes and builds `ModelDeploymentConfigSummary` instance."""
|
163
|
+
# Fetch deployment configurations concurrently.
|
164
|
+
logger.debug(f"Loading model deployment configuration for models: {model_ids}")
|
165
|
+
deployment_configs = self._fetch_deployment_configs_concurrently(model_ids)
|
166
|
+
|
167
|
+
logger.debug(f"Loaded config: {deployment_configs}")
|
168
|
+
model_shape_gpu, deployment = self._extract_model_shape_gpu(
|
169
|
+
deployment_configs=deployment_configs, shapes=shapes
|
170
|
+
)
|
171
|
+
|
172
|
+
# Initialize the summary result with the deployment configurations.
|
173
|
+
summary = ModelDeploymentConfigSummary(deployment_config=deployment)
|
174
|
+
|
175
|
+
# Filter out not available shapes
|
176
|
+
available_shapes = [item.name.upper() for item in shapes]
|
177
|
+
logger.debug(f"Service Available Shapes: {available_shapes}")
|
178
|
+
|
179
|
+
return model_shape_gpu, available_shapes, summary
|
180
|
+
|
181
|
+
def _fetch_deployment_configs_concurrently(
|
182
|
+
self, model_ids: List[str]
|
183
|
+
) -> Dict[str, AquaDeploymentConfig]:
|
184
|
+
"""Fetches deployment configurations in parallel using ThreadPoolExecutor."""
|
185
|
+
with ThreadPoolExecutor(max_workers=self.MAX_WORKERS) as executor:
|
186
|
+
results = executor.map(
|
187
|
+
self._fetch_deployment_config_from_metadata_and_oss,
|
188
|
+
model_ids,
|
189
|
+
)
|
190
|
+
|
191
|
+
return {
|
192
|
+
model_id: AquaDeploymentConfig(**config.config)
|
193
|
+
for model_id, config in zip(model_ids, results)
|
194
|
+
}
|
195
|
+
|
196
|
+
def _fetch_deployment_config_from_metadata_and_oss(
|
197
|
+
self, model_id
|
198
|
+
) -> ModelConfigResult:
|
199
|
+
config = self.deployment_app.get_config_from_metadata(
|
200
|
+
model_id, AquaModelMetadataKeys.DEPLOYMENT_CONFIGURATION
|
201
|
+
)
|
202
|
+
if config:
|
203
|
+
logger.info(
|
204
|
+
f"Fetched metadata key '{AquaModelMetadataKeys.DEPLOYMENT_CONFIGURATION}' from defined metadata for model '{model_id}'"
|
205
|
+
)
|
206
|
+
return config
|
207
|
+
else:
|
208
|
+
logger.info(
|
209
|
+
f"Fetching '{AquaModelMetadataKeys.DEPLOYMENT_CONFIGURATION}' from object storage bucket for {model_id}'"
|
210
|
+
)
|
211
|
+
return self.deployment_app.get_config(
|
212
|
+
model_id, AQUA_MODEL_DEPLOYMENT_CONFIG
|
213
|
+
)
|
214
|
+
|
215
|
+
def _extract_model_shape_gpu(
|
216
|
+
self,
|
217
|
+
deployment_configs: Dict[str, AquaDeploymentConfig],
|
218
|
+
shapes: List[ComputeShapeSummary],
|
219
|
+
):
|
220
|
+
"""Extracts shape and GPU count details from deployment configurations.
|
221
|
+
Supported shapes for multi model deployment will be collected from `configuration` entry in deployment config.
|
222
|
+
Supported shapes for single model deployment will be collected from `shape` entry in deployment config.
|
223
|
+
"""
|
224
|
+
model_shape_gpu = {}
|
225
|
+
deployment = {}
|
226
|
+
is_single_model = len(deployment_configs) == 1
|
227
|
+
|
228
|
+
for model_id, config in deployment_configs.items():
|
229
|
+
# For multi model deployment, we cannot rely on .shape because some models, like Falcon-7B, can only be deployed on a single GPU card (A10.1).
|
230
|
+
# However, Falcon can also be deployed on a single card in other A10 shapes, such as A10.2.
|
231
|
+
# Our current configuration does not support this flexibility.
|
232
|
+
# For single model deployment, we use `config.shape` to find the available shapes.
|
233
|
+
multi_deployment_shape = (
|
234
|
+
list(set(config.configuration.keys()).union(set(config.shape or [])))
|
235
|
+
if is_single_model
|
236
|
+
else list(config.configuration.keys())
|
237
|
+
)
|
238
|
+
|
239
|
+
shape_total_gpus_available_map = {
|
240
|
+
deployment_shape.name.upper(): deployment_shape.gpu_specs.gpu_count
|
241
|
+
or None
|
242
|
+
for deployment_shape in shapes
|
243
|
+
if deployment_shape and deployment_shape.gpu_specs
|
244
|
+
}
|
245
|
+
|
246
|
+
model_shape_gpu[model_id] = {
|
247
|
+
shape.upper(): [
|
248
|
+
item.gpu_count
|
249
|
+
for item in config.configuration.get(
|
250
|
+
shape,
|
251
|
+
ConfigurationItem(
|
252
|
+
multi_model_deployment=(
|
253
|
+
[
|
254
|
+
MultiModelConfig(
|
255
|
+
gpu_count=shape_total_gpus_available_map.get(
|
256
|
+
shape.upper()
|
257
|
+
)
|
258
|
+
)
|
259
|
+
]
|
260
|
+
if is_single_model
|
261
|
+
else []
|
262
|
+
)
|
263
|
+
),
|
264
|
+
).multi_model_deployment
|
265
|
+
]
|
266
|
+
for shape in multi_deployment_shape
|
267
|
+
}
|
268
|
+
|
269
|
+
# For single-model deployments: if the shape is listed in the `shapes` section of the config,
|
270
|
+
# we include the maximum available GPU count for that shape in the allocation consideration.
|
271
|
+
if is_single_model:
|
272
|
+
for shape in model_shape_gpu[model_id]:
|
273
|
+
shape_total_gpu_count = shape_total_gpus_available_map.get(
|
274
|
+
shape.upper()
|
275
|
+
)
|
276
|
+
if (
|
277
|
+
shape in config.shape
|
278
|
+
and shape_total_gpu_count
|
279
|
+
and shape_total_gpu_count
|
280
|
+
not in model_shape_gpu[model_id][shape]
|
281
|
+
):
|
282
|
+
model_shape_gpu[model_id][shape].append(shape_total_gpu_count)
|
283
|
+
|
284
|
+
deployment[model_id] = {
|
285
|
+
"shape": [shape.upper() for shape in config.shape],
|
286
|
+
"configuration": {
|
287
|
+
shape.upper(): config.configuration.get(shape, ConfigurationItem())
|
288
|
+
for shape in multi_deployment_shape
|
289
|
+
},
|
290
|
+
}
|
291
|
+
|
292
|
+
return model_shape_gpu, deployment
|
293
|
+
|
294
|
+
def _get_common_shapes(
|
295
|
+
self, model_shape_gpu: Dict[str, Dict[str, List[int]]]
|
296
|
+
) -> tuple:
|
297
|
+
"""Finds common shapes across all models."""
|
298
|
+
common_shapes_set = []
|
299
|
+
empty_configs = True
|
300
|
+
for shapes in model_shape_gpu.values():
|
301
|
+
if shapes:
|
302
|
+
common_shapes_set.append(set(shapes.keys()))
|
303
|
+
empty_configs = False
|
304
|
+
if not common_shapes_set:
|
305
|
+
return [], empty_configs
|
306
|
+
return list(set.intersection(*(common_shapes_set))), empty_configs
|
307
|
+
|
308
|
+
def _compute_gpu_allocation(
|
309
|
+
self,
|
310
|
+
shapes: List[ComputeShapeSummary],
|
311
|
+
common_shapes: List[str],
|
312
|
+
model_shape_gpu: Dict[str, Dict[str, List[int]]],
|
313
|
+
primary_model_id: Optional[str],
|
314
|
+
) -> Dict[str, GPUShapeAllocation]:
|
315
|
+
"""Computes GPU allocation for common shapes."""
|
316
|
+
|
317
|
+
gpu_allocation = {}
|
318
|
+
|
319
|
+
for common_shape in common_shapes:
|
320
|
+
total_gpus_available = 0
|
321
|
+
|
322
|
+
# search the shape in the available shapes list
|
323
|
+
shape_summary = next(
|
324
|
+
(shape for shape in shapes if shape.name.upper() == common_shape),
|
325
|
+
None,
|
326
|
+
)
|
327
|
+
if shape_summary and shape_summary.gpu_specs:
|
328
|
+
total_gpus_available = shape_summary.gpu_specs.gpu_count
|
329
|
+
|
330
|
+
# generate a list of possible gpu count from `total_gpus_available` for custom models
|
331
|
+
# without multi model deployment config
|
332
|
+
# model_gpu = {
|
333
|
+
# model: (
|
334
|
+
# shape_gpu[common_shape]
|
335
|
+
# if shape_gpu.get(common_shape, UNKNOWN)
|
336
|
+
# else self._generate_gpu_list(total_gpus_available)
|
337
|
+
# )
|
338
|
+
# for model, shape_gpu in model_shape_gpu.items()
|
339
|
+
# }
|
340
|
+
|
341
|
+
model_gpu = {
|
342
|
+
model: (shape_gpu.get(common_shape, []) or [])
|
343
|
+
for model, shape_gpu in model_shape_gpu.items()
|
344
|
+
}
|
345
|
+
|
346
|
+
is_compatible, combination = self._verify_compatibility(
|
347
|
+
total_gpus_available=total_gpus_available,
|
348
|
+
model_gpu_dict=model_gpu,
|
349
|
+
primary_model_id=primary_model_id,
|
350
|
+
)
|
351
|
+
|
352
|
+
if is_compatible:
|
353
|
+
gpu_allocation[common_shape] = GPUShapeAllocation(
|
354
|
+
models=combination, total_gpus_available=total_gpus_available
|
355
|
+
)
|
356
|
+
|
357
|
+
return gpu_allocation
|
358
|
+
|
359
|
+
@staticmethod
|
360
|
+
def _generate_gpu_list(total_gpus_available: int) -> list[int]:
|
361
|
+
"""Generates a list of powers of 2 that's smaller than or equal to `total_gpus_available`.
|
362
|
+
|
363
|
+
Example
|
364
|
+
-------
|
365
|
+
input: 8
|
366
|
+
output: [1,2,4,8]
|
367
|
+
|
368
|
+
Parameters
|
369
|
+
----------
|
370
|
+
total_gpus_available : int
|
371
|
+
Total GPU available
|
372
|
+
|
373
|
+
Returns
|
374
|
+
-------
|
375
|
+
list
|
376
|
+
A list of powers of 2.
|
377
|
+
"""
|
378
|
+
if total_gpus_available < 1:
|
379
|
+
return []
|
380
|
+
return [2**i for i in range(int(math.log2(total_gpus_available)) + 1)]
|
381
|
+
|
382
|
+
def _verify_compatibility(
|
383
|
+
self,
|
384
|
+
total_gpus_available: int,
|
385
|
+
model_gpu_dict: Dict,
|
386
|
+
primary_model_id: str = None,
|
387
|
+
) -> tuple:
|
388
|
+
"""Calculates the gpu allocations for all compatible shapes.
|
389
|
+
If no primary Aqua model id provided, gpu count for each compatible shape will be evenly allocated.
|
390
|
+
If provided, gpu count for each compatible shape will be prioritized for primary model.
|
391
|
+
|
392
|
+
Example
|
393
|
+
-------
|
394
|
+
|
395
|
+
Case 1:
|
396
|
+
There is one compatible shape "BM.GPU.H100.8" for three models A, B, C, and each model has a gpu count as below:
|
397
|
+
|
398
|
+
A - BM.GPU.H100.8 - 1, 2, 4, 8
|
399
|
+
B - BM.GPU.H100.8 - 1, 2, 4, 8
|
400
|
+
C - BM.GPU.H100.8 - 1, 2, 4, 8
|
401
|
+
|
402
|
+
If no primary model is provided, the gpu allocation for A, B, C could be [2, 4, 2], [2, 2, 4] or [4, 2, 2]
|
403
|
+
If B is the primary model, the gpu allocation is [2, 4, 2] as B always gets the maximum gpu count.
|
404
|
+
|
405
|
+
Case 2:
|
406
|
+
There is one compatible shape "BM.GPU.H100.8" for three models A, B, C, and each model has a gpu count as below:
|
407
|
+
|
408
|
+
A - BM.GPU.H100.8 - 1
|
409
|
+
B - BM.GPU.H100.8 - 1, 2, 4
|
410
|
+
C - BM.GPU.H100.8 - 1, 2, 4
|
411
|
+
|
412
|
+
If no primary model is provided, the gpu allocation for A, B, C could be [1, 1, 2] or [1, 2, 1]
|
413
|
+
If C is the primary model, the gpu allocation is [1, 1, 2] as C always gets the maximum gpu count.
|
414
|
+
|
415
|
+
Parameters
|
416
|
+
----------
|
417
|
+
model_gpu_dict: Dict
|
418
|
+
A dict of Aqua model and its gpu counts.
|
419
|
+
primary_model_id: str
|
420
|
+
The OCID of the primary Aqua model
|
421
|
+
|
422
|
+
Returns
|
423
|
+
-------
|
424
|
+
tuple:
|
425
|
+
A tuple of gpu count allocation result.
|
426
|
+
"""
|
427
|
+
model_gpu_dict_copy = copy.deepcopy(model_gpu_dict)
|
428
|
+
# minimal gpu count needed to satisfy all models
|
429
|
+
minimal_gpus_needed = len(model_gpu_dict)
|
430
|
+
if primary_model_id and minimal_gpus_needed > 1:
|
431
|
+
primary_model_gpu_list = sorted(model_gpu_dict_copy.pop(primary_model_id))
|
432
|
+
primary_model_gpu_list.reverse()
|
433
|
+
combinations = self.get_combinations(model_gpu_dict_copy)
|
434
|
+
for gpu_count in primary_model_gpu_list:
|
435
|
+
current_gpus_available = total_gpus_available
|
436
|
+
while (
|
437
|
+
current_gpus_available >= minimal_gpus_needed
|
438
|
+
# or current_gpus_available == 1
|
439
|
+
):
|
440
|
+
for combination in combinations:
|
441
|
+
if (
|
442
|
+
len(combination) == len(model_gpu_dict_copy)
|
443
|
+
and sum(combination.values())
|
444
|
+
== current_gpus_available - gpu_count
|
445
|
+
):
|
446
|
+
combination[primary_model_id] = gpu_count
|
447
|
+
return (
|
448
|
+
True,
|
449
|
+
[
|
450
|
+
GPUModelAllocation(ocid=ocid, gpu_count=gpu_count)
|
451
|
+
for ocid, gpu_count in combination.items()
|
452
|
+
],
|
453
|
+
)
|
454
|
+
|
455
|
+
current_gpus_available -= 1
|
456
|
+
# current_gpus_available = (
|
457
|
+
# 1 if current_gpus_available == 0 else current_gpus_available
|
458
|
+
# )
|
459
|
+
else:
|
460
|
+
combinations = self.get_combinations(model_gpu_dict_copy)
|
461
|
+
current_gpus_available = total_gpus_available
|
462
|
+
while (
|
463
|
+
current_gpus_available >= minimal_gpus_needed
|
464
|
+
# or current_gpus_available == 1
|
465
|
+
):
|
466
|
+
minimal_difference = float("inf") # gets the positive infinity
|
467
|
+
optimal_combination = []
|
468
|
+
for combination in combinations:
|
469
|
+
if (
|
470
|
+
len(combination) == len(model_gpu_dict_copy)
|
471
|
+
and sum(combination.values()) == current_gpus_available
|
472
|
+
):
|
473
|
+
difference = max(combination.values()) - min(
|
474
|
+
combination.values()
|
475
|
+
)
|
476
|
+
if difference < minimal_difference:
|
477
|
+
minimal_difference = difference
|
478
|
+
optimal_combination = combination
|
479
|
+
|
480
|
+
# find the optimal combination, no need to continue
|
481
|
+
if minimal_difference == 0:
|
482
|
+
break
|
483
|
+
|
484
|
+
if optimal_combination:
|
485
|
+
return (
|
486
|
+
True,
|
487
|
+
[
|
488
|
+
GPUModelAllocation(ocid=ocid, gpu_count=gpu_count)
|
489
|
+
for ocid, gpu_count in optimal_combination.items()
|
490
|
+
],
|
491
|
+
)
|
492
|
+
|
493
|
+
current_gpus_available -= 1
|
494
|
+
# current_gpus_available = (
|
495
|
+
# 1 if current_gpus_available == 0 else current_gpus_available
|
496
|
+
# )
|
497
|
+
|
498
|
+
return (False, [])
|
499
|
+
|
500
|
+
@staticmethod
|
501
|
+
def get_combinations(input_dict: dict):
|
502
|
+
"""Finds all unique combinations within input dict.
|
503
|
+
|
504
|
+
The input is a dict of {model:[gpu_count]} on a specific shape and this method will
|
505
|
+
return a list of all unique combinations of gpu allocation of each model.
|
506
|
+
|
507
|
+
For example:
|
508
|
+
|
509
|
+
input: {'model_a': [2, 4], 'model_b': [1, 2, 4], 'model_c': [1, 2, 8]}
|
510
|
+
output:
|
511
|
+
[
|
512
|
+
{'model_a': 2, 'model_b': 1, 'model_c': 1},
|
513
|
+
{'model_a': 2, 'model_b': 1, 'model_c': 2},
|
514
|
+
{'model_a': 2, 'model_b': 1, 'model_c': 8},
|
515
|
+
{'model_a': 2, 'model_b': 2, 'model_c': 1},
|
516
|
+
{'model_a': 2, 'model_b': 2, 'model_c': 2},
|
517
|
+
{'model_a': 2, 'model_b': 2, 'model_c': 8},
|
518
|
+
{'model_a': 2, 'model_b': 4, 'model_c': 1},
|
519
|
+
{'model_a': 2, 'model_b': 4, 'model_c': 2},
|
520
|
+
{'model_a': 2, 'model_b': 4, 'model_c': 8},
|
521
|
+
{'model_a': 4, 'model_b': 1, 'model_c': 1},
|
522
|
+
{'model_a': 4, 'model_b': 1, 'model_c': 2},
|
523
|
+
{'model_a': 4, 'model_b': 1, 'model_c': 8},
|
524
|
+
{'model_a': 4, 'model_b': 2, 'model_c': 1},
|
525
|
+
{'model_a': 4, 'model_b': 2, 'model_c': 2},
|
526
|
+
{'model_a': 4, 'model_b': 2, 'model_c': 8},
|
527
|
+
{'model_a': 4, 'model_b': 4, 'model_c': 1},
|
528
|
+
{'model_a': 4, 'model_b': 4, 'model_c': 2},
|
529
|
+
{'model_a': 4, 'model_b': 4, 'model_c': 8}
|
530
|
+
]
|
531
|
+
|
532
|
+
Parameters
|
533
|
+
----------
|
534
|
+
input_dict: dict
|
535
|
+
A dict of {model:[gpu_count]} on a specific shape
|
536
|
+
|
537
|
+
Returns
|
538
|
+
-------
|
539
|
+
list:
|
540
|
+
A list of all unique combinations of gpu allocation of each model.
|
541
|
+
"""
|
542
|
+
keys, values = zip(*input_dict.items())
|
543
|
+
return [dict(zip(keys, v)) for v in itertools.product(*values)]
|