Skip to content

Enzyme Documentation example does not work on CPU #2627

@aquaresima

Description

@aquaresima

The example:

using Flux
using Enzyme

model = Chain(Dense(28^2 => 32, sigmoid), Dense(32 => 10), softmax);
dup_model = Duplicated(model);

x1 = randn32(28 * 28, 1) ;
y1 = [i == 3 for i in 0:9];
grads_f = Flux.gradient((m, x, y) -> sum(abs2, m(x) .- y), dup_model, Const(x1), Const(y1))

output this text and return this error:


Internal error: during type inference of
(::Type{EnzymeCore.Duplicated{T} where T})(Flux.Chain{Tuple{Flux.Dense{typeof(NNlib.σ), Array{Float32, 2}, Array{Float32, 1}}, Flux.Dense{typeof(Base.identity), Array{Float32, 2}, Array{Float32, 1}}, typeof(NNlib.softmax)}})
Encountered unexpected error in runtime:
AssertionError(msg="invalid `given_argtypes` for `mi`")
va_process_argtypes at ./../usr/share/julia/Compiler/src/inferenceresult.jl:123
InferenceState at ./../usr/share/julia/Compiler/src/inferencestate.jl:352
jfptr_InferenceState_44820.1 at /home/aquaresi/.julia/juliaup/julia-1.12.0+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
tojlinvoke122185.1 at /home/aquaresi/.julia/juliaup/julia-1.12.0+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
j_InferenceState_114514.1 at /home/aquaresi/.julia/juliaup/julia-1.12.0+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
InferenceState at ./../usr/share/julia/Compiler/src/inferencestate.jl:605
typeinf_edge at ./../usr/share/julia/Compiler/src/typeinfer.jl:963
abstract_call_method at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:735
infercalls at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:167
abstract_call_gf_by_type at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:338
abstract_call_known at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:2782
abstract_call at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:2889
abstract_call at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:2882 [inlined]
abstract_call at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3042
abstract_eval_call at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3060 [inlined]
abstract_eval_statement_expr at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3389
abstract_eval_basic_statement at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3830 [inlined]
abstract_eval_basic_statement at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3787 [inlined]
typeinf_local at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:4337
jfptr_typeinf_local_116659.1 at /home/aquaresi/.julia/juliaup/julia-1.12.0+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
typeinf at ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:4495
typeinf_ext at ./../usr/share/julia/Compiler/src/typeinfer.jl:1259
typeinf_ext_toplevel at ./../usr/share/julia/Compiler/src/typeinfer.jl:1442 [inlined]
typeinf_ext_toplevel at ./../usr/share/julia/Compiler/src/typeinfer.jl:1451
jfptr_typeinf_ext_toplevel_117555.1 at /home/aquaresi/.julia/juliaup/julia-1.12.0+0.x64.linux.gnu/lib/julia/sys.so (unknown line)
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
jl_type_infer at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/gf.c:462
jl_compile_method_internal at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/gf.c:3512
_jl_invoke at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/gf.c:4002 [inlined]
ijl_apply_generic at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/gf.c:4210
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
do_call at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/interpreter.c:123
eval_value at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/interpreter.c:243
eval_stmt_value at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/interpreter.c:194 [inlined]
eval_body at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/interpreter.c:707
jl_interpret_toplevel_thunk at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/interpreter.c:898
top-level scope at /home/aquaresi/mnt/helix/User_folders/aquaresi/network_models/src/SNNML.jl/learning/test_enzyme.jl:5
jl_toplevel_eval_flex at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/toplevel.c:1035
jl_toplevel_eval_flex at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/toplevel.c:975
jl_toplevel_eval_flex at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/toplevel.c:975
ijl_toplevel_eval at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/toplevel.c:1047
ijl_toplevel_eval_in at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/toplevel.c:1092
eval at ./boot.jl:489
include_string at ./loading.jl:2843
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
jl_f_invokelatest at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/builtins.c:881
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
jl_f__apply_iterate at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/builtins.c:868
#inlineeval#57 at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:271
inlineeval at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:268
#repl_runcode_request##6 at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:181
withpath at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/repl.jl:276
#repl_runcode_request##4 at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:179
hideprompt at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/repl.jl:38
#repl_runcode_request##2 at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:150 [inlined]
with_logstate at ./logging/logging.jl:540
with_logger at ./logging/logging.jl:651 [inlined]
#repl_runcode_request##0 at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:263
unknown function (ip: 0x75476f33f70d) at (unknown file)
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
jl_f_invokelatest at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/builtins.c:881
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
jl_f__apply_iterate at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/builtins.c:868
#start_eval_backend##0 at /home/aquaresi/.vscode-server/extensions/julialang.language-julia-1.149.2/scripts/packages/VSCodeServer/src/eval.jl:34
unknown function (ip: 0x7547cdb3a93f) at (unknown file)
jl_apply at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/julia.h:2387 [inlined]
start_task at /cache/build/builder-amdci4-0/julialang/julia-release-1-dot-12/src/task.c:1249

Error

ERROR: TypeError: non-boolean (Compiler.IRCode) used in boolean context
Stacktrace:
  [1] semiconcrete_result_item(result::Compiler.SemiConcreteResult, info::Compiler.CallInfo, flag::UInt32, state::Compiler.InliningState{…})
    @ Compiler ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1449
  [2] handle_semi_concrete_result!(cases::Vector{…}, result::Compiler.SemiConcreteResult, match::Core.MethodMatch, info::Compiler.CallInfo, flag::UInt32, state::Compiler.InliningState{…})
    @ Compiler ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1462
  [3] handle_any_const_result!(cases::Vector{…}, result::Any, match::Core.MethodMatch, argtypes::Vector{…}, info::Compiler.CallInfo, flag::UInt32, state::Compiler.InliningState{…}; allow_typevars::Bool)
    @ Compiler ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1304
  [4] handle_any_const_result!
    @ ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1297 [inlined]
  [5] compute_inlining_cases(info::Compiler.CallInfo, flag::UInt32, sig::Compiler.Signature, state::Compiler.InliningState{…})
    @ Compiler ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1369
  [6] handle_call!
    @ ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1401 [inlined]
  [7] assemble_inline_todo!(ir::Compiler.IRCode, state::Compiler.InliningState{…})
    @ Compiler ./../usr/share/julia/Compiler/src/ssair/inlining.jl:1652
  [8] ssa_inlining_pass!
    @ ./../usr/share/julia/Compiler/src/ssair/inlining.jl:76 [inlined]
  [9] run_passes_ipo_safe(ci::Core.CodeInfo, sv::Compiler.OptimizationState{…}, optimize_until::Nothing)
    @ Compiler ./../usr/share/julia/Compiler/src/optimize.jl:1013
 [10] run_passes_ipo_safe
    @ ./../usr/share/julia/Compiler/src/optimize.jl:1027 [inlined]
 [11] optimize(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, opt::Compiler.OptimizationState{…}, caller::Compiler.InferenceResult)
    @ Compiler ./../usr/share/julia/Compiler/src/optimize.jl:1002
 [12] finish_nocycle(::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, frame::Compiler.InferenceState, time_before::UInt64)
    @ Compiler ./../usr/share/julia/Compiler/src/typeinfer.jl:202
 [13] typeinf(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{Nothing}, frame::Compiler.InferenceState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:4502
 [14] const_prop_call(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, mi::Core.MethodInstance, result::Compiler.MethodCallResult, arginfo::Compiler.ArgInfo, sv::Compiler.InferenceState, concrete_eval_result::Nothing)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:1348
 [15] abstract_call_method_with_const_args(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, result::Compiler.MethodCallResult, f::Any, arginfo::Compiler.ArgInfo, si::Compiler.StmtInfo, match::Core.MethodMatch, sv::Compiler.InferenceState, invokecall::Nothing)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:898
 [16] abstract_call_method_with_const_args
    @ ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:868 [inlined]
 [17] (::Compiler.var"#handle1#abstract_call_gf_by_type##1"{})(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, sv::Compiler.InferenceState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:178
 [18] (::Compiler.var"#infercalls#abstract_call_gf_by_type##0"{})(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, sv::Compiler.InferenceState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:252
 [19] abstract_call_gf_by_type(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, func::Any, arginfo::Compiler.ArgInfo, si::Compiler.StmtInfo, atype::Any, sv::Compiler.InferenceState, max_methods::Int64)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:338
 [20] 
    @ Enzyme.Compiler.Interpreter ~/.julia/packages/Enzyme/LJjsP/src/compiler/interpreter.jl:421
 [21] abstract_call_known(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, f::Any, arginfo::Compiler.ArgInfo, si::Compiler.StmtInfo, sv::Compiler.InferenceState, max_methods::Int64)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:2782
 [22] abstract_call_known(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, f::Any, arginfo::Compiler.ArgInfo, si::Compiler.StmtInfo, sv::Compiler.InferenceState, max_methods::Int64)
    @ Enzyme.Compiler.Interpreter ~/.julia/packages/Enzyme/LJjsP/src/compiler/interpreter.jl:1244
 [23] abstract_call(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, arginfo::Compiler.ArgInfo, si::Compiler.StmtInfo, sv::Compiler.InferenceState, max_methods::Int64)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:2889
 [24] abstract_call
    @ ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:2882 [inlined]
 [25] abstract_call(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, arginfo::Compiler.ArgInfo, sstate::Compiler.StatementState, sv::Compiler.InferenceState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3042
 [26] abstract_eval_call
    @ ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3060 [inlined]
 [27] abstract_eval_statement_expr(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, e::Expr, sstate::Compiler.StatementState, sv::Compiler.InferenceState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3389
 [28] abstract_eval_basic_statement
    @ ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3830 [inlined]
 [29] abstract_eval_basic_statement
    @ ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:3787 [inlined]
 [30] typeinf_local(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{…}, frame::Compiler.InferenceState, nextresult::Compiler.CurrentState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:4337
 [31] typeinf(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{Nothing}, frame::Compiler.InferenceState)
    @ Compiler ./../usr/share/julia/Compiler/src/abstractinterpretation.jl:4495
 [32] typeinf_ext(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{Nothing}, mi::Core.MethodInstance, source_mode::UInt8)
    @ Compiler ./../usr/share/julia/Compiler/src/typeinfer.jl:1259
 [33] typeinf_type
    @ ./../usr/share/julia/Compiler/src/typeinfer.jl:1281 [inlined]
 [34] return_type(interp::Enzyme.Compiler.Interpreter.EnzymeInterpreter{Nothing}, mi::Core.MethodInstance)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/LJjsP/src/typeutils/inference.jl:12
 [35] primal_return_type_world(mode::Mode, world::UInt64, mi::Core.MethodInstance)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/LJjsP/src/typeutils/inference.jl:82
 [36] primal_return_type_generator(world::UInt64, source::Any, self::Any, mode::Type, ft::Type, tt::Type)
    @ Enzyme.Compiler ~/.julia/packages/Enzyme/LJjsP/src/typeutils/inference.jl:150
 [37] autodiff(::ReverseMode{…}, ::Const{…}, ::Type{…}, ::Duplicated{…}, ::Const{…}, ::Const{…})
    @ Enzyme ~/.julia/packages/Enzyme/LJjsP/src/Enzyme.jl:387
 [38] _enzyme_gradient(::Function, ::Duplicated{Chain{Tuple{…}}}, ::Vararg{Union{Const, Duplicated}}; zero::Bool)
    @ FluxEnzymeExt ~/.julia/packages/Flux/uRn8o/ext/FluxEnzymeExt/FluxEnzymeExt.jl:50
 [39] gradient(::Function, ::Duplicated{Chain{Tuple{…}}}, ::Vararg{Union{Const, Duplicated}}; zero::Bool)
    @ Flux ~/.julia/packages/Flux/uRn8o/src/gradient.jl:122
 [40] top-level scope
    @ ~/mnt/helix/User_folders/aquaresi/network_models/src/SNNML.jl/learning/test_enzyme.jl:9
Some type information was truncated. Use `show(err)` to see complete types.

This is my environment:

Status `~/mnt/helix/User_folders/aquaresi/network_models/src/SNNML.jl/Project.toml`
⌅ [052768ef] CUDA v5.8.5
  [13f3f980] CairoMakie v0.15.6
  [b7d42ee7] Einsum v0.4.1
  [7da242da] Enzyme v0.13.86
  [587475ba] Flux v0.16.5
  [d9f16b24] Functors v0.5.2
  [ee78f7c6] Makie v0.24.6
  [3bd65402] Optimisers v0.4.6
  [92933f4c] ProgressMeter v1.11.0
  [10745b16] Statistics v1.11.1
  [e88e6eb3] Zygote v0.7.10
  [02a925ec] cuDNN v1.4.5
  [37e2e46d] LinearAlgebra v1.12.0
  [9a3f8284] Random v1.11.0

My system is:


No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.3 LTS
Release:        24.04
Codename:       noble

My CPU

Architecture:             x86_64
  CPU op-mode(s):         32-bit, 64-bit
  Address sizes:          52 bits physical, 57 bits virtual
  Byte Order:             Little Endian
CPU(s):                   24
  On-line CPU(s) list:    0-23
Vendor ID:                GenuineIntel
  Model name:             Intel(R) Xeon(R) w5-3425
    CPU family:           6
    Model:                143
    Thread(s) per core:   2
    Core(s) per socket:   12
    Socket(s):            1
    Stepping:             8
    CPU(s) scaling MHz:   27%
    CPU max MHz:          4600,0000
    CPU min MHz:          800,0000
    BogoMIPS:             6384,00
    Flags:                fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
                           dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_
                          tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmp
                          erf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sd
                          bg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_t
                          imer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch cpuid_fault epb cat_l3
                           cat_l2 cdp_l3 intel_ppin cdp_l2 ssbd mba ibrs ibpb stibp ibrs_enhanced tpr_sha
                          dow flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms i
                          nvpcid cqm rdt_a avx512f avx512dq rdseed adx smap avx512ifma clflushopt clwb in
                          tel_pt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves cqm_llc
                           cqm_occup_llc cqm_mbm_total cqm_mbm_local split_lock_detect user_shstk avx_vnn
                          i avx512_bf16 wbnoinvd dtherm ida arat pln pts hwp hwp_act_window hwp_epp hwp_p
                          kg_req vnmi avx512vbmi umip pku ospke waitpkg avx512_vbmi2 gfni vaes vpclmulqdq
                           avx512_vnni avx512_bitalg tme avx512_vpopcntdq la57 rdpid bus_lock_detect clde
                          mote movdiri movdir64b enqcmd fsrm md_clear serialize tsxldtrk pconfig arch_lbr
                           ibt amx_bf16 avx512_fp16 amx_tile amx_int8 flush_l1d arch_capabilities
Virtualization features:  
  Virtualization:         VT-x
Caches (sum of all):      
  L1d:                    576 KiB (12 instances)
  L1i:                    384 KiB (12 instances)
  L2:                     24 MiB (12 instances)
  L3:                     30 MiB (1 instance)
NUMA:                     
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-23
Vulnerabilities:          
  Gather data sampling:   Not affected
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Not affected
  Reg file data sampling: Not affected
  Retbleed:               Not affected
  Spec rstack overflow:   Not affected
  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:             Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:             Mitigation; Enhanced / Automatic IBRS; IBPB conditional; RSB filling; PBRSB-eIB
                          RS SW sequence; BHI BHI_DIS_S
  Srbds:                  Not affected
  Tsx async abort:        Not affected

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions