无法使用GPU运算或创建卷积算子

最近在飞浆学习目标检测,教程先教了个检测黑白边界的案例。

w = np.array([1, 0, -1], dtype='float32')
w = w.reshape([1, 1, 1, 3])
img = np.ones([50,50], dtype='float32')
img[:, 30:] = 0.
x = img.reshape([1,1,50,50])
x = paddle.to_tensor(x)

这段代码先创建了一个二维数组,每行前30个数为1,后20个数为0,到这里都没问题。

img

但是在创建卷积算子并且开始做运算之后就报错,只输出了一段关于GPU和CUDA版本的信息

# 创建卷积算子,设置输入和输出通道数,卷积核大小,通过参数属性weight_attr用w初始化参数权重
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
       weight_attr=paddle.ParamAttr(
          initializer=Assign(value=w)))
y = conv(x)
out = y.numpy()
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output featuremap', fontsize=15)plt.imshow(out.squeeze(), cmap='gray')
plt.show()
print(conv.weight)
print(conv.bias)

img

这个取决你是否能够调用gpu

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/819389
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:阿里云GPU计算型实例有哪些?实例特点及适用场景整理
  • 除此之外, 这篇博客: 目标检测模型从训练到部署,其实如此简单中的 方法 1 本地GPU进行训练 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 第一步: 拉取docker镜像

    # 镜像名称
    IMAGE="daocloud.io/neucrack/tensorflow-gpu-py3-jupyterlab"
    # 拉取深度学习平台镜像
    docker pull $IMAGE
    # 测试,当日志出现gpu=True表示能成功使用GPU
    docker run --gpus all -it --rm $IMAGE python -c "import tensorflow as tf; print('-----version:{}, gpu:{}, 1+2={}'.format(tf.__version__, tf.test.is_gpu_available(), tf.add(1, 2).numpy()) );"
    

    第二步: 拉取本文代码,配置NNCASE,开启docker容器

    git clone https://github.com/QiangZiBro/pytorch-k210
    cd pytorch-k210/handpose_detection/maix_train
    # 配置NNCASE
    mkdir -p tools/ncc/ncc_v0.2 && cd tools/ncc/ncc_v0.2
    wget https://github.com/kendryte/nncase/releases/download/v0.2.0-beta4/ncc_linux_x86_64.tar.xz
    tar xvf ncc-linux-x86_64.tar.xz
    cd ../../
    

    上面的NNCASE只需要下载、解压即可,我们接下来使用Docker构建一个Linux虚拟容器环境,如下面命令开启环境:

    # 开启容器
    docker run --gpus all --name jupyterlab-gpu -it -p 8889:8889 -e USER_NAME=$USER -e USER_ID=`id -u $USER` -e GROUP_NAME=`id -gn $USER` -e GROUP_ID=`id -g $USER` -v `pwd`:/tf $IMAGE
    

    开启容器后,有两种操作方式供选择

    • 第一种,使用jupyter-notebook运行

    • 第二种,直接进入容器内部

      docker exec -it jupyterlab-gpu /bin/bash
      # 在容器内部,建议切换到普通用户运行
      su - yourname
      cd /tf
      

    这里笔者选用第二种方式。创建容器时,Docker自动在镜像里创建了一个和本机用户名相同的用户。在容器里运行程序时,强烈建议切换成普通用户运行,否则后期遇到权限问题还需要手动改权限。

    第三步: 开启训练,使用Yolo V2算法数据集进行训练,具体操作方法为:

    # 安装必备的包
    pip3 install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
    
    cd /handpose_detection/maix_train
    # 初始化
    python3 train.py init
    # 开始训练
    python3 train.py -t detector -d datasets/game train
    

    运行上述命令即使用maix_train工具箱开始训练,这个程序能一键完成训练、参数转换、量化等功能

    图片

    使用100个Epoch进行训练,得到的结果生成在out文件下。