NNlib.jl icon indicating copy to clipboard operation
NNlib.jl copied to clipboard

pointer(CuArray) is not defined

Open una-dinosauria opened this issue 4 years ago • 0 comments

The demos from Metalhead.jl are broken if one tries to run them on the GPU (xref https://github.com/FluxML/Metalhead.jl/issues/42), eg

julia> using CuArrays, Metalhead, Flux
julia> vgg = VGG19() |> gpu
julia> x = cu(rand(Float32, 224, 224, 3, 1));
julia> vgg(x)

The trace points to a an exception in NNlib:

ERROR: conversion to pointer not defined for CuArray{Float32,2}
Stacktrace:
 [1] error(::String) at ./error.jl:33
 [2] unsafe_convert(::Type{Ptr{Float32}}, ::CuArray{Float32,2}) at ./pointer.jl:67
 [3] pointer(::CuArray{Float32,2}) at ./abstractarray.jl:934
 [4] macro expansion at /home/julieta/.julia/packages/NNlib/mxWRT/src/impl/conv_im2col.jl:54 [inlined]
 [5] macro expansion at ./gcutils.jl:87 [inlined]
 [6] macro expansion at /home/julieta/.julia/packages/NNlib/mxWRT/src/impl/conv_im2col.jl:53 [inlined]
 [7] #conv_im2col!#231(::CuArray{Float32,2}, ::Float32, ::Float32, ::typeof(NNlib.conv_im2col!), ::CuArray{Float32,5}, ::CuArray{Float32,5}, ::Array{Float32,5}, ::DenseConvDims{3,(3, 3, 1),3,64,(1, 1, 1),(1, 1, 1, 1, 0, 0),(1, 1, 1),false}) at /home/julieta/.julia/packages/TimerOutputs/7zSea/src/TimerOutput.jl:190
 [8] conv!(::CuArray{Float32,5}, ::CuArray{Float32,5}, ::Array{Float32,5}, ::DenseConvDims{3,(3, 3, 1),3,64,(1, 1, 1),(1, 1, 1, 1, 0, 0),(1, 1, 1),false}) at /home/julieta/.julia/packages/TimerOutputs/7zSea/src/TimerOutput.jl:198
 [9] #conv!#56(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(conv!), ::CuArray{Float32,4}, ::CuArray{Float32,4}, ::Array{Float32,4}, ::DenseConvDims{2,(3, 3),3,64,(1, 1),(1, 1, 1, 1),(1, 1),false}) at /home/julieta/.julia/packages/NNlib/mxWRT/src/conv.jl:68
 [10] conv!(::CuArray{Float32,4}, ::CuArray{Float32,4}, ::Array{Float32,4}, ::DenseConvDims{2,(3, 3),3,64,(1, 1),(1, 1, 1, 1),(1, 1),false}) at /home/julieta/.julia/packages/NNlib/mxWRT/src/conv.jl:68
 [11] macro expansion at /home/julieta/.julia/packages/NNlib/mxWRT/src/conv.jl:114 [inlined]
 [12] #conv#97(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(conv), ::CuArray{Float32,4}, ::Array{Float32,4}, ::DenseConvDims{2,(3, 3),3,64,(1, 1),(1, 1, 1, 1),(1, 1),false}) at /home/julieta/.julia/packages/TimerOutputs/7zSea/src/TimerOutput.jl:190
 [13] conv(::CuArray{Float32,4}, ::Array{Float32,4}, ::DenseConvDims{2,(3, 3),3,64,(1, 1),(1, 1, 1, 1),(1, 1),false}) at /home/julieta/.julia/packages/TimerOutputs/7zSea/src/TimerOutput.jl:198
 [14] (::Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}})(::CuArray{Float32,4}) at /home/julieta/.julia/packages/Flux/dkJUV/src/layers/conv.jl:55
 [15] applychain(::Tuple{Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},getfield(Metalhead, Symbol("##44#45")),Dense{typeof(relu),LinearAlgebra.Adjoint{Float32,Array{Float32,2}},Array{Float32,1}},Dropout{Float32},Dense{typeof(relu),LinearAlgebra.Adjoint{Float32,Array{Float32,2}},Array{Float32,1}},Dropout{Float32},Dense{typeof(identity),LinearAlgebra.Adjoint{Float32,Array{Float32,2}},Array{Float32,1}},typeof(softmax)}, ::CuArray{Float32,4}) at /home/julieta/.julia/packages/Flux/dkJUV/src/layers/basic.jl:31
 [16] (::Chain{Tuple{Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},Conv{2,2,typeof(relu),Array{Float32,4},Array{Float32,1}},MaxPool{2,4},getfield(Metalhead, Symbol("##44#45")),Dense{typeof(relu),LinearAlgebra.Adjoint{Float32,Array{Float32,2}},Array{Float32,1}},Dropout{Float32},Dense{typeof(relu),LinearAlgebra.Adjoint{Float32,Array{Float32,2}},Array{Float32,1}},Dropout{Float32},Dense{typeof(identity),LinearAlgebra.Adjoint{Float32,Array{Float32,2}},Array{Float32,1}},typeof(softmax)}})(::CuArray{Float32,4}) at /home/julieta/.julia/packages/Flux/dkJUV/src/layers/basic.jl:33
 [17] (::VGG19)(::CuArray{Float32,4}) at /home/julieta/.julia/packages/Metalhead/1dQOk/src/vgg19.jl:46
 [18] top-level scope at REPL[40]:1

Which in this example comes from the NNlib kernel trying to obtain a pointer from a CuArray

https://github.com/FluxML/NNlib.jl/blob/342928eb4478da9c7b1433ec75c8eb8a9b155747/src/impl/conv_im2col.jl#L54

I believe to obtain the pointer of a CuArray one now does

julia> pointer(x.buf)
CUDAdrv.CuPtr{Nothing}(0x00007f09ffc40000)

But I have no idea how to rewrite the code to make this compatible between CPU and GPU arrays.

una-dinosauria avatar Sep 11 '19 18:09 una-dinosauria