高性能计算服务
>
软件专区
>
最佳实践
>
基于国产异构加速卡的 DeePMD-kit 机器学习势训练与 LAMMPS 分子动力学全流程实践
机器学习势(Machine Learning Potential, MLP)兼具第一性原理精度与效率,能够在接近第一性原理精度的前提下,将分子动力学模拟速度提升五个数量级以上,已成为“AI for Science”在材料计算领域最为成熟的落地范式之一。
本期最佳实践,以全无机钙钛矿光伏材料CsPbI₃(含Cs/Pb/I空位缺陷)的相稳定性与热学性质研究为实例,完整记录在超算互联网平台的国产异构加速卡上,跑通 DeePMD-kit 3.1.0(PyTorch 后端)训练 → LAMMPS DP 势分子动力学 → DP-GEN 主动学习闭环的全流程。相较于一般教程,本文额外提供以下三方面内容:① 速度与效率的量化优势(含互联网可查来源);② 单卡到多卡(委员会并行 / DDP / LAMMPS-MPI / 任务级并行)的完整扩展方案;③ 国产异构加速卡的架构优势与成本测算。文中全部配置、命令、日志及报错案例均取自真实 DP-GEN 运行,可直接复用,旨在为国产算力平台上规模化开展机器学习势与分子动力学计算提供详实、可落地的工程参考。
目录
一、背景与目标
二、机器学习势的速度与效率优势(量化)
三、软硬件环境与选型
四、国产异构加速卡 的架构优势与成本
五、环境配置与验证(关键)
六、体系与训练数据准备(分步)
七、训练配置详解(input.json)
八、单卡异构加速卡训练与收敛调优
九、多卡并行扩展(重点)
十、LAMMPS 加载 DP 势的分子动力学
十一、DP-GEN 主动学习闭环编排
十二、报错了怎么办?——定位方法与真实案例
十三、结论与展望
参考来源
研究对象:全无机钙钛矿 CsPbI₃是最受关注的光伏与光电材料之一,理论带隙理想、耐热性优于有机-无机杂化钙钛矿。但它在室温下容易从光电活性的 α 黑色钙钛矿相 退化为非活性的 δ 黄色非钙钛矿相,相变、热膨胀、缺陷与离子迁移是决定其器件寿命的关键。要在原子尺度、纳秒时间尺度上刻画这些过程,第一性原理分子动力学(AIMD)精度足够但代价极其高昂——通常只能算数百原子、数皮秒。
为什么用机器学习势:DeePMD-kit 用深度神经网络拟合第一性原理数据得到深度势(DP)模型,再接入 LAMMPS 驱动大规模分子动力学,可在保持近 DFT 精度的同时把可模拟的体系与时间尺度扩大几个数量级,正好补上 AIMD 与实验之间的尺度鸿沟,非常适合 CsPbI₃ 的相稳定性、缺陷与热学研究。
•生态绑定:DeePMD-kit(PyTorch 后端)与 LAMMPS 的 deepmd 插件深度绑定 NVIDIA CUDA 生态;国产异构加速卡的 DTK 软件栈基于 ROCm,底层接口不同,直接装官方轮子会遇到算子未注册、动态库找不到。
•资源申请:Slurm 需要用正确的加速卡资源标识才能拿到异构加速卡,用错标识会永久排队。
•规模与调度:训练—采样—标注的主动学习闭环需要跨大量作业自动调度,且单卡吞吐有限,需要多卡并行才能压缩到实用周期。
1.在国产异构加速卡上跑通 DeePMD-kit 3.1.0(PyTorch/ROCm)的训练与模型冻结;
2.给出单卡与多卡(委员会并行 / 单模型 DDP / LAMMPS-MPI / DP-GEN 任务级)的完整并行方案;
3.量化异构加速卡上的速度、效率与成本优势,并附互联网可查来源;
4.用 DP-GEN + dpdispatcher 把三阶段无人值守地编排到 Slurm,完成多轮主动学习。
机器学习势之所以能成为主流范式,核心在于它同时拿下了「精度」和「效率」这对传统上难以兼得的指标。下面用可查证的数字说明其量级优势:
•比第一性原理快 ≥5 个数量级。DP 模型推理的计算效率至少比第一性原理计算快 5 个数量级,同时保持量子力学级精度[1]。
•可模拟规模从数千到十亿原子。结合高性能计算,第一性原理精度的分子动力学从只能处理数千原子,扩展到十亿原子量级[2],时间尺度也从皮秒延伸到纳秒以上。
•推理再提速 4–15 倍。DeePMD-kit 的模型压缩技术可将推理速度再提高 4–15 倍[3]。
•GPU/异构加速卡优化收益巨大。通过数据结构优化、算子优化与单双精度混合计算,加速卡上的模拟速度相比早期实现可提升约 5000 倍[3];DeePMD-kit 原生支持 CPU / CUDA / ROCm 三条并行路径,其中 ROCm 正是国产异构加速卡 的通道。
•主动学习省数据。DP-GEN 用不确定度采样,只把少量最有信息量的构型送去 DFT 标注(本例每轮上限约 150 个单点),相比暴力扫描把最贵的 DFT 算量降低几个数量级。
落到本实践:单张异构加速卡上约 70 秒 / 1000 步 完成 DP 训练,40 万步约 7.8 小时 出一个模型;推理阶段 LAMMPS 以 DP 势驱动数百至上千原子体系做纳秒级 NVT/NPT,是同规模 AIMD 想都不敢想的尺度。
本实践基于超算互联网核心节点(zzeshell),计算队列 hx1hdnormal,加速卡为国产异构加速卡,配套 DTK / ROCm 软件栈。软件全部取自平台 apprepo 预构建模块,版本对齐 DTK 25.04,避免自行编译的 ABI 冲突。

选型要点:训练与推理统一 PyTorch 后端(DeePMD-kit v3 默认、对异构加速卡适配最好),冻结模型为 .pth;LAMMPS 必须与 DeePMD 同一 DTK 版本编译且带 deepmd 插件,否则 pair_style 无法加载。
DeePMD-kit 有两套后端,命令、模型格式、异构加速卡适配都不同,混用是最常见的坑。本实践全程使用 PyTorch 后端——真实 param.json 中 train_backend: pytorch,产出 16 个 frozen_model.pth、0 个 .pb。二者对照:

避坑三条: ① PyTorch 后端所有 dp 子命令都要带 --pt;② 冻结产物是 .pth,LAMMPS 的 pair_style deepmd 后必须接 .pth;③ 训练、采样、LAMMPS 三处的插件与后端必须一致,否则报「算子未注册 / 无法加载模型」。
•双精度(FP64)强,天生适合科学计算。深算一号 FP64 双精度算力达 5.2 TFLOPS,填补了国产 GPGPU 在 HPC 的空白[5];分子动力学、第一性原理对双精度敏感,异构加速卡在此类负载上尤为契合。
•大显存、高带宽。集成 4096 个计算核心、32GB HBM2、显存带宽约 1 TB/s,支持 FP64/FP32/FP16/INT8 全精度[5],利于大 batch 训练与大体系 MD。
•迁移成本低。DTK 基于 ROCm,集成 2000+ 算子、对 CUDA 算子覆盖率超 99%,可直接编译 CUDA/ROCm 代码——这正是 DeePMD-kit、LAMMPS 能平滑迁移的底层原因。
•能效更优。深算二号异构加速卡-Z100 功耗约 350W,低于 NVIDIA A100 的 400W[6]。
•自主可控、可规模化获取。已在国家超级计算郑州中心等落地[6],并通过超算互联网以「万卡」级规模对外供给,避免高端进口加速卡的供应与合规风险。
•单卡性价比。据第三方研报,NVIDIA V100 的 AI / 科学计算能力约为深算一号的 85.7% / 54.6%,而价格却高出约 49%,异构加速卡单位算力性价比更优[4]。
•软件栈成本。国产开源第一性原理软件 ABACUS 已针对曙光异构加速卡优化,相比 CPU 平台成本显著降低,且体系越大优势越明显[7]——用它替代商业 DFT 做标注,可进一步降本。
•方法层降本(最关键)。「主动学习 + 机器学习势」把最贵的第一性原理算量压到最小:一次性投入数百个 DFT 单点训练出 DP 势后,后续所有大规模、长时程 MD 都以廉价推理完成。就总拥有成本(TCO)而言,这比全程 AIMD 低几个数量级。

注:上表倍数为不同来源在各自口径下的公开数据,用于说明量级而非严格同一基准;来源见文末《参考来源》。
平台 apprepo 已为 DeePMD-kit 模块提供环境脚本,训练 / 采样作业只需 source 它即可。核心内容(按实际脚本整理):
# apprepo/deepmd/v3.1.0-dtk25.04_pytroch/scripts/env.sh
module load mpi/openmpi/openmpi-4.1.5-gcc9.3.0
module load compiler/dtk/25.04
source ${ROCM_PATH}/cuda/env.sh # DTK 以 cuda/ 目录暴露 HIP 接口
SCRIPTDIR=/public/home/<user>/apprepo/deepmd/v3.1.0-dtk25.04_pytroch
source ${SCRIPTDIR}/app/deepmd-v3.1.0-pytorch/bin/activate
export PATH=${SCRIPTDIR}/app/bin:$PATH
export LD_LIBRARY_PATH=${SCRIPTDIR}/app/lib64:${SCRIPTDIR}/app/lib:$LD_LIBRARY_PATH
export LAMMPS_PLUGIN_PATH=${SCRIPTDIR}/app/lib/deepmd_lmp # LAMMPS 找 DP 插件的关键
export LD_LIBRARY_PATH=${CONDA_PREFIX}/lib/python3.10/site-packages/torch/lib:$LD_LIBRARY_PATH三个决定成败的环境变量: ① source ${ROCM_PATH}/cuda/env.sh(PyTorch 才能把异构加速卡 识别为 cuda 设备);② LAMMPS_PLUGIN_PATH(否则 pair_style deepmd 找不到);③ 把 torch/lib 加入 LD_LIBRARY_PATH(否则 import torch 报缺 .so)。
DEEPMD INFO build variant: rocm
DEEPMD INFO computing device: cuda:0
DEEPMD INFO HIP_VISIBLE_DEVICES: 0
DEEPMD INFO Count of visible GPUs: 1关键认知: 异构加速卡上 device 显示 cuda:0 属正常——ROCm/HIP 复用了 CUDA 命名,build variant = rocm 才是它真跑在异构加速卡上的证据;选卡用 HIP_VISIBLE_DEVICES。
目标体系 CsPbI₃,类型映射 type_map = [Cs, Pb, I],质量 [132.905, 207.2, 126.904]。数据准备分四步:
AIMD 采样:对 α 相体相在 100 / 300 / 450 / 600 K 做短程第一性原理 MD,并对 Cs / Pb / I 三种空位构型各采一批,得到初始轨迹。
格式转换:用 dpdata 把 DFT 输出转成 DeePMD 的 System(box/coord/energy/force 二进制):
import dpdata
ls = dpdata.LabeledSystem('OUTCAR', fmt='vasp/outcar') # 或 abacus/scf
ls.to('deepmd/npy', 'init_data/bulk_300K')目录组织:init_data 下按物理含义分 7 个子集,供 param.json 引用。真实数据规模如下(约 160 原子超胞,缺陷体系 159 原子):

合计约 3000–4000 帧(含能量+力标注)。纯相超胞组成 Cs₃₂Pb₃₂I₉₆(160 原子),缺陷体系抽走 1 个原子 → 159 原子。四个温度点(100 / 300 / 450 / 600 K)从室温覆盖到高温,为 DP-GEN 探索打底。
探索构型:准备纯相与三种空位的 POSCAR(POSCAR_pure / vac_Cs / vac_Pb / vac_I)作为 DP-GEN 在 LAMMPS 中 model-deviation 的起点。
训练输入由 DP-GEN 从 param.json 的 default_training_param 生成,关键段落:
"descriptor": {
"type": "se_e2_a", # 两体嵌入描述符(DeepPot-SE)
"sel": [24, 14, 60], # Cs/Pb/I 近邻截断计数(按 neighbor-stat 核定)
"rcut": 6.0, "rcut_smth": 0.5,
"neuron": [25, 50, 100], "axis_neuron": 16, "resnet_dt": false },
"fitting_net": { "neuron": [240, 240, 240], "resnet_dt": true },
"learning_rate": { "type": "exp", "start_lr": 1e-3,
"stop_lr": 3.51e-8, "decay_steps": 5000 },
"loss": { "start_pref_e": 0.02, "limit_pref_e": 1,
"start_pref_f": 1000, "limit_pref_f": 1 },
"training": { "numb_steps": 400000, "disp_freq": 1000,
"save_freq": 10000, "disp_file": "lcurve.out" }配置解读:sel 需覆盖rcut=6 Å 内各元素最大近邻数,用 dp neighbor-stat -s <data> -r 6.0 核定后留余量;损失采用「先力后能」(start_pref_f=1000),对 MD 稳定性至关重要;学习率指数衰减 1e-3 → 3.51e-8,共 40 万步。 委员会: param.json 设 numb_models: 4,用不同随机种子并行训练 4 个模型以估计不确定度。
"model_devi_dt": 0.002, # LAMMPS 时间步 (ps)
"model_devi_f_trust_lo": 0.15, # 力偏差下限(eV/Å):低于=已学会
"model_devi_f_trust_hi": 0.5, # 力偏差上限:高于=非物理丢弃
"numb_models": 4, # 委员会模型数
"fp_style": "vasp", # 可换 "abacus"(国产开源)
"fp_task_max": 150, # 每轮最多标注构型数
"fp_skip_bad_box": "length_ratio:3.0;height_ratio:3.0;tilt_ratio:1.5",
"ratio_failed": 0.95 # 允许的最大失败比例(容错)关键规则: fp 单点的电子结构参数必须与生成初始数据集时严格一致,否则能量/力基准不统一、势能面被污染。以下取自真实 fp 输入(VASP 记法,括注为国产开源 ABACUS 的对应项):

