Hi there:
I’m working on parameter identification using ModelingToolkit-based ODE models.
I construct a symbolic system using ModelingToolkit.jl and build a custom loss function,
which is optimized under multithreaded parallelism (using Threads.@threads
).
I encountered a GC finalizer error when using ModelingToolkit.jl
under multithreaded computation:
error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")
ijl_error at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/rtutils.c:43
ijl_switch at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/task.c:635
try_yieldto at ./task.jl:948
wait at ./task.jl:1022
#wait#733 at ./condition.jl:130
wait at ./condition.jl:125 [inlined]
slowlock at ./lock.jl:157
lock at ./lock.jl:147 [inlined]
lock at ./lock.jl:230
lock at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:88 [inlined]
delete! at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:184 [inlined]
#1 at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:32
unknown function (ip: 0x14d6c3ba737c)
#11 at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:97
unknown function (ip: 0x14d6c3ba7242)
run_finalizer at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:303
jl_gc_run_finalizers_in_list at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:393
run_finalizers at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:439
run_finalizers at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:420 [inlined]
ijl_gc_collect at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:3915
maybe_collect at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:926 [inlined]
jl_gc_pool_alloc_inner at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:1319
ijl_gc_pool_alloc_instrumented at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:1377
ImmutableDict at ./dict.jl:774 [inlined]
macro expansion at /home/user/.julia/packages/Setfield/ZezIj/src/sugar.jl:198 [inlined]
setmetadata at /home/user/.julia/packages/SymbolicUtils/aooYZ/src/types.jl:964
toparam at /home/user/.julia/packages/ModelingToolkit/weYw6/src/parameters.jl:55
unknown function (ip: 0x14d6581375f2)
Initial at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/abstractsystem.jl:523
unknown function (ip: 0x14d633323842)
jl_apply at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/julia.h:2157 [inlined]
do_apply at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/builtins.c:831
default_toterm at /home/user/.julia/packages/ModelingToolkit/weYw6/src/variables.jl:221
check_index_map at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/index_cache.jl:482
parameter_index at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/index_cache.jl:429
is_parameter at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/index_cache.jl:418 [inlined]
is_parameter at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/abstractsystem.jl:176
unknown function (ip: 0x14d633328e96)
build_operating_point! at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/problem_utils.jl:609
unknown function (ip: 0x14d63333ca76)
#generate_initializesystem_timevarying#1229 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:85
generate_initializesystem_timevarying at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:46 [inlined]
#generate_initializesystem#1228 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:35 [inlined]
generate_initializesystem at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:32 [inlined]
#_#1086 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/problems/initializationproblem.jl:52
InitializationProblem at /home/user/.julia/packages/ModelingToolkit/weYw6/src/problems/initializationproblem.jl:20 [inlined]
#_#1085 at ./none:0 [inlined]
InitializationProblem at ./none:0
unknown function (ip: 0x14d63334b7ea)
#maybe_build_initialization_problem#912 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/problem_utils.jl:1118
maybe_build_initialization_problem at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/problem_utils.jl:1106
unknown function (ip: 0x14d63333f600)
remake_initialization_data at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:662
unknown function (ip: 0x14d63333947e)
#remake#771 at /home/user/.julia/packages/SciMLBase/LZvKA/src/remake.jl:237
unknown function (ip: 0x14d63331af2d)
remake at /home/user/.julia/packages/SciMLBase/LZvKA/src/remake.jl:214 [inlined]
loss at ./REPL[64]:4
#26 at ./REPL[76]:1 [inlined]
macro expansion at ./REPL[69]:25 [inlined]
#112#threadsfor_fun#13 at ./threadingconstructs.jl:253
#112#threadsfor_fun at ./threadingconstructs.jl:220 [inlined]
#1 at ./threadingconstructs.jl:154
unknown function (ip: 0x14d6333129ef)
jl_apply at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/julia.h:2157 [inlined]
start_task at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/task.c:1202
error in running finalizer: ErrorException("task switch not allowed from inside gc finalizer")
ijl_error at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/rtutils.c:43
ijl_switch at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/task.c:635
try_yieldto at ./task.jl:948
wait at ./task.jl:1022
#wait#733 at ./condition.jl:130
wait at ./condition.jl:125 [inlined]
slowlock at ./lock.jl:157
lock at ./lock.jl:147 [inlined]
lock at ./lock.jl:230
lock at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:88 [inlined]
delete! at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:184 [inlined]
#1 at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:32
unknown function (ip: 0x14d6c3ba737c)
#11 at /home/user/.julia/packages/WeakValueDicts/dxukx/src/WeakValueDicts.jl:97
unknown function (ip: 0x14d6c3ba7242)
run_finalizer at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:303
jl_gc_run_finalizers_in_list at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:393
run_finalizers at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:439
run_finalizers at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:420 [inlined]
ijl_gc_collect at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:3915
maybe_collect at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:926 [inlined]
jl_gc_pool_alloc_inner at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:1319
ijl_gc_pool_alloc_instrumented at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/gc.c:1377
ImmutableDict at ./dict.jl:774 [inlined]
macro expansion at /home/user/.julia/packages/Setfield/ZezIj/src/sugar.jl:198 [inlined]
setmetadata at /home/user/.julia/packages/SymbolicUtils/aooYZ/src/types.jl:964
toparam at /home/user/.julia/packages/ModelingToolkit/weYw6/src/parameters.jl:55
unknown function (ip: 0x14d6581375f2)
Initial at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/abstractsystem.jl:523
unknown function (ip: 0x14d633323842)
jl_apply at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/julia.h:2157 [inlined]
do_apply at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/builtins.c:831
default_toterm at /home/user/.julia/packages/ModelingToolkit/weYw6/src/variables.jl:221
check_index_map at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/index_cache.jl:482
parameter_index at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/index_cache.jl:429
is_parameter at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/index_cache.jl:418 [inlined]
is_parameter at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/abstractsystem.jl:176
unknown function (ip: 0x14d633328e96)
build_operating_point! at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/problem_utils.jl:609
unknown function (ip: 0x14d63333ca76)
#generate_initializesystem_timevarying#1229 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:85
generate_initializesystem_timevarying at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:46 [inlined]
#generate_initializesystem#1228 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:35 [inlined]
generate_initializesystem at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:32 [inlined]
#_#1086 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/problems/initializationproblem.jl:52
InitializationProblem at /home/user/.julia/packages/ModelingToolkit/weYw6/src/problems/initializationproblem.jl:20 [inlined]
#_#1085 at ./none:0 [inlined]
InitializationProblem at ./none:0
unknown function (ip: 0x14d63334b7ea)
#maybe_build_initialization_problem#912 at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/problem_utils.jl:1118
maybe_build_initialization_problem at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/problem_utils.jl:1106
unknown function (ip: 0x14d63333f600)
remake_initialization_data at /home/user/.julia/packages/ModelingToolkit/weYw6/src/systems/nonlinear/initializesystem.jl:662
unknown function (ip: 0x14d63333947e)
#remake#771 at /home/user/.julia/packages/SciMLBase/LZvKA/src/remake.jl:237
unknown function (ip: 0x14d63331af2d)
remake at /home/user/.julia/packages/SciMLBase/LZvKA/src/remake.jl:214 [inlined]
loss at ./REPL[64]:4
#26 at ./REPL[76]:1 [inlined]
macro expansion at ./REPL[69]:25 [inlined]
#112#threadsfor_fun#13 at ./threadingconstructs.jl:253
#112#threadsfor_fun at ./threadingconstructs.jl:220 [inlined]
#1 at ./threadingconstructs.jl:154
unknown function (ip: 0x14d6333129ef)
jl_apply at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/julia.h:2157 [inlined]
start_task at /cache/build/tester-amdci4-12/julialang/julia-release-1-dot-11/src/task.c:1202
After tracing the dependency chain:
ModelingToolkit.jl
→SymbolicUtils.jl
→WeakValueDicts.jl
It appears that WeakValueDicts
registers a finalizer that performs a lock()
call
In Julia, it is not legal to task-switch from within a GC finalizer. Doing so results in this error.
I wonder Besides waiting for upstream fix, are there current best practices or safe coding patterns to:
-
Avoid triggering GC finalizers under threaded workloads?
-
Work with ModelingToolkit + SymbolicUtils in a thread-safe way?
Thanks for any guidance!