How to install cuda and pytorch dev environment on thinkpad w530 & ubuntu 20.04

最近发现在笔记本上用 cpu 来训练模型效率还是太慢了,正好我笔记本上有一块 nvidia gpu,准备折腾一下把这块 gpu 用起来

由于在笔记本环境下安装 gpu 开发环境比较痛苦,虽然最终失败了,但是过程比较有意义,值得备忘一下

我的开发环境主要是 pytorch + cuda

硬件环境就是 thinkpad w530 + 32g + K1000M

由于笔记本的 gpu 通常型号比较老,并不是大部分的 pytorch 都支持

1. 安装 cuda

网上有很多资料,怎么安装 nvidia-cuda-toolkit 的,apt install nvidia-cuda-toolkit 就可以直接装

但是我发现装完了之后没法用,pytorch 没法检测到 cuda 环境。这两个东西不完全是一个东西,有挺多差异的。

python3 -c ‘import torch; print(torch.cuda.is_available())’ 必须返回 true

最后用官方的安装方法成功了

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600

wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb

sudo dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

2. 安装 nvidia-driver

ubuntu 默认源里面会有一些基本的 nvidia-driver

ubuntu-drivers devices 可以看到

# ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00000FFCsv000017AAsd000021F5bc03sc00i00
vendor : NVIDIA Corporation
model : GK107GLM [Quadro K1000M]
manual_install: True
driver : nvidia-driver-390 - distro non-free
driver : nvidia-340 - distro non-free recommended
driver : nvidia-driver-418-server - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin

这里面会推荐你使用 nvidia-340

但是我的实际测试来看,nvidia-340是没法用的,安装完了之后显示器各种异常,最后安装到 nvidia-driver-390 解决了显示器异常的问题

但是nvidia-driver-390 版本太低,cuda 现在依赖的 nvidia-driver 版本都是470以上了,所以光有 nvidia-driver 是不行的,必须和 cuda 配套。

最终在安装 cuda 的时候会自动安装 nvidia-driver 配套驱动,其实不用自己搞

安装完,需要重启机器,重启后 nvidia-smi 检查能不能看到显卡信息


Stock Selection via Spatiotemporal Hypergraph Attention Network – A Learning to Rank Approach

论文原址:https://www.aaai.org/AAAI21Papers/AAAI-7907.SawhneyR.pdf

这几年研究把深度学习应用到量化交易和传统投资决策的论文并不少,但都有2个问题:

  1. They do not directly optimize the target of investment in terms of profit
  2. and treat each stock as independent from the others, ignoring the rich signals between related stocks’ temporal price movemen

为了解决这些问题,作者提出了一种叫 STHAN-SR 的超图神经网络。并通过对美3大交易所最近6年的数据,证明这个网络在当前所有股票预测算法里面是最优的

Introduction

美股市场,68万亿,19年

forecasting:预测

highly volatile and non-stationary nature – 股票市场具有很强的波动性

synergy 协同

当前主流的股票预测算法,最大的弊端就是不以投资收益为优化目标。因为这些算法,要么是基于回归来预测价格,要么基于分类来做交易决策,这种分类和回归的优化目标是为了提高股票价格走向的准确性或最小化预测股票收益的误差,而不一定是为了直接利润

(有什么不一样吗??一脸懵比)

0

第二个弊端就是不考虑股票之间的相关性,总是把这些股票作为独立的个体来分析,或者使用一个过于简化的股票市场模型,一个由单个股票之间的成对关系组成的图表,但在现实中,这与真正的市场是相反的


ImageNet Classification with Deep Convolutional Neural Networks

论文原址:https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf

无论是AI、深度学习,还是卷积神经网络,都不是这几年才有的概念,但确实是最近10年才流行起来。这里最主要的原因,还是要归功于AlexNet 2012年在大规模视觉识别挑战赛上取得的成功,所以才有了这篇论文

在这篇论文里面,AlexNet 提出了很多创新性的 idea,对卷积神经网络的发展影响深远,其中很多概念仍然是今天 CNN 的核心

论文的特点:

  1. AlexNet 包含许多心的不同寻常的特性,这些特性提高了神经网络的性能并减少了训练时间
  2. 提出 Dropout 解决过拟合的问题

下面我们再详细看下

不同寻常的网络特性

1. 非饱和神经元 ReLU

使用 ReLU 的四层卷积神经网络在 CIFAR-10 数据集上达到 25% 的训练误差比使用 tanh 神经元的等价网络(虚线)快 6 倍。为了使训练尽可能快,每个网络的学习率是单独选择的。没有采用任何类型的正则化。影响的大小随着网络结构的变化而变化,这一点已得到证实,但使用 ReLU 的网络都比等价的饱和神经元快几倍。

0

论文里有一片引用论文:https://www.cs.toronto.edu/~fritz/absps/reluICML.pdf

可以参考下


Visualizing and Understanding Convolutional Networks

论文原址:https://arxiv.org/pdf/1311.2901.pdf

1. 背景

我们都知道 CNN 卷积神经网络 效果好,但是一直以来都是一个黑盒,有2个关键问题:

  1. However there is no clear understanding of why they perform so wel
  2. or how they might be improved

其实包括我自己也是很困惑的,卷积神经网络有非常多。但是你看网上的资源来来回回都是在讲这些神经网络的结构。但是很少人知道为什么要把结构设计成这个样子。比如LeNet-5第一层卷积层为啥需要6个通道?为什么整个网络只需要2个卷积层,能不能更多或者更少?

为了解决这个黑盒问题,论文作者提出了一种可视化的方法,能够观测到卷积层的feature maps到底识别到了图片的什么特征,并以此反馈来改进神经网络的结构设计。最后通过这个方法,作者在ImageNet测试集上取得了非常突出的结果

2. 方法

论文的核心思想:map these activities back to the input pixel space, showing what input pattern originally caused a given activation in the feature maps

以LeNet-5这种经典的2D网络为例,正向的卷积过程一般包括几个步骤:

  1. filter
  2. relu
  3. max pooling
  4. 【optionally】local contrast operation

0


Mlsys & 深度学习相关方向的技术栈梳理

一些系统性的学习资料:

1. 深度网络设计

神经网络

  1. 经典2D/3D网络(LeNet-5,AlexNet,VCG)
  2. 残差网络:ResNet,DesNet,ResNeXt
  3. 时序网络:RNN,LSTM,GRU
  4. 生成对抗网络:DCGAN,LAPGAN,CycleGAN
  5. 其他:AutoML

2. 模型开发库

对神经网络模型的封装,更易用的API,集成度更高

  1. paddleNLP,paddleDetection,paddleOCR
  2. 其他公司好像没

3. 深度学习框架

面向 AI 的深度学习 toolkit 集合,主要研究的我看有两块,一块是深度学习框架本身,一块是深度学习可视化相关的

  1. 计算框架:
    1. tensorflow
    2. pytorch
    3. mxnet
    4. paddlepaddle
  2. 可视化:
    1. tensorboard
    2. VisualDL
    3. visdom

 


使用 LSTM 实现长期预测

pytorch LSTM:https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html

最近看 google 的论文 autopilot,讲的是怎么通过一个app的历史的资源使用数据,来预测这个app到底需要多少资源,才能满足其服务的正常运行

论文讲了2种方法,就是:

  1. 一种是传统的,对历史数据加权
  2. 一种是基于增强学习的,这个有点复杂,没太看懂

不过我有个疑问,像资源使用这种时序的数据,用 lstm 这种循环神经网络不是最简单吗?为什么要用增强学习这么复杂的东西(状态空间复杂,状态的迁移也复杂,并且需要更大的计算量)

所以我打算试试用 lstm 来实现长期的资源预测

我的数据样本:

20220510000000,38.388889
20220510003000,33.722222
20220510010000,31.538889
...
20220510053000,31.183333
20220510060000,32.983333
20220510063000,36.694444

第一列是明文的时间,第二列是app的cpu使用

1. 思路

使用 lstm 有几个关键的地方:

  1. 定义好网络的输入输出,简单来说就是你希望神经网络帮你学习什么样的特征映射。
  2. 怎么实现长期预测

由于典型的 rnn 神经网络,是输入一串历史数据,输出下一个时刻的预测值。这是经典用法,可能也有一些方法,可以直接输出多个历史预测值的,不过我没研究过,这里不讨论

我的方法也比较简单,就是用预测出来的值作为神经网络的数据,继续滚动预测下一个值,通过这种方法,实现“长期”的预测

2. 网络(输入、输出)建模

首先要定义清楚网络的输入,输出是什么

由于经典的 rnn 只有一个输出,就是我们下一步要预测的值,所以这个没什么好讨论的

但是输入是可以多个的,你可以用当前最近的2个数据来预测下一个数据,也可以用当前10个数据预测下一个数据,也可以是N个。但是据我的实测观察来看,使用2个数据预测下一个数据效果好像更好一些

2个数据预测1个

0


VGG-16 神经网络结构详解

视频:https://www.bilibili.com/video/BV1FT4y1E74V?p=120

0

这节课要讲的第三个,也是最后一个范例是VGG,也叫作VGG-16网络。