真实运行中,单个第一性原理单点在 8 卡异构加速卡上约 4 分钟完成(fp.log:253 s,Exit code 0)。
dp --pt train input.json # 训练(PyTorch 后端)
dp --pt train input.json --restart model.ckpt.pt # 断点续训
dp --pt freeze -o frozen_model.pth # 冻结为可部署模型(.pth)
dp --pt test -m frozen_model.pth -s ../data.init/init_data/bulk_300K # 精度检验DEEPMD INFO Adjust batch size from 1024 to 2048 ... to 131072
DEEPMD INFO batch 1000: total wall time = 70.90 s, eta = 7:51:29
DEEPMD INFO batch 5000: rmse_f = 2.34e-02, total wall time = 70.09 sDeePMD v3 在异构加速卡上自动探测显存放大 batch(1024→131072);单卡约 70 s / 1000 步,40 万步整训约 7.8 小时。

最终精度:能量 RMSE ≈ 1.2 meV/atom,力 RMSE ≈ 15–25 meV/Å,达到可驱动 MD 的势能面精度。(吞吐与收敛为单张异构加速卡实测,卤化物钙钛矿类体系代表值。)
#!/bin/bash -l
#SBATCH --partition hx1hdnormal
#SBATCH --nodes 1 --ntasks-per-node 1
#SBATCH --gres=dcu:1 # 关键:申请 1 张异构加速卡(不是 gpu)
#SBATCH -c 16 --time=48:00:00
source .../deepmd/v3.1.0-dtk25.04_pytroch/scripts/env.sh
dp --pt train input.json单卡够用于中小体系,但当体系更大、模型更多、迭代更快时,需要多卡。异构加速卡集群上有四条互补的并行路径,可组合使用:
DP-GEN 的 numb_models=4 本身是彼此独立的四次训练,dpdispatcher 会把它们作为四个作业各占一张异构加速卡同时提交——无需改代码即可近 4 倍缩短一轮训练墙钟时间。这是本实践实际采用的方式。
当单个模型需要更大数据吞吐时,DeePMD-kit v3(PyTorch 后端)支持用 torchrun 拉起 PyTorch DDP 分布式数据并行[8]。单机 4 卡示例:
# 单机 4 张异构加速卡数据并行训练(DDP,梯度 all-reduce 同步)
torchrun --nnodes 1 --nproc_per_node 4 --no-python \
dp --pt train input.json
# 对应 Slurm 头部
#SBATCH --nodes 1 --ntasks-per-node 4
#SBATCH --gres=dcu:4 -c 32要点: DDP 每进程独占一张异构加速卡,通过 all-reduce 同步梯度[8];异构加速卡上走 DTK 的 RCCL/HIP 集合通信通道。多机多卡时增大 --nnodes 并设好 MASTER_ADDR/PORT。注意有效 batch 随卡数放大,必要时同步调大 decay_steps。
推理阶段,LAMMPS 用 MPI 做空间区域分解,每个 rank 绑定一张异构加速卡,适合大体系或长轨迹:
# 4 张异构加速卡并行跑一条大体系 DP-MD
#SBATCH --nodes 1 --ntasks-per-node 4 --gres=dcu:4 -c 32
source .../deepmd/.../scripts/env.sh
mpirun -np 4 lmp_mpi -i input.lammps -v restart 0扩展性提示: DP 势的 LAMMPS 并行随原子数近线性加速;小体系过度切分会被通信开销吃掉收益,建议每卡保持足够原子数(经验上千原子/卡以上)再横向扩展。
探索(01.model_devi)与标注(02.fp)阶段有成百上千个彼此独立的小任务。通过 machine.json 的 group_size 与并发作业数,dpdispatcher 会把它们批量铺满整个异构加速卡 队列——这是把「十万卡」规模算力真正吃满、缩短闭环周期的关键。标注阶段本实践即用 --gres=dcu:8 单作业 8 卡并行。

DP-GEN 探索阶段一次载入 4 个委员会模型,边跑 MD 边输出 model-deviation。真实 input.lammps(NPT,示例 100 K / 500 bar):
units metal
boundary p p p
atom_style atomic
read_data conf.lmp
change_box all triclinic
mass 1 132.905 # Cs
mass 2 207.2 # Pb
mass 3 126.904 # I
pair_style deepmd ../graph.000.pth ../graph.001.pth \
../graph.002.pth ../graph.003.pth \
out_freq 10 out_file model_devi.out
pair_coeff * *
velocity all create ${TEMP} 501969
fix 1 all npt temp ${TEMP} ${TEMP} 0.1 iso ${PRES} ${PRES} 0.5
timestep 0.002
run 5000 upto运行与解读: pair_style deepmd 后接多个 .pth 即启用委员会;单卡 lmp_mpi -i input.lammps,多卡见 §9.3。以最大力偏差 max_devi_f 作为不确定度,按双阈值 f_trust_lo=0.15 / f_trust_hi=0.5 eV/Å 筛候选:低于下限=已学会,高于上限=非物理丢弃,中间送 DFT 标注。真实 iter.000002 的 max_devi_f 仅 ~5e-3,说明该轮势能面已高度可靠。
DP-GEN 把「训练→探索→标注」循环自动化,每阶段由 dpdispatcher 提交 Slurm。三阶段的 异构加速卡资源(machine.json 真实配置):


规模小结: 探索覆盖 10–700 K 共 10 个不同温度点、4 个压力档、7 个子体系,累计约 122 条 MD 轨迹。
设计思路: 先低温体相稳住势能面,再升温、加压、引入缺陷,最后宽温压扫描搜边界、低温精修,高效覆盖构型空间又避免早期非物理崩溃。
收敛判读(真实 dpgen.log): 到 iter06,每个子体系候选池 2505 帧 中命中信任区间的比例为 100.00%(candidate 0、accurate 2505、需标注 fp 任务 0)——势能面已收敛;运行在 iter07 正常 finished,8 轮闭环完成。
候选构型进入 fp 阶段做第一性原理单点标注回灌训练集(fp_task_max=150)。fp 引擎可插拔:本实践使用的商业 DFT 引擎需自备合法授权;若要全栈国产开源,DP-GEN 原生支持把 fp_style 切为国产开源 ABACUS(已官方适配曙光异构加速卡、成本显著降低[7]),在同一套 异构加速卡上完成标注,彻底摆脱商业软件许可与 CUDA 生态绑定。
dpgen run param.json machine.json # 一键运行 concurrent learning
cat record.dpgen # 断点续跑依据,如 '7 2' = 第7轮 fp 阶段本课题实际完成 8 轮迭代(iter.000000 – iter.000007),势模型对体相与三种缺陷在宽温压区间均达低 model-deviation,可交付生产级 MD。
(1)先看 dpgen.log 与 record.dpgen: 确定卡在哪一轮、哪一阶段。record.dpgen 末行如 7 2 表示第 7 轮、fp 阶段(0=train,1=model_devi,2=fp)。
(2)再进对应 task 目录看日志: 训练看 00.train/00X/train.log,采样看 01.model_devi/task./log.lammps,标注看 02.fp/task./fp.log。
(3)查作业失败标记: dispatch_*/<hash>/ 下的 *_flag_if_job_task_fail,0=成功、1=失败;失败任务的输出就在同目录。
案例 A:dpdispatcher「unexpected submission state」(最常见)。真实报错:
RuntimeError: Meet errors will handle unexpected submission state.
Debug information: submission_hash==1407ff4b88086d8b423678be29582a607dfb679b
The submission information is saved in ~/.dpdispatcher/submission/<hash>.json
For furthur actions, run: dpdisp submission <hash>原因: Slurm 作业被取消 / 超时 / 节点异常,dpdispatcher 与远端作业失联。处理: ① 先按提示 dpdisp submission <hash> 查真实状态;② 队列确已无该作业,则删除 ~/.dpdispatcher/submission/<hash>.json 与该 iter 未完成的 dispatch 子目录,再执行 dpgen run param.json machine.json——DP-GEN 会按 record.dpgen 自动续跑,不重算已完成阶段。
案例 B:Slurm 作业被取消(超时)。真实报错 slurmstepd: error: *** JOB xxx CANCELLED ***。处理: 增大 --time(本实践 48:00:00)或减小单作业规模;训练可断点续训 dp --pt train input.json --restart model.ckpt.pt。
案例 C:部分 fp 单点失败。真实运行中出现若干 fp 失败标记(SCF 不收敛 / 坏构型)。处理: 属正常——DP-GEN 按 fp_skip_bad_box 跳过畸形盒子、按 ratio_failed 容忍一定失败率;若失败偏多,检查 NELM / ALGO 或该温压点是否过极端。

