2026-09
Cap how many runs of a batch use the LSF cluster at the same time, or run batches of short runs on a pool of Dask workers. The server is easier to deploy from scratch, and re-running outputs or tuning on LSF goes through the configured LSF bridge.
Project integration
Limit batch concurrency on LSF
Set runners.lsf.concurrency in qaboard.yaml, or use qa batch --lsf-concurrency 20, so a batch never has more than 20 LSF jobs running at once and doesn't flood the cluster. The default, 0, keeps the previous behavior: no limit.
Learn more →Project integration
Dask runner
With qa batch --runner dask, a batch's runs execute on a few long-lived Dask workers started as LSF jobs, with a bounded number of runs in flight. It avoids paying LSF's scheduling overhead for each of many short runs. Install it with pip install "qaboard[dask]".
Learn more →CLI and project setup
- By default the LSF concurrency limit uses an LSF job array with a slot limit: a new run starts as soon as one ends. Set
runners.lsf.concurrency_strategy: wavesto send runs in groups that each wait for the previous group to end, if job arrays don't work for you. - The Dask runner is configured under
runners.daskin qaboard.yaml:concurrency(or--dask-concurrency), the worker jobs'clustersize and memory, andscheduler_addressto use a Dask cluster you already run. - With
--no-wait, the Dask runner sends a small "driver" LSF job that runs the batch, with its own LSF options (runners.dask.driver), andqa batchreturns right away. - Dask workers' and the driver's logs are saved in the batch directory, under
dask/, and each run's output directory gets alog.dask.txt. Stopping a batch from QA-Board also stops its Dask workers. qa save-artifactsand other commands no longer crash with "'NoneType' object is not iterable" in legacy projects whose configuration defines no inputs.
Server and administration
- "Redo" actions on a batch (deleted, failed or all outputs) and tuning batches sent to LSF from the web app now go through the backend's
QA_RUNNERS_LSF_BRIDGE, which supports the{user}and{bsub_command}placeholders, instead of a hardcoded SSH host. Set it to use these features with LSF (see LSF bridges). - The Flower dashboard for Celery now runs from the backend image: there is no separate Flower image to build anymore.
- The documentation site's image now builds with Docusaurus 3.10.
- The SIRC deployment's files, including
.env.sirc.example, now all live underdeployments/sirc/.
Documentation
- New Dask integration page. The CLI docs now list the batch runners (local, LSF, Dask, Celery) and how to limit their concurrency, and the LSF page documents
--lsf-concurrency.
Fixes
- Fixed results uploads failing (HTTP 500 on every new output) on servers whose database was created from scratch rather than migrated from an older version.
- The database container now starts on a fresh, empty volume: its custom configuration is applied only once the database is initialized.
- Fixed Docker builds that download a CA certificate (
CA_CERT_URL) failing when the certificate file already existed.
Notes
- The LSF concurrency limit and the Dask runner are in
qaboard1.1, released in October.