Correct typo: T.fmatrix -> gpu_fmatrix on line 5. I'm in need of more 
coffee ...

On Wednesday, May 10, 2017 at 11:13:48 PM UTC+8, Alexander Botev wrote:
>
> Again with Theano "0.9.0.dev-ca213aa43e78ab3fb074a7c679907ea4d5412ed1" I 
> get:
>
> Traceback (most recent call last):
>>   File "tt.py", line 9, in <module>
>>     a = theano.gpuarray.host_from_gpu(a_gpu)
>>   File 
>> "/share/apps/barber/system/lib/python3.6/site-packages/theano/gof/op.py", 
>> line 615, in __call__
>>     node = self.make_node(*inputs, **kwargs)
>>   File 
>> "/share/apps/barber/system/lib/python3.6/site-packages/theano/gpuarray/basic_ops.py",
>>  
>> line 549, in make_node
>>     raise TypeError(x)
>> TypeError: <TensorType(float32, matrix)>
>>
>
>
> On Wednesday, 10 May 2017 04:11:46 UTC+1, Adam Becker wrote:
>>
>> Hmm ... my bad. I thought givens would work.
>>
>> Anyway, this trick would work:
>>
>> import theano
>> from theano.gpuarray.basic_ops import infer_context_name
>>
>> gpu_fmatrix  = theano.gpuarray.GpuArrayType(dtype='float32', 
>> broadcastable=(False,False))
>> a_gpu = T.fmatrix()
>>
>> # insert transfer
>> a = theano.gpuarray.host_from_gpu(a_gpu)
>> # define graph as usual
>> b = a + 2.
>>
>> # compiles function, but takes GpuArray as input
>> fn = theano.function([a_gpu], b)
>> theano.printing.debugprint(fn)
>>
>> # compiles function that takes GpuArray as input/output
>> ctx_name = infer_context_name(a_gpu)
>> b_gpu = theano.gpuarray.as_gpuarray_variable(b, ctx_name)
>> fn2 = theano.function([a_gpu], b_gpu)
>> theano.printing.debugprint(fn2)
>>
>>
>> Console output:
>>
>> HostFromGpu(gpuarray) [id A] ''   1
>>  |GpuElemwise{add,no_inplace} [id B] ''   0
>>    |GpuArrayConstant{[[ 2.]]} [id C]
>>    |<GpuArrayType<None>(float32, matrix)> [id D]
>>
>> GpuElemwise{add,no_inplace} [id A] ''   0
>>  |GpuArrayConstant{[[ 2.]]} [id B]
>>  |<GpuArrayType<None>(float32, matrix)> [id C]
>>
>> The above works because the optimizer can remove redundant GPU -> CPU -> 
>> GPU transfers. The downside is the above approach doesn't work with config 
>> optimizer=None
>>
>> On Wednesday, May 10, 2017 at 5:02:20 AM UTC+8, Alexander Botev wrote:
>>>
>>> That does not seem to work. So I have this:
>>>
>>> a = T.fmatrix()
>>> ctx = pygpu.init(theano.config.device)
>>> theano.gpuarray.reg_context("mine", ctx)
>>> a_gpu = theano.gpuarray.GpuArrayType(a.dtype, a.broadcastable, "mine")
>>> f2 = theano.function([a_gpu], a + T.constant(2), givens={a: a_gpu})
>>> return f1, f2
>>>
>>>
>>> However, Theano complains about:
>>>
>>> TypeError: Unknown parameter type: <class 
>>> 'theano.gpuarray.type.GpuArrayType'>
>>>
>>> If instead of the [a_gpu] I have [a] it complains that the givens is 
>>> overwriting an input:
>>>
>>> RuntimeError: You are trying to replace variable '<TensorType(float32, 
>>> matrix)>' through the `givens` parameter, but this variable is an input to 
>>> your function. Replacing inputs is currently forbidden because it has no 
>>> effect. One way to modify an input `x` to a function evaluating f(x) is to 
>>> define a new input `y` and use `theano.function([y], f(x), givens={x: 
>>> g(y)})`. Another solution consists in using `theano.clone`, e.g. like this: 
>>> `theano.function([x], theano.clone(f(x), replace={x: g(x)}))`.
>>>
>>>
>>> On Tuesday, 9 May 2017 15:19:10 UTC+1, Adam Becker wrote:
>>>>
>>>> In the main graph, replace the input variables with type: 
>>>> theano.gpuarray.GpuArrayType (Can be done using givens parameter of 
>>>> theano.function). Then, feed pygpu.gpuarray.GpuArray object directly 
>>>> to the compiled function. pygpu.gpuarray.asarray can be used to move 
>>>> numpy array to GPU.
>>>>
>>>> On Tuesday, May 9, 2017 at 5:01:42 PM UTC+8, Alexander Botev wrote:
>>>>>
>>>>> Actually one thing I've just realized is that to do this consistently 
>>>>> I need to have access to the underlying Theano pygpu Context. Is there 
>>>>> anyway to get that?
>>>>>
>>>>> On Tuesday, 9 May 2017 09:53:02 UTC+1, Alexander Botev wrote:
>>>>>>
>>>>>> So recently I was wondering if there is any way that after compiling 
>>>>>> a theano function, rather than taking numpy arrays / native lists / 
>>>>>> native 
>>>>>> numbers it can accept as an input something like a libgpuarray or 
>>>>>> anything 
>>>>>> else that lives on the GPU. However, I know that in the computation 
>>>>>> graph 
>>>>>> usually when you compile it there is a Transfer Op if it is on the GPU. 
>>>>>> Is 
>>>>>> there a way to avoid that transfer?
>>>>>>
>>>>>>
>>>>>>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"theano-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to