Description
AxBackend has a hardcoded DEFAULT_BO_CONCURRENCY = 3 that caps how many trials Ax suggests per cycle. Manager has an independent job_limit that caps how many simulation jobs run concurrently. These two values are never linked, causing a silent resource underutilization bug:
Example: User sets job_limit=8. Ax only ever suggests 3 candidates. 5 cluster slots sit idle every cycle.
Root cause
DEFAULT_BO_CONCURRENCY mirrors Ax's internal DEFAULT_BAYESIAN_CONCURRENCY and is applied in AxBackend.initialize() when max_parallelism is None (the default). There is no code path that automatically propagates job_limit → max_parallelism.
Expected behavior
AxBackend.max_parallelism should default to Manager.job_limit unless explicitly overridden by the user.
Proposed fix
Wire them together at session construction time, e.g.:
if backend.max_parallelism is None:
backend.max_parallelism = manager.job_limit
Or pass job_limit into AxBackend directly during Session setup.
Description
AxBackend has a hardcoded DEFAULT_BO_CONCURRENCY = 3 that caps how many trials Ax suggests per cycle. Manager has an independent job_limit that caps how many simulation jobs run concurrently. These two values are never linked, causing a silent resource underutilization bug:
Example: User sets job_limit=8. Ax only ever suggests 3 candidates. 5 cluster slots sit idle every cycle.
Root cause
DEFAULT_BO_CONCURRENCY mirrors Ax's internal DEFAULT_BAYESIAN_CONCURRENCY and is applied in AxBackend.initialize() when max_parallelism is None (the default). There is no code path that automatically propagates job_limit → max_parallelism.
Expected behavior
AxBackend.max_parallelism should default to Manager.job_limit unless explicitly overridden by the user.
Proposed fix
Wire them together at session construction time, e.g.:
Or pass job_limit into AxBackend directly during Session setup.