diff --git a/freqtrade/main.py b/freqtrade/main.py index fd142452a..6720e5eeb 100755 --- a/freqtrade/main.py +++ b/freqtrade/main.py @@ -18,7 +18,12 @@ from freqtrade.commands import Arguments from freqtrade.constants import DOCS_LINK from freqtrade.exceptions import ConfigurationError, FreqtradeException, OperationalException from freqtrade.loggers import setup_logging_pre -from freqtrade.system import asyncio_setup, gc_set_threshold, print_version_info +from freqtrade.system import ( + asyncio_setup, + gc_set_threshold, + print_version_info, + set_mp_start_method, +) logger = logging.getLogger("freqtrade") @@ -44,6 +49,7 @@ def main(sysargv: list[str] | None = None) -> None: elif "func" in args: logger.info(f"freqtrade {__version__}") gc_set_threshold() + set_mp_start_method() return_code = args["func"](args) else: # No subcommand was issued. diff --git a/freqtrade/system/__init__.py b/freqtrade/system/__init__.py index e69e90de8..9bb472d01 100644 --- a/freqtrade/system/__init__.py +++ b/freqtrade/system/__init__.py @@ -2,7 +2,8 @@ from freqtrade.system.asyncio_config import asyncio_setup from freqtrade.system.gc_setup import gc_set_threshold +from freqtrade.system.set_mp_start_method import set_mp_start_method from freqtrade.system.version_info import print_version_info -__all__ = ["asyncio_setup", "gc_set_threshold", "print_version_info"] +__all__ = ["asyncio_setup", "gc_set_threshold", "print_version_info", "set_mp_start_method"] diff --git a/freqtrade/system/set_mp_start_method.py b/freqtrade/system/set_mp_start_method.py new file mode 100644 index 000000000..34b7051c5 --- /dev/null +++ b/freqtrade/system/set_mp_start_method.py @@ -0,0 +1,14 @@ +from multiprocessing import get_all_start_methods, get_start_method, set_start_method + + +def set_mp_start_method(): + """ + Set multiprocessing start method to not be fork. + forkserver will become the default in 3.14 - and is deprecated in 3.13 + """ + try: + sms = get_all_start_methods() + if "forkserver" in sms and get_start_method(True) is None: + set_start_method("forkserver") + except RuntimeError: + pass diff --git a/pyproject.toml b/pyproject.toml index 6bf7fe362..1adb31364 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,7 +85,7 @@ hyperopt = [ freqai = [ "scikit-learn", "joblib", - "catboost; 'arm' not in platform_machine", + "catboost; platform_machine != 'arm'", "lightgbm", "xgboost", "tensorboard", diff --git a/tests/commands/test_startup_time.py b/tests/commands/test_startup_time.py index 62baab20a..32b4f80fd 100644 --- a/tests/commands/test_startup_time.py +++ b/tests/commands/test_startup_time.py @@ -4,7 +4,7 @@ import time from tests.conftest import is_arm, is_mac -MAXIMUM_STARTUP_TIME = 0.7 if is_mac() and not is_arm() else 0.5 +MAXIMUM_STARTUP_TIME = 0.7 if is_mac() and not is_arm(True) else 0.5 def test_startup_time(): diff --git a/tests/conftest.py b/tests/conftest.py index a390dea07..93144ffc4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -21,6 +21,7 @@ from freqtrade.exchange import Exchange, timeframe_to_minutes, timeframe_to_seco from freqtrade.freqtradebot import FreqtradeBot from freqtrade.persistence import LocalTrade, Order, Trade, init_db from freqtrade.resolvers import ExchangeResolver +from freqtrade.system import set_mp_start_method from freqtrade.util import dt_now, dt_ts from freqtrade.worker import Worker from tests.conftest_trades import ( @@ -500,9 +501,20 @@ def patch_gc(mocker) -> None: mocker.patch("freqtrade.main.gc_set_threshold") -def is_arm() -> bool: +@pytest.fixture(scope="session", autouse=True) +def fixture_set_mp_start_method(): + """ + Patch multiprocessing start mode globally + Auto-used, runs once per session. + """ + set_mp_start_method() + + +def is_arm(include_aarch64: bool = False) -> bool: machine = platform.machine() - return "arm" in machine or "aarch64" in machine + if include_aarch64: + return "aarch64" in machine or "arm" in machine + return "arm" in machine def is_mac() -> bool: diff --git a/tests/freqai/test_freqai_interface.py b/tests/freqai/test_freqai_interface.py index 0710591c9..3e7e96d85 100644 --- a/tests/freqai/test_freqai_interface.py +++ b/tests/freqai/test_freqai_interface.py @@ -143,6 +143,7 @@ def test_extract_data_and_train_model_Standard( ("CatboostClassifierMultiTarget", "freqai_test_multimodel_classifier_strat"), ], ) +@pytest.mark.filterwarnings(r"ignore:.*__sklearn_tags__.*:DeprecationWarning") def test_extract_data_and_train_model_MultiTargets(mocker, freqai_conf, model, strat): can_run_model(model)