Skip to content

Fix CPU-baseline SIGILLs under Rosetta 2 (apt augustus + pytantan no-SIMD) - #70

Merged
nextgenusfs merged 1 commit into
mainfrom
feat/pytantan-fork-no-simd
May 27, 2026
Merged

Fix CPU-baseline SIGILLs under Rosetta 2 (apt augustus + pytantan no-SIMD)#70
nextgenusfs merged 1 commit into
mainfrom
feat/pytantan-fork-no-simd

Conversation

@nextgenusfs

Copy link
Copy Markdown
Owner

Summary

The bioconda augustus 3.5.0 binary is built with a modern x86_64 microarch baseline (AVX2/BMI2) and SIGILLs (rc=-4) under Rosetta 2 on Apple Silicon and on pre-Haswell x86_64 hardware. Inside the linux/amd64 docker image this caused every augustus invocation on a Mac to silently die, manifesting downstream as a buscolite run with 0 hits across 6,654 BUSCO models.

This PR switches the Docker image to install augustus from Ubuntu apt instead of bioconda. Ubuntu noble ships augustus 3.5.0+dfsg built against the generic x86_64 baseline, so it runs on every host the image can land on (real amd64 and Rosetta 2 alike).

Changes

  • Dockerfile

    • Bump UBUNTU_VERSION 22.04 -> 24.04 (noble — required for augustus 3.5.0 from apt; jammy only has 3.4.0).
    • apt-install augustus augustus-data in the final stage.
    • Repoint AUGUSTUS_CONFIG_PATH to /usr/share/augustus/config. funannotate2/config.py auto-derives AUGUSTUS_BASE=/usr/share/augustus/scripts, where the apt package installs new_species.pl, optimize_augustus.pl, etc.
  • pixi.toml

    • Drop augustus from [dependencies].
    • Move buscolite from [dependencies] to [pypi-dependencies]. Its bioconda recipe hard-depends on augustus; its PyPI wheel does not. This prevents conda from transitively pulling augustus back in.
    • On osx-arm64 augustus is no longer installed at all — the funannotate2 CLI is exercised on Mac via the dockerized image, so this is intentional.
  • pixi.lock

    • Regenerated. Zero augustus entries; buscolite-26.4.22-py3-none-any.whl now from PyPI on both linux-64 and osx-arm64.
  • funannotate2/train.py

    • Re-enable the augustus PPX self-test in buscolite() by removing the check_augustus=False override. Paired with the companion buscolite PR (nextgenusfs/buscolite diagnose-augustus-sigill) that classifies signal deaths with a Rosetta/AVX hint, a future binary mismatch will now fail loudly at the first augustus call instead of silently producing 0 hits.

Verification

  • pixi install succeeds on osx-arm64.
  • buscolite imports from .pixi/envs/default/lib/python3.11/site-packages/buscolite.
  • No augustus binaries in .pixi/envs/default/bin/.
  • Docker build / runtime test against Rosetta 2 still needs to happen before merging.

Related

  • Companion PR (required): buscolite diagnose-augustus-sigill.
  • Root-cause sibling: pytantan SIMD/AVX2 SIGILL under Rosetta 2 (already merged on this branch as commit 0f39d033).

Pull Request opened by Augment Code with guidance from the PR author

The bioconda augustus 3.5.0 binary is built with a modern x86_64
microarch baseline (AVX2/BMI2) and SIGILLs (rc=-4) under Rosetta 2 on
Apple Silicon, and on pre-Haswell x86_64 hardware. This caused every
augustus invocation inside the linux/amd64 docker image to silently
die when run on a Mac, manifesting downstream as a buscolite run with
0 hits across 6,654 models.

Switch the Docker image to Ubuntu 24.04 (noble) and install augustus +
augustus-data from apt — noble ships augustus 3.5.0+dfsg built against
the generic x86_64 baseline, so it runs on every host the image can
land on (real amd64 and Rosetta 2 alike).

To keep conda from pulling augustus back in transitively, drop it from
the conda dependencies and move buscolite to pypi-dependencies (its
bioconda recipe hard-depends on augustus; its pypi wheel does not).
On osx-arm64 augustus is not needed at all — the funannotate2 CLI is
exercised on Mac via the dockerized image.

AUGUSTUS_CONFIG_PATH is repointed at /usr/share/augustus/config, which
is where the apt package installs the species/model tree. funannotate2's
config.py derives AUGUSTUS_BASE from that, resolving the scripts dir to
/usr/share/augustus/scripts where new_species.pl, optimize_augustus.pl,
etc. live.

Also re-enables the augustus PPX self-test in train.py:buscolite() (it
had been suppressed with check_augustus=False); paired with the
companion buscolite change that classifies signal deaths with a
Rosetta/AVX hint, a future binary mismatch will now fail loudly at the
first augustus call instead of silently producing 0 hits.

- Dockerfile: bump UBUNTU_VERSION 22.04 -> 24.04, apt-install augustus
  + augustus-data in the final stage, repoint AUGUSTUS_CONFIG_PATH.
- pixi.toml: drop augustus from [dependencies], move buscolite from
  [dependencies] to [pypi-dependencies].
- pixi.lock: regenerated; zero augustus entries, buscolite now from pypi.
- funannotate2/train.py: remove check_augustus=False override.
@nextgenusfs
nextgenusfs marked this pull request as ready for review May 27, 2026 05:59
@nextgenusfs
nextgenusfs merged commit 4278598 into main May 27, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant