0%

配置云服务器

系统 : ubuntu 18.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 更新所有环境
sudo apt update

# 安装开发所需的基本包
sudo apt install build-essential

# 安装cuda.这里会连同显卡驱动一起安装
wget https://developer.download.nvidia.com/compute/cuda/11.5.1/local_installers/cuda_11.5.1_495.29.05_linux.run
sudo sh cuda_11.5.1_495.29.05_linux.run



# 去anaconda官方复制miniconda的下载链接
wget https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Linux-x86_64.sh

# 进入conda环境
bash

之后就继续用pip安装所需要的包
apt-get install python3.8

这里需要知道,如果我们在云端配置的环境,需要将云端的jupyter notebook的运行端口映射到本地来,可以这样做:

1
ssh -L8888:localhost:8888 ubuntu@100.20.65.33

如果使用aws配置远端服务器,在本地连接时使用:

$ chomd 400 Downloads/d2l.pem

$ ssh -i Downloads/d2l.pem ubuntu@54.245.23.40

以上两条命令中将密钥path和ip地址都替换成自己的。

docker中的tensorflow-gpu配置

首先在宿主机(本机)安装好NVIDIA GPU的驱动程序,然后对于每一个容器都要各自安装对应版本的cudacudnn

下载TensorFlow Docker镜像

官方 TensorFlow Docker 映像位于 tensorflow/tensorflow Docker Hub 代码库中。映像版本按照以下格式进行标记

标记 说明
latest TensorFlow CPU 二进制映像的最新版本。(默认版本)
nightly TensorFlow 映像的每夜版。(不稳定)
version 指定 TensorFlow 二进制映像的版本,例如:2.1.0
devel TensorFlow master 开发环境的每夜版。包含 TensorFlow 源代码。
custom-op 用于开发 TF 自定义操作的特殊实验性映像。详见此处

每个基本标记都有会添加或更改功能的变体:

标记变体 说明
tag-gpu 支持 GPU 的指定标记版本。(详见下文
tag-jupyter 针对 Jupyter 的指定标记版本(包含 TensorFlow 教程笔记本)

您可以一次使用多个变体。例如,以下命令会将 TensorFlow 版本映像下载到计算机上:

1
2
3
docker pull tensorflow/tensorflow                     # latest stable release
docker pull tensorflow/tensorflow:devel-gpu # nightly dev release w/ GPU support
docker pull tensorflow/tensorflow:latest-gpu-jupyter # latest release w/ GPU support and Jupyter

注意如果要用gpu版本的tensorflow,需要pull带有gpu tag的镜像. docker pull tensorflow/tensorflow:latest-gpu。如果不带gpu标签,会默认下载CPU版本的tensorflow。

验证tensorflow gpu

查看是否有GPU:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import tensorflow as tf

gpu_device_name = tf.test.gpu_device_name()
print(gpu_device_name)

# GPU是否可用,返回True或者False
tf.test.is_gpu_available()

from tensorflow.python.client import device_lib

# 列出所有的本地机器设备
local_device_protos = device_lib.list_local_devices()
# 打印
# print(local_device_protos)

# 只打印GPU设备
[print(x) for x in local_device_protos if x.device_type == 'GPU']

docker中安装多种cuda版本并切换

cuda官网下载所需版本,以.run结尾。楼主系统为linux

进入到放置 cuda_9.0.176_384.81_linux.run 的目录:

1
2
sudo chmod +x cuda_9.0.176_384.81_linux.run # 为 cuda_9.0.176_384.81_linux.run 添加可执行权限
./cuda_9.0.176_384.81_linux.run # 安装 cuda_9.0.176_384.81_linux.run

在安装过程中截取其中比较重要的几个选择:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 384.81?
(y)es/(n)o/(q)uit: n # 如果在这之前已经安装好更高版本的显卡驱动就不需要再重复安装,如果需要重复安装就选择 yes,此外还需要关闭图形界面。

Install the CUDA 9.0 Toolkit?
(y)es/(n)o/(q)uit: y

Enter Toolkit Location
[ default is /usr/local/cuda-9.0 ]: # 一般选择默认即可,也可以选择安装在其他目录,在需要用的时候指向该目录或者使用软连接 link 到 /usr/local/cuda。

/usr/local/cuda-9.0 is not writable.
Do you wish to run the installation with 'sudo'?
(y)es/(n)o: y

Please enter your password:
Do you want to install a symbolic link at /usr/local/cuda? # 是否将安装目录通过软连接的方式 link 到 /usr/local/cuda,yes or no 都可以,取决于你是否使用 /usr/local/cuda 为默认的 cuda 目录。
(y)es/(n)o/(q)uit: n

Install the CUDA 9.0 Samples?
(y)es/(n)o/(q)uit: n

选择的汇总:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Driver:   Not Selected
Toolkit: Installed in /usr/local/cuda-9.0
Samples: Not Selected

Please make sure that
- PATH includes /usr/local/cuda-9.0/bin
- LD_LIBRARY_PATH includes /usr/local/cuda-9.0/lib64, or, add /usr/local/cuda-9.0/lib64 to /etc/ld.so.conf and run ldconfig as root

To uninstall the CUDA Toolkit, run the uninstall script in /usr/local/cuda-9.0/bin

Please see CUDA_Installation_Guide_Linux.pdf in /usr/local/cuda-9.0/doc/pdf for detailed information on setting up CUDA.

***WARNING: Incomplete installation! This installation did not install the CUDA Driver. A driver of version at least 384.00 is required for CUDA 9.0 functionality to work.
To install the driver using this installer, run the following command, replacing <CudaInstaller> with the name of this run file:
sudo <CudaInstaller>.run -silent -driver
安装完成后可以在 /usr/local 目录下看到:

1
2
3
cuda-11.1 # 之前安装的cuda-11.1 
cuda-9.0 # 刚刚安装的cuda-9.0
cuda # cuda-10.0 的软连接

多版本切换:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#在切换cuda版本时
rm -rf /usr/local/cuda#删除之前创建的软链接
sudo ln -s /usr/local/cuda-8.0/ /usr/local/cuda/
nvcc --version #查看当前 cuda 版本

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Mon_Jan_23_12:24:11_CST_2017
Cuda compilation tools, release 8.0, V8.0.62

#cuda8.0 切换到 cuda9.0
rm -rf /usr/local/cuda
sudo ln -s /usr/local/cuda-9.0/ /usr/local/cuda/
nvcc --version

上面的前提是linux系统的环境变量中(~./bashrc文件)cuda的路径是/usr/local/cuda

tensorflow_decision_forests使用

我一开始pull了tensorflow-gpu版本的docker环境,想用一下tensorflow的tensorflow_decision_forests库,该库是随机森林的集合库,内有很多算法可以用。官方使用document在[https://www.tensorflow.org/decision_forests/tutorials/beginner_colab?hl=zh_cn]。

我一开始没注意,后来发现我在docker环境中直接用pip安装该库时,帮我又安装了cpu版本的tensorflow,这样就和我的gpu版本冲突了,然后去网上搜了一下,发现该库现在还有很多使用限制:1. 仅仅支持linux,不支持windows和mac 2. 仅支持cpu ,还没有gpu版本,见[https://github.com/tensorflow/decision-forests/issues/38].作者的意思是用gpu训练会更复杂,更详细的我就没看了。

然后我的做法是在该tensorflow-gpu的docker环境中使用virtualenv创建一个tensorfow的cpu虚拟环境,然后再用pip安装TF-DF这个包。避免污染docker主环境中的tensorflow-gpu。

之所以不用miniconda,是因为conda会默认替代掉我容器自带的python以及安装好的tensorflow-gpu。我只是想用一下TFDF这个库,不想太折腾。

此处贴virtualenv的命令:

1
2
3
4
5
6
7
pip install virtualenv

virtualenv venv # 在项目目录中执行,会创建一个名称为venv的虚拟环境,venv文件夹下包含python和pip

source venv/bin/activate # 激活环境

激活完了之后就pip安装tensorflow就行了

本地机器vscode配置使用远程服务器中运行的容器

参考 [https://zhuanlan.zhihu.com/p/80099904]

其中有几个地方需要注意一下的是:

  1. 如果遇到在本地机器vscode中使用插件remote ssh连接不上容器的问题时,需要vim /etc/ssh/sshd_config ,将PermitRootLogin的值改为yes(去掉前面的#号)

  2. 远程容器里面还需要有python插件,才能在本地机器vscode中debug代码

  3. 上面博主服务器端口映射的是容器的22端口,我没有尝试过用其他端口映射。22端口是ssh登陆的默认端口。

cudnn深度学习库的安装和验证

参考[https://blog.csdn.net/caicaiatnbu/article/details/87626491]

注意点:

  1. 下载对应的linux版本的cudnn

conda安装cuda和cudnn

如果使用的是conda的环境,可以单独使用conda install cuda来在虚拟环境中安装不同于本机版本的cuda和cudnn,而不需要使用我上面提到的那种方式(每次换cuda版本需要更换/usr/local/cuda的软链接的方式)。

conda创建了虚拟环境后,激活进入虚拟环境

1
conda install cudatoolkit=10.2

以上命令安装了10.2版本的cuda,然后可以使用cuda search cudnn找一下合适版本的cudnn,然后还是用cuda install cudnn=版本号来安装

注意:这里用conda安装的cuda和cudnn,是无法像在本机使用nvcc -V来检查版本的,所以即使你在虚拟环境激活的情况下使用 nvcc -V的命令会返回无此命令或者是返回的还是本机cuda的版本号!

那可能有人会问,如果想在conda虚拟环境下测试cuda和cudnn是否安装成功怎么办?

目前的办法是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# In[]:
import torch
# cpu
print(torch.__version__)
# gpu
print(torch.cuda.is_available())

# In[]:
import tensorflow as tf
# cpu
print(tf.__version__)
# v1 to test gpu
print(tf.test.is_gpu_available())
# v2 to test gpu
print(tf.config.list_physical_devices('GPU'))

参考[https://blog.csdn.net/qq_37774098/article/details/109895048]

docker拉取的pytorch-gpu版找不到cuda和cudnn的位置,为何?

参考 https://blog.csdn.net/ljp1919/article/details/106209358

tensorflow和pytorch验证GPU是否可用

tensorflow

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf

gpu_device_name = tf.test.gpu_device_name()
print(gpu_device_name)
# 查看是否可用
tf.test.is_gpu_available()

from tensorflow.python.client import device_lib

# 列出所有的本地机器设备
local_device_protos = device_lib.list_local_devices()
# 打印
# print(local_device_protos)

# 只打印GPU设备
[print(x) for x in local_device_protos if x.device_type == 'GPU']

pytorch

1
2
3
4
5
6
7
8
9
10
11
12
13
import torch
flag = torch.cuda.is_available()
if flag:
print("CUDA可使用")
else:
print("CUDA不可用")

ngpu= 1
# Decide which device we want to run on
device = torch.device("cuda:0" if (torch.cuda.is_available() and ngpu > 0) else "cpu")
print("驱动为:",device)
print("GPU型号: ",torch.cuda.get_device_name(0))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import 	torch
import time
print(torch.__version__)
print(torch.cuda.is_available())
# print('hello, world.')


a = torch.randn(10000, 1000)
b = torch.randn(1000, 2000)

t0 = time.time()
c = torch.matmul(a, b)
t1 = time.time()
print(a.device, t1 - t0, c.norm(2))

device = torch.device('cuda')
a = a.to(device)
b = b.to(device)

t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))

t0 = time.time()
c = torch.matmul(a, b)
t2 = time.time()
print(a.device, t2 - t0, c.norm(2))

附录:docker使用

创建容器:

1
2
3
4
5
6
7
8
docker run --gpus all -d -v /:/host -p 3333:22 tensorflow/tensorflow:2.4.0-gpu tail -f /var/log/dpkg.log # 创建容器并启动
docker create --name postgres nginx:latest # 创建容器并不启动

docker start # 启动一个或多个已经被停止的容器

docker stop # 停止一个运行中的容器

docker restart # 重启容器

进入容器:

1
2
3
docker exec -it [container_id] /bin/bash

docker inpect # 获取容器/镜像的元数据

停止容器运行

1
2
docker kill -s KILL [container_id]
或者 docker stop [container_id]

删除一个或多个容器

1
2
3
docker rm -f db01 db02 # 强制删除,容器可以是在运行着的状态
或者 docker rm db01

docker save 与 docker export 区别参考:[https://jingsam.github.io/2017/08/26/docker-save-and-docker-export.html]

1
2
docker save -o images.tar postgres:9.6 # 打包postgres镜像
docker load -9 images.tar # 载入镜像

docker save的应用场景是,如果你的应用是使用docker-compose.yml编排的多个镜像组合,但你要部署的客户服务器并不能连外网。这时,你可以使用docker save将用到的镜像打个包,然后拷贝到客户服务器上使用docker load载入。

1
2
docker export -o postgres-export.tar postgres # 将容器postgres打包成一个tar
docker import postgres-export.tar postgres:latest # 这是将tar包import成一个镜像,镜像和tag名字自定义

docker export的应用场景主要用来制作基础镜像,比如你从一个ubuntu镜像启动一个容器,然后安装一些软件和进行一些设置后,使用docker export保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。

sys.argv

sys模块是很常用的模块, 它封装了与python解释器相关的数据,例如sys.modules里面有已经加载了的所有模块信息,sys.path里面是PYTHONPATH的内容,而sys.argv则封装了传入的参数数据。 使用sys.argv接收上面第一个命令中包含的参数方式如下:

1
2
3
import sys

print(sys.argv[0],sys.argv[1],sys.argv[2])

其中sys.argv[0]是该脚本的名称,sys.argv[1]才是第一个参数,sys.argv是一个列表

用这种方式,命令行调用方式为:

python script.py parameter1 parameter2

argparse

1
2
3
4
5
6
7
8
9
10
11
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

安装

参照 https://github.com/PaddlePaddle/PaddleVideo/blob/develop/docs/zh-CN/install.md

注意这里创建虚拟环境的时候要使用python=3.7,因为3.7之后的版本,paddleVideo只支持Linux系统。

其他要求: cuda >= 10.1, cuDNN >= 7.6.4

安装完paddlepaddle之后,再安装paddleVideo

快速开始

这里官方教程写的不是很详细,安装完之后让直接用命令行方式启动程序,因为paddleVideo这个库里面有三个inference模型,分别是

1
2
3
Inference models that Paddle provides are listed as follows:

{'TSN', 'ppTSM', 'TSM'}

这里安装好环境之后,直接命令行是会报错的,因为还没有下载模型参数以及label,会报'If you want to use your own model, Please input model_file as model path!'的错误。

这时候进入python环境,跑以下程序:

1
2
3
4
5
from ppvideo import PaddleVideo
clas = PaddleVideo(model_name='ppTSM',use_gpu=False,use_tensorrt=False)
video_file='data/example.avi'
result=clas.predict(video_file)
print(result)

当你enter第二句话的时候,程序就会开始下载InferenceModel,大概有90.6兆,下载完之后再执行下面几行的程序,其中video_file这里要注意一下,程序里是相对路径。

下载的模型会放在 C:\Users\XXXX\.paddlevideo_inference\inference_model\ppTSM

下载的label的txt在'D:\\XXXXX\\anaconda_envs\\paddleVideo\\lib\\site-packages\\ppvideo\\tools\\../data/k400/Kinetics-400_label_list.txt'也就是虚拟环境那个ppvideo里

训练attention-lstm模型

前两节安装完之后,快速开始是为了测试安装正确与否。paddleVideo只有attention-lstm模型,并没有提供在youtube-8m上训练后的参数和label。所以这部分我们使用paddle框架来自己训练。

下载youtube-8m数据集并转换为paddlepaddle处理的格式

整个数据集包含3844个训练数据文件和3844个验证数据文件(TFRecord格式)

在linux系统下用curl下载,在windows下可以利用git的bash命令行的方式下载:

1
2
3
4
5
curl data.yt8m.org/download.py | partition=2/frame/train mirror=asia python

curl data.yt8m.org/download.py | partition=2/frame/validate mirror=asia python

curl data.yt8m.org/download.py | partition=2/frame/test mirror=asia python

数据下载完成之后,因为paddlepaddle需要使用pickle的数据格式,所以需要用https://github.com/PaddlePaddle/PaddleVideo/该官方仓库里data/yt8m下的脚本tf2pkl.py脚本进行转换。tf2pkl.py文件运行时需要两个参数,分别是数据源tf文件存放路径和转化后的pkl文件存放路径。

由于TFRecord文件的读取需要用到Tensorflow,用户要先安装Tensorflow,或者在安装有Tensorflow的环境中转化完数据,再拷贝到data/dataset/youtube8m/pkl目录下。为了避免和PaddlePaddle环境冲突,建议先在其他地方转化完成再将数据拷贝过来。

上面在转换数据格式的时候还要注意,tf2pkl.py文件用的tensorflow是1.X的版本,用2.0之后版本的需要重新创建虚拟环境,如果不想麻烦,可以直接在这个paddleVideo的虚拟环境里面安装tensorflow-gpu==1.14.0

这里如果安装的是gpu版本,需要有对应的cuda版本支持,1.14.0需要10.0的cuda,我的服务器是11.2的cuda,所以这里我就直接安装的是cpu版本的tensorflow。其他的版本支持请查阅:https://www.tensorflow.org/install/source#gpu

  • 在linux中命令:
1
2
python tf2pkl.py ./tf/train ./pkl/train
python tf2pkl.py ./tf/val ./pkl/val
  • 在windows中我的方案:

我看到tf2pkl.py脚本里是用sys命令行的方式调用的,然后他整个脚本都是在linux的模式下的模式。其中有几个地方改动一下就可以适用于windows:

  1. 删掉以下几行:
1
2
3
# assert (len(sys.argv) == 3)
# source_dir = sys.argv[1]
# target_dir = sys.argv[2]

禁用命令行调用的模式

  1. 将record_dir 变成你想转化的文件的文件夹的路径,比如\data\dataset\youtube8m\tf
  2. 将main函数中将outputdir路径改成你要存储pickle文件的文件夹的路径。

完成上述步骤之后,直接在IDE中运行tf2pkl.py就可以开始转化文件了。

1
export CUDA_VISIBLE_DEVICES=1