值得注意的一点是,VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。首先用3×3,步幅为1的过滤器构建卷积层,padding参数为same卷积中的参数。然后用一个2×2,步幅为2的过滤器构建最大池化层。因此VGG网络的一大优点是它确实简化了神经网络结构,下面我们具体讲讲这种网络结构。

0

假设要识别这个图像,在最开始的两层用64个3×3的过滤器对输入图像进行卷积,输出结果是224×224×64,因为使用了same卷积,通道数量也一样。VGG-16其实是一个很深的网络,这里我并没有把所有卷积层都画出来。

0

假设这个小图是我们的输入图像,尺寸是224×224×3,进行第一个卷积之后得到224×224×64的特征图,接着还有一层224×224×64,得到这样2个厚度为64的卷积层,意味着我们用64个过滤器进行了两次卷积。正如我在前面提到的,这里采用的都是大小为3×3,步幅为1的过滤器,并且都是采用same卷积,所以我就不再把所有的层都画出来了,只用一串数字代表这些网络。


AlexNet 神经网络结构详解

视频:https://www.bilibili.com/video/BV1FT4y1E74V?p=120 

我要举例说明的第二种神经网络是AlexNet,是以论文的第一作者Alex Krizhevsky的名字命名的,另外两位合著者是Ilya Sutskever和Geoffery Hinton。

0

AlexNet首先用一张227×227×3的图片作为输入,实际上原文中使用的图像是224×224×3,但是如果你尝试去推导一下,你会发现227×227这个尺寸更好一些。

第一层我们使用96个11×11的过滤器,步幅为4,由于步幅是4,因此尺寸缩小到55×55,缩小了4倍左右。

(以下请有兴趣的同学一定要推导一下,算一算才有长进~)

然后用一个3×3的过滤器构建最大池化层,f=3,步幅s为2,卷积层尺寸缩小为27×27×96。接着再执行一个5×5的卷积,padding之后,输出是27×27×276。然后再次进行最大池化,尺寸缩小到13×13。

再执行一次same卷积,相同的padding,得到的结果是13×13×384,384个过滤器。

再做一次same卷积,就像这样。

再做一次同样的操作,最后再进行一次最大池化,尺寸缩小到6×6×256。

6×6×256等于9216,将其展开为9216个单元,然后是一些全连接层。

最后使用softmax函数输出识别的结果,看它究竟是1000个可能的对象中的哪一个。


LeNet-5 神经网络结构详解

卷积层的参数计算:

  1. 卷积后feature map边长: outputSize =(originalSize + paddingX2 – kernelSize)/ stride + 1 (其中outputSize是卷积之后得到的feature map的边长,originalSize是输⼊图的边长,padding是填充的⼤⼩,kernelSize是卷积核的边长,stride是步长)
  2. 卷积层的可训练的参数个数: trainNum = (outputSize X outputSize + 1) X kernelNum (其中kernelNum是卷积核的个数,加1是因为每⼀个卷积核有⼀个bias参数)
  3. 卷积层的连接数: connectNum = (kernelSize X kernelSize) X (outputSize X outputSize) X kernelNum
  4. 卷积层的神经元个数: neuralNum = (outputSzie X outputSize) X kernelNum

采样层的参数计算:

  1. 采样后map的边长: outputSize =(originalSize + paddingX2 – kernelSize)/ stride + 1 (其中outputSize是卷积之后得到的feature map的边长,originalSize是输⼊图的边长,padding是填充的⼤⼩,kernelSize是卷积核的边长,stride是步长)
  2. 采样层可训练的参数个数: trainNum = (1+ 1) X kernelNum (其中kernelNum是卷积核的个数)
  3. 采样层的连接数: connectNum = (kernelSize X kernelSize) X (outputSize X outputSize) X kernelNum
  4. 采样层的神经元个数: neuralNum = (outputSzie X outputSize) X kernelNum

0


机器学习算法之——卷积神经网 (CNN)原理讲解

很经典的一篇文章,存档一下:https://xie.infoq.cn/article/c4d846096c92c7dfcd6539075

一、从神经网络到卷积神经网络

我们知道神经网络的结构是这样的:

那卷积神经网络跟它是什么关系呢?

其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次。

1. 定义

简而言之,卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家 Yann LeCun,目前在 Facebook 工作,他是第一个通过卷积神经网络在 MNIST 数据集上解决手写数字问题的人。

Yann LeCunn

2. 卷积神经网络的架构

如上图所示,卷积神经网络架构与常规人工神经网络架构非常相似,特别是在网络的最后一层,即全连接。此外,还注意到卷积神经网络能够接受多个特征图作为输入,而不是向量。