From 8f06185f5f916074da845332013238c80941ab7e Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 11 Jan 2024 11:01:40 +0100 Subject: [PATCH 01/43] WIP: add benchmark setup for Ridge --- ..._benchmark_results_file_sanity_checks.yaml | 1 + .../sync_benchmark_files_to_gsheet.yaml | 3 + .github/workflows/test_cpu_benchmarks.yaml | 2 + README.md | 1 + benchmarks/kmeans/objective.py | 11 +- benchmarks/ridge/consolidate_result_csv.py | 647 ++++++++++++++++++ benchmarks/ridge/datasets/simulated_blobs.py | 41 ++ benchmarks/ridge/objective.py | 86 +++ benchmarks/ridge/solvers/scikit_learn.py | 76 ++ 9 files changed, 863 insertions(+), 5 deletions(-) create mode 100644 benchmarks/ridge/consolidate_result_csv.py create mode 100644 benchmarks/ridge/datasets/simulated_blobs.py create mode 100644 benchmarks/ridge/objective.py create mode 100644 benchmarks/ridge/solvers/scikit_learn.py diff --git a/.github/workflows/run_benchmark_results_file_sanity_checks.yaml b/.github/workflows/run_benchmark_results_file_sanity_checks.yaml index d427868..a93e386 100644 --- a/.github/workflows/run_benchmark_results_file_sanity_checks.yaml +++ b/.github/workflows/run_benchmark_results_file_sanity_checks.yaml @@ -19,3 +19,4 @@ jobs: run: | python ./benchmarks/kmeans/consolidate_result_csv.py ./benchmarks/kmeans/results.csv --check-csv python ./benchmarks/pca/consolidate_result_csv.py ./benchmarks/pca/results.csv --check-csv + python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/ridge/results.csv --check-csv diff --git a/.github/workflows/sync_benchmark_files_to_gsheet.yaml b/.github/workflows/sync_benchmark_files_to_gsheet.yaml index cbd2f25..24505a6 100644 --- a/.github/workflows/sync_benchmark_files_to_gsheet.yaml +++ b/.github/workflows/sync_benchmark_files_to_gsheet.yaml @@ -24,8 +24,11 @@ jobs: run: | python ./benchmarks/kmeans/consolidate_result_csv.py ./benchmarks/kmeans/results.csv --check-csv python ./benchmarks/pca/consolidate_result_csv.py ./benchmarks/pca/results.csv --check-csv + python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/pca/results.csv --check-csv echo "$GSPREAD_SERVICE_ACCOUNT_AUTH_KEY" > service_account.json python ./benchmarks/kmeans/consolidate_result_csv.py ./benchmarks/kmeans/results.csv \ --sync-to-gspread --gspread-url $GSPREAD_URL --gspread-auth-key ./service_account.json python ./benchmarks/pca/consolidate_result_csv.py ./benchmarks/pca/results.csv \ --sync-to-gspread --gspread-url $GSPREAD_URL --gspread-auth-key ./service_account.json + python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/pca/results.csv \ + --sync-to-gspread --gspread-url $GSPREAD_URL --gspread-auth-key ./service_account.json diff --git a/.github/workflows/test_cpu_benchmarks.yaml b/.github/workflows/test_cpu_benchmarks.yaml index 57b0707..31cfda8 100644 --- a/.github/workflows/test_cpu_benchmarks.yaml +++ b/.github/workflows/test_cpu_benchmarks.yaml @@ -143,3 +143,5 @@ jobs: PYTHONPATH=$PYTHONPATH:$(realpath ../../kmeans_dpcpp/) benchopt run --no-plot -l -d Simulated_correlated_data[n_samples=1000,n_features=14] cd ../pca benchopt run --no-plot -l -d Simulated_correlated_data[n_samples=100,n_features=100] + cd ../ridge + benchopt run --no-plot -l -d Simulated_correlated_data[n_samples=100,n_features=100] # TODO add relevant parameters diff --git a/README.md b/README.md index 82f5e88..214f473 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ hardware. Benchmarks are currently available for the following algorithms: - [k-means](https://github.com/soda-inria/sklearn-engine-benchmarks/tree/main/benchmarks/kmeans) - [PCA](https://github.com/soda-inria/sklearn-engine-benchmarks/tree/main/benchmarks/pca) +- [Ridge](https://github.com/soda-inria/sklearn-engine-benchmarks/tree/main/benchmarks/pca) Here is a (non-exhaustive) list of libraries that are compared in the benchmarks: - [scikit-learn](https://scikit-learn.org/stable/index.html) diff --git a/benchmarks/kmeans/objective.py b/benchmarks/kmeans/objective.py index 63f3bf1..c3e860c 100644 --- a/benchmarks/kmeans/objective.py +++ b/benchmarks/kmeans/objective.py @@ -32,15 +32,15 @@ def set_data(self, X, **dataset_parameters): self.X = X dtype = X.dtype - if self.init == "random" or self.sample_weight == "random": - rng = np.random.default_rng(self.random_state) - if self.sample_weight == "None": sample_weight = None elif self.sample_weight == "unary": sample_weight = np.ones(len(X), dtype=dtype) elif self.sample_weight == "random": - sample_weight = rng.random(size=len(X)).astype(dtype) + rng_sample_weight = np.random.default_rng( + dataset_parameters["sample_weight"] + 1 + ) + sample_weight = rng_sample_weight.random(size=len(X)).astype(dtype) else: raise ValueError( "Expected 'sample_weight' parameter to be either equal to 'None', " @@ -48,8 +48,9 @@ def set_data(self, X, **dataset_parameters): ) if self.init == "random": + rng_init = np.random.default_rng(self.random_state) init = np.array( - rng.choice(X, self.n_clusters, replace=False), dtype=X.dtype + rng_init.choice(X, self.n_clusters, replace=False), dtype=X.dtype ) elif self.init == "k-means++": init = self.init diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py new file mode 100644 index 0000000..3f780e9 --- /dev/null +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -0,0 +1,647 @@ +import hashlib +from functools import partial +from io import BytesIO +from itertools import zip_longest +from operator import attrgetter + +import numpy as np +import pandas as pd +from pandas.io.parsers.readers import STR_NA_VALUES + +GOOGLE_WORKSHEET_NAME = "Ridge" + +DATES_FORMAT = "%Y-%m-%d" + +BENCHMARK_DEFINING_COLUMNS = [ + "objective_objective_param___name", + "objective_dataset_param___name", + "objective_dataset_param_n_samples", + "objective_dataset_param_n_features", + "objective_dataset_param_n_targets", + "objective_dataset_param_dtype", + "objective_dataset_param_random_state", + "objective_objective_param_alpha", + "objective_objective_param_fit_intercept", + "objective_objective_param_max_iter", + "objective_objective_param_tol", + "objective_objective_param_sample_weight", + "objective_objective_param_random_state", +] + +BENCHMARK_DEFINING_COLUMNS = sorted(BENCHMARK_DEFINING_COLUMNS) +_benchmark_defining_columns_identifier = "".join(sorted(BENCHMARK_DEFINING_COLUMNS)) + +BACKEND_PROVIDER = "Backend provider" +COMMENT = "Comment" +COMPUTE_DEVICE = "Compute device" +COMPUTE_RUNTIME = "Compute runtime" +DATA_RANDOM_STATE = "Data random state" +DATA_SAMPLE_WEIGHTS = "Data sample weights" +DTYPE = "Dtype" +ALPHA = "alpha" +NB_DATA_FEATURES = "Nb data features" +NB_DATA_SAMPLES = "Nb data samples" +NB_DATA_TARGETS = "Nb data targets" +SOLVER = "Solver" +PLATFORM = "Platform" +PLATFORM_ARCHITECTURE = "Platform architecture" +PLATFORM_RELEASE = "Platform release" +SYSTEM_CPUS = "Nb cpus" +SYSTEM_PROCESSOR = "Cpu name" +SYSTEM_RAM = "RAM (GB)" +SYSTEM_GPU = "Gpu name" +RESULT_NB_ITERATIONS = "Result nb iterations" +OBJECTIVE_FUNCTION_VALUE = "Result objective value" +VERSION_INFO = "Version info" +RUN_DATE = "Run date" +SOLVER_RANDOM_STATE = "Solver random state" +WALLTIME = "Walltime" + +BENCHMARK_ID_NAME = "Benchmark id" + +TABLE_DISPLAY_ORDER = [ + BENCHMARK_ID_NAME, + DTYPE, + NB_DATA_SAMPLES, + NB_DATA_FEATURES, + NB_DATA_TARGETS, + DATA_SAMPLE_WEIGHTS, + ALPHA, + WALLTIME, + BACKEND_PROVIDER, + COMPUTE_DEVICE, + COMPUTE_RUNTIME, + SOLVER, + SYSTEM_CPUS, + SYSTEM_PROCESSOR, + SYSTEM_GPU, + SYSTEM_RAM, + PLATFORM, + PLATFORM_ARCHITECTURE, + PLATFORM_RELEASE, + RUN_DATE, + VERSION_INFO, + COMMENT, + RESULT_NB_ITERATIONS, + OBJECTIVE_FUNCTION_VALUE, + DATA_RANDOM_STATE, + SOLVER_RANDOM_STATE, +] + +COLUMNS_DTYPES = { + BENCHMARK_ID_NAME: str, + DTYPE: str, + NB_DATA_SAMPLES: np.int64, + NB_DATA_FEATURES: np.int64, + NB_DATA_TARGETS: np.int64, + ALPHA: np.float64, + WALLTIME: np.float64, + BACKEND_PROVIDER: str, + COMPUTE_DEVICE: str, + COMPUTE_RUNTIME: str, + RESULT_NB_ITERATIONS: np.int64, + OBJECTIVE_FUNCTION_VALUE: np.float64, + SOLVER: str, + PLATFORM: str, + PLATFORM_ARCHITECTURE: str, + PLATFORM_RELEASE: str, + SYSTEM_CPUS: np.int64, + SYSTEM_PROCESSOR: str, + SYSTEM_GPU: str, + SYSTEM_RAM: np.int64, + DATA_RANDOM_STATE: np.int64, + SOLVER_RANDOM_STATE: np.int64, + VERSION_INFO: str, + RUN_DATE: str, + COMMENT: str, +} + +COLUMNS_WITH_NONE_STRING = [DATA_SAMPLE_WEIGHTS] + +# If all those fields have equal values for two given benchmarks, then the oldest +# benchmark (given by RUN_DATE) will be discarded +UNIQUE_BENCHMARK_KEY = [ + BENCHMARK_ID_NAME, + DTYPE, + NB_DATA_SAMPLES, + NB_DATA_FEATURES, + NB_DATA_TARGETS, + DATA_SAMPLE_WEIGHTS, + BACKEND_PROVIDER, + SOLVER, + COMPUTE_DEVICE, + COMPUTE_RUNTIME, + PLATFORM, + PLATFORM_ARCHITECTURE, + SYSTEM_PROCESSOR, + SYSTEM_CPUS, + SYSTEM_GPU, + DATA_RANDOM_STATE, + SOLVER_RANDOM_STATE, +] + +# Importance and say if ascending / descending +ROW_SORT_ORDER = [ + (DTYPE, True), + (NB_DATA_SAMPLES, False), + (NB_DATA_FEATURES, False), + (NB_DATA_TARGETS, False), + (DATA_SAMPLE_WEIGHTS, True), + (ALPHA, False), + (WALLTIME, True), + (BACKEND_PROVIDER, True), + (COMPUTE_DEVICE, True), + (COMPUTE_RUNTIME, True), + (RESULT_NB_ITERATIONS, True), + (OBJECTIVE_FUNCTION_VALUE, False), + (SOLVER, True), + (SYSTEM_GPU, True), + (SYSTEM_CPUS, True), + (PLATFORM, True), + (PLATFORM_ARCHITECTURE, True), + (PLATFORM_RELEASE, True), + (SYSTEM_PROCESSOR, True), + (SYSTEM_RAM, True), + (DATA_RANDOM_STATE, True), + (SOLVER_RANDOM_STATE, True), + (RUN_DATE, False), + (VERSION_INFO, False), + (COMMENT, True), + (BENCHMARK_ID_NAME, True), +] +_row_sort_by, _row_sort_ascending = map(list, zip(*ROW_SORT_ORDER)) + +PARQUET_TABLE_DISPLAY_MAPPING = dict( + time=WALLTIME, + objective_value=OBJECTIVE_FUNCTION_VALUE, + objective_n_iter=RESULT_NB_ITERATIONS, + objective_dataset_param_n_samples=NB_DATA_SAMPLES, + objective_dataset_param_n_features=NB_DATA_FEATURES, + objective_dataset_param_n_targets=NB_DATA_TARGETS, + objective_dataset_param_dtype=DTYPE, + objective_dataset_param_random_state=DATA_RANDOM_STATE, + objective_objective_param_alpha=ALPHA, + objective_objective_param_fit_intercept=ALPHA, + objective_objective_param_alpha=ALPHA, + objective_objective_param_random_state=SOLVER_RANDOM_STATE, + objective_solver_param___name=BACKEND_PROVIDER, + objective_solver_param_device=COMPUTE_DEVICE, + objective_solver_param_runtime=COMPUTE_RUNTIME, + objective_solver_param_solver=SOLVER, + objective_solver_param_comment=COMMENT, + objective_solver_param_version_info=VERSION_INFO, + objective_solver_param_run_date=RUN_DATE, + platform=PLATFORM, +) + +PARQUET_TABLE_DISPLAY_MAPPING.update( + { + "platform-architecture": PLATFORM_ARCHITECTURE, + "platform-release": PLATFORM_RELEASE, + "system-cpus": SYSTEM_CPUS, + "system-processor": SYSTEM_PROCESSOR, + "system-ram (GB)": SYSTEM_RAM, + } +) +_all_table_columns = list(PARQUET_TABLE_DISPLAY_MAPPING) + [BENCHMARK_ID_NAME] + +ALL_EXPECTED_COLUMNS = set(BENCHMARK_DEFINING_COLUMNS + _all_table_columns) + +IDS_LENGTH = 8 + + +def _get_id_from_str(s): + return hashlib.sha256(s.encode("utf8"), usedforsecurity=False).hexdigest()[ + :IDS_LENGTH + ] + + +def _get_sample_id_for_columns(row, defining_colums, constant_identifier): + return _get_id_from_str( + "".join(row[defining_colums].astype(str)) + constant_identifier + ) + + +def _validate_one_parquet_table(source): + df = pd.read_parquet(source) + + # NB: we're lenient on the columns + for col in ALL_EXPECTED_COLUMNS - set(df.columns): + df[col] = None + + df[BENCHMARK_ID_NAME] = df.apply( + lambda row: _get_sample_id_for_columns( + row, BENCHMARK_DEFINING_COLUMNS, _benchmark_defining_columns_identifier + ), + axis=1, + ) + + df = df[_all_table_columns] + df.rename(columns=PARQUET_TABLE_DISPLAY_MAPPING, inplace=True, errors="raise") + + df[RUN_DATE] = df[RUN_DATE].astype("datetime64[ns]") + + return df + + +def _validate_one_csv_table(source, parse_dates=True, order_columns=True): + NA_VALUES = set(STR_NA_VALUES) + NA_VALUES.discard("None") + + df = pd.read_csv( + source, + usecols=TABLE_DISPLAY_ORDER, + dtype=COLUMNS_DTYPES, + index_col=False, + na_values={col: NA_VALUES for col in COLUMNS_WITH_NONE_STRING}, + keep_default_na=False, + ) + + if order_columns: + df = df[TABLE_DISPLAY_ORDER] + + if parse_dates: + df[RUN_DATE] = pd.to_datetime(df[RUN_DATE], format=DATES_FORMAT).astype( + "datetime64[ns]" + ) + + return df + + +def _assemble_output_table( + dfs_from_csv, dfs_from_parquet, parquet_gpu_name, create_gpu_entry, list_known_gpus +): + + if not list_known_gpus and (len(dfs_from_parquet) == 0): + if parquet_gpu_name is not None: + parameter_name = ( + "--parquet-gpu-name" if parquet_gpu_name else "--no-parquet-gpu-name" + ) + raise ValueError( + f"The parameter {parameter_name} should only be used if at least one " + "benchopt parquet table is being consolidated, but only got csv tables." + ) + if create_gpu_entry is not False: + raise ValueError( + "The parameter --create-gpu-entry should only be used if at least one " + "benchopt parquet table is being consolidated, but got only csv tables." + ) + elif not list_known_gpus and parquet_gpu_name is None: + raise ValueError( + "Please use the --parquet-gpu-name parameter to provide a gpu name that " + "will be added to the metadata of the samples in the input parquet tables " + "or use the --no-parquet-gpu-name if you intend to leave the corresponding " + "field empty." + ) + + else: + gpu_names_from_csv = set( + gpu_name + for df in dfs_from_csv + for gpu_name in df[SYSTEM_GPU] + if (len(gpu_name) > 0) + ) + + if list_known_gpus: + print("\n".join(gpu_names_from_csv)) + return False + + if ( + (len(parquet_gpu_name) > 0) + and (parquet_gpu_name not in gpu_names_from_csv) + and not create_gpu_entry + ): + raise IndexError( + f"The gpu name {parquet_gpu_name} is unknown. Please use the " + "--new-gpu-entry parameter to confirm the addition of the new gpu " + "entry in the output csv table, or use --list-known-gpus parameter to " + "print a list of gpus names that have been already registered and use " + "one of those to bypass this error." + ) + + for df in dfs_from_parquet: + df[SYSTEM_GPU] = parquet_gpu_name + + df_list = dfs_from_csv + dfs_from_parquet + + if len(df_list) > 1: + df = pd.concat(df_list, ignore_index=True, copy=False) + else: + df = df_list[0] + + df = df[TABLE_DISPLAY_ORDER] + df.sort_values( + by=_row_sort_by, ascending=_row_sort_ascending, inplace=True, kind="stable" + ) + # HACK: sanitize mix of None values and empty strings that can happen when some + # columns are missing in the parquet input files (because it's optional and no + # solver returns it in the batch) by passing the data to CSV and re-loading + # again from CSV + df = _sanitize_df_with_tocsv(df) + + df.drop_duplicates(subset=UNIQUE_BENCHMARK_KEY, inplace=True, ignore_index=True) + + return df + + +def _sanitize_df_with_tocsv(df): + in_memory_buffer = BytesIO() + _df_to_csv(df, in_memory_buffer) + in_memory_buffer.seek(0) + return _validate_one_csv_table(in_memory_buffer, order_columns=False) + + +def _df_to_csv(df, target): + float_format_fn = partial( + np.format_float_positional, + precision=3, + unique=True, + fractional=False, + trim="-", + sign=False, + pad_left=None, + pad_right=None, + min_digits=None, + ) + df = df.copy() + df[WALLTIME] = df[WALLTIME].map(float_format_fn) + df.to_csv( + target, + index=False, + mode="a", + date_format=DATES_FORMAT, + ) + + +def _gspread_sync(source, gspread_url, gspread_auth_key): + import gspread + + df = _validate_one_csv_table(source, parse_dates=False) + + n_rows, n_cols = df.shape + walltime_worksheet_col = df.columns.get_loc(WALLTIME) + 1 + + gs = gspread.service_account(gspread_auth_key) + sheet = gs.open_by_url(gspread_url) + + global_range = ( + f"{gspread.utils.rowcol_to_a1(1, 1)}:" + f"{gspread.utils.rowcol_to_a1(n_rows + 1, n_cols)}" + ) + + try: + worksheet = sheet.worksheet(GOOGLE_WORKSHEET_NAME) + worksheet.clear() + worksheet.clear_basic_filter() + worksheet.freeze(0, 0) + worksheet.resize(rows=n_rows + 1, cols=n_cols) + worksheet.clear_notes(global_range) + white_background = dict( + backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)) + ) + worksheet.format(global_range, white_background) + except gspread.WorksheetNotFound: + worksheet = sheet.add_worksheet( + GOOGLE_WORKSHEET_NAME, rows=n_rows + 1, cols=n_cols + ) + # ensure worksheets are sorted anti-alphabetically + sheet.reorder_worksheets( + sorted(sheet.worksheets(), key=attrgetter("title"), reverse=True) + ) + + # upload all values + worksheet.update( + values=[df.columns.values.tolist()] + df.values.tolist(), range_name="A1" + ) + + # set filter + worksheet.set_basic_filter(1, 1, n_rows + 1, n_cols) + + # freeze filter rows and benchmark-defining cols + worksheet.freeze(rows=1, cols=walltime_worksheet_col) + + format_queries = [] + + # Text is centerd and wrapped in all cells + global_format = dict( + horizontalAlignment="CENTER", + verticalAlignment="MIDDLE", + wrapStrategy="WRAP", + ) + format_queries.append(dict(range=global_range, format=global_format)) + + # benchmark_id and walltime columns are bold + bold_format = dict(textFormat=dict(bold=True)) + benchmark_id_col_range = ( + f"{gspread.utils.rowcol_to_a1(2, 1)}:" + f"{gspread.utils.rowcol_to_a1(n_rows + 1, 1)}" + ) + walltime_col_range = ( + f"{gspread.utils.rowcol_to_a1(2, walltime_worksheet_col)}:" + f"{gspread.utils.rowcol_to_a1(n_rows + 1, walltime_worksheet_col)}" + ) + format_queries.append(dict(range=benchmark_id_col_range, format=bold_format)) + format_queries.append(dict(range=walltime_col_range, format=bold_format)) + + # Header is light-ish yellow + yellow_lighter_header = dict( + backgroundColorStyle=dict( + rgbColor=dict(red=1, green=1, blue=102 / 255, alpha=1) + ) + ) + header_row_range = ( + f"{gspread.utils.rowcol_to_a1(1, 1)}:" + f"{gspread.utils.rowcol_to_a1(1, n_cols)}" + ) + format_queries.append(dict(range=header_row_range, format=yellow_lighter_header)) + + # Every other benchmark_id has greyed background + bright_gray_background = dict( + backgroundColorStyle=dict( + rgbColor=dict(red=232 / 255, green=233 / 255, blue=235 / 255, alpha=1) + ) + ) + benchmark_ids = df[BENCHMARK_ID_NAME] + benchmark_ids_ending_idx = ( + np.where((benchmark_ids.shift() != benchmark_ids).values[1:])[0] + 2 + ) + for benchmark_id_range_start, benchmark_id_range_end in zip_longest( + *(iter(benchmark_ids_ending_idx),) * 2 + ): + benchmark_row_range = ( + f"{gspread.utils.rowcol_to_a1(benchmark_id_range_start + 1, 1)}:" + f"{gspread.utils.rowcol_to_a1(benchmark_id_range_end or (n_rows + 1), n_cols)}" # noqa + ) + format_queries.append( + dict(range=benchmark_row_range, format=bright_gray_background) + ) + + # Apply formats + worksheet.batch_format(format_queries) + + # auto-resize rows and cols + worksheet.columns_auto_resize(0, n_cols - 1) + worksheet.rows_auto_resize(0, n_rows) + + +if __name__ == "__main__": + import os + import sys + from argparse import ArgumentParser + + argparser = ArgumentParser( + description=( + "Print an aggregated CSV-formated database of ridge benchmark results " + "for the sklearn-engine-benchmarks project hosted at " + "https://github.com/soda-inria/sklearn-engine-benchmarks.\n\n" + "The inputs are assumed to be a collection of benchopt parquet files and " + "CSV files, well formated according to the project current specs. This " + "command assumes rhat the inputs are valid and is lenient at checking " + "types, null values, or missing columns, hence the user is advised to " + "cautiously check outputs before using.\n\n" + "If several results are found for identical benchmarks, only the most " + "recent `Run date` value is retained, all anterior entries are discarded " + "from the output CSV." + ) + ) + + argparser.add_argument( + "benchmark_files", + nargs="+", + help="benchopt parquet files or sklearn-engine-benchmarks csv files", + ) + + argparser.add_argument( + "--check-csv", + action="store_true", + help="Perform a few sanity checks on a CSV database of ridge benchmark " + "results. If this option is passed, then the command only expects a single " + "input path to a csv file.", + ) + + argparser.add_argument( + "--sync-to-gspread", + action="store_true", + help="Synchronize a CSV database of ridge benchmark results to a google " + "spreadsheet and format it nicely. If this option is passed, then the command " + "only expects a single input path to a csv file, and also requires " + "--gspread-url and --gspread-auth-key.", + ) + + argparser.add_argument( + "--gspread-url", + help="URL to a google spreadsheet. Expected if and only if --sync-to-gspread " + "is passed.", + ) + + argparser.add_argument( + "--gspread-auth-key", + help="Path to a json authentication key for a gspread service account. " + "Expected if and only if --sync-to-gspread is passed.", + ) + + argparser.add_argument( + "--parquet-gpu-name", + help="Name of the GPU on the host that runs the benchmarks that are recorded " + "in the input parquet files.", + ) + + argparser.add_argument( + "--no-parquet-gpu-name", + action="store_true", + help="Do not insert a GPU name in the metadata of the benchmark samples that " + "were recorded in the input parquet files (and leave it blank).", + ) + + argparser.add_argument( + "--new-gpu-entry", + action="store_true", + help="Use this parameter along with --parquet-gpu-name to confirm that if the " + "GPU name is not yet known in the existing databases, it will be added to the " + "list of known GPU names. Else the command will throw an error.", + ) + + argparser.add_argument( + "--list-known-gpus", + action="store_true", + help="Will print a list of the GPU names that are used in CSV benchmark files.", + ) + + args = argparser.parse_args() + + if (parquet_gpu_name := args.parquet_gpu_name) is None and args.no_parquet_gpu_name: + parquet_gpu_name = "" + + create_gpu_entry = args.new_gpu_entry + list_known_gpus = args.list_known_gpus + + paths = args.benchmark_files + if (check_csv := args.check_csv) or args.sync_to_gspread: + if (n_paths := len(paths)) > 1: + command = "--check-csv" if check_csv else "--sync-to-gspread" + raise ValueError( + f"A single input path to a csv file is expected when the {command} " + f"parameter is passed, but you passed {n_paths - 1} additional " + "arguments." + ) + path = paths[0] + _, file_extension = os.path.splitext(path) + if file_extension != ".csv": + raise ValueError( + "Expecting a '.csv' file extensions, but got " + f"{file_extension} instead !" + ) + + if check_csv: + df_loaded = _validate_one_csv_table(path) + df_clean = _assemble_output_table( + dfs_from_csv=[df_loaded], + dfs_from_parquet=[], + parquet_gpu_name=None, + create_gpu_entry=False, + list_known_gpus=list_known_gpus, + ) + + pd.testing.assert_frame_equal(df_loaded, df_clean) + + if gspread_sync := args.sync_to_gspread: + if (gspread_url := args.gspread_url) is None: + raise ValueError( + "Please provide a URL to a google spreadsheet using the " + "--gspread-url parameter." + ) + + if (gspread_auth_key := args.gspread_auth_key) is None: + raise ValueError( + "Please use the --gspread-auth-key parameter to pass a json " + "authentication key for a service account from the google developer " + "console." + ) + _gspread_sync(path, gspread_url, gspread_auth_key) + + if not check_csv and not gspread_sync: + dfs_from_parquet, dfs_from_csv = [], [] + for path in paths: + _, file_extension = os.path.splitext(path) + if file_extension == ".parquet": + if list_known_gpus: + continue + dfs_from_parquet.append(_validate_one_parquet_table(path)) + elif file_extension == ".csv": + dfs_from_csv.append(_validate_one_csv_table(path, order_columns=False)) + else: + raise ValueError( + "Expecting '.csv' or '.parquet' file extensions, but got " + f"{file_extension} instead !" + ) + + df = _assemble_output_table( + dfs_from_csv=dfs_from_csv, + dfs_from_parquet=dfs_from_parquet, + parquet_gpu_name=parquet_gpu_name, + create_gpu_entry=create_gpu_entry, + list_known_gpus=list_known_gpus, + ) + + if df is not False: + _df_to_csv(df, sys.stdout) diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py new file mode 100644 index 0000000..0ef5605 --- /dev/null +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -0,0 +1,41 @@ +from benchopt import BaseDataset, safe_import_context +from benchopt.datasets import make_correlated_data + +with safe_import_context() as import_ctx: + import numpy as np + + +class Dataset(BaseDataset): + name = "Simulated_correlated_data" + + parameters = { + "n_samples, n_features": [ + (20_000_000, 100), + (15_000, 15_000), + (2_000_000, 100), + (5000, 5000), + ], + "n_targets": [1, 5, 20], + "dtype": ["float32"], + "random_state": [123], + } + + def __init__(self, n_samples, n_features, n_targets, dtype, random_state): + self.n_samples = n_samples + self.n_features = n_features + self.n_targets = n_targets + self.random_state = random_state + self.dtype = dtype + + def get_data(self): + rng = np.random.RandomState(self.random_state) + + X, y = make_correlated_data( + self.n_samples, self.n_features, self.n_targets, random_state=rng + ) + + dtype = getattr(np, self.dtype) + + return dict( + X=X.astype(dtype), y=y.astype(dtype), __name=self.name, **self._parameters + ) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py new file mode 100644 index 0000000..67c8708 --- /dev/null +++ b/benchmarks/ridge/objective.py @@ -0,0 +1,86 @@ +from datetime import datetime + +from benchopt import BaseObjective, safe_import_context + +with safe_import_context() as import_ctx: + import numpy as np + + +class Objective(BaseObjective): + name = "Ridge walltime" + url = "https://github.com/soda-inria/sklearn-engine-benchmarks" + + requirements = ["numpy"] + + # Since our goal is to measure walltime for solvers that perform exact same + # computations, the solver parameters are part of the objective and must be set + # for all solvers, rather than being an independent benchmark space for each + # solver. + parameters = { + "alpha": [1.0], + "fit_intercept": [True], + "solver, max_iter, tol": [("svd", None, 0)], + "sample_weight": ["None", "random"], + "random_state": [123], + } + + def set_data(self, X, **dataset_parameters): + self.X = X + dtype = X.dtype + + if self.sample_weight == "None": + sample_weight = None + elif self.sample_weight == "unary": + sample_weight = np.ones(len(X), dtype=dtype) + elif self.sample_weight == "random": + rng_sample_weight = np.random.default_rng( + dataset_parameters["sample_weight"] + 1 + ) + sample_weight = rng_sample_weight.random(size=len(X)).astype(dtype) + else: + raise ValueError( + "Expected 'sample_weight' parameter to be either equal to 'None', " + f"'unary' or 'random', but got {sample_weight}." + ) + + self.sample_weight_ = sample_weight + self.dataset_parameters = dataset_parameters + + def evaluate_result(self, objective, **solver_parameters): + all_parameters = dict(solver_param_run_date=datetime.today()) + all_parameters.update( + { + ("dataset_param_" + key): value + for key, value in self.dataset_parameters.items() + } + ) + all_parameters.update( + { + ("objective_param_" + key): value + for key, value in self._parameters.items() + } + ) + all_parameters.update( + {("solver_param_" + key): value for key, value in solver_parameters.items()} + ) + return dict( + value=objective, + objective_param___name=self.name, + **all_parameters, + ) + + def get_one_result(self): + return dict(objective=1) + + def get_objective(self): + return dict( + X=self.X, + y=self.y, + sample_weight=self.sample_weight_, + alpha=self.alpha, + fit_intercept=self.fit_intercept, + solver=self.solver, + max_iter=self.max_iter, + tol=self.tol, + random_state=self.random_state, + ) diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py new file mode 100644 index 0000000..d60f41f --- /dev/null +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -0,0 +1,76 @@ +from importlib.metadata import version + +from benchopt import BaseSolver, safe_import_context +from benchopt.stopping_criterion import SingleRunCriterion + +with safe_import_context() as import_ctx: + from sklearn.linear_model import Ridge + from sklearn.linear_model._base import _rescale_data + + +class Solver(BaseSolver): + name = "scikit-learn" + requirements = ["scikit-learn"] + + stopping_criterion = SingleRunCriterion(1) + + def set_objective( + self, + X, + y, + sample_weight, + alpha, + fit_intercept, + solver, + max_iter, + tol, + random_state, + ): + # Copy the data before running the benchmark to ensure that no unfortunate side + # effects can happen + self.X = X.copy() + self.y = y.copy() + + if hasattr(sample_weight, "copy"): + sample_weight = sample_weight.copy() + self.sample_weight = sample_weight + + self.alpha = alpha + self.fit_intercept = fit_intercept + self.solver = solver + self.max_iter = max_iter + self.tol = tol + self.random_state = random_state + + def run(self, _): + estimator = Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + copy_X=False, + max_iter=self.max_iter, + tol=self.tol, + solver=self.solver, + positive=True if (self.solver == "lbfgs") else False, + random_state=self.random_state, + ).fit(self.X, self.y, self.sample_weight) + + self.coef_ = estimator.coef_ + + def get_result(self): + if self.sample_weight is not None: + X, y, _ = _rescale_data(self.X, self.y, self.sample_weight, inplace=True) + + y = y.reshape((y.shape[0], -1)) + + coef_ = self.coef_.reshape((X.shape[0], 1, -1)) + + objective = ((y - (X @ coef_).squeeze(1)) ** 2).sum() + ( + len(y.T) * self.alpha * (coef_**2).sum() + ) + + return dict( + objective=objective, + version_info=f"scikit-learn {version('scikit-learn')}", + __name=self.name, + **self._parameters, + ) From 08cc70f1c90e3770210fb04d45a3a865b325f94a Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 11 Jan 2024 15:10:31 +0100 Subject: [PATCH 02/43] scikit-learn benchmark works --- benchmarks/kmeans/objective.py | 2 +- benchmarks/ridge/datasets/simulated_blobs.py | 2 +- benchmarks/ridge/objective.py | 5 +++-- benchmarks/ridge/solvers/scikit_learn.py | 7 ++++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/benchmarks/kmeans/objective.py b/benchmarks/kmeans/objective.py index c3e860c..942f701 100644 --- a/benchmarks/kmeans/objective.py +++ b/benchmarks/kmeans/objective.py @@ -38,7 +38,7 @@ def set_data(self, X, **dataset_parameters): sample_weight = np.ones(len(X), dtype=dtype) elif self.sample_weight == "random": rng_sample_weight = np.random.default_rng( - dataset_parameters["sample_weight"] + 1 + dataset_parameters["random_state"] + 1 ) sample_weight = rng_sample_weight.random(size=len(X)).astype(dtype) else: diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index 0ef5605..a4e3832 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -30,7 +30,7 @@ def __init__(self, n_samples, n_features, n_targets, dtype, random_state): def get_data(self): rng = np.random.RandomState(self.random_state) - X, y = make_correlated_data( + X, y, _ = make_correlated_data( self.n_samples, self.n_features, self.n_targets, random_state=rng ) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 67c8708..40b2713 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -24,8 +24,9 @@ class Objective(BaseObjective): "random_state": [123], } - def set_data(self, X, **dataset_parameters): + def set_data(self, X, y, **dataset_parameters): self.X = X + self.y = y dtype = X.dtype if self.sample_weight == "None": @@ -34,7 +35,7 @@ def set_data(self, X, **dataset_parameters): sample_weight = np.ones(len(X), dtype=dtype) elif self.sample_weight == "random": rng_sample_weight = np.random.default_rng( - dataset_parameters["sample_weight"] + 1 + dataset_parameters["random_state"] + 1 ) sample_weight = rng_sample_weight.random(size=len(X)).astype(dtype) else: diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index d60f41f..dec54da 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -57,14 +57,15 @@ def run(self, _): self.coef_ = estimator.coef_ def get_result(self): + X, y = self.X, self.y if self.sample_weight is not None: - X, y, _ = _rescale_data(self.X, self.y, self.sample_weight, inplace=True) + X, y, _ = _rescale_data(X, y, self.sample_weight, inplace=True) y = y.reshape((y.shape[0], -1)) - coef_ = self.coef_.reshape((X.shape[0], 1, -1)) + coef_ = self.coef_.reshape((-1, X.shape[1], 1)) - objective = ((y - (X @ coef_).squeeze(1)) ** 2).sum() + ( + objective = ((y.T - (X @ coef_).squeeze(2)) ** 2).sum() + ( len(y.T) * self.alpha * (coef_**2).sum() ) From 9de71549811ec43192d71d9195e70604f4626b7a Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:01:15 +0100 Subject: [PATCH 03/43] smaller dimensions / consolidation script works --- benchmarks/ridge/consolidate_result_csv.py | 16 +++++++++------- benchmarks/ridge/datasets/simulated_blobs.py | 8 ++++---- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 3f780e9..fd5cc2f 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -50,7 +50,9 @@ SYSTEM_PROCESSOR = "Cpu name" SYSTEM_RAM = "RAM (GB)" SYSTEM_GPU = "Gpu name" -RESULT_NB_ITERATIONS = "Result nb iterations" +# TODO: add number of iterations once iteration-based solvers are +# added to the benchmark. +# RESULT_NB_ITERATIONS = "Result nb iterations" OBJECTIVE_FUNCTION_VALUE = "Result objective value" VERSION_INFO = "Version info" RUN_DATE = "Run date" @@ -82,7 +84,7 @@ RUN_DATE, VERSION_INFO, COMMENT, - RESULT_NB_ITERATIONS, + # RESULT_NB_ITERATIONS, OBJECTIVE_FUNCTION_VALUE, DATA_RANDOM_STATE, SOLVER_RANDOM_STATE, @@ -95,11 +97,12 @@ NB_DATA_FEATURES: np.int64, NB_DATA_TARGETS: np.int64, ALPHA: np.float64, + DATA_SAMPLE_WEIGHTS: str, WALLTIME: np.float64, BACKEND_PROVIDER: str, COMPUTE_DEVICE: str, COMPUTE_RUNTIME: str, - RESULT_NB_ITERATIONS: np.int64, + # RESULT_NB_ITERATIONS: np.int64, OBJECTIVE_FUNCTION_VALUE: np.float64, SOLVER: str, PLATFORM: str, @@ -152,7 +155,7 @@ (BACKEND_PROVIDER, True), (COMPUTE_DEVICE, True), (COMPUTE_RUNTIME, True), - (RESULT_NB_ITERATIONS, True), + # (RESULT_NB_ITERATIONS, True), (OBJECTIVE_FUNCTION_VALUE, False), (SOLVER, True), (SYSTEM_GPU, True), @@ -174,16 +177,15 @@ PARQUET_TABLE_DISPLAY_MAPPING = dict( time=WALLTIME, objective_value=OBJECTIVE_FUNCTION_VALUE, - objective_n_iter=RESULT_NB_ITERATIONS, + # objective_n_iter=RESULT_NB_ITERATIONS, objective_dataset_param_n_samples=NB_DATA_SAMPLES, objective_dataset_param_n_features=NB_DATA_FEATURES, objective_dataset_param_n_targets=NB_DATA_TARGETS, objective_dataset_param_dtype=DTYPE, objective_dataset_param_random_state=DATA_RANDOM_STATE, objective_objective_param_alpha=ALPHA, - objective_objective_param_fit_intercept=ALPHA, - objective_objective_param_alpha=ALPHA, objective_objective_param_random_state=SOLVER_RANDOM_STATE, + objective_objective_param_sample_weight=DATA_SAMPLE_WEIGHTS, objective_solver_param___name=BACKEND_PROVIDER, objective_solver_param_device=COMPUTE_DEVICE, objective_solver_param_runtime=COMPUTE_RUNTIME, diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index a4e3832..d8d178e 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -10,10 +10,10 @@ class Dataset(BaseDataset): parameters = { "n_samples, n_features": [ - (20_000_000, 100), - (15_000, 15_000), - (2_000_000, 100), - (5000, 5000), + (200_000, 100), + (1500, 1500), + (200_000, 10), + (500, 500), ], "n_targets": [1, 5, 20], "dtype": ["float32"], From d1d8760581c524aca4be0b19152c72c3d8697b0b Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 11:06:28 +0100 Subject: [PATCH 04/43] add results.csv file --- benchmarks/ridge/results.csv | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 benchmarks/ridge/results.csv diff --git a/benchmarks/ridge/results.csv b/benchmarks/ridge/results.csv new file mode 100644 index 0000000..68de113 --- /dev/null +++ b/benchmarks/ridge/results.csv @@ -0,0 +1,25 @@ +Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Data sample weights,alpha,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result objective value,Data random state,Solver random state +3e6d9fa7,float32,200000,100,20,None,1.0,0.313,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,9653625.760253906,123,123 +e7a310cb,float32,200000,100,20,random,1.0,0.355,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,4837163.777099609,123,123 +717e20b6,float32,200000,100,5,None,1.0,0.292,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2390454.421310425,123,123 +34fcc214,float32,200000,100,5,random,1.0,0.341,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1199593.1394348145,123,123 +f9ad376b,float32,200000,100,1,None,1.0,0.537,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,667870.030544281,123,123 +bd618e32,float32,200000,100,1,random,1.0,0.329,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,335730.99897003174,123,123 +b1164905,float32,200000,10,20,None,1.0,0.0513,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,978816.2872009276,123,123 +227daaba,float32,200000,10,20,random,1.0,0.0537,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,490945.86505126953,123,123 +188adee3,float32,200000,10,5,None,1.0,0.0451,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,178935.9187784195,123,123 +7c6da6dd,float32,200000,10,5,random,1.0,0.0471,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,89726.84803056717,123,123 +6e8b775b,float32,200000,10,1,None,1.0,0.0385,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,71637.0589671135,123,123 +f355d572,float32,200000,10,1,random,1.0,0.032,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,35833.32835125923,123,123 +46bef6c6,float32,1500,1500,20,None,1.0,0.426,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,475352.138671875,123,123 +561d0ce5,float32,1500,1500,20,random,1.0,0.469,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,295619.1181640625,123,123 +79df633d,float32,1500,1500,5,None,1.0,0.425,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,34620.72705078125,123,123 +9e51b4f6,float32,1500,1500,5,random,1.0,0.45,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,21469.46875,123,123 +63405b3d,float32,1500,1500,1,None,1.0,0.432,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2250.33251953125,123,123 +784cd81e,float32,1500,1500,1,random,1.0,0.412,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1258.864501953125,123,123 +4fdd16bc,float32,500,500,20,None,1.0,0.0515,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,101646.53369140624,123,123 +48999078,float32,500,500,20,random,1.0,0.0718,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,66861.75463867188,123,123 +28e582c7,float32,500,500,5,None,1.0,0.0519,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,8771.281860351562,123,123 +93625d55,float32,500,500,5,random,1.0,0.0507,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,5395.750244140625,123,123 +33f75d20,float32,500,500,1,None,1.0,0.0512,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,377.2563629150391,123,123 +f89a30fa,float32,500,500,1,random,1.0,0.0919,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,242.02552032470703,123,123 From 893f67e58475d49ce2b177dc891384d6c15b148b Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 11:58:20 +0100 Subject: [PATCH 05/43] Increase dimensions / update results --- benchmarks/ridge/datasets/simulated_blobs.py | 7 ++- .../benchopt_run_2024-01-12_11h52m30.parquet | Bin 0 -> 32880 bytes benchmarks/ridge/results.csv | 52 ++++++++++-------- 3 files changed, 33 insertions(+), 26 deletions(-) create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-12_11h52m30.parquet diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index d8d178e..e8db00c 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -10,10 +10,11 @@ class Dataset(BaseDataset): parameters = { "n_samples, n_features": [ - (200_000, 100), + (20_000_000, 100), + (5000, 5000), + (20_000_000, 10), + (2_000_000, 100), (1500, 1500), - (200_000, 10), - (500, 500), ], "n_targets": [1, 5, 20], "dtype": ["float32"], diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-12_11h52m30.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-12_11h52m30.parquet new file mode 100644 index 0000000000000000000000000000000000000000..4d45266494158aaeb442d33412c98af44a8fc6af GIT binary patch literal 32880 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 Date: Fri, 12 Jan 2024 12:06:10 +0100 Subject: [PATCH 06/43] Order sheets alphabetically, ignore casing --- benchmarks/kmeans/consolidate_result_csv.py | 3 +-- benchmarks/pca/consolidate_result_csv.py | 3 +-- benchmarks/ridge/consolidate_result_csv.py | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/benchmarks/kmeans/consolidate_result_csv.py b/benchmarks/kmeans/consolidate_result_csv.py index 00ef838..81e9a50 100644 --- a/benchmarks/kmeans/consolidate_result_csv.py +++ b/benchmarks/kmeans/consolidate_result_csv.py @@ -2,7 +2,6 @@ from functools import partial from io import BytesIO from itertools import zip_longest -from operator import attrgetter import numpy as np import pandas as pd @@ -403,7 +402,7 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): ) # ensure worksheets are sorted anti-alphabetically sheet.reorder_worksheets( - sorted(sheet.worksheets(), key=attrgetter("title"), reverse=True) + sorted(sheet.worksheets(), key=lambda worksheet: worksheet.title.lower()) ) # upload all values diff --git a/benchmarks/pca/consolidate_result_csv.py b/benchmarks/pca/consolidate_result_csv.py index e4e1a3f..fc34b3f 100644 --- a/benchmarks/pca/consolidate_result_csv.py +++ b/benchmarks/pca/consolidate_result_csv.py @@ -2,7 +2,6 @@ from functools import partial from io import BytesIO from itertools import zip_longest -from operator import attrgetter import numpy as np import pandas as pd @@ -401,7 +400,7 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): ) # ensure worksheets are sorted anti-alphabetically sheet.reorder_worksheets( - sorted(sheet.worksheets(), key=attrgetter("title"), reverse=True) + sorted(sheet.worksheets(), key=lambda worksheet: worksheet.title.lower()) ) # upload all values diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index fd5cc2f..a991669 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -407,9 +407,7 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): GOOGLE_WORKSHEET_NAME, rows=n_rows + 1, cols=n_cols ) # ensure worksheets are sorted anti-alphabetically - sheet.reorder_worksheets( - sorted(sheet.worksheets(), key=attrgetter("title"), reverse=True) - ) + sheet.reorder_worksheets(sorted(sheet.worksheets(), key=attrgetter("title"))) # upload all values worksheet.update( From 2be4ee7b9683f73f3bdf6c070cc2f4f47cd085d3 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:08:02 +0100 Subject: [PATCH 07/43] do not display alpha column in the spreadsheet --- benchmarks/ridge/consolidate_result_csv.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index a991669..3b152d2 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -38,7 +38,6 @@ DATA_RANDOM_STATE = "Data random state" DATA_SAMPLE_WEIGHTS = "Data sample weights" DTYPE = "Dtype" -ALPHA = "alpha" NB_DATA_FEATURES = "Nb data features" NB_DATA_SAMPLES = "Nb data samples" NB_DATA_TARGETS = "Nb data targets" @@ -68,7 +67,6 @@ NB_DATA_FEATURES, NB_DATA_TARGETS, DATA_SAMPLE_WEIGHTS, - ALPHA, WALLTIME, BACKEND_PROVIDER, COMPUTE_DEVICE, @@ -96,7 +94,6 @@ NB_DATA_SAMPLES: np.int64, NB_DATA_FEATURES: np.int64, NB_DATA_TARGETS: np.int64, - ALPHA: np.float64, DATA_SAMPLE_WEIGHTS: str, WALLTIME: np.float64, BACKEND_PROVIDER: str, @@ -150,7 +147,6 @@ (NB_DATA_FEATURES, False), (NB_DATA_TARGETS, False), (DATA_SAMPLE_WEIGHTS, True), - (ALPHA, False), (WALLTIME, True), (BACKEND_PROVIDER, True), (COMPUTE_DEVICE, True), @@ -183,7 +179,6 @@ objective_dataset_param_n_targets=NB_DATA_TARGETS, objective_dataset_param_dtype=DTYPE, objective_dataset_param_random_state=DATA_RANDOM_STATE, - objective_objective_param_alpha=ALPHA, objective_objective_param_random_state=SOLVER_RANDOM_STATE, objective_objective_param_sample_weight=DATA_SAMPLE_WEIGHTS, objective_solver_param___name=BACKEND_PROVIDER, From 04803544a1c63ba90d9720c6120e680343ca4c58 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:16:36 +0100 Subject: [PATCH 08/43] Fix solver column --- benchmarks/ridge/consolidate_result_csv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 3b152d2..4cc59d1 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -181,10 +181,10 @@ objective_dataset_param_random_state=DATA_RANDOM_STATE, objective_objective_param_random_state=SOLVER_RANDOM_STATE, objective_objective_param_sample_weight=DATA_SAMPLE_WEIGHTS, + objective_objective_param_solver=SOLVER, objective_solver_param___name=BACKEND_PROVIDER, objective_solver_param_device=COMPUTE_DEVICE, objective_solver_param_runtime=COMPUTE_RUNTIME, - objective_solver_param_solver=SOLVER, objective_solver_param_comment=COMMENT, objective_solver_param_version_info=VERSION_INFO, objective_solver_param_run_date=RUN_DATE, From 00005f02e446383b99dbebc2c16bdb2e3da778f2 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:25:03 +0100 Subject: [PATCH 09/43] move data copy and objective evaluation in objective dedicated methods --- benchmarks/ridge/objective.py | 34 ++++++++++++++++++++---- benchmarks/ridge/solvers/scikit_learn.py | 29 +++++--------------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 40b2713..9242ecc 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -4,6 +4,7 @@ with safe_import_context() as import_ctx: import numpy as np + from sklearn.linear_model._base import _rescale_data class Objective(BaseObjective): @@ -47,7 +48,21 @@ def set_data(self, X, y, **dataset_parameters): self.sample_weight_ = sample_weight self.dataset_parameters = dataset_parameters - def evaluate_result(self, objective, **solver_parameters): + def evaluate_result(self, weights, intercept, **solver_parameters): + # NB: weights, intercept expected to be numpy arrays + + X, y = self.X, self.y + if self.sample_weight_ is not None: + X, y, _ = _rescale_data(X, y, self.sample_weight_, inplace=False) + + y = y.reshape((y.shape[0], -1)) + weights = weights.reshape((-1, X.shape[1], 1)) + + value = ( + (((X @ weights).squeeze(2) + (intercept - y).T) ** 2).sum() + + (self.alpha * (weights**2).sum()) + ) / (X.shape[0] * len(y.T)) + all_parameters = dict(solver_param_run_date=datetime.today()) all_parameters.update( { @@ -65,7 +80,7 @@ def evaluate_result(self, objective, **solver_parameters): {("solver_param_" + key): value for key, value in solver_parameters.items()} ) return dict( - value=objective, + value=value, objective_param___name=self.name, **all_parameters, ) @@ -74,10 +89,19 @@ def get_one_result(self): return dict(objective=1) def get_objective(self): + # Copy the data before sending to the solver, to ensure that no unfortunate + # side effects can happen + X = self.X.copy() + y = self.y.copy() + + sample_weight = self.sample_weight_ + if hasattr(sample_weight, "copy"): + sample_weight = sample_weight.copy() + return dict( - X=self.X, - y=self.y, - sample_weight=self.sample_weight_, + X=X, + y=y, + sample_weight=sample_weight, alpha=self.alpha, fit_intercept=self.fit_intercept, solver=self.solver, diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index dec54da..4b5c4eb 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -5,7 +5,6 @@ with safe_import_context() as import_ctx: from sklearn.linear_model import Ridge - from sklearn.linear_model._base import _rescale_data class Solver(BaseSolver): @@ -26,15 +25,9 @@ def set_objective( tol, random_state, ): - # Copy the data before running the benchmark to ensure that no unfortunate side - # effects can happen - self.X = X.copy() - self.y = y.copy() - - if hasattr(sample_weight, "copy"): - sample_weight = sample_weight.copy() + self.X = X + self.y = y self.sample_weight = sample_weight - self.alpha = alpha self.fit_intercept = fit_intercept self.solver = solver @@ -54,23 +47,13 @@ def run(self, _): random_state=self.random_state, ).fit(self.X, self.y, self.sample_weight) - self.coef_ = estimator.coef_ + self.weights = estimator.coef_ + self.intercept = estimator.intercept_ def get_result(self): - X, y = self.X, self.y - if self.sample_weight is not None: - X, y, _ = _rescale_data(X, y, self.sample_weight, inplace=True) - - y = y.reshape((y.shape[0], -1)) - - coef_ = self.coef_.reshape((-1, X.shape[1], 1)) - - objective = ((y.T - (X @ coef_).squeeze(2)) ** 2).sum() + ( - len(y.T) * self.alpha * (coef_**2).sum() - ) - return dict( - objective=objective, + weights=self.weights, + intercept=self.intercept, version_info=f"scikit-learn {version('scikit-learn')}", __name=self.name, **self._parameters, From 0bcb8908c542feb006e3f59722127b292c6c0df8 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:09:35 +0100 Subject: [PATCH 10/43] Update results.csv --- benchmarks/ridge/results.csv | 62 ++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/benchmarks/ridge/results.csv b/benchmarks/ridge/results.csv index b849b5e..e2c2e4c 100644 --- a/benchmarks/ridge/results.csv +++ b/benchmarks/ridge/results.csv @@ -1,31 +1,31 @@ -Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Data sample weights,alpha,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result objective value,Data random state,Solver random state -a78d35ba,float32,20000000,100,20,None,1.0,56,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,922550919.371338,123,123 -8b1100fe,float32,20000000,100,20,random,1.0,59.6,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,461288551.440918,123,123 -17b28ecb,float32,20000000,100,5,None,1.0,55.5,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,129293185.74858856,123,123 -1860575f,float32,20000000,100,5,random,1.0,58.4,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,64640129.75015259,123,123 -2e28ac06,float32,20000000,100,1,None,1.0,54.7,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,28933007.926410675,123,123 -c8f238fc,float32,20000000,100,1,random,1.0,60.8,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,14463809.926801682,123,123 -f7f7d3ec,float32,20000000,10,20,None,1.0,4.3,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,99911837.59606934,123,123 -d73672fb,float32,20000000,10,20,random,1.0,5.46,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,49956789.596069336,123,123 -32dcde45,float32,20000000,10,5,None,1.0,3.81,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,23062447.030111317,123,123 -ab137d0c,float32,20000000,10,5,random,1.0,4.39,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,11530631.03193283,123,123 -811a6242,float32,20000000,10,1,None,1.0,2.9,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,8171019.225429058,123,123 -f3eb07b0,float32,20000000,10,1,random,1.0,3.38,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,4085583.225161791,123,123 -aadcc062,float32,2000000,100,20,None,1.0,6.8,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,93357177.85253906,123,123 -b94007e8,float32,2000000,100,20,random,1.0,7.24,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,46702286.408569336,123,123 -95cf6cca,float32,2000000,100,5,None,1.0,5.8,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,20061771.567626957,123,123 -573fa149,float32,2000000,100,5,random,1.0,6.1,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,10032954.551605225,123,123 -32973908,float32,2000000,100,1,None,1.0,5.54,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,4566305.682353973,123,123 -91a6dbe0,float32,2000000,100,1,random,1.0,7.53,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2284366.68109703,123,123 -fa82693a,float32,5000,5000,20,None,1.0,7.65,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2797818.703125,123,123 -d5d61723,float32,5000,5000,20,random,1.0,7.73,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1539654.8515625,123,123 -cb92ea74,float32,5000,5000,5,None,1.0,7.73,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,199817.18359375,123,123 -5c90e258,float32,5000,5000,5,random,1.0,7.73,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,109143.365234375,123,123 -62f48fdb,float32,5000,5000,1,None,1.0,7.66,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,11393.48388671875,123,123 -6d09b315,float32,5000,5000,1,random,1.0,7.77,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,5781.953369140625,123,123 -46bef6c6,float32,1500,1500,20,None,1.0,0.426,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,475352.138671875,123,123 -561d0ce5,float32,1500,1500,20,random,1.0,0.477,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,295619.1181640625,123,123 -79df633d,float32,1500,1500,5,None,1.0,0.441,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,34620.72705078125,123,123 -9e51b4f6,float32,1500,1500,5,random,1.0,0.435,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,21469.46875,123,123 -63405b3d,float32,1500,1500,1,None,1.0,0.436,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2250.33251953125,123,123 -784cd81e,float32,1500,1500,1,random,1.0,0.468,scikit-learn,,,,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1258.864501953125,123,123 +Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Data sample weights,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result objective value,Data random state,Solver random state +a78d35ba,float32,20000000,100,20,None,55.8,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.306357464921417,123,123 +8b1100fe,float32,20000000,100,20,random,58.9,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.1532024249301147,123,123 +17b28ecb,float32,20000000,100,5,None,54.9,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.292928387497177,123,123 +1860575f,float32,20000000,100,5,random,57.7,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.6463988675003052,123,123 +2e28ac06,float32,20000000,100,1,None,53.9,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.4466487963205337,123,123 +c8f238fc,float32,20000000,100,1,random,60.5,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.723188996340084,123,123 +f7f7d3ec,float32,20000000,10,20,None,4.53,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.2497772326995086,123,123 +d73672fb,float32,20000000,10,20,random,5.38,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.1248897226995086,123,123 +32dcde45,float32,20000000,10,5,None,3.66,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.2306240220602226,123,123 +ab137d0c,float32,20000000,10,5,random,4.38,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.1153058720638656,123,123 +811a6242,float32,20000000,10,1,None,2.93,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.4085507112714529,123,123 +f3eb07b0,float32,20000000,10,1,random,3.45,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.2042790112580895,123,123 +aadcc062,float32,2000000,100,20,None,5.84,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.3337219423156736,123,123 +b94007e8,float32,2000000,100,20,random,6.96,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.1673499430107117,123,123 +95cf6cca,float32,2000000,100,5,None,5.77,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.006134111352539,123,123 +573fa149,float32,2000000,100,5,random,6.3,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.0032485110321046,123,123 +32973908,float32,2000000,100,1,None,5.41,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.283151841176987,123,123 +91a6dbe0,float32,2000000,100,1,random,7.02,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.1421833405485151,123,123 +fa82693a,float32,5000,5000,20,None,7.58,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.46500453125,123,123 +d5d61723,float32,5000,5000,20,random,7.7,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.2509208203125,123,123 +cb92ea74,float32,5000,5000,5,None,7.59,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.539740703125,123,123 +5c90e258,float32,5000,5000,5,random,7.63,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.2494446484375,123,123 +62f48fdb,float32,5000,5000,1,None,7.55,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,2.20544296875,123,123 +6d09b315,float32,5000,5000,1,random,7.59,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.164737255859375,123,123 +46bef6c6,float32,1500,1500,20,None,0.44,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.2916935872395834,123,123 +561d0ce5,float32,1500,1500,20,random,0.443,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.750314453125,123,123 +79df633d,float32,1500,1500,5,None,0.425,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.4401695963541667,123,123 +9e51b4f6,float32,1500,1500,5,random,0.46,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.7841548177083333,123,123 +63405b3d,float32,1500,1500,1,None,0.424,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,1.2072095540364582,123,123 +784cd81e,float32,1500,1500,1,random,0.479,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-12,scikit-learn 1.3.2,,0.6977200317382812,123,123 From 82b3ec5176de844f29a5df730fa0434e3ea3f2f8 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 14:27:21 +0100 Subject: [PATCH 11/43] update yaml --- .github/workflows/sync_benchmark_files_to_gsheet.yaml | 4 ++-- .github/workflows/test_cpu_benchmarks.yaml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sync_benchmark_files_to_gsheet.yaml b/.github/workflows/sync_benchmark_files_to_gsheet.yaml index 24505a6..c99700b 100644 --- a/.github/workflows/sync_benchmark_files_to_gsheet.yaml +++ b/.github/workflows/sync_benchmark_files_to_gsheet.yaml @@ -24,11 +24,11 @@ jobs: run: | python ./benchmarks/kmeans/consolidate_result_csv.py ./benchmarks/kmeans/results.csv --check-csv python ./benchmarks/pca/consolidate_result_csv.py ./benchmarks/pca/results.csv --check-csv - python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/pca/results.csv --check-csv + python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/ridge/results.csv --check-csv echo "$GSPREAD_SERVICE_ACCOUNT_AUTH_KEY" > service_account.json python ./benchmarks/kmeans/consolidate_result_csv.py ./benchmarks/kmeans/results.csv \ --sync-to-gspread --gspread-url $GSPREAD_URL --gspread-auth-key ./service_account.json python ./benchmarks/pca/consolidate_result_csv.py ./benchmarks/pca/results.csv \ --sync-to-gspread --gspread-url $GSPREAD_URL --gspread-auth-key ./service_account.json - python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/pca/results.csv \ + python ./benchmarks/ridge/consolidate_result_csv.py ./benchmarks/ridge/results.csv \ --sync-to-gspread --gspread-url $GSPREAD_URL --gspread-auth-key ./service_account.json diff --git a/.github/workflows/test_cpu_benchmarks.yaml b/.github/workflows/test_cpu_benchmarks.yaml index 31cfda8..4bb5cc5 100644 --- a/.github/workflows/test_cpu_benchmarks.yaml +++ b/.github/workflows/test_cpu_benchmarks.yaml @@ -144,4 +144,4 @@ jobs: cd ../pca benchopt run --no-plot -l -d Simulated_correlated_data[n_samples=100,n_features=100] cd ../ridge - benchopt run --no-plot -l -d Simulated_correlated_data[n_samples=100,n_features=100] # TODO add relevant parameters + benchopt run --no-plot -l -d Simulated_correlated_data[n_samples=100,n_features=100,n_targets=2] From 0ce20138a74fabb499dd5053177a77eb25bbac93 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 19:45:22 +0100 Subject: [PATCH 12/43] Trigger ci after fix From 6bb0aa520e176c271182a40488b67da82cce577a Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 20:50:27 +0100 Subject: [PATCH 13/43] Adress review Co-authored-by: Olivier Grisel --- benchmarks/ridge/consolidate_result_csv.py | 8 +------- benchmarks/ridge/datasets/simulated_blobs.py | 7 +++---- benchmarks/ridge/objective.py | 16 ++++++++++++++-- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 4cc59d1..ddf5938 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -36,7 +36,6 @@ COMPUTE_DEVICE = "Compute device" COMPUTE_RUNTIME = "Compute runtime" DATA_RANDOM_STATE = "Data random state" -DATA_SAMPLE_WEIGHTS = "Data sample weights" DTYPE = "Dtype" NB_DATA_FEATURES = "Nb data features" NB_DATA_SAMPLES = "Nb data samples" @@ -66,7 +65,6 @@ NB_DATA_SAMPLES, NB_DATA_FEATURES, NB_DATA_TARGETS, - DATA_SAMPLE_WEIGHTS, WALLTIME, BACKEND_PROVIDER, COMPUTE_DEVICE, @@ -94,7 +92,6 @@ NB_DATA_SAMPLES: np.int64, NB_DATA_FEATURES: np.int64, NB_DATA_TARGETS: np.int64, - DATA_SAMPLE_WEIGHTS: str, WALLTIME: np.float64, BACKEND_PROVIDER: str, COMPUTE_DEVICE: str, @@ -116,7 +113,7 @@ COMMENT: str, } -COLUMNS_WITH_NONE_STRING = [DATA_SAMPLE_WEIGHTS] +COLUMNS_WITH_NONE_STRING = [] # If all those fields have equal values for two given benchmarks, then the oldest # benchmark (given by RUN_DATE) will be discarded @@ -126,7 +123,6 @@ NB_DATA_SAMPLES, NB_DATA_FEATURES, NB_DATA_TARGETS, - DATA_SAMPLE_WEIGHTS, BACKEND_PROVIDER, SOLVER, COMPUTE_DEVICE, @@ -146,7 +142,6 @@ (NB_DATA_SAMPLES, False), (NB_DATA_FEATURES, False), (NB_DATA_TARGETS, False), - (DATA_SAMPLE_WEIGHTS, True), (WALLTIME, True), (BACKEND_PROVIDER, True), (COMPUTE_DEVICE, True), @@ -180,7 +175,6 @@ objective_dataset_param_dtype=DTYPE, objective_dataset_param_random_state=DATA_RANDOM_STATE, objective_objective_param_random_state=SOLVER_RANDOM_STATE, - objective_objective_param_sample_weight=DATA_SAMPLE_WEIGHTS, objective_objective_param_solver=SOLVER, objective_solver_param___name=BACKEND_PROVIDER, objective_solver_param_device=COMPUTE_DEVICE, diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index e8db00c..74daf4a 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -10,13 +10,12 @@ class Dataset(BaseDataset): parameters = { "n_samples, n_features": [ - (20_000_000, 100), + (10_000_000, 100), (5000, 5000), - (20_000_000, 10), + (10_000_000, 10), (2_000_000, 100), - (1500, 1500), ], - "n_targets": [1, 5, 20], + "n_targets": [1, 10], "dtype": ["float32"], "random_state": [123], } diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 9242ecc..1a7dc89 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -21,7 +21,7 @@ class Objective(BaseObjective): "alpha": [1.0], "fit_intercept": [True], "solver, max_iter, tol": [("svd", None, 0)], - "sample_weight": ["None", "random"], + "sample_weight": ["None"], # NB: add "random" to test non None weights "random_state": [123], } @@ -86,7 +86,19 @@ def evaluate_result(self, weights, intercept, **solver_parameters): ) def get_one_result(self): - return dict(objective=1) + n_features = self.dataset_parameters["n_features"] + n_targets = self.dataset_parameters["n_targets"] + if n_targets == 1: + weights = np.ones((n_features,)) + else: + weights = np.ones( + ( + n_targets, + n_features, + ) + ) + + return dict(weights=weights, intercept=np.ones((n_targets,))) def get_objective(self): # Copy the data before sending to the solver, to ensure that no unfortunate From 5fddbac562c376ee4fba3582b6bbc458db25801f Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Fri, 12 Jan 2024 21:11:21 +0100 Subject: [PATCH 14/43] Tune down dataset size and update results --- benchmarks/ridge/datasets/simulated_blobs.py | 4 +- .../benchopt_run_2024-01-12_11h52m30.parquet | Bin 32880 -> 0 bytes .../benchopt_run_2024-01-12_21h05m55.parquet | Bin 0 -> 32152 bytes benchmarks/ridge/results.csv | 40 ++++-------------- 4 files changed, 11 insertions(+), 33 deletions(-) delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-12_11h52m30.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-12_21h05m55.parquet diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index 74daf4a..68e40f4 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -10,9 +10,9 @@ class Dataset(BaseDataset): parameters = { "n_samples, n_features": [ - (10_000_000, 100), + (5_000_000, 100), (5000, 5000), - (10_000_000, 10), + (5_000_000, 10), (2_000_000, 100), ], "n_targets": [1, 10], diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-12_11h52m30.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-12_11h52m30.parquet deleted file mode 100644 index 4d45266494158aaeb442d33412c98af44a8fc6af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32880 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 Date: Mon, 15 Jan 2024 10:22:21 +0100 Subject: [PATCH 15/43] Add other scikit-learn solvers --- benchmarks/ridge/objective.py | 10 +++++++++- benchmarks/ridge/solvers/scikit_learn.py | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 1a7dc89..98056c7 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -20,7 +20,15 @@ class Objective(BaseObjective): parameters = { "alpha": [1.0], "fit_intercept": [True], - "solver, max_iter, tol": [("svd", None, 0)], + "solver, max_iter, tol": [ + ("svd", None, 0), + ("cholesky", None, 0), + ("lsqr", 25, 0), + ("sparse_cg", 25, 0), + ("sag", 50, 0), + ("saga", 25, 0), + ("lbfgs", 100, 0), + ], "sample_weight": ["None"], # NB: add "random" to test non None weights "random_state": [123], } diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 4b5c4eb..8ebef71 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -35,6 +35,23 @@ def set_objective( self.tol = tol self.random_state = random_state + def skip(self, **objective_dict): + y = objective_dict["y"] + solver = objective_dict["solver"] + + if solver == "sparse_cg": + # TODO: investigate ? seems to freeze or take very long time + return True, "sparse_cg doesn't seem to work well at the moment ?" + + is_multitarget = (y.ndim == 2) and (y.shape[1] > 1) + + if is_multitarget and solver.startswith("sag"): + # TODO: investigate ? it freezes or take very long time + # at most should multiply single-target time by number of targets. + return True, "sag and saga doesn't support well multitarget." + + return False, None + def run(self, _): estimator = Ridge( alpha=self.alpha, From 50a2cd5158f370d8a7ea9ee74a8572539a50a498 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:09:12 +0100 Subject: [PATCH 16/43] Skip sag, saga, sparse_cg and lbfgs ~ much too slow ? --- benchmarks/ridge/solvers/scikit_learn.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 8ebef71..0d49ac0 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -36,19 +36,14 @@ def set_objective( self.random_state = random_state def skip(self, **objective_dict): - y = objective_dict["y"] solver = objective_dict["solver"] - if solver == "sparse_cg": - # TODO: investigate ? seems to freeze or take very long time - return True, "sparse_cg doesn't seem to work well at the moment ?" - - is_multitarget = (y.ndim == 2) and (y.shape[1] > 1) - - if is_multitarget and solver.startswith("sag"): - # TODO: investigate ? it freezes or take very long time - # at most should multiply single-target time by number of targets. - return True, "sag and saga doesn't support well multitarget." + if solver in ["sag", "saga", "sparse_cg", "lbfgs"]: + # TODO: investigate ? + return True, ( + "Preliminary testing show this solver is too slow to have relevance " + "in the benchmark." + ) return False, None @@ -66,11 +61,13 @@ def run(self, _): self.weights = estimator.coef_ self.intercept = estimator.intercept_ + self.n_iter_ = estimator.n_iter_ def get_result(self): return dict( weights=self.weights, intercept=self.intercept, + n_iter=self.n_iter_, version_info=f"scikit-learn {version('scikit-learn')}", __name=self.name, **self._parameters, From ca4077f32c8c767b9f580c609ef9fef65c05fe49 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:13:29 +0100 Subject: [PATCH 17/43] Add number of iterations --- benchmarks/ridge/consolidate_result_csv.py | 12 +++++------- benchmarks/ridge/objective.py | 3 ++- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index ddf5938..25b2cf2 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -48,9 +48,7 @@ SYSTEM_PROCESSOR = "Cpu name" SYSTEM_RAM = "RAM (GB)" SYSTEM_GPU = "Gpu name" -# TODO: add number of iterations once iteration-based solvers are -# added to the benchmark. -# RESULT_NB_ITERATIONS = "Result nb iterations" +RESULT_NB_ITERATIONS = "Result nb iterations" OBJECTIVE_FUNCTION_VALUE = "Result objective value" VERSION_INFO = "Version info" RUN_DATE = "Run date" @@ -80,7 +78,7 @@ RUN_DATE, VERSION_INFO, COMMENT, - # RESULT_NB_ITERATIONS, + RESULT_NB_ITERATIONS, OBJECTIVE_FUNCTION_VALUE, DATA_RANDOM_STATE, SOLVER_RANDOM_STATE, @@ -96,7 +94,7 @@ BACKEND_PROVIDER: str, COMPUTE_DEVICE: str, COMPUTE_RUNTIME: str, - # RESULT_NB_ITERATIONS: np.int64, + RESULT_NB_ITERATIONS: np.int64, OBJECTIVE_FUNCTION_VALUE: np.float64, SOLVER: str, PLATFORM: str, @@ -146,7 +144,7 @@ (BACKEND_PROVIDER, True), (COMPUTE_DEVICE, True), (COMPUTE_RUNTIME, True), - # (RESULT_NB_ITERATIONS, True), + (RESULT_NB_ITERATIONS, True), (OBJECTIVE_FUNCTION_VALUE, False), (SOLVER, True), (SYSTEM_GPU, True), @@ -168,7 +166,7 @@ PARQUET_TABLE_DISPLAY_MAPPING = dict( time=WALLTIME, objective_value=OBJECTIVE_FUNCTION_VALUE, - # objective_n_iter=RESULT_NB_ITERATIONS, + objective_n_iter=RESULT_NB_ITERATIONS, objective_dataset_param_n_samples=NB_DATA_SAMPLES, objective_dataset_param_n_features=NB_DATA_FEATURES, objective_dataset_param_n_targets=NB_DATA_TARGETS, diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 98056c7..94c241c 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -56,7 +56,7 @@ def set_data(self, X, y, **dataset_parameters): self.sample_weight_ = sample_weight self.dataset_parameters = dataset_parameters - def evaluate_result(self, weights, intercept, **solver_parameters): + def evaluate_result(self, weights, intercept, n_iter, **solver_parameters): # NB: weights, intercept expected to be numpy arrays X, y = self.X, self.y @@ -89,6 +89,7 @@ def evaluate_result(self, weights, intercept, **solver_parameters): ) return dict( value=value, + n_iter=n_iter, objective_param___name=self.name, **all_parameters, ) From 2f9d3690b302f484b52d047683f57374ed4c6092 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 16:33:56 +0100 Subject: [PATCH 18/43] fix n_iter report --- benchmarks/ridge/solvers/scikit_learn.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 0d49ac0..202e720 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -64,10 +64,20 @@ def run(self, _): self.n_iter_ = estimator.n_iter_ def get_result(self): + n_iter = self.n_iter_ + if isinstance(n_iter, list): + n_iter = set(n_iter) + if len(n_iter) > 1: + raise ValueError( + "In multitarget mode, the same number of iterations is expected " + "for all targets, to keep reports comparable." + ) + n_iter = n_iter.pop() + return dict( weights=self.weights, intercept=self.intercept, - n_iter=self.n_iter_, + n_iter=n_iter, version_info=f"scikit-learn {version('scikit-learn')}", __name=self.name, **self._parameters, From 1cf65692f18ff0e8a5ccc59e5d765517a0bcf928 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:06:32 +0100 Subject: [PATCH 19/43] fix n_iter report --- benchmarks/ridge/consolidate_result_csv.py | 4 +++- benchmarks/ridge/objective.py | 18 ++++++++++++++++++ benchmarks/ridge/solvers/scikit_learn.py | 12 +----------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 25b2cf2..2933f92 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -94,7 +94,9 @@ BACKEND_PROVIDER: str, COMPUTE_DEVICE: str, COMPUTE_RUNTIME: str, - RESULT_NB_ITERATIONS: np.int64, + # NB: following should be int but str is more practical because it enables + # use of missing values for solver for which it doesn't apply. + RESULT_NB_ITERATIONS: str, OBJECTIVE_FUNCTION_VALUE: np.float64, SOLVER: str, PLATFORM: str, diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 94c241c..970fb21 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -1,3 +1,4 @@ +import numbers from datetime import datetime from benchopt import BaseObjective, safe_import_context @@ -87,6 +88,23 @@ def evaluate_result(self, weights, intercept, n_iter, **solver_parameters): all_parameters.update( {("solver_param_" + key): value for key, value in solver_parameters.items()} ) + + if not (isinstance(n_iter, numbers.Number) or (n_iter is None)): + n_iter = set(n_iter) + if len(n_iter) > 1: + raise ValueError( + "In multitarget mode, the same number of iterations is expected " + "for all targets, to keep reports comparable." + ) + n_iter = n_iter.pop() + + # NB: str for n_iter is a more practical type because it enables + # using missing values for solvers for which it doesn't apply + if n_iter is None: + n_iter = "" + else: + n_iter = str(n_iter) + return dict( value=value, n_iter=n_iter, diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 202e720..0d49ac0 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -64,20 +64,10 @@ def run(self, _): self.n_iter_ = estimator.n_iter_ def get_result(self): - n_iter = self.n_iter_ - if isinstance(n_iter, list): - n_iter = set(n_iter) - if len(n_iter) > 1: - raise ValueError( - "In multitarget mode, the same number of iterations is expected " - "for all targets, to keep reports comparable." - ) - n_iter = n_iter.pop() - return dict( weights=self.weights, intercept=self.intercept, - n_iter=n_iter, + n_iter=self.n_iter_, version_info=f"scikit-learn {version('scikit-learn')}", __name=self.name, **self._parameters, From 40fb09773092fe7e534e014c9447fa5cb633ee23 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:23:06 +0100 Subject: [PATCH 20/43] max_iter and tol out of benchmark unicity key ~ enable comparing solvers of different nature ? --- benchmarks/ridge/consolidate_result_csv.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 2933f92..c578289 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -22,8 +22,6 @@ "objective_dataset_param_random_state", "objective_objective_param_alpha", "objective_objective_param_fit_intercept", - "objective_objective_param_max_iter", - "objective_objective_param_tol", "objective_objective_param_sample_weight", "objective_objective_param_random_state", ] From 60556a8a93ed4e930baf8cd45ead87e99d6ef379 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:24:22 +0100 Subject: [PATCH 21/43] update results sheet --- benchmarks/ridge/consolidate_result_csv.py | 7 ++-- .../benchopt_run_2024-01-12_21h05m55.parquet | Bin 32152 -> 0 bytes .../benchopt_run_2024-01-15_18h08m05.parquet | Bin 0 -> 33467 bytes benchmarks/ridge/results.csv | 34 +++++++++++++----- 4 files changed, 30 insertions(+), 11 deletions(-) delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-12_21h05m55.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-15_18h08m05.parquet diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index c578289..0461d71 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -139,7 +139,7 @@ (DTYPE, True), (NB_DATA_SAMPLES, False), (NB_DATA_FEATURES, False), - (NB_DATA_TARGETS, False), + (NB_DATA_TARGETS, True), (WALLTIME, True), (BACKEND_PROVIDER, True), (COMPUTE_DEVICE, True), @@ -393,8 +393,11 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): worksheet = sheet.add_worksheet( GOOGLE_WORKSHEET_NAME, rows=n_rows + 1, cols=n_cols ) + # ensure worksheets are sorted anti-alphabetically - sheet.reorder_worksheets(sorted(sheet.worksheets(), key=attrgetter("title"))) + sheet.reorder_worksheets( + sorted(sheet.worksheets(), key=lambda worksheet: worksheet.title.lower()) + ) # upload all values worksheet.update( diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-12_21h05m55.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-12_21h05m55.parquet deleted file mode 100644 index 8a75507401f46d88fb8619091d8631417a06089f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32152 zcmeHQdu(IXnZM2qnanT@VT!#D4d4d29XgrBb{@o2rjzS9b{rB<;z=Cavyl36{Yd=6 zk2ncsJEiUHsOqlRwnEdYLL+Ur>hed0+AcyBt7W^0McTe!yFyjPA}x!m3XN6>RTX0Q z`_8@RzOUnu7t+>%eeXTzeBbYTobP<+al;%Jc3BTw->_JJZ<(=nSecUyQ@c?uGYk{X zr?b4HnJ5(M`67QQQK;k+=UfBM{!G5UoG;b+YKpJa&n;9Ne19>qzMO|A=R)NY-(O9X z(&gfEt)8g!=Uncg{#v3~De%ipKA+9ig*vrzVGZin*3$j;a^alwVJl-jX|?rRyWyWs zYiI8$bE>@05bXQS5VU;M(E;Dx7E3q7UhC|&9`6}pI=g%9C(6kcK2^`J@yn$|k+*i( zx@}iFZBKTxU+G}G{(oqvrypFCv34-<)eS!k1NRQ=z0^^=A3P4vYN`BczJ8{_C#od_ zCpxYyx2x_n>VN9Etp1w?|CDwAti|@cg?;*F_P57S`6@aZs)n$?ev9?$p&1YZd)SXV zr!v6&V!qfYKp#mjr^?kTfAr?((}{ZGQo6oT;m>6XvbL*K5CE82-H+ z6V5TyKVx3aGmOjf;=oUsqyM?`cb3<0?N~d}G5rhX^%Z6Snz}7Nzv<-4FPZl?Iwm)! zSD5Kvp-pVoJ5>FZ*9auY)>hYnqR z`H$=`ZJ9@2$#Xxu@pI%?C@)Z&RpSRdvw6I_6VSi`um1)XXCe#f@xWjrE z72y`=Q9uxc0W49^myM#xQK`@_UusZ4b*Jngw~=0&FJ)mA1fqO)gW!MKV*93reWsVa z@nLinnUs>MA=)nMaf|L}(zCwS{KZV9hC0)5! z_O`BCy_4A> z*72j>|C;C+|ImkDf8=LV76aiaMSB-*i^A)l>V$vyv@AUK4>98c`!^&#e7}Qz^JDA} z?gu^SDVp#x)Wf~jQ?v`8^ql}K>hxCY&!fz#6Y3gv%{`D%`tehPa({Ek!pK*ZL^V-d zUY5tL7c91yEbLPQ?9b0&|I?7yu``qk{90w*u6y3StMLzi|7VviUw-2+;P=HJ*#71- z@cZUZUUGj9eqZ^Q8z(*wzpwrGlUJ_5?~}o??k~XawcgFQ{|bKfu1!nqU6eLzUH?>P z-RFnoj(xYR1~C)~+Nd^4%P^QLt^Ex*`<@f5t><9E*HABKt)HOQzO&K;*i4fn1H<>2 zR<@fLY24v^56JFtmn=PIE;YWstaFCYjl)9cI4v zK$U;h-U9J^OY)H)8$U1z`X zaoOr0F_T+Lqe--T)na?i!hY#2`;rIju4iGw*hJU?N!Y__=BO;{F(M8bxHO_t0qtG1 z4sz5#Rf~Fz{o^NOQTxnAr4tA$>u)UVo9Ec4&w;FZ9wwX(WhHYln4*DUyC0;(BNajG z*0ON&P>RfGefcSfDaExz&#*6hWhq-2RLtdxkgr&5Kee#WaqK(eAf%py3134YVU|NX z^3A7?05)-Erj>7$Idw!VveOHtBrw5$byDtR=cCjsYCGCj$c~+&C4#{A_)=3U;=8>_JoD~ z;T-$)96Gs7*FZyLHE0IWLc~GLqQZm~Ls>-(!#;bl*V-YbwTjTF)e&8|6x9=9{}5(h z4c~9H@TBTjz>9penxP(m!xpV0dw}vOlq&nxlM%UJDMEu5FRYaks6vOjyvY7^LGn5! zbrYV3I#mgF7;xbtu2wKG&0&0QC*K*@Z{d)tWnd!4WsB{qh5b&HeIkm+S8~`I zDh(rAsM`oIY8zbpbJ+&0ta z+*)}-aVPb)>;}&?X8XgkY_@x3DOLF~EYjCtNdy-BGi4&|FD*9AA0A=9{s@}PfQun# zLv!xkTJE<~vS^C#q!LXr5fWB+pG&guBv7brukJ$hY%eVRmY2iQhxpRknG3UX%b~^D z<%Oy6Bj^tAx9lIfk|ibrN+8}Q`|%f?81-6^lxQl{d84e zp*B;l776n!7TaG#E}Ugw%b+UML=3G6$t(qQ?A}gbv_3YvJUVQEs8cAhi@zF7Pp!z9 ztQ6CkL^YLzt)&z$ffImVwAj7^xm})pB98#IGz}rTt)moT&nKYd?Z%Ha@;q0R<>{8>sq(N>Q4>UY!(w|2mNN_NE2}7qF;z2WhJuEyVJhfH zuiXQH?r}LT&dxa&8oXmRvEdkUIb5S>U7oWpmt%2Z!r^whjpE5YZ8WpDQ%R$e-#luh z5;4XQ>wdq(_5+xOR@kqVQ6=s0Xb*^?x>Q4-1Hj@(>$vtV2YHU;E4{KoE=jNDr%+8f zra#}1$CI0D8?`!LJd>(4YD7?B1pii@{X-1~4LvOr4u)bpV*Mnw`r!C!KoNxP*}|#t z{f;PKE?K(L7xTE=>KJyrhQp4Dxkbmg!#yzU3`}img$13TR<%Yd=FRQfsjN}YI~xjT z5Y(Sw#ObY8U-m9qB445D^iMU? z|Ig#HbKELQ56g3oQvvV&3I}=pQ|xy>1rDO8XTrr$6kYraMS{K{=ir8&XC0|VI z4LqQg4ODJ5tY|lWtda1!&sbyw9~V3M8RSOf6NBGn3;W8aN%Y$mD?>4Rt&SPoGKReA z#4wITt^xPxzz|$ur|z?|{jhy39WUq<8UEgs~>?#UgS%4kj7!VX0ctjus{DSET?|fg5t>34Wa4=P1gXJz;MtMO6))o zYXClFjJf=mGDy1w64Jqnu;V0*me;RX*x!Gi;zBYKIYV@9=QHnJ1@?5Fbz71zrE*yPx5R=v0ei~0Ay(~K~=4oY-uRL78GlTT1{F2bfKZ} z0-6bRs!)NpGR*P??k%vYCesuI(rt6*Dllkg+DD0F7g2y#xuV)>Q5QzD8$o!aBh5LK z#Ep}FWer^#ZCohEYFda|QRZKQ=-t|sLs?xrA`4AagP2%-q(ct7WNd&_be%KU9Y+q^ z$vA-rm{4XqUQj;xOdYXl3F=QDOo{ev-95cM?|$@8XT`wAiqnGz=N8z#JJ0o}vp|qe z2`BQ{y+5nN?%lx}b~g^lu)B27h24jPDC`~|_h9$$L zbhnG$wQVYPuQr$1ec$C_KTw+}?EY+Wupj8n0(Sov^Vxk~Ro}x^aCQ&YuGt+gNZX#D zv30XuwwHaksy6qaMcG#-m-jO zzoQS|)`JJ7Mxg+A@D60P4!2HnU9Q087`f!}()IYma3j!z6Ba<67s;xrWb%9=O^$8L zlm%GJ_^uc{>}!Kmqp20G zD9~_(7jj33iT|mrFFjTmU$0(#Jy-dzlAf{dbtbH$fv`On)S&=JRlc62$6!!lcM*u5 zq@+K-+YeX3zZ&Nv(Snxdc;GkLRv zyk?{4Yfxd&AjrIgeIj8WqZKCe78;N{?+)VINTSP$hY!W~Ra!wbZJ(mdgdCr^ZX4zCW-+tlkbvxrGMat~sYxq4ey+ zc2FwYXmIkyN_|7GM}aFoe}9^ULlfHpC|1{C+nY|KI;*iAkh+E%xO--DZER6bLu3b$ zuk`Ompr9JOyQ5xJej}dsATKDiQfyARf6srxGm-2-r(yzg=N(+*rXd|~OVaFE-6 zEjEZBcQ(gy+&uh;pNBYZnDb^iKgVUci7a{M^{UF7_;6Ax_s>U#d-x_)NO_RsnjEx) zUqS?aNhA1#I?>0pEZh zu=_WoL*bEB05Ng-^wLNL=&!~v29Y;lbT#>i$H_;%gl@3t$tQ}DmGlHDug9a|9MEva zE&|@ET0XusvXXR%E6HMt(2GREftiJDKBK{&+JO50I_Qt$;_^xN^rP{mkTVgD7bsqo zH(o3hl7Vn0S@hQd*C^mxi^0lrY$#kw7bEmJ;uY-^%A}_XO|h;kSu7wXs()89>K#$a zO!*4-aTU@5KiD{&lk_;{tf6cQ{+mhnx;q}7R`M<;mLj#d-y_)|SVEtO7g7cB8QQ<( z1z!MryA(PtMH-2v&{`a9fbxRv>Zz%MQU+1pd7*qM;*2eYbLqgO+F~QD)FgYCRGH#CVfKdqg+0*6dsNaO&6danAx?GEX}(^Lb-vT78+?^%()$# zLf>g71JI{jp3U^sH0Uo<;)Q--WZNA0Q4RWdDLNE#riy-Nd?`Ib`0bmGp)VGouSP>F zsbZm-4iwgsd7>{pUhKEVb@$8WQlEi%xfvUpuB4_QPPm7OPaE{{mi1G+9lHV}u4G`{ zGc$oPU5-f*o7Yl)k2|*1G{uZhyKGV8J{iYbNCEb2!Xhn>D`q-$Er>*#{9zT@h z&X6|;eYqZWdA5k1;y4&6xZ@FziXQmp2E-B=@(v>It8htuh+;~?SQB;Q*dUBG2K`Pg z3+5Wd$VQavWoX)!gg64@qhMb{n<4#(!bc5!3~~m@9V(CuxkLVXBjs{#V{B8&NXF`v zJK~fuZqIgGwcoG!sM0&hsiL7m+V5$`qL4pEJPjCU$e4rqUORbFJ2Z^qD2!>X`kQjx z-F|E!zUSWr+h?dxfww?=zT#Os^%~Lf)9% zexEb6UrHR0+lwWtK1|0EF((KTA25<>@B5x1u6it*%OoJLNVS^7$YX$^ev(UmSc@q@ zZecE89OilHsZ}B0(C3pP-R;b^Rq`0(f;mEM2R3t3KQgkHDz@w8+2MGtl1=g zq}`E9+?^BW+4_0Bs(-n+LCYv!?#Vid3X`Gj4CDEhzUMplzdvgNa zyy;-(a*;+l@0wePcry!yNGR$G2Nzc(-mu>^|1Ts3~R#f$!F|NLTj z!F;^NwZ^cpZdKIhjkNy?v8%1QHLRh*+^*=^NSdyld25hg6_Z2LbyHk>(br2d-#)vRgZb5Fi#4IW zSR+^BmEub~cyYZU<(Aem_e;Ni>{T_R79B58I4u2 zFVt#{O*Lk>lN-u>o2jB_1=f5wlS4v|W02!YvZSV9uf!eMgm}2IzkN;86O4Jz>_e03 ziHA)4m}y-j+bi=KgPdEb_qO7dVh=yU;Y>N0ITS+#%Q#Fvq(WdW{t$ z4HySt?lE1RSxQ&Z6E4_WOPS?AWPdXeaKRdJtsaMY#tiO%n&&wMSX+0BvcE6AMqyts zSPVhD_dBt_!@e=>PpnsBu&10Vt&%-f*eitV>9w?gL-JFy_q;OcoLS)-v-xS*+fc5x zNO~tUX7j`AGqA>*D$=ceydqD%#`Z;h%=xf=(*s8ju(mghjf6u2gg&|DLinTeePlJ^ z8yXz+WNCXJDuN@574V@994Zd9fJL}(OmbhHk)T)d9WfS?qAIpOEw!I8ZjZFR^0)(gD8Y#w ztir5vxw#bqFCNc;&osRk@q=T*N5)U+Pf25fa=aro1K8fRGAzm?;6cYz+LNont&E3^ z=}lkl^c=Athb{<4nHBG;J<-ucd*GD-N|{SZwgo?g_8hivwk3}u_k?xsWFV4Dxd{la zj_n5*s63*52m{$ZUaad?=2Q@aLSGF>jYpA?(~|{-@IAzp8DG`vQos465i7}mv9b7r6)RH-_)+Z zaDkOk=%i&zAA%}=NT*QHPvgTj=;L}5)b!4u7UG@QUwlo8zTh7uz$obF+oUhA^?`0Z zsQ=A{2U^<~DXZ5FUgTzm~eHMYrelY>IM@{0D<`U~lwDm}EZuK|={kX{%Q^bJPF zdq2IO6ygt#zRGy&MN_NwZ?M0(O3qy&K|=5Jq6WX#Ux=4(g&+0@rTs4iH9sfnM;uRv z=QdUSmkh#+coWq3->vo!A<5W;p%&wfsGkXXKPikiy7+^kdQ1H%_i&-UFE%K|Td{w6 zhsApuAJ7Yw@qx$tt@K6Ls-PvI*P!~EFSqNTx_GQOH^4=qI}!hE`o=VPwe}^wP>t6x zo@K=IekdN~S`Z4HKImE`-uuWPNCquMyeFxhTHooSAI?QCaxRK5>vayoHBj_I5{Vy@ zUn$}hAx+N9fMy_9g~T$3zrrUwu`0C};;FVh)CZ#S86nc{0`ys;AJISEC=XiFEZ;$X zQ_`BO`aBnuZIbrjCgGjLed=L7zpCVUC{ z6!bwfrO@XT(vr^ZVX6*85I}|JRH&th+0%b{A=p*3#~39U}H6?XLF4 zKJ+3?oRlV>lu$xx3M9=i2}!|82q6sP5|X$KnKFcs7o{GWQtD7j3S}IUHe^Df|9|fL zC9P~dm}xek`#6vP`yb~&|M}0kWS9-vP0gmqHkh7j8Z>P*Q9CH=Uz$$WOB6+gvZ<-G zbvB;Q*RqB5;ds8Bi65|c*xDzvwTW!8maZhz<=TPKNmwJDDlv z)79zu_S%Lys`%n-RI{V|!Cz5(^3@wFd}R}5+G(=3n{1}-fO_N39%@f%jqzHFXGGA^ zy&Un#SO$%3>uQ3(Ho9rkZvP$d5A*iMou;j=-PFeIt(I-2L@u4IWoOb8#dslYYBJl* zr#72^yOBBF#I*dskWgzo*fM2mqTtVVxKI>4TTQzMO-;nIw_mdr-c^&?>1=IpJ{_+V zq2dmcSz$+8<>eN|6Exmz{$~1L$vug%^cavoH!R{ujohBt1j#> zoM$?E&LFUXL-N^;zDXc{C|juKVN9halBG%|z4_eZsdz1ZI8~c3rw>f#OYxf1(O#UG zOvh{WO1gT$ZnME7H~6Xtx@}-NbMT@TuS}(DP^_`U>!;qyQL!A@n0K0@QqNCQE!gTw zs(SJBGe4)O^g9_Ul%WDYrC!KVl$}1&@ndT9zvaF{pL$=@%(kY$6ssoxj=$~!a zk$aAMXTGU_K9HjV|A;ziGcgKLr&SDbye-ZX;88J!k0MJpEl-v+A!An);mC?~v}8a( z=l62Pan2^{4&MvjhrjV(?=nw-qY{SbW@Jq=k^9a!-?@o-{(R=aZD=BA0`t8q4PB$& zZn{tyi!D1rVC1JBgO(PdM7lFmdvxAHJ^6UN>!O{eX5Jfa%BJQfD(NzDgU4y}37R?j z0p?`uPN`4n&Y*W)7CvCQL}1}O+h#!EhiNZf%a-(f$!4+8BHgM`-*Sm$Am@{@nk`Pj z+zFkgr{)R%FVg0((#%~KGcWE$Ly@|Y_o|Dw#k5sG+l;;sN1@u`Q5Gza3-Xv%g7iL^ zRwh#EYO<0o6E1OH$(YN`sY{v1E=4%leg%o&*Cr9)!FyFb`oFl0dE~N1=_{;_Mke8> z7J#KiD3R{a9<*9l7K)^>^U)eLwuxNBiM* z?_V?7-EgJeI21mG)$hFhfhXWu#KUwI0 znr^YZaq7y~pzz4u4?p$hLE3l!6~F&ye6$@ubqRE7{l@^qmgf_;4M+s`2B z6V^jtYNai<2f~q8;qj@9Ht%)xg4{by4$1xF=;JVwaY#_1V6<9y<*Cu>_Nw>6r?E5d=UH&rF``^8z--Ndl|63S`w|D&TW4`a-NB16# z9R3#FGPr%A=W9=2(bjul%Rha&Or6s^|IOIl@On0|>9v3T{I1?N|6%+`FFkhmLAuHQ zD&5ljna4J_41Q&NXl%>S-yi&Se)8STa6Nx&XpG+O`;hxbJOAC&)I0u%Kl#JUaNTtI zGaI&lcy7;@zMuN&-j}<%>jf8``UpO2WiODlvw8k^-z179NomDox6t* z)i7FSe&&?i%618Ckt|z?(R|c=3(b7O$vo>oufp}B3uU)ykKj~y^lbwe%7uX1!$4=- zlr=1>XXrxiS?=$VpjsuU(p@=Ti5Dg&q)6g%+WaKV+~3W-+=bXx-D}9{as{3S15Uxy zoc{h(+dq3^&tDyT|EpK_Ok4@qlh0+o{Xw|e?*7$9U2uKrJHD6kde@iw4jzQ7?}7*F zZn*BbJbpi3Eu&w1oLt+#Jk<}+_uK2ACs*5RzrpJbzji$2h3koDuKOWgZ~yr3%mZ+> zdH*KogR9Se=ilP>R5`<06%9zSJw(<|PvM7}!?RwF!-7zC)Wo z*~C0@ka^)lXqm=z7K5NG3Y*CxWGpOOd#@d&X!@F?7XV!N9l7Naas?qM(gca!}%P5w-G5Kf>lS zwD~!jc{9K~8~`@8Gz=)~vI%SmL;Bo3n*bfZkk=W&oA@G&a09jF6URN*NrUrZBaM-4 z0pa2f+I$bqJQ`$<1aWK%ol3py;#EY|Hvt0tsli%Wgc9ivg`#~6jpZ!d8yItcfc>ilj^}G!6eib8?lzeD~dVnFpggO;qdU8>v>y6%sb- zjzg(P1QWEQ<|y-g*_uFpls12lW{$_0Q{y-aR3vod*bGTIO&Y_6 zLAJ^x0Y3P-dIhz)dd*hBMC5Ow(z$z(YYbHB?G$tDBa)HGJg-{(LeibE!G(aIyPkRF z!=jzYi5QS>ls~;8j@;o-;E$ptW0b#zD)J%zN?aP^GB2g(4t51(1K{}^n6KU-GA8fc zfacPSp~P{!0u-lCi8SMT3;C-8|58e_uSG_NV#9;5afCJ>g&b6hIhjN=lT%n4s^HPo zP?zEBlsb50O40!%NnX0+<5<~7j!YRZPBITpp0%TeMVm13nMYw+r%23O?H$ezhnimy z+zxqqo~vcid8bm_v(u8=c1c_+f_B)BszMqMwzeiqgxTk4^DiKH%Q0_eQDr(*bSdkq zbM;+n2bt$UIX(rk1@g0d9N{)Pn19^y%A7JEX-oyxL?Ti*AZy z9=UO+sfo|bT#zo#?7ePicp^A9G%@N6^|O74h=_;HVdm{J^J4i*y{#Jvai}Nx-x>UP)$P6E%sOHw56VwE0e&xwX!mtRX;k zpSlnorXE3Ntv8r}ZdZqWUx#h4)790H&hP6mL~PQnXwiSI;^)?RiJ$EvKb17>u~j)% zUZKrz(9G#s=8Ln)ihi#~#B>=AnnD7jSKPG=0PV6{4-E}lN9$?pP<-C%v|H^x`|Ym% zcDr?K)MItn9D4p_R|Cx~jZ{*JEe&Z!$mB#C-A3VP*YkqUt64ZvcU=cwluTq{O#%;cR5@aP)LI;RXk` z19w|)kj}?!Rmw2hBYHSpgSzBX*~YuHne$)jNT_5ZaudNEeftLcB7)cM49G)Z$ab z3NWyF2qy14?xgiXo7T6l>ZU9ktI15d5H}4|rmdGZsZa1+P7UH7IVqAKFOk2OP80}l zo1r6N^P6j{-BcFpB2o4JuDncV`&B4LGUBc$W!eIdWc!V~RqqCIKs4JfLT89$k;OU} zy$Y3)vMh6=h;xO!d;ZoPJFfxR@zPr&Q7!Lzkpv)rjs{W~fIzk^SLVK@<2PKzMLOg& zikxs{p}Vp}lCP6PY$z?p=|LtZY0)FgFoB-{UKUx$Dl$AA&_xu*=|aGYHX##}8i0_! z;KU?jUtJLr0UYH;a4Oc@0sz!ggNs{^KqD(dp>woZ8EAzWDh;*?YU(Y3@{bGlDK1Oo zo$Id)$OYDtj!K5v+g^P%=+#LGHbbS zch;M6%!=)zF{`!r#jN=z6!V_i<6+il4~BWKYyx>+^6y0e)IM4z;y`cK%nVbL3qrrn3gh6v?$eln>+sjo5U}-RmN@SEQZOr#cE;X&7MD|$$xIN z7(~McDum!g(}JNXEmtV%={j7jUXQdIvnuq<>TiP29r;>iF^q-{RPbaomJ*<>ps^97rl>f`upFqGhAPO3QYnx9De($#&kQW* ztCxdPYN3L+V#cW!sBnB^IVk0AR5)b{R!UM{SQSK<4lfO=uPi#9 zPc*c0GpM9Ok}i~M^VnE9lsTio_lu2W;qw74ae0Y~;#q1&=vnazhA{w5wN*mHe?YMa z5Lt~?!oZKCMKH)}tSkoEX9QaEszMdzvvDZu1N?@x#UuV$Lj~Y04N`Ts-VlOt_+AIW z*@%EwDLK@xrL8VqS=NQ#iSIBbE*7h(<019Ky!6Q;^-O$_fPow-H^v|qt1z6U@--*Q zwFq>ps8B513zOV;1^(lKr3y(&=d+1QyfTj&>GFKMQYpu|I|YFIFT zS)ro?PTaTMOj)+Fq0n`a{oGl1%e{v?@wdQcS(Y7vfAM!M%XYEuDb~xfQ>z*BtbWe{*hk)WZw0B?aFXZd7 zfpAyU5u8c*!nH(kD0^Mjok-6IDsiam&y}Y9#Xu%eNag+6*(raaJClfvVV!y^GFKh+ zu-T+Dlt~sx;2k^5KhGpR{vLmy-^M@Zxo58{dI=3ja=(Z;YW~+Wrpb(FQt1+*uJ|3~>v0kDWt|mOtPtgsyfVSObOGn+L%wG)GB~>1eEC_@uO~1w4$0+l=LlCG3ERdap-gI^A9(_KgzMuD*EH~6B)sRt zW1+0A%U`rBu}g9iarq0bY`hT8r3UhjSeVC4WELyOB6HJGhafw^+-2|R#Iv#CgT88HEVln2P&KAR59coyh-NO>(54P~GY+qfvlIoF^E zd6VcT9j510&ac7{M^o7a^N0$*^!@7F1UEMJg$|oJc`FPZA zi$`2_&Zf0vTpD9K^;h0^5q~@h{uO+;2Tkxm+{4p7av7XEt$Ww{89(Ckxv8dlrzN;~Ilz0{MV;IHiYU@nwM6oaW{%*6^GNo)}f=2Kn~ zZ{yfZ$lc2W+ZjOZbw4pezfj;#7KE&XQ`3FUuuzX)e zVx*)aY>Nsu=>U5wgfl5$7~+$m#pYXxlezJxqciX$u{_wdJz3!8^B&<1^f(^_ev|VJ z`9od#sQS={_+mLay7H{`FNipRBUU6l>5l-&7vnaal_sZ#1Jcr)lr&u6YiZb!kNu3eqk z+@R=J&?Br3AgAW4MV&#L7>BRDPQ_fBfD7|)Nk@JL;!Mcd#AX`upMpP<)(4oMTfjU7 zjOBW)uy6g=by{r8S{Dd@QjAmAXFZos6vu0$Hv34_)*T)VyT%TA1KyFb(5R7qVv%mg z;Fv2o=5<{c95}QdDY)0`s zT#iR)-dVB@jG?v3lS^`~!8)fJi@+Mu zFmL6qf`2I_oPpY4Gyu8ua3<+6&SR}co(1y1f*sUE|6&xo6y5Z$EUXzJ*lRnrta)cMaM{#jZL7T@(3cN(! z^9e^Vp9Fu%=j8OTuEtoC@IpS!@5%T^;Q#6k^Qbyw%&@MW?iD!*ZTu#edqeq4$u{k| z6zsnl`BvR}dUN+`#Lz`?Ou)Vgwy<6eJY zb^zKB!I=WKlO1E(!6`Uf;GT9ve?EK;;#mTZAI=J}!+3yT77ofc>=>jD9x7~dpF_wIhIpBbLy`5z;1 z$)OAx{~%~kisWm?o#E+muDuQ0*TnXI{q_jm7wiVVl2076L+;u(b!~sjbM1(G=&E6Y z7nKUXzN!j87#1*tf4Cp%Uw0k@y+ivcZ0{e=@%(Uj(D3B?^eFMr`H{s$Vhl&fx%XlF8Id1OKi3ih zqyo9~;;l~>D}mn{cVsZDEGPVR+EjSRP>{)&s9qMMk^Z}o{(N6IZ=Y_?z6pJq zJaA094c8{DdlcHc#;yWW!-~9p5~G&UPa#3&dRw#KB&^x68`58XxTvsSGDu|h>qjaB zihRnFYh5;w1H7H%0$w(Q$lwqZ{A73w_^iO|P|y+g$nacK!ePgA58$)G*!{U4g}r%% zXWriWh(Sy8^`NTUiu{3su8_}l1~V|fSK)k*GZx7ghZ>Fnd_^?OLCWKa{w zh%7+Y#6LCAKjf@P{oK_G{DUHXaLVxGT&)a0npOk&W%)X&pY7!Q19;Ouo}M5dmHiQa z+d%(94uFW4?Y|0?92%bC?T7Pf*CBqH{RFi3qmYx3FM$}=hB*$*H9{;tn}Ycb`_GB} z4-wEfQsn*n8tfnT{Ac3>{p`>TxO!|e)i;9u!=2l}K8e3k*on?QqB{SC=vaT>K81cg z!m}WMQcKdWj{WHD$#Hu`C0V_PX z**Wr(;F0t_jEE2sggf@doJ+&yGbf$Qg%tnH}Im zGt#~+wl|1ZpcceW;yEdNWcy%FmfK%2w}d>1{}uJ7I@89oLqwiK(5ZZWHk1eGT5-mV z9VYEz3@F;G;~f%}^0|HWIY8uU7TYJm=X3JZk0(heJRqK5M0vtsnS#^9xDeofB%bt? zus?VsjF%*q%JfS@eKHRD^RQT+NBXW&_#?9~F8-GM9b3hoM0t`ksUv+X(t}Ds9q>%S zQU(_+=>K-HDT@_8+PblxuEGC Date: Mon, 15 Jan 2024 18:35:13 +0100 Subject: [PATCH 22/43] linting --- benchmarks/ridge/consolidate_result_csv.py | 1 - 1 file changed, 1 deletion(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 0461d71..b2cb42f 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -2,7 +2,6 @@ from functools import partial from io import BytesIO from itertools import zip_longest -from operator import attrgetter import numpy as np import pandas as pd From 658bc8209ecc3d71812c59ef978c0681c25efc94 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 18:50:49 +0100 Subject: [PATCH 23/43] Add cuml solver --- benchmarks/ridge/solvers/cuml.py | 89 ++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 benchmarks/ridge/solvers/cuml.py diff --git a/benchmarks/ridge/solvers/cuml.py b/benchmarks/ridge/solvers/cuml.py new file mode 100644 index 0000000..2d5efa1 --- /dev/null +++ b/benchmarks/ridge/solvers/cuml.py @@ -0,0 +1,89 @@ +from importlib.metadata import version + +from benchopt import BaseSolver, safe_import_context +from benchopt.stopping_criterion import SingleRunCriterion + +with safe_import_context() as import_ctx: + import cuml + import cupy + import numpy as np + + +class Solver(BaseSolver): + """https://docs.rapids.ai/api/cuml/stable/api/#ridge-regression""" + + name = "cuml" + requirements = ["cuml"] + + parameters = dict(device=["gpu"]) + + stopping_criterion = SingleRunCriterion(1) + + def skip(self, **objective_dict): + + X = objective_dict["X"] + if X.dtype == np.float64: + # We haven't came accross cuda devices that doesn't support float64 yet, + # can it happen ? If it happens, the following instruction will fail, + # please enclose it with the appropriate Try/Except to return the + # appropriate skip decision. + cupy.zeros(1, dtype=cupy.float64) + # return True, ( + # f"This {self.device} device has no support for float64 compute" + # ) + + y = objective_dict["y"] + if (y.ndim == 2) and (y.shape[1] > 1): + return True, "Multitarget is not supported." + + solver = objective_dict["solver"] + if solver != "svd": + return True, "Only accepts the svd solver at the moment." + + return False, None + + def set_objective( + self, + X, + y, + sample_weight, + alpha, + fit_intercept, + solver, + max_iter, + tol, + random_state, + ): + self.X = cupy.asarray(X) + self.y = cupy.asarray(y) + + self.sample_weight = sample_weight + if sample_weight is not None: + self.sample_weight = cupy.asarray(sample_weight) + + self.alpha = alpha + self.fit_intercept = fit_intercept + self.solver = solver + self.max_iter = max_iter + self.tol = tol + self.random_state = random_state + + def run(self, _): + estimator = cuml.Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + solver=self.solver, + ).fit(self.X, self.y, sample_weight=self.sample_weight) + + self.weights = estimator.coef_ + self.intercept = estimator.intercept_ + + def get_result(self): + return dict( + weights=cupy.asnumpy(self.weights), + intercept=cupy.asnumpy(self.intercept), + n_iter=None, + version_info=f"scikit-learn {version('scikit-learn')}", + __name=self.name, + **self._parameters, + ) From cf662eb64ffbbbfbc263e882a20fe1c2f66551cf Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 19:54:24 +0100 Subject: [PATCH 24/43] Add cuml results --- .../benchopt_run_2024-01-15_19h50m23.parquet | Bin 0 -> 33882 bytes benchmarks/ridge/results.csv | 4 ++++ benchmarks/ridge/solvers/cuml.py | 7 +++++++ 3 files changed, 11 insertions(+) create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-15_19h50m23.parquet diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-15_19h50m23.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-15_19h50m23.parquet new file mode 100644 index 0000000000000000000000000000000000000000..9ed915ec471ae2ed587f60abdf3cc130caca8f82 GIT binary patch literal 33882 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 literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/results.csv b/benchmarks/ridge/results.csv index 697cf0e..a75c863 100644 --- a/benchmarks/ridge/results.csv +++ b/benchmarks/ridge/results.csv @@ -1,16 +1,19 @@ Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result nb iterations,Result objective value,Data random state,Solver random state +3a327106,float32,5000000,100,1,1.37,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506280786409378,123,123 3a327106,float32,5000000,100,1,1.73,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506281986367035,123,123 3a327106,float32,5000000,100,1,4.88,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,4.506281186382675,123,123 3a327106,float32,5000000,100,1,16.8,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506280786407089,123,123 9bd2a256,float32,5000000,100,10,1.9,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079804773100586,123,123 9bd2a256,float32,5000000,100,10,16.9,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079804613102112,123,123 9bd2a256,float32,5000000,100,10,43,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.0798041330996706,123,123 +a9a05f25,float32,5000000,10,1,0.131,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.0251269475669592,123,123 a9a05f25,float32,5000000,10,1,0.205,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.025126947566834,123,123 a9a05f25,float32,5000000,10,1,0.743,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.025126946004498,123,123 a9a05f25,float32,5000000,10,1,0.849,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.025126947566998,123,123 ffd32c2e,float32,5000000,10,10,0.437,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.1351635453291702,123,123 ffd32c2e,float32,5000000,10,10,1.17,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.135163585330429,123,123 ffd32c2e,float32,5000000,10,10,7.72,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.1351635853305244,123,123 +c49c3df8,float32,2000000,100,1,0.557,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151841176033,123,123 c49c3df8,float32,2000000,100,1,0.692,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151591079712,123,123 c49c3df8,float32,2000000,100,1,1.92,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.2831518411445617,123,123 c49c3df8,float32,2000000,100,1,6.06,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151841176987,123,123 @@ -19,6 +22,7 @@ c49c3df8,float32,2000000,100,1,6.06,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core 1a8c391a,float32,2000000,100,10,18.2,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.1605555927993776,123,123 e5684553,float32,5000,5000,1,0.146,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.077718115234376,123,123 e5684553,float32,5000,5000,1,0.573,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544375,123,123 +e5684553,float32,5000,5000,1,6.29,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544453125,123,123 e5684553,float32,5000,5000,1,10.2,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544296875,123,123 7b05f2bf,float32,5000,5000,10,0.509,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.375214765625,123,123 7b05f2bf,float32,5000,5000,10,1.22,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.804442734375,123,123 diff --git a/benchmarks/ridge/solvers/cuml.py b/benchmarks/ridge/solvers/cuml.py index 2d5efa1..20482a1 100644 --- a/benchmarks/ridge/solvers/cuml.py +++ b/benchmarks/ridge/solvers/cuml.py @@ -68,6 +68,13 @@ def set_objective( self.tol = tol self.random_state = random_state + def warm_up(self): + cuml.Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + solver=self.solver, + ).fit(self.X, self.y, sample_weight=self.sample_weight) + def run(self, _): estimator = cuml.Ridge( alpha=self.alpha, From f3e976551b23ea05dc59a4d4542c31179f904fd7 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 20:15:07 +0100 Subject: [PATCH 25/43] Also add warm-up for scikit-learn --- .../benchopt_run_2024-01-15_18h08m05.parquet | Bin 33467 -> 0 bytes .../benchopt_run_2024-01-15_20h06m24.parquet | Bin 0 -> 33618 bytes benchmarks/ridge/results.csv | 48 +++++++++--------- benchmarks/ridge/solvers/scikit_learn.py | 12 +++++ 4 files changed, 36 insertions(+), 24 deletions(-) delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-15_18h08m05.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-15_20h06m24.parquet diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-15_18h08m05.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-15_18h08m05.parquet deleted file mode 100644 index 69c46db19a9ae775ebb580e2138822f723d2b885..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33467 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 L9j2%OCg}J-YWNJs literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/results.csv b/benchmarks/ridge/results.csv index a75c863..d9738d7 100644 --- a/benchmarks/ridge/results.csv +++ b/benchmarks/ridge/results.csv @@ -1,29 +1,29 @@ Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result nb iterations,Result objective value,Data random state,Solver random state 3a327106,float32,5000000,100,1,1.37,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506280786409378,123,123 -3a327106,float32,5000000,100,1,1.73,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506281986367035,123,123 -3a327106,float32,5000000,100,1,4.88,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,4.506281186382675,123,123 -3a327106,float32,5000000,100,1,16.8,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506280786407089,123,123 -9bd2a256,float32,5000000,100,10,1.9,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079804773100586,123,123 -9bd2a256,float32,5000000,100,10,16.9,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079804613102112,123,123 -9bd2a256,float32,5000000,100,10,43,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.0798041330996706,123,123 +3a327106,float32,5000000,100,1,1.73,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506297986368179,123,123 +3a327106,float32,5000000,100,1,4.3,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,4.506297986381912,123,123 +3a327106,float32,5000000,100,1,13.7,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506297186405945,123,123 +9bd2a256,float32,5000000,100,10,1.93,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079808773100586,123,123 +9bd2a256,float32,5000000,100,10,14.9,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079808933101807,123,123 +9bd2a256,float32,5000000,100,10,37.2,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.07980909309967,123,123 a9a05f25,float32,5000000,10,1,0.131,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.0251269475669592,123,123 -a9a05f25,float32,5000000,10,1,0.205,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.025126947566834,123,123 -a9a05f25,float32,5000000,10,1,0.743,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.025126946004498,123,123 -a9a05f25,float32,5000000,10,1,0.849,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.025126947566998,123,123 -ffd32c2e,float32,5000000,10,10,0.437,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.1351635453291702,123,123 -ffd32c2e,float32,5000000,10,10,1.17,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.135163585330429,123,123 -ffd32c2e,float32,5000000,10,10,7.72,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.1351635853305244,123,123 +a9a05f25,float32,5000000,10,1,0.245,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.02512695694184,123,123 +a9a05f25,float32,5000000,10,1,0.796,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.025126958504486,123,123 +a9a05f25,float32,5000000,10,1,0.842,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.025126955379498,123,123 +ffd32c2e,float32,5000000,10,10,0.441,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.1351636653292465,123,123 +ffd32c2e,float32,5000000,10,10,1.01,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.1351636653303528,123,123 +ffd32c2e,float32,5000000,10,10,7.28,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.1351636553305053,123,123 c49c3df8,float32,2000000,100,1,0.557,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151841176033,123,123 -c49c3df8,float32,2000000,100,1,0.692,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151591079712,123,123 -c49c3df8,float32,2000000,100,1,1.92,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.2831518411445617,123,123 -c49c3df8,float32,2000000,100,1,6.06,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151841176987,123,123 -1a8c391a,float32,2000000,100,10,0.761,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.160555392800904,123,123 -1a8c391a,float32,2000000,100,10,6.41,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.160555392799377,123,123 -1a8c391a,float32,2000000,100,10,18.2,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.1605555927993776,123,123 -e5684553,float32,5000,5000,1,0.146,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.077718115234376,123,123 -e5684553,float32,5000,5000,1,0.573,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544375,123,123 +c49c3df8,float32,2000000,100,1,0.727,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283155591078758,123,123 +c49c3df8,float32,2000000,100,1,1.84,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.283155091144562,123,123 +c49c3df8,float32,2000000,100,1,5.62,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.2831550911808014,123,123 +1a8c391a,float32,2000000,100,10,0.779,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.160573592800904,123,123 +1a8c391a,float32,2000000,100,10,5.7,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.1605733927993773,123,123 +1a8c391a,float32,2000000,100,10,16.4,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.1605733928001403,123,123 +e5684553,float32,5000,5000,1,0.166,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.347395458984376,123,123 +e5684553,float32,5000,5000,1,0.541,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.45976669921875,123,123 e5684553,float32,5000,5000,1,6.29,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544453125,123,123 -e5684553,float32,5000,5000,1,10.2,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544296875,123,123 -7b05f2bf,float32,5000,5000,10,0.509,scikit-learn,,,cholesky,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.375214765625,123,123 -7b05f2bf,float32,5000,5000,10,1.22,scikit-learn,,,lsqr,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.804442734375,123,123 -7b05f2bf,float32,5000,5000,10,10.2,scikit-learn,,,svd,32,AMD EPYC 7502 32-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.37521484375,123,123 +e5684553,float32,5000,5000,1,9.08,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.459914453125,123,123 +7b05f2bf,float32,5000,5000,10,0.478,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.781028203125,123,123 +7b05f2bf,float32,5000,5000,10,1.22,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.960193984375,123,123 +7b05f2bf,float32,5000,5000,10,9.23,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.781131640625,123,123 diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 0d49ac0..0fbbe8b 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -47,6 +47,18 @@ def skip(self, **objective_dict): return False, None + def warm_up(self): + Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + copy_X=False, + max_iter=self.max_iter, + tol=self.tol, + solver=self.solver, + positive=True if (self.solver == "lbfgs") else False, + random_state=self.random_state, + ).fit(self.X, self.y, self.sample_weight) + def run(self, _): estimator = Ridge( alpha=self.alpha, From c2f2479527f5b3010092a4eb5be2bc3664a1eca1 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Mon, 15 Jan 2024 20:20:27 +0100 Subject: [PATCH 26/43] Faster warmup --- benchmarks/ridge/solvers/cuml.py | 5 ++++- benchmarks/ridge/solvers/scikit_learn.py | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/benchmarks/ridge/solvers/cuml.py b/benchmarks/ridge/solvers/cuml.py index 20482a1..c64cd41 100644 --- a/benchmarks/ridge/solvers/cuml.py +++ b/benchmarks/ridge/solvers/cuml.py @@ -69,11 +69,14 @@ def set_objective( self.random_state = random_state def warm_up(self): + sample_weight = self.sample_weight + if sample_weight is not None: + sample_weight = sample_weight[:2] cuml.Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, solver=self.solver, - ).fit(self.X, self.y, sample_weight=self.sample_weight) + ).fit(self.X[:2], self.y[:2], sample_weight=sample_weight) def run(self, _): estimator = cuml.Ridge( diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 0fbbe8b..97db1c6 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -48,6 +48,9 @@ def skip(self, **objective_dict): return False, None def warm_up(self): + sample_weight = self.sample_weight + if sample_weight is not None: + sample_weight = sample_weight[:2] Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, @@ -57,7 +60,7 @@ def warm_up(self): solver=self.solver, positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, - ).fit(self.X, self.y, self.sample_weight) + ).fit(self.X[:2], self.y[:2], sample_weight) def run(self, _): estimator = Ridge( From edd2e90be7fadae5196abe9017d6bdc82a184ad4 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:27:10 +0100 Subject: [PATCH 27/43] Add sklearn+array_api+torch solver --- .../ridge/solvers/sklearn_torch_dispatch.py | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 benchmarks/ridge/solvers/sklearn_torch_dispatch.py diff --git a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py new file mode 100644 index 0000000..f02eb2b --- /dev/null +++ b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py @@ -0,0 +1,129 @@ +from importlib.metadata import PackageNotFoundError, version + +from benchopt import BaseSolver, safe_import_context +from benchopt.stopping_criterion import SingleRunCriterion + +with safe_import_context() as import_ctx: + # isort: off + import numpy as np + + # NB: even if it's not use for the compute we rely on the sklearn_pytorch_engine + # for the few utilities it contains e.g for loading torch with xpu support and + # checking for float64 compat. + # This import is necessary to pre-load torch extensions + import sklearn_pytorch_engine # noqa + import torch + from sklearn import config_context + from sklearn.linear_models import Ridge + from sklearn_pytorch_engine._utils import has_fp64_support + + # isort: on + + +class Solver(BaseSolver): + name = "sklearn-torch-dispatch" + requirements = ["scikit-learn", "sklearn-pytorch-engine"] + + parameters = { + "device": ["cpu", "xpu", "cuda", "mps"], + } + + stopping_criterion = SingleRunCriterion(1) + + def skip(self, **objective_dict): + try: + torch.zeros(1, dtype=torch.float32, device=self.device) + except Exception: + return True, f"{self.device} compute backend for pytorch not found" + + X = objective_dict["X"] + if (X.dtype == np.float64) and not has_fp64_support(self.device): + return True, ( + f"This {self.device} device has no support for float64 compute" + ) + + solver = objective_dict["solver"] + if solver != "svd": + return True, "Only accepts the svd solver at the moment." + + return False, None + + def set_objective( + self, + X, + y, + sample_weight, + alpha, + fit_intercept, + solver, + max_iter, + tol, + random_state, + ): + # Copy the data before running the benchmark to ensure that no unfortunate side + # effects can happen + self.X = torch.asarray(X, copy=True, device=self.device) + self.y = torch.asarray(y, copy=True, device=self.device) + self.sample_weight = sample_weight + if sample_weight is not None: + self.sample_weight = torch.asarray( + sample_weight, copy=True, device=self.device + ) + + self.alpha = alpha + self.fit_intercept = fit_intercept + self.solver = solver + self.max_iter = max_iter + self.tol = tol + self.random_state = random_state + + def warm_up(self): + sample_weight = self.sample_weight + if sample_weight is not None: + sample_weight = sample_weight[:2] + with config_context(array_api_dispatch=True): + Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + copy_X=False, + max_iter=self.max_iter, + tol=self.tol, + solver=self.solver, + positive=True if (self.solver == "lbfgs") else False, + random_state=self.random_state, + ).fit(self.X[:2], self.y[:2], sample_weight) + + def run(self, _): + with config_context(array_api_dispatch=True): + estimator = Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + copy_X=False, + max_iter=self.max_iter, + tol=self.tol, + solver=self.solver, + positive=True if (self.solver == "lbfgs") else False, + random_state=self.random_state, + ).fit(self.X, self.y, self.sample_weight) + + self.weights = estimator.coef_ + self.intercept = estimator.intercept_ + self.n_iter_ = estimator.n_iter_ + + def get_result(self): + version_info = ( + f"scikit-learn {version('scikit-learn')}; torch {version('torch')}" + ) + try: + version_info += f"; ipex {version('intel-extension-for-pytorch')}" + except PackageNotFoundError: + pass + + return dict( + weights=self.weights.cpu().asnumpy(), + intercept=self.intercept.cpu().asnumpy(), + n_iter=self.n_iter_.cpu(), + version_info=version_info, + __name=self.name, + **self._parameters, + ) From 4e1a2c0dee79df7a3d8b4772cac51c64a69cca55 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Tue, 16 Jan 2024 15:04:11 +0100 Subject: [PATCH 28/43] Fix sklearn+array api+torch solver, and add results --- .../benchopt_run_2024-01-16_14h54m53.parquet | Bin 0 -> 34246 bytes benchmarks/ridge/results.csv | 16 ++++++++++++++++ .../ridge/solvers/sklearn_torch_dispatch.py | 8 ++++---- 3 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-16_14h54m53.parquet diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-16_14h54m53.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-16_14h54m53.parquet new file mode 100644 index 0000000000000000000000000000000000000000..84c8b668348291f551680ab2c1cad1d73e0fe9c1 GIT binary patch literal 34246 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 Date: Tue, 16 Jan 2024 16:03:10 +0100 Subject: [PATCH 29/43] Add scikit-learn-intelex solver --- benchmarks/ridge/objective.py | 3 + benchmarks/ridge/solvers/scikit_learn.py | 3 + .../ridge/solvers/scikit_learn_intelex.py | 142 ++++++++++++++++++ 3 files changed, 148 insertions(+) create mode 100644 benchmarks/ridge/solvers/scikit_learn_intelex.py diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 970fb21..45f5e9c 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -29,6 +29,9 @@ class Objective(BaseObjective): ("sag", 50, 0), ("saga", 25, 0), ("lbfgs", 100, 0), + # Used for solvers like scikit-learn-intelex that doesn't + # document the underlying solver nor expose the n_iter_ attribute + ("???", None, 0), ], "sample_weight": ["None"], # NB: add "random" to test non None weights "random_state": [123], diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 97db1c6..4a2d278 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -45,6 +45,9 @@ def skip(self, **objective_dict): "in the benchmark." ) + if solver == "???": + return True, "" + return False, None def warm_up(self): diff --git a/benchmarks/ridge/solvers/scikit_learn_intelex.py b/benchmarks/ridge/solvers/scikit_learn_intelex.py new file mode 100644 index 0000000..88cb36f --- /dev/null +++ b/benchmarks/ridge/solvers/scikit_learn_intelex.py @@ -0,0 +1,142 @@ +from contextlib import nullcontext +from importlib.metadata import version + +from benchopt import BaseSolver, safe_import_context +from benchopt.stopping_criterion import SingleRunCriterion + +with safe_import_context() as import_ctx: + # isort: off + import dpctl + import numpy as np + from sklearnex.linear_model import Ridge + from sklearnex import config_context + + # isort: on + + +class Solver(BaseSolver): + name = "scikit-learn-intelex" + + requirements = [ + "scikit-learn-intelex", + "dpcpp-cpp-rt", + ] + + parameters = { + "device, runtime": [ + ("cpu", None), # TODO: replace "None" with "opencl" if relevant + ("gpu", "level_zero"), + ], + } + + stopping_criterion = SingleRunCriterion(1) + + def skip(self, **objective_dict): + if self.runtime is not None: + try: + device = dpctl.SyclDevice(f"{self.runtime}:{self.device}") + except Exception: + return ( + True, + f"{self.runtime} runtime not found for device {self.device}", + ) + + X = objective_dict["X"] + if (X.dtype == np.float64) and not device.has_aspect_fp64: + return True, ( + f"This {self.device} device has no support for float64 compute" + ) + + solver = objective_dict["solver"] + + if solver != "???": + # TODO: investigate ? + return True, "The underlying solver is unknown." + + return False, None + + def set_objective( + self, + X, + y, + sample_weight, + alpha, + fit_intercept, + solver, + max_iter, + tol, + random_state, + ): + # TODO: the overhead of the copy of the data from host to device could be + # eliminated if scikit-learn-intelex could just take usm_ndarray objects as + # input and directly run compute with the underlying memory buffer. The + # documentation at + # https://intel.github.io/scikit-learn-intelex/latest/oneapi-gpu.html#device-offloading # noqa + # suggests that it is the intended behavior, however in practice + # scikit-learn-intelex currently always perform underlying copies + # under the hood no matter what, and sometimes fails at doing so. See e.g. + # issue at + # https://github.com/intel/scikit-learn-intelex/issues/1534#issuecomment-1766266299 # noqa + + # if self.runtime != "numpy": + # device = device = dpctl.SyclDevice(f"{self.runtime}:{self.device}") + # self.X = dpt.asarray(X, copy=True, device=device) + # else: + # self.X = X + + self.X = X + self.y = y + self.sample_weight = sample_weight + self.alpha = alpha + self.fit_intercept = fit_intercept + self.solver = solver + self.max_iter = max_iter + self.tol = tol + self.random_state = random_state + + def warm_up(self): + sample_weight = self.sample_weight + if sample_weight is not None: + sample_weight = sample_weight[:2] + with nullcontext() if (self.runtime is None) else config_context( + target_offload=f"{self.runtime}:{self.device}" + ): + Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + copy_X=False, + max_iter=self.max_iter, + tol=self.tol, + solver="auto", + positive=True if (self.solver == "lbfgs") else False, + random_state=self.random_state, + ).fit(self.X[:2], self.y[:2], sample_weight) + + def run(self, _): + with nullcontext() if (self.runtime is None) else config_context( + target_offload=f"{self.runtime}:{self.device}" + ): + estimator = Ridge( + alpha=self.alpha, + fit_intercept=self.fit_intercept, + copy_X=False, + max_iter=self.max_iter, + tol=self.tol, + solver="auto", + positive=True if (self.solver == "lbfgs") else False, + random_state=self.random_state, + ).fit(self.X, self.y, self.sample_weight) + + self.weights = estimator.coef_ + self.intercept = estimator.intercept_ + self.n_iter_ = estimator.n_iter_ + + def get_result(self): + return dict( + weights=self.weights, + intercept=self.intercept, + n_iter=self.n_iter_, + version_info=f"scikit-learn-intelex {version('scikit-learn-intelex')}", + __name=self.name, + **self._parameters, + ) From 9e808cd8bf7373ec8c877f80634abbe150cb236a Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Tue, 16 Jan 2024 16:11:36 +0100 Subject: [PATCH 30/43] Add scikit-learn-intelex result even if actual solver is unkown --- .../benchopt_run_2024-01-16_16h08m16.parquet | Bin 0 -> 34664 bytes benchmarks/ridge/results.csv | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-16_16h08m16.parquet diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-16_16h08m16.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-16_16h08m16.parquet new file mode 100644 index 0000000000000000000000000000000000000000..b529006cb6e18c70a12239a4ce16e05817e36705 GIT binary patch literal 34664 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 Date: Tue, 16 Jan 2024 16:24:24 +0100 Subject: [PATCH 31/43] Skip if array_api_support for Ridge not available --- benchmarks/ridge/solvers/sklearn_torch_dispatch.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py index ceef958..c1e4553 100644 --- a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py +++ b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py @@ -31,6 +31,11 @@ class Solver(BaseSolver): stopping_criterion = SingleRunCriterion(1) def skip(self, **objective_dict): + if not Ridge()._get_tags()["array_api_support"]: + return True, ( + "Requires the development branch for Ridge support for Array API." + ) + try: torch.zeros(1, dtype=torch.float32, device=self.device) except Exception: From 6bcf4d0644b2932fcab80958c327fe554f7917f0 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Wed, 17 Jan 2024 10:50:08 +0100 Subject: [PATCH 32/43] wip: iterate on benchmark parameters, following review suggestions --- benchmarks/ridge/consolidate_result_csv.py | 5 +++++ benchmarks/ridge/datasets/simulated_blobs.py | 7 +++---- benchmarks/ridge/objective.py | 20 +++++++++---------- benchmarks/ridge/solvers/scikit_learn.py | 4 ++-- .../ridge/solvers/scikit_learn_intelex.py | 4 ++-- 5 files changed, 22 insertions(+), 18 deletions(-) diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index b2cb42f..76cf2de 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -33,6 +33,7 @@ COMPUTE_DEVICE = "Compute device" COMPUTE_RUNTIME = "Compute runtime" DATA_RANDOM_STATE = "Data random state" +REGULARIZATION_STRENGTH = "Regularization strength" DTYPE = "Dtype" NB_DATA_FEATURES = "Nb data features" NB_DATA_SAMPLES = "Nb data samples" @@ -60,6 +61,7 @@ NB_DATA_SAMPLES, NB_DATA_FEATURES, NB_DATA_TARGETS, + REGULARIZATION_STRENGTH, WALLTIME, BACKEND_PROVIDER, COMPUTE_DEVICE, @@ -87,6 +89,7 @@ NB_DATA_SAMPLES: np.int64, NB_DATA_FEATURES: np.int64, NB_DATA_TARGETS: np.int64, + REGULARIZATION_STRENGTH: np.float64, WALLTIME: np.float64, BACKEND_PROVIDER: str, COMPUTE_DEVICE: str, @@ -120,6 +123,7 @@ NB_DATA_SAMPLES, NB_DATA_FEATURES, NB_DATA_TARGETS, + REGULARIZATION_STRENGTH, BACKEND_PROVIDER, SOLVER, COMPUTE_DEVICE, @@ -139,6 +143,7 @@ (NB_DATA_SAMPLES, False), (NB_DATA_FEATURES, False), (NB_DATA_TARGETS, True), + (REGULARIZATION_STRENGTH, False), (WALLTIME, True), (BACKEND_PROVIDER, True), (COMPUTE_DEVICE, True), diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index 68e40f4..5d3276a 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -10,10 +10,9 @@ class Dataset(BaseDataset): parameters = { "n_samples, n_features": [ - (5_000_000, 100), - (5000, 5000), - (5_000_000, 10), - (2_000_000, 100), + (10_000_000, 100), + (10_000_000, 10), + (5000, 10000), ], "n_targets": [1, 10], "dtype": ["float32"], diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 45f5e9c..4681241 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -19,19 +19,19 @@ class Objective(BaseObjective): # for all solvers, rather than being an independent benchmark space for each # solver. parameters = { - "alpha": [1.0], + "alpha": [1.0, 1e-10], "fit_intercept": [True], "solver, max_iter, tol": [ - ("svd", None, 0), - ("cholesky", None, 0), - ("lsqr", 25, 0), - ("sparse_cg", 25, 0), - ("sag", 50, 0), - ("saga", 25, 0), - ("lbfgs", 100, 0), - # Used for solvers like scikit-learn-intelex that doesn't + ("svd", None, 1e-4), + ("cholesky", None, 1e-4), + ("lsqr", None, 1e-4), + ("sparse_cg", None, 1e-4), + ("sag", None, 1e-4), + ("saga", None, 1e-4), + ("lbfgs", None, 1e-4), + # Used for scikit-learn-intelex that doesn't # document the underlying solver nor expose the n_iter_ attribute - ("???", None, 0), + ("DefaultDense", None, 1e-4), ], "sample_weight": ["None"], # NB: add "random" to test non None weights "random_state": [123], diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 4a2d278..8a0c76b 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -45,8 +45,8 @@ def skip(self, **objective_dict): "in the benchmark." ) - if solver == "???": - return True, "" + if solver == "DefaultDense": + return True, "No support this solver parameter." return False, None diff --git a/benchmarks/ridge/solvers/scikit_learn_intelex.py b/benchmarks/ridge/solvers/scikit_learn_intelex.py index 88cb36f..571705a 100644 --- a/benchmarks/ridge/solvers/scikit_learn_intelex.py +++ b/benchmarks/ridge/solvers/scikit_learn_intelex.py @@ -49,9 +49,9 @@ def skip(self, **objective_dict): solver = objective_dict["solver"] - if solver != "???": + if solver != "DefaultDense": # TODO: investigate ? - return True, "The underlying solver is unknown." + return True, "DefaultDense is the only supported solver parameter." return False, None From bd78618228cbb76897a048e5d20d13afdf899413 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Wed, 17 Jan 2024 11:16:09 +0100 Subject: [PATCH 33/43] Nits --- benchmarks/ridge/objective.py | 5 +---- benchmarks/ridge/solvers/scikit_learn.py | 2 +- benchmarks/ridge/solvers/scikit_learn_intelex.py | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 4681241..0c34844 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -95,10 +95,7 @@ def evaluate_result(self, weights, intercept, n_iter, **solver_parameters): if not (isinstance(n_iter, numbers.Number) or (n_iter is None)): n_iter = set(n_iter) if len(n_iter) > 1: - raise ValueError( - "In multitarget mode, the same number of iterations is expected " - "for all targets, to keep reports comparable." - ) + n_iter = max(n_iter) n_iter = n_iter.pop() # NB: str for n_iter is a more practical type because it enables diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 8a0c76b..971a76d 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -46,7 +46,7 @@ def skip(self, **objective_dict): ) if solver == "DefaultDense": - return True, "No support this solver parameter." + return True, "No support for this solver parameter." return False, None diff --git a/benchmarks/ridge/solvers/scikit_learn_intelex.py b/benchmarks/ridge/solvers/scikit_learn_intelex.py index 571705a..02445bb 100644 --- a/benchmarks/ridge/solvers/scikit_learn_intelex.py +++ b/benchmarks/ridge/solvers/scikit_learn_intelex.py @@ -51,7 +51,7 @@ def skip(self, **objective_dict): if solver != "DefaultDense": # TODO: investigate ? - return True, "DefaultDense is the only supported solver parameter." + return True, "The only supported solver parameter is DefaultDense." return False, None From 35a40d0818f1f67cfb21725f520eb435eb6e1423 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Wed, 17 Jan 2024 11:55:13 +0100 Subject: [PATCH 34/43] Fix lsqr --- benchmarks/ridge/objective.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 0c34844..9f7043e 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -93,10 +93,7 @@ def evaluate_result(self, weights, intercept, n_iter, **solver_parameters): ) if not (isinstance(n_iter, numbers.Number) or (n_iter is None)): - n_iter = set(n_iter) - if len(n_iter) > 1: - n_iter = max(n_iter) - n_iter = n_iter.pop() + n_iter = max(n_iter) # NB: str for n_iter is a more practical type because it enables # using missing values for solvers for which it doesn't apply From 934460286c30eed7add9ad6ca42e0a1361efb78e Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:37:45 +0100 Subject: [PATCH 35/43] Update results (wip: cuml missing) --- benchmarks/ridge/consolidate_result_csv.py | 1 + .../benchopt_run_2024-01-15_19h50m23.parquet | Bin 33882 -> 0 bytes .../benchopt_run_2024-01-15_20h06m24.parquet | Bin 33618 -> 0 bytes .../benchopt_run_2024-01-16_14h54m53.parquet | Bin 34246 -> 0 bytes .../benchopt_run_2024-01-16_16h08m16.parquet | Bin 34664 -> 0 bytes .../benchopt_run_2024-01-17_12h14m29.parquet | Bin 0 -> 36368 bytes .../benchopt_run_2024-01-17_13h01m18.parquet | Bin 0 -> 34214 bytes benchmarks/ridge/results.csv | 126 ++++++++++-------- 8 files changed, 74 insertions(+), 53 deletions(-) delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-15_19h50m23.parquet delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-15_20h06m24.parquet delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-16_14h54m53.parquet delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-16_16h08m16.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-17_12h14m29.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-17_13h01m18.parquet diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index 76cf2de..dc15978 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -174,6 +174,7 @@ objective_dataset_param_n_samples=NB_DATA_SAMPLES, objective_dataset_param_n_features=NB_DATA_FEATURES, objective_dataset_param_n_targets=NB_DATA_TARGETS, + objective_objective_param_alpha=REGULARIZATION_STRENGTH, objective_dataset_param_dtype=DTYPE, objective_dataset_param_random_state=DATA_RANDOM_STATE, objective_objective_param_random_state=SOLVER_RANDOM_STATE, diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-15_19h50m23.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-15_19h50m23.parquet deleted file mode 100644 index 9ed915ec471ae2ed587f60abdf3cc130caca8f82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33882 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 diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-15_20h06m24.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-15_20h06m24.parquet deleted file mode 100644 index 04850ea43ef6c73415c81fc3c003d4d446337aab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33618 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 L9j2%OCg}J-YWNJs diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-16_14h54m53.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-16_14h54m53.parquet deleted file mode 100644 index 84c8b668348291f551680ab2c1cad1d73e0fe9c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34246 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 literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-17_13h01m18.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-17_13h01m18.parquet new file mode 100644 index 0000000000000000000000000000000000000000..f3d5e98dab8e0027ec7bcea9bd5953736e4b94b4 GIT binary patch literal 34214 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 N_ums7HzdTo{|9tO=Slzo literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/results.csv b/benchmarks/ridge/results.csv index 9df6e45..270518c 100644 --- a/benchmarks/ridge/results.csv +++ b/benchmarks/ridge/results.csv @@ -1,53 +1,73 @@ -Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result nb iterations,Result objective value,Data random state,Solver random state -3a327106,float32,5000000,100,1,0.306,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,4.506280786401367,123,123 -3a327106,float32,5000000,100,1,0.735,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,4.506280786413193,123,123 -3a327106,float32,5000000,100,1,1.37,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506280786409378,123,123 -3a327106,float32,5000000,100,1,1.73,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506297986368179,123,123 -3a327106,float32,5000000,100,1,4.3,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,4.506297986381912,123,123 -3a327106,float32,5000000,100,1,5.56,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,4.506281586742783,123,123 -3a327106,float32,5000000,100,1,13.7,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,4.506297186405945,123,123 -9bd2a256,float32,5000000,100,10,0.26,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,2.079804933099976,123,123 -9bd2a256,float32,5000000,100,10,0.74,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.0798047731054687,123,123 -9bd2a256,float32,5000000,100,10,1.93,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079808773100586,123,123 -9bd2a256,float32,5000000,100,10,5.78,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.0798046132958983,123,123 -9bd2a256,float32,5000000,100,10,14.9,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.079808933101807,123,123 -9bd2a256,float32,5000000,100,10,37.2,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.07980909309967,123,123 -a9a05f25,float32,5000000,10,1,0.0273,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,0.0251269475670009,123,123 -a9a05f25,float32,5000000,10,1,0.0324,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.0251269460045129,123,123 -a9a05f25,float32,5000000,10,1,0.131,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.0251269475669592,123,123 -a9a05f25,float32,5000000,10,1,0.245,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.02512695694184,123,123 -a9a05f25,float32,5000000,10,1,0.527,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.0251269460045427,123,123 -a9a05f25,float32,5000000,10,1,0.796,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.025126958504486,123,123 -a9a05f25,float32,5000000,10,1,0.842,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.025126955379498,123,123 -ffd32c2e,float32,5000000,10,10,0.0375,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.1351635653306007,123,123 -ffd32c2e,float32,5000000,10,10,0.0458,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,0.1351635853306198,123,123 -ffd32c2e,float32,5000000,10,10,0.441,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.1351636653292465,123,123 -ffd32c2e,float32,5000000,10,10,0.688,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.1351635653207397,123,123 -ffd32c2e,float32,5000000,10,10,1.01,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,0.1351636653303528,123,123 -ffd32c2e,float32,5000000,10,10,7.28,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,0.1351636553305053,123,123 -c49c3df8,float32,2000000,100,1,0.0924,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,2.283151841181755,123,123 -c49c3df8,float32,2000000,100,1,0.283,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.28315184118557,123,123 -c49c3df8,float32,2000000,100,1,0.557,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283151841176033,123,123 -c49c3df8,float32,2000000,100,1,0.727,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.283155591078758,123,123 -c49c3df8,float32,2000000,100,1,1.84,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.283155091144562,123,123 -c49c3df8,float32,2000000,100,1,2.35,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.2831518412952425,123,123 -c49c3df8,float32,2000000,100,1,5.62,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.2831550911808014,123,123 -1a8c391a,float32,2000000,100,10,0.0961,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,2.160555392794037,123,123 -1a8c391a,float32,2000000,100,10,0.282,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.160555392803192,123,123 -1a8c391a,float32,2000000,100,10,0.779,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.160573592800904,123,123 -1a8c391a,float32,2000000,100,10,2.61,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.16055519289856,123,123 -1a8c391a,float32,2000000,100,10,5.7,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.1605733927993773,123,123 -1a8c391a,float32,2000000,100,10,16.4,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,2.1605733928001403,123,123 -e5684553,float32,5000,5000,1,0.166,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.347395458984376,123,123 -e5684553,float32,5000,5000,1,0.541,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.45976669921875,123,123 -e5684553,float32,5000,5000,1,0.557,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,3.76711484375,123,123 -e5684553,float32,5000,5000,1,6.29,cuml,gpu,,svd,32,AMD EPYC 7502 32-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.20544453125,123,123 -e5684553,float32,5000,5000,1,7.03,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,3.76734375,123,123 -e5684553,float32,5000,5000,1,9.08,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.459914453125,123,123 -e5684553,float32,5000,5000,1,10.7,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,3.76877265625,123,123 -7b05f2bf,float32,5000,5000,10,0.478,scikit-learn,,,cholesky,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.781028203125,123,123 -7b05f2bf,float32,5000,5000,10,0.532,scikit-learn-intelex,cpu,,???,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn-intelex 2024.0.1,,,2.74752203125,123,123 -7b05f2bf,float32,5000,5000,10,1.22,scikit-learn,,,lsqr,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,25,9.960193984375,123,123 -7b05f2bf,float32,5000,5000,10,6.82,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.747505859375,123,123 -7b05f2bf,float32,5000,5000,10,9.23,scikit-learn,,,svd,32,AMD EPYC 7402 24-Core Processor,,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-15,scikit-learn 1.3.2,,,2.781131640625,123,123 -7b05f2bf,float32,5000,5000,10,10.7,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7302 16-Core Processor,NVIDIA A100-PCIE-40GB,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-16,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.747708828125,123,123 +Benchmark id,Dtype,Nb data samples,Nb data features,Nb data targets,Regularization strength,Walltime,Backend provider,Compute device,Compute runtime,Solver,Nb cpus,Cpu name,Gpu name,RAM (GB),Platform,Platform architecture,Platform release,Run date,Version info,Comment,Result nb iterations,Result objective value,Data random state,Solver random state +cbe96b03,float32,10000000,100,1,1.0,0.563,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,3.105119922031021,123,123 +cbe96b03,float32,10000000,100,1,1.0,0.79,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,3.10511992203598,123,123 +cbe96b03,float32,10000000,100,1,1.0,3.42,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,3.1051197220314024,123,123 +cbe96b03,float32,10000000,100,1,1.0,5.96,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,17,3.105119122049713,123,123 +cbe96b03,float32,10000000,100,1,1.0,8.91,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,3.1051209226127625,123,123 +cbe96b03,float32,10000000,100,1,1.0,52.7,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,3.105120122029496,123,123 +f976a4f8,float32,10000000,100,1,1e-10,0.408,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,3.1051164000000004,123,123 +f976a4f8,float32,10000000,100,1,1e-10,0.742,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,3.1051164000000004,123,123 +f976a4f8,float32,10000000,100,1,1e-10,3.45,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,3.1051164000000004,123,123 +f976a4f8,float32,10000000,100,1,1e-10,6.14,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,17,3.1051158000000005,123,123 +f976a4f8,float32,10000000,100,1,1e-10,9.2,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,3.1051176000000003,123,123 +f976a4f8,float32,10000000,100,1,1e-10,52.3,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,3.1051168,123,123 +a9625843,float32,10000000,100,10,1.0,0.452,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,2.692140948616333,123,123 +a9625843,float32,10000000,100,10,1.0,0.75,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.692140628620148,123,123 +a9625843,float32,10000000,100,10,1.0,3.94,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,2.692140308622131,123,123 +a9625843,float32,10000000,100,10,1.0,9.93,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.6921425489894104,123,123 +a9625843,float32,10000000,100,10,1.0,48.9,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,18,2.6921428686135864,123,123 +a9625843,float32,10000000,100,10,1.0,52.8,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,2.69214062861969,123,123 +8ed75954,float32,10000000,100,10,1e-10,0.44,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,2.69213856,123,123 +8ed75954,float32,10000000,100,10,1e-10,0.749,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.69213824,123,123 +8ed75954,float32,10000000,100,10,1e-10,3.89,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,2.69213792,123,123 +8ed75954,float32,10000000,100,10,1e-10,9.78,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,2.69214016,123,123 +8ed75954,float32,10000000,100,10,1e-10,48.6,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,18,2.69214048,123,123 +8ed75954,float32,10000000,100,10,1e-10,51.6,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,2.69213824,123,123 +67d027a4,float32,10000000,10,1,1.0,0.0439,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.5324485410551071,123,123 +67d027a4,float32,10000000,10,1,1.0,0.0531,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.5324485410553932,123,123 +67d027a4,float32,10000000,10,1,1.0,0.46,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.5324485410561561,123,123 +67d027a4,float32,10000000,10,1,1.0,0.834,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,10,0.5324489910561084,123,123 +67d027a4,float32,10000000,10,1,1.0,0.86,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.5324485410661698,123,123 +67d027a4,float32,10000000,10,1,1.0,3,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.5324485910551549,123,123 +4fe92f89,float32,10000000,10,1,1e-10,0.038,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.5324481,123,123 +4fe92f89,float32,10000000,10,1,1e-10,0.0495,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.53244815,123,123 +4fe92f89,float32,10000000,10,1,1e-10,0.461,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.53244815,123,123 +4fe92f89,float32,10000000,10,1,1e-10,0.847,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,10,0.53244855,123,123 +4fe92f89,float32,10000000,10,1,1e-10,0.855,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.5324481,123,123 +4fe92f89,float32,10000000,10,1,1e-10,2.97,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.53244815,123,123 +9355a1d7,float32,10000000,10,10,1.0,0.0585,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.2334089881958007,123,123 +9355a1d7,float32,10000000,10,10,1.0,0.0745,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.2334089881957817,123,123 +9355a1d7,float32,10000000,10,10,1.0,0.901,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.2334089681967163,123,123 +9355a1d7,float32,10000000,10,10,1.0,1.13,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.2334098480794334,123,123 +9355a1d7,float32,10000000,10,10,1.0,3.62,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.2334089881959343,123,123 +9355a1d7,float32,10000000,10,10,1.0,6.36,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,11,0.2334089881908989,123,123 +a14c1361,float32,10000000,10,10,1e-10,0.04,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.23340876,123,123 +a14c1361,float32,10000000,10,10,1e-10,0.0739,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.23340876,123,123 +a14c1361,float32,10000000,10,10,1e-10,0.908,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.23340874,123,123 +a14c1361,float32,10000000,10,10,1e-10,1.13,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.23340962,123,123 +a14c1361,float32,10000000,10,10,1e-10,3.43,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.23340876,123,123 +a14c1361,float32,10000000,10,10,1e-10,6.26,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,11,0.23340876,123,123 +73b8dab5,float32,5000,10000,1,1.0,0.576,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.4365529907226562,123,123 +73b8dab5,float32,5000,10000,1,1.0,0.593,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.4365529907226562,123,123 +73b8dab5,float32,5000,10000,1,1.0,0.668,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,82,0.4365451538085937,123,123 +73b8dab5,float32,5000,10000,1,1.0,3.66,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.4365692749023437,123,123 +73b8dab5,float32,5000,10000,1,1.0,11.9,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.4365479858398438,123,123 +73b8dab5,float32,5000,10000,1,1.0,24.1,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.4365515014648437,123,123 +1e6fef9b,float32,5000,10000,1,1e-10,0.591,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,64,0.1466086914354196,123,123 +1e6fef9b,float32,5000,10000,1,1e-10,3.55,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.1557751831353653,123,123 +1e6fef9b,float32,5000,10000,1,1e-10,5.79,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.1377344848931573,123,123 +1e6fef9b,float32,5000,10000,1,1e-10,5.79,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.1377344848931573,123,123 +1e6fef9b,float32,5000,10000,1,1e-10,12,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.128667602568943,123,123 +1e6fef9b,float32,5000,10000,1,1e-10,23.4,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.1380022217095494,123,123 +06511952,float32,5000,10000,10,1.0,0.576,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.9041459375,123,123 +06511952,float32,5000,10000,10,1.0,0.583,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.9041459375,123,123 +06511952,float32,5000,10000,10,1.0,3.61,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.9043073828125,123,123 +06511952,float32,5000,10000,10,1.0,6.45,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,82,0.90424390625,123,123 +06511952,float32,5000,10000,10,1.0,12,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.904237265625,123,123 +06511952,float32,5000,10000,10,1.0,24.2,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.904249765625,123,123 +6e8bfb2d,float32,5000,10000,10,1e-10,3.56,sklearn-torch-dispatch,cuda,,svd,32,AMD EPYC 7402 24-Core Processor,NVIDIA A100-PCIE-40GB,1008,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.4814392579111228,123,123 +6e8bfb2d,float32,5000,10000,10,1e-10,4.68,scikit-learn,,,lsqr,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,64,0.3175425000945574,123,123 +6e8bfb2d,float32,5000,10000,10,1e-10,6.2,scikit-learn-intelex,cpu,,DefaultDense,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn-intelex 2024.0.1,,,0.3010748829093572,123,123 +6e8bfb2d,float32,5000,10000,10,1e-10,6.31,scikit-learn,,,cholesky,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.3010748829093572,123,123 +6e8bfb2d,float32,5000,10000,10,1e-10,11.7,sklearn-torch-dispatch,cpu,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0; torch 2.1.0.post300,,,0.2938720313465286,123,123 +6e8bfb2d,float32,5000,10000,10,1e-10,23.9,scikit-learn,,,svd,32,AMD EPYC 7302 16-Core Processor,,503,Linux,x86_64,4.18.0-394.el8.x86_64,2024-01-17,scikit-learn 1.5.dev0,,,0.3019234375965278,123,123 From 6d021d073c471aa936ab1b1301b89e7dd16d9fec Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Wed, 17 Jan 2024 15:27:16 +0100 Subject: [PATCH 36/43] revert unrelated kmeans changes --- benchmarks/kmeans/objective.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/benchmarks/kmeans/objective.py b/benchmarks/kmeans/objective.py index 942f701..63f3bf1 100644 --- a/benchmarks/kmeans/objective.py +++ b/benchmarks/kmeans/objective.py @@ -32,15 +32,15 @@ def set_data(self, X, **dataset_parameters): self.X = X dtype = X.dtype + if self.init == "random" or self.sample_weight == "random": + rng = np.random.default_rng(self.random_state) + if self.sample_weight == "None": sample_weight = None elif self.sample_weight == "unary": sample_weight = np.ones(len(X), dtype=dtype) elif self.sample_weight == "random": - rng_sample_weight = np.random.default_rng( - dataset_parameters["random_state"] + 1 - ) - sample_weight = rng_sample_weight.random(size=len(X)).astype(dtype) + sample_weight = rng.random(size=len(X)).astype(dtype) else: raise ValueError( "Expected 'sample_weight' parameter to be either equal to 'None', " @@ -48,9 +48,8 @@ def set_data(self, X, **dataset_parameters): ) if self.init == "random": - rng_init = np.random.default_rng(self.random_state) init = np.array( - rng_init.choice(X, self.n_clusters, replace=False), dtype=X.dtype + rng.choice(X, self.n_clusters, replace=False), dtype=X.dtype ) elif self.init == "k-means++": init = self.init From e7a1399f3b5e28ac72c9d1dc27dc3d4a3e24a25e Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 18 Jan 2024 11:10:11 +0100 Subject: [PATCH 37/43] Add more solvers and dimensions, work around issues with incompatible dimensions in warmup --- benchmarks/ridge/datasets/simulated_blobs.py | 4 +- benchmarks/ridge/objective.py | 6 +- benchmarks/ridge/solvers/cuml.py | 56 ++++++++++-------- benchmarks/ridge/solvers/scikit_learn.py | 14 +++-- .../ridge/solvers/scikit_learn_intelex.py | 58 ++++++++++--------- .../ridge/solvers/sklearn_torch_dispatch.py | 54 +++++++++-------- 6 files changed, 110 insertions(+), 82 deletions(-) diff --git a/benchmarks/ridge/datasets/simulated_blobs.py b/benchmarks/ridge/datasets/simulated_blobs.py index 5d3276a..d850f73 100644 --- a/benchmarks/ridge/datasets/simulated_blobs.py +++ b/benchmarks/ridge/datasets/simulated_blobs.py @@ -11,8 +11,10 @@ class Dataset(BaseDataset): parameters = { "n_samples, n_features": [ (10_000_000, 100), - (10_000_000, 10), + (5_000_000, 100), + (5_000_000, 10), (5000, 10000), + (5000, 5000), ], "n_targets": [1, 10], "dtype": ["float32"], diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 9f7043e..3dbfcdb 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -22,13 +22,15 @@ class Objective(BaseObjective): "alpha": [1.0, 1e-10], "fit_intercept": [True], "solver, max_iter, tol": [ - ("svd", None, 1e-4), - ("cholesky", None, 1e-4), + ("svd", None, 0), + ("cholesky", None, 0), ("lsqr", None, 1e-4), ("sparse_cg", None, 1e-4), ("sag", None, 1e-4), ("saga", None, 1e-4), ("lbfgs", None, 1e-4), + ("cg", None, 1e-4), + ("eig", None, None), # Used for scikit-learn-intelex that doesn't # document the underlying solver nor expose the n_iter_ attribute ("DefaultDense", None, 1e-4), diff --git a/benchmarks/ridge/solvers/cuml.py b/benchmarks/ridge/solvers/cuml.py index c64cd41..6245868 100644 --- a/benchmarks/ridge/solvers/cuml.py +++ b/benchmarks/ridge/solvers/cuml.py @@ -19,29 +19,6 @@ class Solver(BaseSolver): stopping_criterion = SingleRunCriterion(1) - def skip(self, **objective_dict): - - X = objective_dict["X"] - if X.dtype == np.float64: - # We haven't came accross cuda devices that doesn't support float64 yet, - # can it happen ? If it happens, the following instruction will fail, - # please enclose it with the appropriate Try/Except to return the - # appropriate skip decision. - cupy.zeros(1, dtype=cupy.float64) - # return True, ( - # f"This {self.device} device has no support for float64 compute" - # ) - - y = objective_dict["y"] - if (y.ndim == 2) and (y.shape[1] > 1): - return True, "Multitarget is not supported." - - solver = objective_dict["solver"] - if solver != "svd": - return True, "Only accepts the svd solver at the moment." - - return False, None - def set_objective( self, X, @@ -68,15 +45,44 @@ def set_objective( self.tol = tol self.random_state = random_state + def skip(self, **objective_dict): + + X = objective_dict["X"] + if X.dtype == np.float64: + # We haven't came accross cuda devices that doesn't support float64 yet, + # can it happen ? If it happens, the following instruction will fail, + # please enclose it with the appropriate Try/Except to return the + # appropriate skip decision. + cupy.zeros(1, dtype=cupy.float64) + # return True, ( + # f"This {self.device} device has no support for float64 compute" + # ) + + y = objective_dict["y"] + if (y.ndim == 2) and (y.shape[1] > 1): + return True, "Multitarget is not supported." + + solver = objective_dict["solver"] + if solver not in ["svd", "cg", "eig"]: + return True, "Only accepts the svd solver at the moment." + + return False, None + def warm_up(self): + n_warmup_samples = 20 + n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:2] + sample_weight = sample_weight[:n_warmup_samples] cuml.Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, solver=self.solver, - ).fit(self.X[:2], self.y[:2], sample_weight=sample_weight) + ).fit( + self.X[:n_warmup_samples, :n_warmup_features], + self.y[:n_warmup_samples], + sample_weight=sample_weight, + ) def run(self, _): estimator = cuml.Ridge( diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index 971a76d..dec7041 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -38,22 +38,24 @@ def set_objective( def skip(self, **objective_dict): solver = objective_dict["solver"] - if solver in ["sag", "saga", "sparse_cg", "lbfgs"]: + if solver in ["sag", "saga"]: # TODO: investigate ? return True, ( "Preliminary testing show this solver is too slow to have relevance " "in the benchmark." ) - if solver == "DefaultDense": + if solver in ["DefaultDense", "eig", "cg"]: return True, "No support for this solver parameter." return False, None def warm_up(self): + n_warmup_samples = 20 + n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:2] + sample_weight = sample_weight[:20] Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, @@ -63,7 +65,11 @@ def warm_up(self): solver=self.solver, positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, - ).fit(self.X[:2], self.y[:2], sample_weight) + ).fit( + self.X[:n_warmup_samples, :n_warmup_features], + self.y[:n_warmup_samples], + sample_weight, + ) def run(self, _): estimator = Ridge( diff --git a/benchmarks/ridge/solvers/scikit_learn_intelex.py b/benchmarks/ridge/solvers/scikit_learn_intelex.py index 02445bb..29cca65 100644 --- a/benchmarks/ridge/solvers/scikit_learn_intelex.py +++ b/benchmarks/ridge/solvers/scikit_learn_intelex.py @@ -31,30 +31,6 @@ class Solver(BaseSolver): stopping_criterion = SingleRunCriterion(1) - def skip(self, **objective_dict): - if self.runtime is not None: - try: - device = dpctl.SyclDevice(f"{self.runtime}:{self.device}") - except Exception: - return ( - True, - f"{self.runtime} runtime not found for device {self.device}", - ) - - X = objective_dict["X"] - if (X.dtype == np.float64) and not device.has_aspect_fp64: - return True, ( - f"This {self.device} device has no support for float64 compute" - ) - - solver = objective_dict["solver"] - - if solver != "DefaultDense": - # TODO: investigate ? - return True, "The only supported solver parameter is DefaultDense." - - return False, None - def set_objective( self, X, @@ -94,10 +70,36 @@ def set_objective( self.tol = tol self.random_state = random_state + def skip(self, **objective_dict): + if self.runtime is not None: + try: + device = dpctl.SyclDevice(f"{self.runtime}:{self.device}") + except Exception: + return ( + True, + f"{self.runtime} runtime not found for device {self.device}", + ) + + X = objective_dict["X"] + if (X.dtype == np.float64) and not device.has_aspect_fp64: + return True, ( + f"This {self.device} device has no support for float64 compute" + ) + + solver = objective_dict["solver"] + + if solver != "DefaultDense": + # TODO: investigate ? + return True, "The only supported solver parameter is DefaultDense." + + return False, None + def warm_up(self): + n_warmup_samples = 20 + n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:2] + sample_weight = sample_weight[:n_warmup_samples] with nullcontext() if (self.runtime is None) else config_context( target_offload=f"{self.runtime}:{self.device}" ): @@ -110,7 +112,11 @@ def warm_up(self): solver="auto", positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, - ).fit(self.X[:2], self.y[:2], sample_weight) + ).fit( + self.X[:n_warmup_samples, :n_warmup_features], + self.y[:n_warmup_samples], + sample_weight, + ) def run(self, _): with nullcontext() if (self.runtime is None) else config_context( diff --git a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py index c1e4553..26f3194 100644 --- a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py +++ b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py @@ -30,29 +30,6 @@ class Solver(BaseSolver): stopping_criterion = SingleRunCriterion(1) - def skip(self, **objective_dict): - if not Ridge()._get_tags()["array_api_support"]: - return True, ( - "Requires the development branch for Ridge support for Array API." - ) - - try: - torch.zeros(1, dtype=torch.float32, device=self.device) - except Exception: - return True, f"{self.device} compute backend for pytorch not found" - - X = objective_dict["X"] - if (X.dtype == np.float64) and not has_fp64_support(self.device): - return True, ( - f"This {self.device} device has no support for float64 compute" - ) - - solver = objective_dict["solver"] - if solver != "svd": - return True, "Only accepts the svd solver at the moment." - - return False, None - def set_objective( self, X, @@ -82,7 +59,32 @@ def set_objective( self.tol = tol self.random_state = random_state + def skip(self, **objective_dict): + if not Ridge()._get_tags()["array_api_support"]: + return True, ( + "Requires the development branch for Ridge support for Array API." + ) + + try: + torch.zeros(1, dtype=torch.float32, device=self.device) + except Exception: + return True, f"{self.device} compute backend for pytorch not found" + + X = objective_dict["X"] + if (X.dtype == np.float64) and not has_fp64_support(self.device): + return True, ( + f"This {self.device} device has no support for float64 compute" + ) + + solver = objective_dict["solver"] + if solver != "svd": + return True, "Only accepts the svd solver at the moment." + + return False, None + def warm_up(self): + n_warmup_samples = 20 + n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: sample_weight = sample_weight[:2] @@ -96,7 +98,11 @@ def warm_up(self): solver=self.solver, positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, - ).fit(self.X[:2], self.y[:2], sample_weight) + ).fit( + self.X[:n_warmup_samples, :n_warmup_features], + self.y[:n_warmup_samples], + sample_weight, + ) def run(self, _): with config_context(array_api_dispatch=True): From 8144d23493799d3d981c84d79df653fe0139edb9 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 18 Jan 2024 11:19:03 +0100 Subject: [PATCH 38/43] fixup --- benchmarks/ridge/objective.py | 2 +- benchmarks/ridge/solvers/cuml.py | 8 ++++---- benchmarks/ridge/solvers/scikit_learn.py | 8 ++++---- benchmarks/ridge/solvers/scikit_learn_intelex.py | 6 +++--- benchmarks/ridge/solvers/sklearn_torch_dispatch.py | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 3dbfcdb..88c939e 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -29,7 +29,7 @@ class Objective(BaseObjective): ("sag", None, 1e-4), ("saga", None, 1e-4), ("lbfgs", None, 1e-4), - ("cg", None, 1e-4), + ("cd", None, 1e-4), ("eig", None, None), # Used for scikit-learn-intelex that doesn't # document the underlying solver nor expose the n_iter_ attribute diff --git a/benchmarks/ridge/solvers/cuml.py b/benchmarks/ridge/solvers/cuml.py index 6245868..5df29dd 100644 --- a/benchmarks/ridge/solvers/cuml.py +++ b/benchmarks/ridge/solvers/cuml.py @@ -63,7 +63,7 @@ def skip(self, **objective_dict): return True, "Multitarget is not supported." solver = objective_dict["solver"] - if solver not in ["svd", "cg", "eig"]: + if solver not in ["svd", "cd", "eig"]: return True, "Only accepts the svd solver at the moment." return False, None @@ -73,14 +73,14 @@ def warm_up(self): n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:n_warmup_samples] + sample_weight = (sample_weight[:n_warmup_samples].copy(),) cuml.Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, solver=self.solver, ).fit( - self.X[:n_warmup_samples, :n_warmup_features], - self.y[:n_warmup_samples], + self.X[:n_warmup_samples, :n_warmup_features].copy(), + self.y[:n_warmup_samples].copy(), sample_weight=sample_weight, ) diff --git a/benchmarks/ridge/solvers/scikit_learn.py b/benchmarks/ridge/solvers/scikit_learn.py index dec7041..14674a2 100644 --- a/benchmarks/ridge/solvers/scikit_learn.py +++ b/benchmarks/ridge/solvers/scikit_learn.py @@ -45,7 +45,7 @@ def skip(self, **objective_dict): "in the benchmark." ) - if solver in ["DefaultDense", "eig", "cg"]: + if solver in ["DefaultDense", "eig", "cd"]: return True, "No support for this solver parameter." return False, None @@ -55,7 +55,7 @@ def warm_up(self): n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:20] + sample_weight = sample_weight[:n_warmup_samples].copy() Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, @@ -66,8 +66,8 @@ def warm_up(self): positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, ).fit( - self.X[:n_warmup_samples, :n_warmup_features], - self.y[:n_warmup_samples], + self.X[:n_warmup_samples, :n_warmup_features].copy(), + self.y[:n_warmup_samples].copy(), sample_weight, ) diff --git a/benchmarks/ridge/solvers/scikit_learn_intelex.py b/benchmarks/ridge/solvers/scikit_learn_intelex.py index 29cca65..c5f697f 100644 --- a/benchmarks/ridge/solvers/scikit_learn_intelex.py +++ b/benchmarks/ridge/solvers/scikit_learn_intelex.py @@ -99,7 +99,7 @@ def warm_up(self): n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:n_warmup_samples] + sample_weight = sample_weight[:n_warmup_samples].copy() with nullcontext() if (self.runtime is None) else config_context( target_offload=f"{self.runtime}:{self.device}" ): @@ -113,8 +113,8 @@ def warm_up(self): positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, ).fit( - self.X[:n_warmup_samples, :n_warmup_features], - self.y[:n_warmup_samples], + self.X[:n_warmup_samples, :n_warmup_features].copy(), + self.y[:n_warmup_samples].copy(), sample_weight, ) diff --git a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py index 26f3194..f51f829 100644 --- a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py +++ b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py @@ -87,7 +87,7 @@ def warm_up(self): n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:2] + sample_weight = sample_weight[:n_warmup_samples].copy() with config_context(array_api_dispatch=True): Ridge( alpha=self.alpha, @@ -99,8 +99,8 @@ def warm_up(self): positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, ).fit( - self.X[:n_warmup_samples, :n_warmup_features], - self.y[:n_warmup_samples], + self.X[:n_warmup_samples, :n_warmup_features].copy(), + self.y[:n_warmup_samples].copy(), sample_weight, ) From d5bab3fec1f6f48754b5feb5389afe52613fd17c Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 18 Jan 2024 11:24:48 +0100 Subject: [PATCH 39/43] fixup cuml --- benchmarks/ridge/solvers/cuml.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/benchmarks/ridge/solvers/cuml.py b/benchmarks/ridge/solvers/cuml.py index 5df29dd..b892e96 100644 --- a/benchmarks/ridge/solvers/cuml.py +++ b/benchmarks/ridge/solvers/cuml.py @@ -63,7 +63,9 @@ def skip(self, **objective_dict): return True, "Multitarget is not supported." solver = objective_dict["solver"] - if solver not in ["svd", "cd", "eig"]: + # NB: should also support "cd" but it doesnt work + # TODO: investigate ? + if solver not in ["svd", "eig"]: return True, "Only accepts the svd solver at the moment." return False, None @@ -73,7 +75,7 @@ def warm_up(self): n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = (sample_weight[:n_warmup_samples].copy(),) + sample_weight = sample_weight[:n_warmup_samples].copy() cuml.Ridge( alpha=self.alpha, fit_intercept=self.fit_intercept, From d2ccf5ba5141be15f0392f8e85094699b774970e Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 18 Jan 2024 13:25:39 +0100 Subject: [PATCH 40/43] fixup torch --- benchmarks/ridge/solvers/sklearn_torch_dispatch.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py index f51f829..1ba6213 100644 --- a/benchmarks/ridge/solvers/sklearn_torch_dispatch.py +++ b/benchmarks/ridge/solvers/sklearn_torch_dispatch.py @@ -87,7 +87,7 @@ def warm_up(self): n_warmup_features = 5 sample_weight = self.sample_weight if sample_weight is not None: - sample_weight = sample_weight[:n_warmup_samples].copy() + sample_weight = sample_weight[:n_warmup_samples].clone() with config_context(array_api_dispatch=True): Ridge( alpha=self.alpha, @@ -99,8 +99,8 @@ def warm_up(self): positive=True if (self.solver == "lbfgs") else False, random_state=self.random_state, ).fit( - self.X[:n_warmup_samples, :n_warmup_features].copy(), - self.y[:n_warmup_samples].copy(), + self.X[:n_warmup_samples, :n_warmup_features].clone(), + self.y[:n_warmup_samples].clone(), sample_weight, ) From 5a0da41b3349fcc9c2b3b1a72498c3a7f5d334b8 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:46:38 +0100 Subject: [PATCH 41/43] Remove lbfgs (because it enforces positive=True) --- benchmarks/ridge/objective.py | 1 - 1 file changed, 1 deletion(-) diff --git a/benchmarks/ridge/objective.py b/benchmarks/ridge/objective.py index 88c939e..f5520fc 100644 --- a/benchmarks/ridge/objective.py +++ b/benchmarks/ridge/objective.py @@ -28,7 +28,6 @@ class Objective(BaseObjective): ("sparse_cg", None, 1e-4), ("sag", None, 1e-4), ("saga", None, 1e-4), - ("lbfgs", None, 1e-4), ("cd", None, 1e-4), ("eig", None, None), # Used for scikit-learn-intelex that doesn't From 7b4c52e44821a3eb745da628d5f6107af5c32317 Mon Sep 17 00:00:00 2001 From: Franck Charras <29153872+fcharras@users.noreply.github.com> Date: Thu, 18 Jan 2024 16:29:56 +0100 Subject: [PATCH 42/43] Update all results. --- .../benchopt_run_2024-01-17_12h14m29.parquet | Bin 36368 -> 0 bytes .../benchopt_run_2024-01-17_13h01m18.parquet | Bin 34214 -> 0 bytes .../benchopt_run_2024-01-18_11h26m04.parquet | Bin 0 -> 34305 bytes .../benchopt_run_2024-01-18_12h59m51.parquet | Bin 0 -> 38350 bytes .../benchopt_run_2024-01-18_13h35m10.parquet | Bin 0 -> 34455 bytes .../benchopt_run_2024-01-18_16h06m03.parquet | Bin 0 -> 34395 bytes benchmarks/ridge/results.csv | 228 ++++++++++++------ 7 files changed, 156 insertions(+), 72 deletions(-) delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-17_12h14m29.parquet delete mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-17_13h01m18.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-18_11h26m04.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-18_12h59m51.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-18_13h35m10.parquet create mode 100644 benchmarks/ridge/outputs/benchopt_run_2024-01-18_16h06m03.parquet diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-17_12h14m29.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-17_12h14m29.parquet deleted file mode 100644 index 6b5e12972a9f38149bdac7303c27cf583659754a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36368 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 diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-17_13h01m18.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-17_13h01m18.parquet deleted file mode 100644 index f3d5e98dab8e0027ec7bcea9bd5953736e4b94b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34214 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 N_ums7HzdTo{|9tO=Slzo diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-18_11h26m04.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-18_11h26m04.parquet new file mode 100644 index 0000000000000000000000000000000000000000..ca3adf5e9cc0d609952b1d89a7b078fa9428b6ec GIT binary patch literal 34305 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 bzT3nj@$d(q;jid#*1ybK6AUxN2OR$cx-95A literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-18_12h59m51.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-18_12h59m51.parquet new file mode 100644 index 0000000000000000000000000000000000000000..180efc8192d7e29e214fcb616685849746d6a232 GIT binary patch literal 38350 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 literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-18_13h35m10.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-18_13h35m10.parquet new file mode 100644 index 0000000000000000000000000000000000000000..25627ed8e226340a06375a4a95f4ba95958cfca0 GIT binary patch literal 34455 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 literal 0 HcmV?d00001 diff --git a/benchmarks/ridge/outputs/benchopt_run_2024-01-18_16h06m03.parquet b/benchmarks/ridge/outputs/benchopt_run_2024-01-18_16h06m03.parquet new file mode 100644 index 0000000000000000000000000000000000000000..c1fd0685295c3fc1c1905450035889cb30b85ba2 GIT binary patch literal 34395 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 Date: Wed, 21 Feb 2024 12:15:22 +0100 Subject: [PATCH 43/43] Fix a bug that didn't reset bold settings after a sync refresh --- benchmarks/kmeans/consolidate_result_csv.py | 7 ++++--- benchmarks/pca/consolidate_result_csv.py | 7 ++++--- benchmarks/ridge/consolidate_result_csv.py | 7 ++++--- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/benchmarks/kmeans/consolidate_result_csv.py b/benchmarks/kmeans/consolidate_result_csv.py index 81e9a50..5656264 100644 --- a/benchmarks/kmeans/consolidate_result_csv.py +++ b/benchmarks/kmeans/consolidate_result_csv.py @@ -392,10 +392,11 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): worksheet.freeze(0, 0) worksheet.resize(rows=n_rows + 1, cols=n_cols) worksheet.clear_notes(global_range) - white_background = dict( - backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)) + reset_format = dict( + backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)), + textFormat=dict(bold=False), ) - worksheet.format(global_range, white_background) + worksheet.format(global_range, reset_format) except gspread.WorksheetNotFound: worksheet = sheet.add_worksheet( GOOGLE_WORKSHEET_NAME, rows=n_rows + 1, cols=n_cols diff --git a/benchmarks/pca/consolidate_result_csv.py b/benchmarks/pca/consolidate_result_csv.py index fc34b3f..90835e3 100644 --- a/benchmarks/pca/consolidate_result_csv.py +++ b/benchmarks/pca/consolidate_result_csv.py @@ -390,10 +390,11 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): worksheet.freeze(0, 0) worksheet.resize(rows=n_rows + 1, cols=n_cols) worksheet.clear_notes(global_range) - white_background = dict( - backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)) + reset_format = dict( + backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)), + textFormat=dict(bold=False), ) - worksheet.format(global_range, white_background) + worksheet.format(global_range, reset_format) except gspread.WorksheetNotFound: worksheet = sheet.add_worksheet( GOOGLE_WORKSHEET_NAME, rows=n_rows + 1, cols=n_cols diff --git a/benchmarks/ridge/consolidate_result_csv.py b/benchmarks/ridge/consolidate_result_csv.py index dc15978..892cbfd 100644 --- a/benchmarks/ridge/consolidate_result_csv.py +++ b/benchmarks/ridge/consolidate_result_csv.py @@ -390,10 +390,11 @@ def _gspread_sync(source, gspread_url, gspread_auth_key): worksheet.freeze(0, 0) worksheet.resize(rows=n_rows + 1, cols=n_cols) worksheet.clear_notes(global_range) - white_background = dict( - backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)) + reset_format = dict( + backgroundColorStyle=dict(rgbColor=dict(red=1, green=1, blue=1, alpha=1)), + textFormat=dict(bold=False), ) - worksheet.format(global_range, white_background) + worksheet.format(global_range, reset_format) except gspread.WorksheetNotFound: worksheet = sheet.add_worksheet( GOOGLE_WORKSHEET_NAME, rows=n_rows + 1, cols=n_cols