JuliaAI / MLJXGBoostInterface.jl

MIT License
11 stars 5 forks source link

Can't open .jls files #24

Closed kool7d closed 1 year ago

kool7d commented 1 year ago

I can't open my saved models, I get one of 2 errors, depending on the computer I use. One gives me:

ERROR: UndefVarError: FeatureImportance not defined
Stacktrace:
  [1] deserialize_datatype(s::Serialization.Serializer{IOStream}, full::Bool)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1364
  [2] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:866
  [3] deserialize(s::Serialization.Serializer{IOStream})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813
  [4] deserialize_datatype(s::Serialization.Serializer{IOStream}, full::Bool)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1388
  [5] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:866
  [6] deserialize(s::Serialization.Serializer{IOStream})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813
  [7] deserialize_datatype(s::Serialization.Serializer{IOStream}, full::Bool)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1375
  [8] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:866
  [9] deserialize(s::Serialization.Serializer{IOStream})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813
 [10] deserialize_datatype(s::Serialization.Serializer{IOStream}, full::Bool)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1388
 [11] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:866
 [12] deserialize(s::Serialization.Serializer{IOStream})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813
 [13] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:873
 [14] deserialize(s::Serialization.Serializer{IOStream}, t::DataType)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1467
 [15] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:882
 [16] deserialize(s::Serialization.Serializer{IOStream}, t::DataType)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1467
 [17] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:882
 [18] deserialize(s::Serialization.Serializer{IOStream})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813
 [19] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:919
 [20] deserialize
    @ C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813 [inlined]
 [21] deserialize(s::IOStream)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:800
 [22] open(f::typeof(Serialization.deserialize), args::String; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Base .\io.jl:384
 [23] open
    @ .\io.jl:381 [inlined]
 [24] deserialize
    @ C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:810 [inlined]
 [25] machine(file::String)
    @ MLJBase C:\Users\kool7\.julia\packages\MLJBase\6ooqv\src\machines.jl:406

The other gives:

ERROR: MethodError: no method matching Base.GenericCondition{ReentrantLock}(::Base.InvasiveLinkedList{Task})
Closest candidates are:
  Base.GenericCondition{L}() where L<:Base.AbstractLock at condition.jl:67
  Base.GenericCondition{L}(::L) where L<:Base.AbstractLock at condition.jl:68
Stacktrace:
  [1] deserialize(s::Serialization.Serializer{IOStream}, #unused#::Type{Base.GenericCondition{ReentrantLock}})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1560
  [2] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:877
  [3] deserialize(s::Serialization.Serializer{IOStream}, t::DataType)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1467
  [4] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:882
  [5] deserialize(s::Serialization.Serializer{IOStream}, t::DataType)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:1467
  [6] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:882
  [7] deserialize(s::Serialization.Serializer{IOStream})
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813
  [8] handle_deserialize(s::Serialization.Serializer{IOStream}, b::Int32)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:919
  [9] deserialize
    @ C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:813 [inlined]
 [10] deserialize(s::IOStream)
    @ Serialization C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:800
 [11] open(f::typeof(Serialization.deserialize), args::String; kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ Base .\io.jl:384
 [12] open
    @ .\io.jl:381 [inlined]
 [13] deserialize
    @ C:\Users\kool7\AppData\Local\Programs\Julia-1.8.2\share\julia\stdlib\v1.8\Serialization\src\Serialization.jl:810 [inlined]
 [14] machine(file::String)
    @ MLJBase C:\Users\kool7\.julia\packages\MLJBase\6ooqv\src\machines.jl:406

I have no idea how to fix this, and I am in panic mode because I have a lot of saved models.

ablaom commented 1 year ago

Are you restoring your models using the same version of MLJXGBoostInterface under which you saved the models? A few days ago a breaking release was tagged (the core package XGBoost.jl was just overhauled) which is probably incompatible (added feature importance support, among other things). Can you try pinning MLJXGBoostInterface to 0.2.1 and see if you can restore your models?

DilumAluthge commented 1 year ago

As a general rule, Julia's Serialization stdlib assumes that when you deserialize, you will be using the same exact Julia package versions that you used when serializing. One way to ensure this is to use the same Project.toml and Manifest.toml files at both serialization time and deserialization time. The Manifest.toml file contains the exact versions of the Julia packages that you are using. You can copy Project.toml and Manifest.toml files from one computer to another, to ensure that both computers use the same versions of Julia packages.

ablaom commented 1 year ago

Alternatively, you can use JLSO.jl, which wraps julia's default serialiser (or BSON) in that same package information. When you try to restore using incompatible pkg versions, it will pinpoint the pkg conflict.

At least, that is my understanding. (MLJ allows you to use any serializer).

ablaom commented 1 year ago

As I've seen no further feedback, closing. In unresolved please re-open.