在8张V100上安装测试deepmd-kit的GPU版本

本文最后更新于:2022年5月19日 下午

前言

之前在自己的电脑上装了Centos9,然后我在里面配置好了deepmd-kit所需要的一切环境,然后在我的8核i5小笔记本上跑起来了,现在呢准备用学校提供的8张V100试试,并且之后的优化全部都在上面了。

准备工作

安装anaconda

之前已经出过教程,这里类比就行

创建自己的文件夹

这里啊,我们很多人用的一个集群,所以得分好目录和使用时间,在根目录下创建一个只属于你的文件夹,这样对大家都好,就比如我们每个人都创建一个目录:

image-20220211084108526

创建一个deepmd-kit环境(GPU版本)

之前我出的教程使用的是CPU版本,因为笔记本不太好,现在我们要创建一个名为deepmd-gpu的conda环境

运行以下命令:

1
conda create -n deepmd-gpu deepmd-kit=*=*gpu libdeepmd=*=*gpu lammps-dp cudatoolkit=11.3 horovod -c https://conda.deepmodeling.org

会安装下列的软件包:

image-20220211084711957

环境创建完成后会出现下列提示:

image-20220211084806682

这时候按提示输入conda activate deepmd-gpu就可以切换到该conda环境下

运行example

1
cd $deepmd的源码目录/examples/water/se_e2_a/

在这个目录下你将会看到一个名为input.json的文件,切换到该目录后,可以通过以下命令调用训练:

1
dp train input.json

这个input.json文件是输入脚本。开始训练之后会在屏幕上看到许多有关代码和环境的重要信息,其中有两条关于数据系统的信息值得特别注意。

1
2
3
4
5
6
7
8
9
10
11
12
DEEPMD INFO    ---Summary of DataSystem: training     -----------------------------------------------
DEEPMD INFO found 3 system(s):
DEEPMD INFO system natoms bch_sz n_bch prob pbc
DEEPMD INFO ../data_water/data_0/ 192 1 80 0.250 T
DEEPMD INFO ../data_water/data_1/ 192 1 160 0.500 T
DEEPMD INFO ../data_water/data_2/ 192 1 80 0.250 T
DEEPMD INFO --------------------------------------------------------------------------------------
DEEPMD INFO ---Summary of DataSystem: validation -----------------------------------------------
DEEPMD INFO found 1 system(s):
DEEPMD INFO system natoms bch_sz n_bch prob pbc
DEEPMD INFO ../data_water/data_3 192 1 80 1.000 T
DEEPMD INFO --------------------------------------------------------------------------------------

DeePMD-kit会打印出关于训练和验证数据集的详细信息。这些数据集由输入脚本的 “训练 “部分中的 “training_data “和 “validation_data “定义。训练数据集由三个数据系统组成,而验证数据集则由一个数据系统组成。屏幕上都显示了原子数(atoms)、批大小(batch size)、系统中的批次数(number of batches)以及使用系统的概率。最后一列显示是否假定了系统的周期性边界条件。

在训练过程中,每隔disp_freq训练步骤,用训练模型的批次和验证数据的numb_btch批次来测试模型的误差。训练误差和验证误差会相应地打印在文件disp_file中(默认为lcurve.out)。批量大小可以在输入脚本中通过训练和验证数据集的相应部分中的键 batch_size 来设置。一个输出的例子:

1
2
3
4
5
6
7
#  step      rmse_val    rmse_trn    rmse_e_val  rmse_e_trn    rmse_f_val  rmse_f_trn         lr
0 3.33e+01 3.41e+01 1.03e+01 1.03e+01 8.39e-01 8.72e-01 1.0e-03
100 2.57e+01 2.56e+01 1.87e+00 1.88e+00 8.03e-01 8.02e-01 1.0e-03
200 2.45e+01 2.56e+01 2.26e-01 2.21e-01 7.73e-01 8.10e-01 1.0e-03
300 1.62e+01 1.66e+01 5.01e-02 4.46e-02 5.11e-01 5.26e-01 1.0e-03
400 1.36e+01 1.32e+01 1.07e-02 2.07e-03 4.29e-01 4.19e-01 1.0e-03
500 1.07e+01 1.05e+01 2.45e-03 4.11e-03 3.38e-01 3.31e-01 1.0e-03

该文件(lcurve.out)包含8个栏目,从右到左分别是训练步骤、验证损失、训练损失、能量的均方根(RMS)验证误差、能量的均方根训练误差、力的均方根验证误差、力的均方根训练误差和学习率。能量的均方根误差(RMSE)以系统中的原子数为标准。

人们可以通过一个简单的Python脚本直观地看到这个文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt("lcurve.out", names=True)
for name in data.dtype.names[1:-1]:
plt.plot(data['step'], data[name], label=name)
plt.legend()
plt.xlabel('Step')
plt.ylabel('Loss')
plt.xscale('symlog')
plt.yscale('symlog')
plt.grid()
plt.show()

检查点将被写入文件,前缀为save_ckpt,每一个save_freq训练步骤。

在这里有一点值得思考,当我开始训练之后,一直在监视这8张卡的使用情况,使用命令nvidia-smi可以查看GPU信息和使用情况,如下:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 460.56 Driver Version: 460.56 CUDA Version: 11.2 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla V100-SXM2... On | 00000000:8A:00.0 Off | 0 |
| N/A 44C P0 112W / 300W | 910MiB / 16160MiB | 56% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 1 Tesla V100-SXM2... On | 00000000:8B:00.0 Off | 0 |
| N/A 38C P0 58W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 2 Tesla V100-SXM2... On | 00000000:8C:00.0 Off | 0 |
| N/A 41C P0 57W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 3 Tesla V100-SXM2... On | 00000000:8D:00.0 Off | 0 |
| N/A 38C P0 58W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 4 Tesla V100-SXM2... On | 00000000:B3:00.0 Off | 0 |
| N/A 37C P0 57W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 5 Tesla V100-SXM2... On | 00000000:B4:00.0 Off | 0 |
| N/A 37C P0 57W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 6 Tesla V100-SXM2... On | 00000000:B5:00.0 Off | 0 |
| N/A 39C P0 59W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
| 7 Tesla V100-SXM2... On | 00000000:B6:00.0 Off | 0 |
| N/A 38C P0 56W / 300W | 496MiB / 16160MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 907MiB |
| 1 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
| 2 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
| 3 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
| 4 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
| 5 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
| 6 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
| 7 N/A N/A 160386 C ...nvs/deepmd-gpu/bin/python 493MiB |
+-----------------------------------------------------------------------------+

可以看到0号GPU的显存占用为907MiB,而其余7张都是493MiB,且占用率GPU-Util只有第一张为56%,其它的都是0%,这还未跑满全部显存,并且这8张卡跑在一个线程上PID-160386。我认为可以在占满显存的情况下再比较一下,然后多线程试试,感觉可以在这个上面做做文章。


在8张V100上安装测试deepmd-kit的GPU版本
https://jialiangz.github.io/2022/02/11/deepmd-gpu/
作者
爱吃菠萝
发布于
2022年2月11日
更新于
2022年5月19日
许可协议