CUBIN:在Keras中使用双向LSTM运行Attention Layer时出现CUDA_ERROR_NO_BINARY_FOR_GPU错误

2o7dmzc5  于 2023-04-21  发布在  其他
关注(0)|答案(1)|浏览(335)

我正在使用一个自定义的注意力层来添加到我的双向LSTM模型中。

import keras
import keras.backend as K
from keras.models import Model
from keras.layers import Layer, Input, Bidirectional, LSTM, Dense, Attention

class attention(Layer):
    def __init__(self,**kwargs):
        super(attention,self).__init__(**kwargs)

    def build(self,input_shape):
        self.W=self.add_weight(name="att_weight",shape=(input_shape[-1],1),initializer="normal")
        self.b=self.add_weight(name="att_bias",shape=(input_shape[1],1),initializer="zeros")        
        super(attention, self).build(input_shape)

    def call(self,x):
        et=K.squeeze(K.tanh(K.dot(x,self.W)+self.b),axis=-1)
        at=K.softmax(et)
        at=K.expand_dims(at,axis=-1)
        output=x*at
        return K.sum(output,axis=1)

    def compute_output_shape(self,input_shape):
        return (input_shape[0],input_shape[-1])

    def get_config(self):
        return super(attention,self).get_config()

模型定义为

inputs = Input(shape=(1, len(features)))
att_in = Bidirectional(LSTM(16, return_sequences= True, dropout=0.2))(inputs)
att_out = attention()(att_in)
# l2 = Bidirectional(LSTM(8, return_sequences=True))(att_out)
d1 = Dense(8, activation = 'relu', kernel_initializer='normal')(att_out)
outputs = Dense(1, activation = 'relu', kernel_initializer='normal')(d1)
model = Model(inputs=inputs, outputs=outputs)

model.compile(optimizer=keras.optimizers.Adam(0.001),
             loss = 'mse',
             metrics = ['mse'])

history = model.fit(x_train[:100], y_train[:100], epochs = 1000, batch_size = 5, validation_data=(x_val, y_val), shuffle=False)

执行model.fit时出错

InternalError:  Failed to load in-memory CUBIN: CUDA_ERROR_NO_BINARY_FOR_GPU: no kernel image is available for execution on the device
     [[node model/attention/Tanh (defined at tmp/ipykernel_30186/2175341019.py:16) ]] [Op:__inference_train_function_5003]

Function call stack:
train_function

我在NVIDIA GeForce RTX 3090 computeCapability上使用Keras 2.4.3和TensorFlow 2.4.1:8.6与CUDA 12.0
我尝试使用较小的数据集(只有100个数据点)沿着较小的批处理大小(5)来检查内存消耗,但仍然,我看到几乎所有的GPU内存都被利用,然后在训练开始之前生成上述错误。是否有内存泄漏或其他问题我错过了?任何帮助都非常感谢。
更新:如果我在self.call中将tanh激活更改为sigmoid,它就能工作。是什么导致它不能与tanh激活一起工作是剩下的问题。

p8h8hvxi

p8h8hvxi1#

您的系统中带有GPU设置的TensorFlow的构建配置不正确。您需要为python版本(3.6 - 3.8)TensorFlow version 2.4安装cuDNN 8.0CUDA 11.0
请查看下面的图片:

**注意:**您也可以尝试将tensorflow升级到最新版本沿着安装所有所需软件的兼容版本,以启用GPU支持。请查看此link作为参考。

相关问题