cars 1.0.0rc3__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.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.
- cars/__init__.py +74 -0
- cars/applications/__init__.py +40 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +46 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-x86_64-linux-gnu.so +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +597 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +278 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
- cars/applications/dsm_merging/__init__.py +28 -0
- cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
- cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
- cars/applications/grid_correction/__init__.py +30 -0
- cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
- cars/applications/grid_correction/grid_correction_app.py +557 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +639 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +760 -0
- cars/applications/resampling/resampling_algo.py +590 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sensors_subsampling/__init__.py +32 -0
- cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
- cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
- cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
- cars/applications/sparse_matching/sift_app.py +724 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +750 -0
- cars/cars.py +179 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1130 -0
- cars/core/geometry/shareloc_geometry.py +604 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1544 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +250 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +728 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/memory_tools.py +47 -0
- cars/orchestrator/orchestrator.py +755 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +1095 -0
- cars/pipelines/filling/__init__.py +26 -0
- cars/pipelines/filling/filling.py +981 -0
- cars/pipelines/formatting/__init__.py +26 -0
- cars/pipelines/formatting/formatting.py +190 -0
- cars/pipelines/merging/__init__.py +26 -0
- cars/pipelines/merging/merging.py +439 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +256 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
- cars/pipelines/parameters/application_parameters.py +72 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +349 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +435 -0
- cars/pipelines/parameters/sensor_inputs.py +859 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +38 -0
- cars/pipelines/pipeline_template.py +135 -0
- cars/pipelines/subsampling/__init__.py +26 -0
- cars/pipelines/subsampling/subsampling.py +358 -0
- cars/pipelines/surface_modeling/__init__.py +26 -0
- cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
- cars/pipelines/tie_points/__init__.py +26 -0
- cars/pipelines/tie_points/tie_points.py +536 -0
- cars/starter.py +167 -0
- cars-1.0.0rc3.dist-info/METADATA +289 -0
- cars-1.0.0rc3.dist-info/RECORD +220 -0
- cars-1.0.0rc3.dist-info/WHEEL +6 -0
- cars-1.0.0rc3.dist-info/entry_points.txt +8 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
|
|
5
|
+
#
|
|
6
|
+
# This file is part of CARS
|
|
7
|
+
# (see https://github.com/CNES/cars).
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
"""
|
|
22
|
+
Contains functions for sequential cluster
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# Standard imports
|
|
26
|
+
|
|
27
|
+
# Third party imports
|
|
28
|
+
from json_checker import Checker, Or
|
|
29
|
+
|
|
30
|
+
# CARS imports
|
|
31
|
+
from cars.orchestrator.cluster import abstract_cluster
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@abstract_cluster.AbstractCluster.register_subclass("sequential")
|
|
35
|
+
class SequentialCluster(abstract_cluster.AbstractCluster):
|
|
36
|
+
"""
|
|
37
|
+
SequentialCluster
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
def __init__(self, conf_cluster, out_dir, log_dir, launch_worker=True):
|
|
41
|
+
"""
|
|
42
|
+
Init function of SequentialCluster
|
|
43
|
+
|
|
44
|
+
:param conf_cluster: configuration for cluster
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
# call parent init
|
|
48
|
+
super().__init__(
|
|
49
|
+
conf_cluster, out_dir, log_dir, launch_worker=launch_worker
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
# retrieve parameters
|
|
53
|
+
self.profiling = self.checked_conf_cluster["profiling"]
|
|
54
|
+
self.out_dir = out_dir
|
|
55
|
+
self.launch_worker = launch_worker
|
|
56
|
+
|
|
57
|
+
def check_conf(self, conf):
|
|
58
|
+
"""
|
|
59
|
+
Check configuration
|
|
60
|
+
|
|
61
|
+
:param conf: configuration to check
|
|
62
|
+
:type conf: dict
|
|
63
|
+
|
|
64
|
+
:return: overloaded configuration
|
|
65
|
+
:rtype: dict
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
# init conf
|
|
70
|
+
if conf is not None:
|
|
71
|
+
overloaded_conf = conf.copy()
|
|
72
|
+
else:
|
|
73
|
+
conf = {}
|
|
74
|
+
overloaded_conf = {}
|
|
75
|
+
|
|
76
|
+
# Overload conf
|
|
77
|
+
overloaded_conf["mode"] = conf.get("mode", "sequential")
|
|
78
|
+
overloaded_conf["max_ram_per_worker"] = conf.get(
|
|
79
|
+
"max_ram_per_worker", 2000
|
|
80
|
+
)
|
|
81
|
+
overloaded_conf["profiling"] = conf.get("profiling", {})
|
|
82
|
+
|
|
83
|
+
cluster_schema = {
|
|
84
|
+
"mode": str,
|
|
85
|
+
"max_ram_per_worker": Or(float, int),
|
|
86
|
+
"profiling": dict,
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
# Check conf
|
|
90
|
+
checker = Checker(cluster_schema)
|
|
91
|
+
checker.validate(overloaded_conf)
|
|
92
|
+
|
|
93
|
+
return overloaded_conf
|
|
94
|
+
|
|
95
|
+
def get_delayed_type(self):
|
|
96
|
+
"""
|
|
97
|
+
Get delayed type
|
|
98
|
+
"""
|
|
99
|
+
return object
|
|
100
|
+
|
|
101
|
+
def cleanup(self, keep_shared_dir=False):
|
|
102
|
+
"""
|
|
103
|
+
Cleanup cluster
|
|
104
|
+
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
def create_task_wrapped(self, func, nout=2):
|
|
108
|
+
"""
|
|
109
|
+
Create task
|
|
110
|
+
|
|
111
|
+
:param func: function
|
|
112
|
+
:param nout: number of outputs
|
|
113
|
+
"""
|
|
114
|
+
return func
|
|
115
|
+
|
|
116
|
+
def start_tasks(self, task_list):
|
|
117
|
+
"""
|
|
118
|
+
Start all tasks
|
|
119
|
+
|
|
120
|
+
:param task_list: task list
|
|
121
|
+
"""
|
|
122
|
+
return task_list
|
|
123
|
+
|
|
124
|
+
def scatter(self, data, broadcast=True): # pylint: disable=W0613
|
|
125
|
+
"""
|
|
126
|
+
Distribute data through workers
|
|
127
|
+
|
|
128
|
+
:param data: task data
|
|
129
|
+
"""
|
|
130
|
+
return data
|
|
131
|
+
|
|
132
|
+
def future_iterator(self, future_list, timeout=None):
|
|
133
|
+
"""
|
|
134
|
+
Start all tasks
|
|
135
|
+
|
|
136
|
+
:param future_list: future_list list
|
|
137
|
+
"""
|
|
138
|
+
|
|
139
|
+
yield from future_list
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
|
|
5
|
+
#
|
|
6
|
+
# This file is part of CARS
|
|
7
|
+
# (see https://github.com/CNES/cars).
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
"""
|
|
22
|
+
Contains abstract function for SLURM dask Cluster
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import logging
|
|
26
|
+
import os
|
|
27
|
+
import warnings
|
|
28
|
+
|
|
29
|
+
from dask.distributed import Client
|
|
30
|
+
from json_checker import Or
|
|
31
|
+
|
|
32
|
+
with warnings.catch_warnings():
|
|
33
|
+
# Ignore some internal dask_jobqueue warnings
|
|
34
|
+
warnings.filterwarnings(
|
|
35
|
+
"ignore",
|
|
36
|
+
category=FutureWarning,
|
|
37
|
+
message=".*format_bytes is deprecated.*",
|
|
38
|
+
)
|
|
39
|
+
warnings.filterwarnings(
|
|
40
|
+
"ignore",
|
|
41
|
+
category=FutureWarning,
|
|
42
|
+
message=".*parse_bytes is deprecated.*",
|
|
43
|
+
)
|
|
44
|
+
warnings.filterwarnings(
|
|
45
|
+
"ignore",
|
|
46
|
+
category=FutureWarning,
|
|
47
|
+
message=".*tmpfile is deprecated.*",
|
|
48
|
+
)
|
|
49
|
+
from dask_jobqueue import SLURMCluster
|
|
50
|
+
|
|
51
|
+
from cars.orchestrator.cluster import ( # pylint: disable=C0412
|
|
52
|
+
abstract_cluster,
|
|
53
|
+
abstract_dask_cluster,
|
|
54
|
+
)
|
|
55
|
+
from cars.orchestrator.cluster.dask_cluster_tools import (
|
|
56
|
+
check_configuration,
|
|
57
|
+
create_checker_schema,
|
|
58
|
+
)
|
|
59
|
+
from cars.orchestrator.cluster.dask_jobqueue_utils import (
|
|
60
|
+
get_dashboard_link,
|
|
61
|
+
init_cluster_variables,
|
|
62
|
+
stop_cluster,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
@abstract_cluster.AbstractCluster.register_subclass("slurm_dask")
|
|
67
|
+
class SlurmDaskCluster(abstract_dask_cluster.AbstractDaskCluster):
|
|
68
|
+
"""
|
|
69
|
+
SlurmDaskCluster
|
|
70
|
+
"""
|
|
71
|
+
|
|
72
|
+
def check_conf(self, conf):
|
|
73
|
+
"""
|
|
74
|
+
Check configuration
|
|
75
|
+
|
|
76
|
+
:param conf: configuration to check
|
|
77
|
+
:type conf: dict
|
|
78
|
+
|
|
79
|
+
:return: overloaded configuration
|
|
80
|
+
:rtype: dict
|
|
81
|
+
|
|
82
|
+
"""
|
|
83
|
+
# overload cluster schema
|
|
84
|
+
overloaded_conf, cluster_schema = create_checker_schema(conf)
|
|
85
|
+
if overloaded_conf["mode"] == "slurm_dask":
|
|
86
|
+
overloaded_conf["account"] = conf.get("account", None)
|
|
87
|
+
overloaded_conf["qos"] = conf.get("qos", None)
|
|
88
|
+
cluster_schema["account"] = Or(None, str)
|
|
89
|
+
cluster_schema["qos"] = Or(None, str)
|
|
90
|
+
|
|
91
|
+
if overloaded_conf["account"] is None:
|
|
92
|
+
error_msg = (
|
|
93
|
+
"'account' parameter must be set for slurm dask cluster"
|
|
94
|
+
)
|
|
95
|
+
logging.error(error_msg)
|
|
96
|
+
raise RuntimeError(error_msg)
|
|
97
|
+
return check_configuration(overloaded_conf, cluster_schema)
|
|
98
|
+
|
|
99
|
+
def start_dask_cluster(self):
|
|
100
|
+
"""
|
|
101
|
+
Start dask cluster
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
return start_cluster(
|
|
105
|
+
self.nb_workers,
|
|
106
|
+
self.walltime,
|
|
107
|
+
self.out_dir,
|
|
108
|
+
activate_dashboard=self.activate_dashboard,
|
|
109
|
+
python=self.python,
|
|
110
|
+
account=self.account,
|
|
111
|
+
qos=self.qos,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
def cleanup(self):
|
|
115
|
+
"""
|
|
116
|
+
Cleanup cluster
|
|
117
|
+
|
|
118
|
+
"""
|
|
119
|
+
stop_cluster(self.cluster, self.client)
|
|
120
|
+
logging.info("Dask cluster closed")
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def start_cluster( # pylint: disable=too-many-positional-arguments
|
|
124
|
+
nb_workers,
|
|
125
|
+
walltime,
|
|
126
|
+
out_dir,
|
|
127
|
+
timeout=600,
|
|
128
|
+
activate_dashboard=False,
|
|
129
|
+
python=None,
|
|
130
|
+
account=None,
|
|
131
|
+
qos=None,
|
|
132
|
+
):
|
|
133
|
+
"""Create a Dask cluster.
|
|
134
|
+
|
|
135
|
+
Each worker will be spawned in an independent job with a single CPU
|
|
136
|
+
allocated to it, and will use a single process. This is done to maximize
|
|
137
|
+
CPU utilization and minimize scheduling delay.
|
|
138
|
+
|
|
139
|
+
The CARS_SLURM_QUEUE environment variable, if defined, is used
|
|
140
|
+
to specify the queue in which worker jobs are scheduled.
|
|
141
|
+
|
|
142
|
+
:param nb_workers: Number of dask workers
|
|
143
|
+
:type nb_workers: int
|
|
144
|
+
:param walltime: Walltime for each dask worker
|
|
145
|
+
:type walltime: string
|
|
146
|
+
:param out_dir: Output directory
|
|
147
|
+
:type out_dir: string
|
|
148
|
+
:param timeout: timeout of the cluster client
|
|
149
|
+
:type timeout: int
|
|
150
|
+
:param activate_dashboard: option to activate the dashborad server mode
|
|
151
|
+
:type activate_dashboard: bool
|
|
152
|
+
:param python: specfic python path
|
|
153
|
+
:type python: string
|
|
154
|
+
:param account: SLURM account
|
|
155
|
+
:type account: string
|
|
156
|
+
:param qos: Quality of Service parameter for TREX cluster
|
|
157
|
+
:type qos: string
|
|
158
|
+
:return: Dask cluster and dask client
|
|
159
|
+
:rtype: (dask_jobqueue.SLURMCluster, dask.distributed.Client) tuple
|
|
160
|
+
"""
|
|
161
|
+
# Retrieve SLURM queue
|
|
162
|
+
slurm_queue = os.environ.get("CARS_SLURM_QUEUE")
|
|
163
|
+
|
|
164
|
+
# retrieve current python path if None
|
|
165
|
+
(
|
|
166
|
+
python,
|
|
167
|
+
nb_workers_per_job,
|
|
168
|
+
memory,
|
|
169
|
+
_,
|
|
170
|
+
stagger,
|
|
171
|
+
lifetime_with_margin,
|
|
172
|
+
scheduler_options,
|
|
173
|
+
envs,
|
|
174
|
+
log_directory,
|
|
175
|
+
local_directory,
|
|
176
|
+
) = init_cluster_variables(
|
|
177
|
+
nb_workers,
|
|
178
|
+
walltime,
|
|
179
|
+
out_dir,
|
|
180
|
+
activate_dashboard,
|
|
181
|
+
python,
|
|
182
|
+
core_memory=7000,
|
|
183
|
+
cluster_name="SLURM",
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
with warnings.catch_warnings():
|
|
187
|
+
# Ignore some internal dask_jobqueue warnings
|
|
188
|
+
# TODO remove when Future warning do not exist anymore
|
|
189
|
+
warnings.filterwarnings(
|
|
190
|
+
"ignore",
|
|
191
|
+
category=FutureWarning,
|
|
192
|
+
message=".*extra has been renamed to worker_extra_args*",
|
|
193
|
+
)
|
|
194
|
+
warnings.filterwarnings(
|
|
195
|
+
"ignore",
|
|
196
|
+
category=FutureWarning,
|
|
197
|
+
message=".*job_extra has been renamed to job_extra_directives*",
|
|
198
|
+
)
|
|
199
|
+
warnings.filterwarnings(
|
|
200
|
+
"ignore",
|
|
201
|
+
category=FutureWarning,
|
|
202
|
+
message=".*env_extra has been renamed to job_script_prologue*",
|
|
203
|
+
)
|
|
204
|
+
if qos:
|
|
205
|
+
qos = ["--qos=" + qos]
|
|
206
|
+
logging.info("Quality of Service option: {}".format(qos[0]))
|
|
207
|
+
cluster = SLURMCluster(
|
|
208
|
+
processes=nb_workers_per_job,
|
|
209
|
+
cores=nb_workers_per_job,
|
|
210
|
+
memory="{}MiB".format(memory),
|
|
211
|
+
local_directory=local_directory,
|
|
212
|
+
account=account,
|
|
213
|
+
walltime=walltime,
|
|
214
|
+
interface="ib0",
|
|
215
|
+
queue=slurm_queue,
|
|
216
|
+
job_script_prologue=envs,
|
|
217
|
+
log_directory=log_directory,
|
|
218
|
+
python=python,
|
|
219
|
+
worker_extra_args=[
|
|
220
|
+
"--lifetime",
|
|
221
|
+
f"{int(lifetime_with_margin.total_seconds())}s",
|
|
222
|
+
"--lifetime-stagger",
|
|
223
|
+
f"{int(stagger.total_seconds())}s",
|
|
224
|
+
],
|
|
225
|
+
scheduler_options=scheduler_options,
|
|
226
|
+
job_extra_directives=qos,
|
|
227
|
+
)
|
|
228
|
+
logging.info("Dask cluster started")
|
|
229
|
+
cluster.adapt(minimum=nb_workers, maximum=nb_workers)
|
|
230
|
+
client = Client(cluster, timeout=timeout)
|
|
231
|
+
logging.info(
|
|
232
|
+
"Dashboard started at {}".format(get_dashboard_link(cluster))
|
|
233
|
+
)
|
|
234
|
+
return cluster, client
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
|
|
5
|
+
#
|
|
6
|
+
# This file is part of CARS
|
|
7
|
+
# (see https://github.com/CNES/cars).
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
"""
|
|
22
|
+
this module contains the ram tools
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
import psutil
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_available_ram():
|
|
29
|
+
"""
|
|
30
|
+
Get available ram
|
|
31
|
+
|
|
32
|
+
:return : available ram in Mb
|
|
33
|
+
"""
|
|
34
|
+
ram = psutil.virtual_memory()
|
|
35
|
+
available_ram_mb = ram.available / (1024 * 1024)
|
|
36
|
+
return available_ram_mb
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def get_total_ram():
|
|
40
|
+
"""
|
|
41
|
+
Get total ram
|
|
42
|
+
|
|
43
|
+
:return : available ram in Mb
|
|
44
|
+
"""
|
|
45
|
+
ram = psutil.virtual_memory()
|
|
46
|
+
total_ram_mb = ram.available / (1024 * 1024)
|
|
47
|
+
return total_ram_mb
|