Apple Silicon crash when Kaleido is launched with `--disable-gpu` (macOS 15.4.1, M4 Max)
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- À l'abandon
- Domaine
- computer-graphics, operating-systems
Piste de recherche
Commencez par la construction des flags dans plotly_kaleido/src/lib.rs et reproduisez la commande Kaleido 0.2.1 signalée sur macOS arm64 en utilisant le spec.json fourni. Comparez le rendu avec et sans --disable-gpu ; le travail est terminé lorsque l’ensemble de flags par défaut produit un rendu réussi ou échoue proprement sur Apple Silicon.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Image generation fails on Apple Silicon when Kaleido is started with --disable-gpu (macOS 15.4.1, M4 Max)
Summary
Running the standalone Kaleido v0.2.1 binary on macOS 15.4.1 (Sequoia) with an Apple M4 Max fails to produce any image whenever the --disable-gpu flag is present (the default set that Plotly‑rs passes).
Kaleido returns error 525 ("error creating static canvas/context for image server") instead of the expected base64 payload.
Removing only that flag makes rendering work again.
Environment
| item | version / value |
|---|---|
| Kaleido binary | 0.2.1 (wheel installed via pip install kaleido) |
| macOS | 15.4.1 (23E214) |
| Chip | Apple M4 Max (arm64) |
| Python | 3.12.3 |
| Rust (for the original call) | 1.86.0 |
| Calling app | plotly‑rs 0.12 (plot.write_image) |
Reproduction steps
-
Save this Plotly spec to
spec.json:{"format":"png","width":800,"height":600,"scale":1.0,"data":{"config":{},"data":[{"name":"Surface","type":"surface","x":[1.0,2.0,3.0],"y":[4.0,5.0,6.0],"z":[[1.0,2.0,3.0],[4.0,5.0,6.0],[7.0,8.0,9.0]]}],"layout":{}}} -
Run Kaleido with the default flag set (notice
--disable-gpu):
cat spec.json | ./kaleido plotly \
--disable-gpu \
--allow-file-access-from-files \
--disable-breakpad \
--disable-dev-shm-usage \
--disable-software-rasterizer \
--single-process \
--no-sandbox \
> out.b64
Output:
[WARNING:resource_bundle.cc(431)] locale_file_path.empty() for locale en-US
{"code": 0, "message": "Success", "result": null, "version": "0.2.1"}
{"code":525,"message":"error creating static canvas/context for image server","pdfBgColor":null,"format":"png","result":null,"width":800,"height":600,"scale":1}
No image data is returned (result is null).
- Run again, this time without
--disable-gpu:
cat spec.json | ./kaleido plotly \
--allow-file-access-from-files \
--disable-breakpad \
--disable-dev-shm-usage \
--disable-software-rasterizer \
--single-process \
--no-sandbox \
> out.b64
jq -r '.result' out.b64 | base64 -d > out.png # PNG decodes correctly
Kaleido exits cleanly:
{"code": 0, "message": "Success", "result": null, "version": "0.2.1"}
Expected behaviour
Kaleido should render the plot (or at least fail gracefully) even when --disable-gpu is passed, matching behaviour on Intel Macs and Linux builds.
Actual behaviour
- With
--disable-gpu: Kaleido returns code 525 and no image. - Without
--disable-gpu: Kaleido returns the expected base64 PNG.
Notes & hypothesis
- Apple Silicon’s ANGLE‑Metal backend initialises fine; disabling the GPU appears to remove both hardware and software rasterisers, so Chrome cannot create the canvas.
- The flag combo is hard‑coded in plotly‑rs (
plotly_kaleido/src/lib.rs). Removing it there is an effective workaround. - The universal2 wheel of kaleido 1.0.0‑rc11 (Chromium 120) does not reproduce the issue, but Plotly‑rs has not migrated yet.
Workarounds
# simple wrapper to strip the flag
#!/usr/bin/env bash
exec /path/to/kaleido "${@/--disable-gpu/}"
or build/run Kaleido without passing the flag on macOS‑arm64.
Happy to provide additional logs or test patches.
— Joaquín
- Langage dominant
- Python
- Étoiles
- 504
- Forks
- 65
- Merge moyen
- 6 j 9 h
- PR mergées (30 j)
- 2
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de plotly/kaleido
-
Writing to an existing directory whose name has a dot fails with "Invalid format"Peut-être pris @RaphaelFakhri l’a pris il y a 14 jours. Ouvertebug P3 size: 1
Difficulté 2/5 1-3 heures Accessibilité débutants 35/100
-
Deterministic Rendering ChallengesPeut-être à nouveau libre @camdecoster l’a pris il y a 68 jours, et aucune pull request n’est ouverte. Ouverteenhancement feature P2 size: 5
-
[FEATURE]: Embed custom fonts into vector exports (no system install)Peut-être pris @camdecoster l’a pris il y a 125 jours. Ouverteenhancement P3 size: 3
plotly/kaleido#464 · 10 commentaires · 1 personne assignée ·
-
enhancement feature P3 size: 5
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 25/100
-
GlobalKaleidoServer is not thread-safePeut-être pris @talleibman l’a pris il y a 251 jours. Ouverte
Difficulté 4/5 3-5 jours Accessibilité débutants 48/100
Toutes les issues de plotly/kaleido
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
FinanceFlash/unvibecode#509 ·
-
Difficulté 1/5 Moins d'une heure Accessibilité débutants 82/100
FAIRmat-NFDI/nomad-distro-dev#161 ·
-
bug v2
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
modelcontextprotocol/python-sdk#3821 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
bug severity:low
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 2 jours
-
Log-odds calibration uses upper middle score instead of median for even candidate setsPeut-être pris @flysheep-ai l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour