[ deepSpeed ] 单机单卡本地运行 Docker运行

2024-05-11 22:20

本文主要是介绍[ deepSpeed ] 单机单卡本地运行 Docker运行,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文笔者基于官方示例DeepSpeedExamples/training/cifar/cifar10_deepspeed.py进行本地构建和Docker构建运行示例(下列代码中均是踩坑后可执行的代码,尤其是Docker部分), 全部code可以看笔者的github: cifiar10_ds_train.py

1 环境配置

1.1 cuda 相关配置

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda-repo-ubuntu2204-12-3-local_12.3.0-545.23.06-1_amd64.debsudo dpkg -i cuda-repo-ubuntu2204-12-3-local_12.3.0-545.23.06-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

1.2 deepspeed 相关配置

需要注意pip install mpi4py可能无法安装,所以用conda进行安装

sudo apt-get update
sudo apt-get install -y openmpi-bin  libopenmpi-dev ninja-build python3-mpi4py numactl
echo "Setting System Param >>>>>"
echo "export PATH=/usr/bin/mpirun:\$PATH" >> ~/.bashrc
echo "export PATH=/usr/bin/mpiexec:\$PATH" >> ~/.bashrc
echo "export PATH=/opt/conda/bin/ninja:\$PATH" >> ~/.bashrc
echo "export PATH=/usr/bin/mpirun:\$PATH" >> ~/.profile
echo "export PATH=/usr/bin/mpiexec:\$PATH" >> ~/.profile
echo "export PATH=/opt/conda/bin/ninja:\$PATH" >> ~/.profilepip3 install deepspeed==0.12.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
conda install -c conda-forge mpi4py
pip3 install tqdm   -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install triton  -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 Docker相关配置

如果不进行docker运行,这部分可以直接跳过

  1. 安装nvidia-container-toolkit
# clear cache
sudo docker builder prune
sudo docker system prune
sudo apt-get update
sudo apt-get install nvidia-container-toolkit
sudo systemctl restart docker
  1. 国内镜像源以及docker启动gpu的配置
    1. Docker Hub 镜像加速器
    2. sudo vi /etc/docker/daemon.json
    3. 重启docker sudo systemctl restart docker
// 创建修改 /etc/docker/daemon.json 
{"registry-mirrors": ["https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"],"default-runtime": "nvidia","runtimes": {"nvidia": {"path": "nvidia-container-runtime","runtimeArgs": []}}
}
  1. 镜像构建Dockerfile
FROM pytorch/pytorch:2.2.1-cuda12.1-cudnn8-develRUN apt-get update
RUN apt-get install -y openmpi-bin 
RUN apt-get install -y libopenmpi-dev
RUN apt-get install -y ninja-build  
RUN apt-get install -y python3-mpi4py
RUN apt-get install -y numactl
RUN echo "Setting System Param >>>>>"
RUN echo "export PATH=/usr/bin/mpirun:\$PATH" >> ~/.bashrc
RUN echo "export PATH=/usr/bin/mpiexec:\$PATH" >> ~/.bashrc
RUN echo "export PATH=/opt/conda/bin/ninja:\$PATH" >> ~/.bashrc
RUN echo "export PATH=/usr/bin/mpirun:\$PATH" >> ~/.profile
RUN echo "export PATH=/usr/bin/mpiexec:\$PATH" >> ~/.profile
RUN echo "export PATH=/opt/conda/bin/ninja:\$PATH" >> ~/.profileRUN echo 'export NUMA_POLICY=preferred' >> ~/.bashrc
RUN echo 'export NUMA_NODES=0' >> ~/.bashrcRUN pip3 install deepspeed==0.12.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN conda install -c conda-forge mpi4py
RUN pip3 install tqdm   -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip3 install triton  -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip3 install tensorboard  -i https://pypi.tuna.tsinghua.edu.cn/simpleRUN echo "Done"
  1. 构建和查看镜像
sudo docker build -t ds_env_container . --network=host
sudo docker imagesres="""
REPOSITORY                TAG       IMAGE ID       CREATED       SIZE
ds_env_container          latest    9149b06c79c8   1 hours ago   17.4GB
ultralytics/ultralytics   latest    9d605fba39ec   6 weeks ago   13.8GB
"""

2 cifiar10 deepspeed训练代码解析

2.1 训练数据 & 简单CNN

Data

直接torchvision.datasets中下载

tf_func = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])# Load or download cifar data
tr_set = torchvision.datasets.CIFAR10(root=DATA_FILE_NOW,train=True,download=True, transform=tf_func
)
testset = torchvision.datasets.CIFAR10(root=DATA_FILE_NOW, train=False, download=True, transform=tf_func
)

CNN

简单结构:CNN -> MLP -> head
其中包含Mixture of Experts(专家混和架构), Mixture-of-Experts (MoE) 经典论文一览
MOE模型的关键特点包括:

  • 专业化:每个专家被训练来处理输入数据的不同部分或不同类型的任务。
  • 灵活性:MOE模型可以根据任务需求动态地调整专家的数量和类型。
  • 扩展性:通过增加更多的专家,MOE模型可以扩展以处理更复杂的任务。
  • 并行处理:专家可以并行工作,这提高了模型的计算效率。
  • 负载均衡:MOE模型可以通过将任务分配给多个专家来实现负载均衡。
class MLP(nn.Module):def __init__(self, cfg):super().__init__()self.extra_feat = nn.Sequential(nn.Conv2d(3, 6, 5),nn.ReLU(),nn.MaxPool2d(2, 2),nn.Conv2d(6, 16, 5),nn.ReLU(),nn.MaxPool2d(2, 2),nn.Flatten())self.hiddens = nn.Sequential(nn.Linear(16*5*5, 120),nn.ReLU(),nn.Linear(120, 84),nn.ReLU())self.head = nn.Linear(84, 10)self.moe_layer_list = []self.moe = cfg.moeif self.moe:expert=nn.Linear(84, 84)for n_e in cfg.num_experts:self.moe_layer_list.append(deepspeed.moe.layer.MoE(hidden_size=84,expert=expert, num_expert=n_e,ep_size=cfg.ep_word_size,use_residual=cfg.mlp_type == 'residual',k=cfg.top_k,min_capacity=cfg.min_capacity,nosiy_gate_policy=cfg.nosiy_gate_policy,))self.moe_layer_list = nn.ModuleList(self.moe_layer_list)def forward(self, x):x = self.extra_feat(x)x = self.hiddens(x)if self.moe:for layer in self.moe_layer_list:x, _, _ = layer(x)return self.head(x)

2.2 设置分布式环境 & 初始化deepSpeed训练模型

设置分布式环境

deepspeed.init_distributed()

  • 其中用torch.distributed.get_rank() 获取当前进程在所有分布式进程中的索引
    • 当索引不为0时,调用torch.distributed.barrier()使得进程进行等待
    • 当索引为0时,下载数据后,再调用torch.distributed.barrier()
      • 这时候所有进程都达到barrier, 然后进程各自进行后续操作
if torch.distributed.get_rank() != 0:torch.distributed.barrier()....if torch.distributed.get_rank() == 0:torch.distributed.barrier()

初始化deepSpeed训练模型

model_engine, opt, tr_loader, _lr_scheduler = deepspeed.initialize(args=cfg,  # 其中包含 local_rank 和 deepspeed_config 字段。如果传递了 config,则此对象为可选项。model=net, # torch.nn.Modulemodel_parameters=params_grad, # 开启梯度下降的参数training_data=tr_set, # torch.utils.data.Datasetconfig=ds_config #  Instead of requiring args.deepspeed_config
)

config 设置的全部参数可以看 www.deepspeed.ai 官方文档
这里我们仅仅对部分必要参数进行了简单设置。
其中ZeR(Zero Redundancy Optimizer):

  1. ZeRO的主要思想包括:

    • 数据并行主义的内存优化:在传统的数据并行训练中,每个GPU都会存储一份完整的模型副本,这会导致显著的内存浪费。ZeRO通过将模型的参数、梯度和优化器状态分散到多个GPU上,从而减少了每个GPU所需的内存量。
    • 计算和通信的重叠:ZeRO利用异步执行和管道化技术,使得计算和通信可以并行进行,这样可以进一步提高训练的效率。
    • 动态损失缩放:为了混合精度训练的稳定性,ZeRO会自动调整损失缩放因子,避免了由于数值不稳定导致的问题。
    • 优化器状态的CPU offloading:ZeRO允许将优化器的状态存储在CPU上,进一步减少了GPU的内存占用。
  2. ZeRO分为几个阶段(stages),每个阶段都提供了不同程度的优化:

    • ZeRO-Offload:将优化器的状态和计算卸载到CPU。
    • ZeRO-Stage 1:在数据并行的基础上,对模型参数进行划分,每个GPU只存储一部分模型参数。
    • ZeRO-Stage 2:除了参数划分,还将梯度进行划分,每个GPU只存储与其参数相对应的梯度。
    • ZeRO-Stage 3:进一步将模型的前向和后向计算分散到不同的GPU上。
ds_config = {"train_batch_size": 16, # = train_micro_batch_size_per_gpu * gradient_accumulation_steps * number of GPUs"train_micro_batch_size_per_gpu": 16,"gradient_accumulation_steps": 1, # 梯度累积"steps_per_print": 2000, # logging相关 每 N 个培训步骤打印进度报告"tensorboard": { # tensorboard 相关设置"enabled": True,"output_path": "deepspeed_runs","job_name": "cifiar10-try"},"optimizer":{ # 优化器相关设置'type': 'Adam','params': {"lr": 0.001,"betas": [0.8, 0.999],'eps': 1e-8,'weight_decay': 3e-7}},"scheduler": { # 学习率相关设置'type': 'WarmupLR','params': {'warmup_min_lr': 0,'warmup_max_lr': 0.001,'warmup_num_steps': 1000}},"gradient_clipping": 1.0, # 梯度裁剪'prescale_gradients': False, # 在进行 allreduce 之前缩放梯度'bf16': {'enabled': cfg.dtype == 'bf16'},"fp16": {"enabled": cfg.dtype == "fp16","fp16_master_weights_and_grads": False,"loss_scale": 0, # the loss scaling value for FP16 training"loss_scale_window": 500,# "hysteresis": 2,"min_loss_scale": 1, "initial_scale_power": 15, # 2^initial_scale_power the power of the initial dynamic loss scale valu},"wall_clock_breakdown": False, # 为  forward/backward/update 训练阶段的延迟计时"zero_optimization": { # ZeRO(Zero Redundancy Optimizer) memory optimizations"stage": cfg.stage,"allgather_partitions": True, # 以便在每一步结束时从所有 GPU 收集更新参数"reduce_scatter": True, # 使用 reduce 或 reduce scatter 而不是 allreduce 来平均梯度"allgather_bucket_size": 5e8, # 一次全采集的元素数量。限制大尺寸模型全收集所需的内存"reduce_bucket_size": 5e8, # 一次还原/全还原的元素数量。限制大型模型的 allgather 内存需求"overlap_comm": True, # 尝试将梯度缩减与逆向计算相重叠"contiguous_gradients": True, # 在生成梯度时将其复制到连续的缓冲区中。避免在后向传递过程中出现内存碎片"cpu_offload": False # 将优化器内存和计算卸载到 CPU}
}

3 cifiar10 训练

再2中准备了model_engine, opt, tr_loader, _lr_scheduler , 就可以按照一般的深度学习方式进行训练了

from deepspeed.accelerator import get_accelerator# 获取分布的机器的device
local_rank = model_engine.local_rank
local_device = get_accelerator().device_name(local_rank)
for ep in range(cfg.epochs):for i, data_b in enumerate(tr_loader):ipts, labels = data_b[0].to(local_device), data_b[1].to(local_device)out = model_engine(ipts)loss = criterion(out, labels)# 一般DL loss.backward()model_engine.backward(loss)# 一般DL opt.step()model_engine.step()

3.1 本地训练

deepspeed --bind_cores_to_rank cifiar10_ds_train.py --deepspeed $@res="""
[ 030 / 30 ]: 100%|█████████████████████████████████████| 30/30 [02:29<00:00,  4.97s/it, loss=0.504]
Finished Training
Accuracy of the network on the 10000 test images:  57 %
Accuracy of plane :  67 %
Accuracy of   car :  70 %
Accuracy of  bird :  43 %
Accuracy of   cat :  41 %
Accuracy of  deer :  51 %
Accuracy of   dog :  42 %
Accuracy of  frog :  66 %
Accuracy of horse :  61 %
Accuracy of  ship :  66 %
Accuracy of truck :  59 %
"""

3.2 Docker训练

# 启动docker
sudo docker run --env CUDA_VISIBLE_DEVICES=0 -it --ipc=host \--security-opt seccomp=seccomp.json \--gpus all \-v  /home/scc/sccWork/myGitHub/My_Learn/deepSpeed/ds_train_learning/cifiar:/app \-v  /home/scc/Downloads/Datas:/data \ds_env_container# docker中运行
cd /app
deepspeed --bind_cores_to_rank cifiar10_ds_train.py --deepspeed $@# 退出
exit

seccomp.json 是在遇到set_mempolicy: Operation not permitted 问题继续的解决
参考的 https://github.com/bytedance/byteps/issues/17

这篇关于[ deepSpeed ] 单机单卡本地运行 Docker运行的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980818

相关文章

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

如何在运行时修改serialVersionUID

优质博文:IT-BLOG-CN 问题 我正在使用第三方库连接到外部系统,一切运行正常,但突然出现序列化错误 java.io.InvalidClassException: com.essbase.api.base.EssException; local class incompatible: stream classdesc serialVersionUID = 90314637791991

禅道Docker安装包发布

禅道Docker安装包发布 大家好, 禅道Docker安装包发布。 一、下载地址 禅道开源版:   /dl/zentao/docker/docker_zentao.zip  备用下载地址:https://download.csdn.net/download/u013490585/16271485 数据库用户名: root,默认密码: 123456。运行时,可以设置 MYSQL_ROOT_P

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群

828华为云征文|华为云Flexus X实例docker部署rancher并构建k8s集群 华为云最近正在举办828 B2B企业节,Flexus X实例的促销力度非常大,特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、Nginx等服务的需求,一定不要错过这个机会。赶紧去看看吧! 什么是华为云Flexus X实例 华为云Flexus X实例云服务是新一代开箱即用、体

docker-compose安装和简单使用

本文介绍docker-compose的安装和使用 新版docker已经默认安装了docker-compose 可以使用docker-compose -v 查看docker-compose版本 如果没有的话可以使用以下命令直接安装 sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-c

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储,载入镜像和删除镜像 1.4 Doecker容器操作 1.4

win7+ii7+tomcat7运行javaWeb开发的程序

转载请注明出处:陈科肇 1.前提准备: 操作系统:windows 7 旗舰版   x64 JDK:jdk1.7.0_79_x64(安装目录:D:\JAVA\jdk1.7.0_79_x64) tomcat:32-bit64-bit Windows Service Installer(安装目录:D:\0tomcat7SerV) tomcat-connectors:tomcat-connect

php 7之PhpStorm + Nginx + Xdebug运行调试

操作环境: windows PHP 7.1.10 PhpStorm-2017.2.4 Xdebug 2.5.4 Xdebug helper 1.6.1 nginx-1.12.2 注意查看端口占用情况 netstat -ano //查看所以端口netstat -aon|findstr "80" //查看指定端口占用情况 比如80端口查询情况 TCP 0.0.0.0:8