无法获得Julia Turing模型的性能

无法获得Julia Turing模型的性能,julia,Julia,我试着从一个模型复制这个模型。但是它似乎运行得很慢,当我看@code_warntype时,有一些东西——我认为是K和N——编译器似乎调用了任何东西 我尝试过添加类型——虽然我不能向图灵_模型的参数添加类型,而且图灵_模型中的事情很复杂,因为它使用的是autodiff变量,而不是通常使用的变量。我把所有的代码都放在函数do_it中以避免全局变量,因为他们说全局变量会减慢速度。不过,它实际上似乎慢了一些 关于问题的起因有什么建议吗?turing_模型代码是迭代的,所以这应该是最大的区别 using

我试着从一个模型复制这个模型。但是它似乎运行得很慢,当我看@code_warntype时,有一些东西——我认为是K和N——编译器似乎调用了任何东西

我尝试过添加类型——虽然我不能向图灵_模型的参数添加类型,而且图灵_模型中的事情很复杂,因为它使用的是autodiff变量,而不是通常使用的变量。我把所有的代码都放在函数do_it中以避免全局变量,因为他们说全局变量会减慢速度。不过,它实际上似乎慢了一些

关于问题的起因有什么建议吗?turing_模型代码是迭代的,所以这应该是最大的区别

using Turing, StatsPlots, Random

sigmoid(x) = 1.0 / (1.0 + exp(-x))

function scale(w0::Float64, w1::Array{Float64,1})
    scale = √(w0^2 + sum(w1 .^ 2))
    return w0 / scale, w1 ./ scale
end

function do_it(iterations::Int64)::Chains
    K = 10                         # predictor dimension
    N = 1000                       # number of data samples

    X = rand(N, K)                 # predictors    (1000, 10)

    w1 = rand(K)                   # weights       (10,)
    w0 = -median(X * w1)           # 50% of elements for each class (number)
    w0, w1 = scale(w0, w1)         # unit length (euclidean)
    w_true = [w0, w1...]

    y = (w0 .+ (X * w1)) .> 0.0    # labels
    y = [Float64(x) for x in y]

    σ = 5.0
    σm = [x == y ? σ : 0.0 for x in 1:K, y in 1:K]

    @model turing_model(X, y, σ, σm) = begin

        w0_pred ~ Normal(0.0, σ)
        w1_pred ~ MvNormal(σm)

        p = sigmoid.(w0_pred .+ (X * w1_pred))

        @inbounds for n in 1:length(y)
            y[n] ~ Bernoulli(p[n])
        end
    end

    @time chain = sample(turing_model(X, y, σ, σm), NUTS(iterations, 200, 0.65));

    # ϵ = 0.5
    # τ = 10

    # @time chain = sample(turing_model(X, y, σ), HMC(iterations, ϵ, τ));

    return (w_true=w_true, chains=chain::Chains)
end

chain = do_it(1000)

这并不像写的那样运行。你能添加足够的代码让这个例子运行吗?它使诊断性能问题变得更加容易。谢谢,我忘记了设置数据时使用的两个支持函数。应立即运行。类型不稳定性不会出现在N或K上。N和K被设置为Int64,并且您永远不会更改其绑定。虽然将y设置为位数组,然后设置为浮点64数组,但Julia在编译过程中消除了不稳定性问题。类型稳定性取决于模型。我不确定Turing.jl是如何工作的,但这种类型的不稳定性可能是意料之中的。我会尝试在上问这个问题,并在这里提供一个链接。这不是书面的。你能添加足够的代码让这个例子运行吗?它使诊断性能问题变得更加容易。谢谢,我忘记了设置数据时使用的两个支持函数。应立即运行。类型不稳定性不会出现在N或K上。N和K被设置为Int64,并且您永远不会更改其绑定。虽然将y设置为位数组,然后设置为浮点64数组,但Julia在编译过程中消除了不稳定性问题。类型稳定性取决于模型。我不确定Turing.jl是如何工作的,但这种类型的不稳定性可能是意料之中的。我会尝试在上问这个问题,并在这里提供链接。