Title: Segfaults on 3.12 when using PySR and running Julia's GC · Issue #113591 · python/cpython · GitHub
Open Graph Title: Segfaults on 3.12 when using PySR and running Julia's GC · Issue #113591 · python/cpython
X Title: Segfaults on 3.12 when using PySR and running Julia's GC · Issue #113591 · python/cpython
Description: Crash report What happened? This is a segfault I am seeing on Python 3.12, when trying to use the Python and Julia runtimes simultaneously via the PyJulia package. It seems like when there is an object that is referenced by both the Juli...
Open Graph Description: Crash report What happened? This is a segfault I am seeing on Python 3.12, when trying to use the Python and Julia runtimes simultaneously via the PyJulia package. It seems like when there is an ob...
X Description: Crash report What happened? This is a segfault I am seeing on Python 3.12, when trying to use the Python and Julia runtimes simultaneously via the PyJulia package. It seems like when there is an ob...
Opengraph URL: https://github.com/python/cpython/issues/113591
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"Segfaults on 3.12 when using PySR and running Julia's GC","articleBody":"# Crash report\r\n\r\n### What happened?\r\n\r\nThis is a segfault I am seeing on Python 3.12, when trying to use the Python and Julia runtimes simultaneously via the PyJulia package.\r\n\r\nIt seems like when there is an object that is referenced by both the Julia and Python runtimes, there can be memory access errors. It seems as though Python is trying to free memory which has already been freed in Julia or vice versa.\r\n\r\nI am raising the issue here since the issue has only started occurring on Python 3.12, but does not occur on 3.11. The Julia version does not seem to affect this behavior. So I am trying to understand what changes were made to the Python GC that might have triggered this, and if perhaps the GC is more aggressive in some way?\r\n\r\nHere is my current MWE based on a package I maintain ([PySR](https://github.com/MilesCranmer/PySR)) that uses Julia as backend for a Python frontend:\r\n\r\n```python\r\nfrom pysr import PySRRegressor\r\n\r\nmodel = PySRRegressor()\r\n\r\n# This runs fine:\r\nmodel.fit([[1]], [1])\r\n\r\n# This second run results in a segmentation fault:\r\nmodel.fit([[1]], [1])\r\n```\r\n\r\nThis is the smallest MWE I have been able to create thus far.\r\n\r\nI also see the issue in my continuous integration tests on Python 3.12, but never before 3.12: https://github.com/MilesCranmer/PySR/pull/450\r\n\r\nFor example, in one of those segfaults, I see the following backtrace:\r\n\r\n```\r\nPlease submit a bug report with steps to reproduce this fault, and any error messages that follow (in their entirety). Thanks.\r\nException: EXCEPTION_ACCESS_VIOLATION at 0x7ffb0691a026 -- PyObject_Free at C:\\hostedtoolcache\\windows\\Python\\3.12.1\\x64\\python312.dll (unknown line)\r\nin expression starting at none:0\r\nPyObject_Free at C:\\hostedtoolcache\\windows\\Python\\3.12.1\\x64\\python312.dll (unknown line)\r\npydecref_ at C:\\Users\\runneradmin\\.julia\\packages\\PyCall\\1gn3u\\src\\PyCall.jl:118\r\npydecref at C:\\Users\\runneradmin\\.julia\\packages\\PyCall\\1gn3u\\src\\PyCall.jl:123\r\njfptr_pydecref_1039 at C:\\Users\\runneradmin\\.julia\\compiled\\v1.9\\PyCall\\GkzkC_As42O.dll (unknown line)\r\nrun_finalizer at C:/workdir/src\\gc.c:417\r\njl_gc_run_finalizers_in_list at C:/workdir/src\\gc.c:507\r\nrun_finalizers at C:/workdir/src\\gc.c:553\r\nrun_finalizers at C:/workdir/src\\gc.c:534 [inlined]\r\nijl_gc_collect at C:/workdir/src\\gc.c:3732\r\nmaybe_collect at C:/workdir/src\\gc.c:1083 [inlined]\r\njl_gc_pool_alloc_inner at C:/workdir/src\\gc.c:1450 [inlined]\r\njl_gc_pool_alloc_noinline at C:/workdir/src\\gc.c:1511\r\njl_gc_alloc_ at C:/workdir/src\\julia_internal.h:460 [inlined]\r\n_new_array_ at C:/workdir/src\\array.c:144\r\n_new_array at C:/workdir/src\\array.c:198 [inlined]\r\nijl_alloc_array_1d at C:/workdir/src\\array.c:436\r\nArray at .\\boot.jl:477 [inlined]\r\nArray at .\\boot.jl:486 [inlined]\r\nsimilar at .\\array.jl:374 [inlined]\r\nsimilar at .\\abstractarray.jl:839 [inlined]\r\ndeg2_l0_r0_eval at C:\\Users\\runneradmin\\.julia\\packages\\DynamicExpressions\\KRT17\\src\\EvaluateEquation.jl:257\r\njfptr_deg2_l0_r0_eval_1577 at C:\\Users\\runneradmin\\.julia\\compiled\\v1.9\\DynamicExpressions\\BQC8W_As42O.dll (unknown line)\r\n_eval_tree_array at C:\\Users\\runneradmin\\.julia\\packages\\DynamicExpressions\\KRT17\\src\\EvaluateEquation.jl:117\r\n_eval_tree_array at C:\\Users\\runneradmin\\.julia\\packages\\DynamicExpressions\\KRT17\\src\\EvaluateEquation.jl:131\r\n_eval_tree_array at C:\\Users\\runneradmin\\.julia\\packages\\DynamicExpressions\\KRT17\\src\\EvaluateEquation.jl:125\r\n#eval_tree_array#1 at C:\\Users\\runneradmin\\.julia\\packages\\DynamicExpressions\\KRT17\\src\\EvaluateEquation.jl:65 [inlined]\r\neval_tree_array at C:\\Users\\runneradmin\\.julia\\packages\\DynamicExpressions\\KRT17\\src\\EvaluateEquation.jl:59 [inlined]\r\n#eval_tree_array#1 at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\InterfaceDynamicExpressions.jl:57 [inlined]\r\neval_tree_array at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\InterfaceDynamicExpressions.jl:56 [inlined]\r\n_eval_loss at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\LossFunctions.jl:48\r\n#eval_loss#3 at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\LossFunctions.jl:101\r\neval_loss at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\LossFunctions.jl:93 [inlined]\r\n#score_func#5 at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\LossFunctions.jl:160 [inlined]\r\nscore_func at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\LossFunctions.jl:157 [inlined]\r\n#next_generation#1 at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\Mutate.jl:235\r\nnext_generation at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\Mutate.jl:60 [inlined]\r\nreg_evol_cycle at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\RegularizedEvolution.jl:37\r\n#s_r_cycle#1 at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\SingleIteration.jl:42\r\ns_r_cycle at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\SingleIteration.jl:17 [inlined]\r\n#_dispatch_s_r_cycle#81 at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\SymbolicRegression.jl:1053\r\n_dispatch_s_r_cycle at C:\\Users\\runneradmin\\.julia\\packages\\SymbolicRegression\\OYvt5\\src\\SymbolicRegression.jl:1036\r\n```\r\n\r\nI found this quite odd as it seems as though both the Julia and Python garbage collection are interfering with eachother. Here, it seems as though `PyObject_Free` is trying to free memory that was already freed? Perhaps one of the GCs is trying to free the memory access by the other runtime. Looking at the backtrace, I suppose this could also be an issue with [PyCall.jl](https://github.com/JuliaPy/PyCall.jl) (which calls Python functions from Julia), although it hasn't occurred in any previous Python version, so I'm not sure where the issue is coming from.\r\n\r\nAny help is appreciated. I am happy to provide you with as much debugging information as I can, as this issue is quite urgent to fix in the ecosystem of Python \u003c-\u003e Julia packages.\r\n\r\n\r\n\r\n### CPython versions tested on:\r\n\r\n3.12\r\n\r\n### Operating systems tested on:\r\n\r\nLinux, macOS, Windows\r\n\r\n### Output from running 'python -VV' on the command line:\r\n\r\nLinux test performed on: `Python 3.12.1 (main, Dec 30 2023, 22:23:57) [GCC 8.5.0 20210514 (Red Hat 8.5.0-20)]`","author":{"url":"https://github.com/MilesCranmer","@type":"Person","name":"MilesCranmer"},"datePublished":"2023-12-31T00:11:35.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":7},"url":"https://github.com/113591/cpython/issues/113591"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:4828b66b-51cf-93d3-ea54-b61d77905be2 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | E00C:26A5A1:6099C8:83F21B:6969DC0B |
| html-safe-nonce | bfd465cdadd0aec8fc3c5bee3e3be78bef648b4f4383d7df774430785d1235ec |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFMDBDOjI2QTVBMTo2MDk5Qzg6ODNGMjFCOjY5NjlEQzBCIiwidmlzaXRvcl9pZCI6IjE3NDI4Mzg3MTc2MzQ2OTgyNTEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | dabab4eebe64908144f850189b4060c9848290cfb9e2a4c1ff21ea8596f62d67 |
| hovercard-subject-tag | issue:2060890735 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/python/cpython/113591/issue_layout |
| twitter:image | https://opengraph.githubassets.com/4a719b7c514cdd70cf8df1920b5570252dc8e1a9efd5543290d0fb988ee02fa4/python/cpython/issues/113591 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/4a719b7c514cdd70cf8df1920b5570252dc8e1a9efd5543290d0fb988ee02fa4/python/cpython/issues/113591 |
| og:image:alt | Crash report What happened? This is a segfault I am seeing on Python 3.12, when trying to use the Python and Julia runtimes simultaneously via the PyJulia package. It seems like when there is an ob... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | MilesCranmer |
| hostname | github.com |
| expected-hostname | github.com |
| None | 7b32f1c7c4549428ee399213e8345494fc55b5637195d3fc5f493657579235e8 |
| turbo-cache-control | no-preview |
| go-import | github.com/python/cpython git https://github.com/python/cpython.git |
| octolytics-dimension-user_id | 1525981 |
| octolytics-dimension-user_login | python |
| octolytics-dimension-repository_id | 81598961 |
| octolytics-dimension-repository_nwo | python/cpython |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 81598961 |
| octolytics-dimension-repository_network_root_nwo | python/cpython |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | bdde15ad1b403e23b08bbd89b53fbe6bdf688cad |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width