本报告在超算互联网曙光核心节点、国产异构加速卡 上完整打通了 DeePMD-kit 训练 → LAMMPS 分子动力学 → DP-GEN 主动学习 的机器学习势全流程,并以全无机钙钛矿 CsPbI₃ 为例给出可复用的配置、命令与日志。单卡约 8 小时完成 40 万步训练(能量 ~1 meV/atom、力 ~20 meV/Å);委员会/DDP/LAMMPS-MPI/任务级四条并行路径可把训练与采样铺满异构加速卡集群;机器学习势相对第一性原理快 5 个数量级以上、规模扩展至十亿原子,配合异构加速卡更优的双精度性价比与国产开源 ABACUS 标注,形成高精度、低成本、全国产的闭环。 结果表明,异构加速卡与 CUDA 生态虽底层不同,但依托 DTK/ROCm 预构建栈与「环境脚本 + 正确的加速卡资源申请 + 插件路径」三板斧,主流机器学习势工作流可在国产算力上无缝迁移、稳定高效、按需扩卡。下一步将把 fp 标注全面切换为 ABACUS 实现全栈国产开源,并在更大体系、多机多卡上做吞吐基准,进一步夯实国产算力在计算材料领域的规模化应用。
参考来源
[1] 上海交通大学超算平台 · DeePMD-kit 用户手册(≥5 个数量级、CPU/CUDA/ROCm 并行) https://docs.hpc.sjtu.edu.cn/app/engineeringscience/deepmd-kit.html
[2] 中国科学院院刊《AI 助力打造科学研究新范式》(第一性原理精度 MD 扩展至十亿原子) http://old2022.bulletin.cas.cn/publish_article/2024/1/20240102.htm
[3] DeePMD-kit v2 介绍(模型压缩 4–15×;加DCU速卡优化约 5000×) https://zhuanlan.zhihu.com/p/655569985
[4] 东吴证券《海光信息(688041)深度研究》(V100 vs 深算一号 性价比) https://pdf.dfcfw.com/pdf/H3_AP202402021620071544_1.pdf
[5] 山证/新浪财经《海光信息:国产 CPU 和 双领军》(FP64 5.2 TFLOPS) https://finance.sina.com.cn/stock/relnews/cn/2025-03-27/doc-ineqzwys5354332.shtml
[6] 国产国产异构加速卡 及超算平台深度解析(能效、超算落地) https://blog.csdn.net/thesky123456/article/details/147719977
[7] ABACUS 在曙光 DCU 集群上的编译与使用 / DCU 适配(成本显著降低) https://mcresearch.github.io/abacus-user-guide/abacus-dcu.html
[8] PyTorch 分布式训练 DP/DDP/torchrun(多卡数据并行) https://zhuanlan.zhihu.com/p/489011749