JuliaML / MLUtils.jl

Utilities and abstractions for Machine Learning tasks
MIT License
109 stars 22 forks source link

stack can cause StackOverflowError or Segmentation fault on macOS ARM #121

Closed gabrevaya closed 1 year ago

gabrevaya commented 2 years ago

Stacking vectors of length larger than 1353 causes a StackOverflowError:

julia> using MLUtils
for j in 1:2000
           a = [[1] for i in 1:j];
           stack(a, 2);
           @info j
end
.
.
.
[ Info: 1350
[ Info: 1351
[ Info: 1352
[ Info: 1353
ERROR: StackOverflowError:
Stacktrace:
 [1] __cat_offset!(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Tuple{Int64, Int64}, ::Matrix{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}}) (repeats 1339 times)
   @ Base ./abstractarray.jl:1749
 [2] __cat(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1744
 [3] _cat_t(::Int64, ::Type{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1737
 [4] _cat(::Int64, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ LinearAlgebra /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:424
 [5] cat(::Matrix{Int64}, ::Vararg{Matrix{Int64}}; dims::Int64)
   @ Base ./abstractarray.jl:1916
 [6] stack(xs::Vector{Vector{Int64}}; dims::Int64)
   @ MLUtils ~/.julia/packages/MLUtils/aThik/src/utils.jl:101
 [7] stack(x::Vector{Vector{Int64}}, dims::Int64)
   @ MLUtils ./deprecated.jl:72

However, if I restart the REPL I have this behaviour:

julia> using Pkg; Pkg.activate(".")
  Activating project at `~/Documents/doctorado/issues/MLUtils_stack`

julia> using MLUtils

julia> a = [[1] for i in 1:1354]; stack(a, 2);
ERROR: StackOverflowError:
Stacktrace:
 [1] __cat_offset!(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Tuple{Int64, Int64}, ::Matrix{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1746
 [2] __cat_offset!(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Tuple{Int64, Int64}, ::Matrix{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}}) (repeats 1339 times)
   @ Base ./abstractarray.jl:1749
 [3] __cat(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1744
 [4] _cat_t(::Int64, ::Type{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1737
 [5] _cat(::Int64, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ LinearAlgebra /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:424
 [6] cat(::Matrix{Int64}, ::Vararg{Matrix{Int64}}; dims::Int64)
   @ Base ./abstractarray.jl:1916
 [7] stack(xs::Vector{Vector{Int64}}; dims::Int64)
   @ MLUtils ~/.julia/packages/MLUtils/aThik/src/utils.jl:101
 [8] stack(x::Vector{Vector{Int64}}, dims::Int64)
   @ MLUtils ./deprecated.jl:72

julia> a = [[1] for i in 1:1353]; stack(a, 2);
ERROR: StackOverflowError:
Stacktrace:
 [1] __cat_offset!(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Tuple{Int64, Int64}, ::Matrix{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}}) (repeats 1352 times)
   @ Base ./abstractarray.jl:1749
 [2] __cat(::Matrix{Int64}, ::Tuple{Int64, Int64}, ::Tuple{Bool, Bool}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1744
 [3] _cat_t(::Int64, ::Type{Int64}, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ Base ./abstractarray.jl:1737
 [4] _cat(::Int64, ::Matrix{Int64}, ::Vararg{Matrix{Int64}})
   @ LinearAlgebra /Applications/Julia-1.8.app/Contents/Resources/julia/share/julia/stdlib/v1.8/LinearAlgebra/src/special.jl:424
 [5] cat(::Matrix{Int64}, ::Vararg{Matrix{Int64}}; dims::Int64)
   @ Base ./abstractarray.jl:1916
 [6] stack(xs::Vector{Vector{Int64}}; dims::Int64)
   @ MLUtils ~/.julia/packages/MLUtils/aThik/src/utils.jl:101
 [7] stack(x::Vector{Vector{Int64}}, dims::Int64)
   @ MLUtils ./deprecated.jl:72

julia> a = [[1] for i in 1:1352]; stack(a, 2);
ERROR: StackOverflowError:

julia> a = [[1] for i in 1:1351]; stack(a, 2);

signal (11): Segmentation fault: 11
in expression starting at REPL[8]:1
_ZN4llvm16InstCombinerImpl15visitSelectInstERNS_10SelectInstE at /Applications/Julia-1.8.app/Contents/Resources/julia/lib/julia/libLLVM.dylib (unknown line)
Allocations: 3717522 (Pool: 3708463; Big: 9059); GC: 5

And Julia exits.

(MLUtils_stack) pkg> st
Status `~/Documents/doctorado/issues/MLUtils_stack/Project.toml`
  [f1d291b0] MLUtils v0.2.10
julia> versioninfo()
Julia Version 1.8.0
Commit 5544a0fab76 (2022-08-17 13:38 UTC)
Platform Info:
  OS: macOS (arm64-apple-darwin21.3.0)
  CPU: 8 × Apple M1 Pro
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-13.0.1 (ORCJIT, apple-m1)
  Threads: 1 on 6 virtual cores
CarloLucibello commented 2 years ago

This is the same as https://github.com/FluxML/Flux.jl/issues/1585