DeepSpeed性能调优与常见问题解决方案

1. 引言

什么是DeepSpeed?

DeepSpeed是由微软开源的深度学习训练优化库,旨在帮助研究人员和工程师高效地训练大规模深度学习模型。基于PyTorch框架,DeepSpeed提供了一系列先进的技术,如ZeRO(Zero Redundancy Optimizer)优化器、混合精度训练和通信优化等,使得在现有硬件条件下训练数十亿甚至数千亿参数的模型成为可能。

为什么选择DeepSpeed?

随着深度学习模型规模的不断扩大,训练所需的计算资源和时间成本也随之增加。DeepSpeed通过以下方式解决了这些挑战:

  • 高效的内存利用:利用ZeRO优化器,大幅减少了冗余数据的存储,降低了内存占用。
  • 加速训练过程:通过并行化和优化的通信机制,显著缩短了训练时间。
  • 可扩展性强:支持数据并行、模型并行和管道并行等多种并行策略,适应不同规模的硬件集群。
  • 易于集成:与PyTorch深度融合,开发者可以在现有代码基础上轻松引入DeepSpeed的优化功能。

选择DeepSpeed,可以在有限的硬件资源下实现更高效的模型训练,加速科研和应用的落地。

背景和动机

在人工智能领域,模型的规模和复杂度正呈指数级增长。从自然语言处理的大规模预训练模型到计算机视觉中的深层神经网络,训练这些模型需要巨大的计算和内存资源。然而,硬件发展的速度远不及模型规模增长的速度,导致训练过程变得异常缓慢且成本高昂。

为了解决这一瓶颈,业界迫切需要新的工具和方法来提高训练效率、降低资源消耗。DeepSpeed正是在这样的背景下诞生的,它为大规模模型的训练提供了高效、可扩展的解决方案,推动了深度学习的进一步发展。

2. DeepSpeed的关键特性

DeepSpeed作为一个高性能的深度学习训练优化库,提供了一系列先进的特性,帮助开发者在训练大规模模型时提高效率、降低资源消耗。以下是DeepSpeed的几个关键特性。

ZeRO(Zero Redundancy Optimizer)优化器

什么是ZeRO优化器?

ZeRO(Zero Redundancy Optimizer)是一种用于大规模分布式深度学习的优化技术,旨在消除数据并行训练中的冗余内存开销。传统的数据并行方法会在每个设备上保存完整的模型参数、梯度和优化器状态,这导致了巨大的内存消耗。ZeRO通过将这些组件在多个设备之间进行分片,从而极大地降低了单个设备的内存需求。

ZeRO的三个阶段

  • ZeRO Stage 1(优化器状态分片):在第一阶段中,优化器状态被分片到不同的设备上,而模型参数和梯度仍然是完整的。这减少了与优化器状态相关的内存开销。

  • ZeRO Stage 2(梯度分片):第二阶段在第一阶段的基础上,进一步将梯度进行分片。这样,除了优化器状态,梯度也被分布到各个设备上,进一步降低内存使用。

  • ZeRO Stage 3(参数分片):在第三阶段,模型参数也被分片。这意味着优化器状态、梯度和模型参数都在设备之间分布,实现了最大的内存节省。

ZeRO的优势

  • 大幅降低内存占用:通过分片技术,ZeRO允许在单个GPU上训练更大的模型。

  • 提高计算效率:内存的节省使得更多的计算资源可以用于实际的训练过程,提高了效率。

  • 灵活的并行策略:ZeRO可以与数据并行、模型并行和流水线并行等多种并行方式结合,适应不同的硬件架构。

DeepSpeed推理引擎

高性能推理

DeepSpeed不仅在训练阶段提供了优化方案,还针对推理阶段开发了高性能的推理引擎。该引擎旨在最大化模型的推理速度和效率,特别是在大规模模型的部署中。

主要特性

  • 内存优化:通过高效的内存管理和分片技术,减少了模型在推理阶段的内存占用。

  • 计算优化:利用算子融合、张量并行等技术,提升了计算效率。

  • 支持混合精度:推理引擎支持FP16、BF16等混合精度运算,提高了吞吐量。

  • 并行化推理:支持数据并行和模型并行,使得大型模型的推理成为可能。

应用场景

  • 实时应用:如实时翻译、语音识别,需要低延迟的推理性能。

  • 大规模服务:在需要高吞吐量的场景下,如搜索引擎、推荐系统。

  • 资源受限环境:如移动设备或边缘计算,需要高效的内存和计算优化。

稀疏注意力机制

背景介绍

Transformer模型中的自注意力机制在处理长序列时,会带来O(N^2)的计算复杂度和内存需求。这限制了模型在长序列任务中的应用,如长文本生成、DNA序列分析等。

稀疏注意力的解决方案

DeepSpeed通过引入稀疏注意力机制,降低了自注意力的计算和内存开销。稀疏注意力通过仅计算序列中一部分位置的相关性,避免了全局自注意力的高成本。

实现方式

  • 局部注意力:只计算相邻位置之间的注意力,适用于具有局部依赖性的序列。

  • 分块处理:将序列划分为多个块,块内进行全连接的注意力计算,块间的计算则被简化。

  • 基于模式的稀疏性:预定义稀疏模式,如Strided、Random等,以确保在降低计算量的同时,仍能捕获全局信息。

优势

  • 降低复杂度:计算复杂度从O(N^2)降至O(NlogN)甚至O(N)。

  • 支持长序列:可以处理数千甚至数万长度的序列。

  • 性能保持:在许多任务上,稀疏注意力的性能与全连接注意力相当。

1-bit Adam和1-bit LAMB优化器

通信瓶颈

在分布式训练中,参数和梯度的同步需要大量的通信带宽,尤其是在多节点环境下。这会成为扩展训练规模的主要瓶颈。

1-bit Adam和1-bit LAMB的原理

  • 梯度压缩:将梯度从32位浮点数压缩为1位表示,只保留梯度的符号。

  • 误差补偿:在压缩过程中引入误差补偿机制,累积被舍弃的误差,确保模型的收敛性。

  • 适用于大规模模型:1-bit Adam适用于需要Adam优化器的模型,1-bit LAMB则适用于需要LAMB优化器的大规模模型,如BERT。

优势

  • 减少通信量:通信数据量减少至原来的1/32,大幅降低通信开销。

  • 保持精度:通过误差补偿,模型的精度与未压缩的训练方式相当。

  • 提升可扩展性:使得大规模分布式训练在通信受限的环境下成为可能。

自定义训练和推理优化

灵活的配置选项

DeepSpeed提供了高度可配置的训练和推理选项,允许用户根据特定的模型和硬件环境进行优化。

支持多种并行模式

  • 数据并行:默认的并行方式,简单易用。

  • 模型并行:将模型的不同部分分配到不同的设备上,适用于超大模型。

  • 流水线并行:将模型划分为多个阶段,依次在不同设备上执行,提升设备利用率。

混合精度和量化支持

  • 混合精度训练:支持FP16和BF16,可以在保证精度的同时提升计算效率。

  • 量化感知训练:支持低比特量化,如INT8,进一步加速模型训练和推理。

插件式架构

  • 自定义优化器:可以集成自定义的优化器,以满足特殊需求。

  • 扩展性强:社区和用户可以开发插件,扩展DeepSpeed的功能。

优势

  • 满足多样化需求:适用于从小型模型到超大规模模型的各种场景。

  • 易于集成和部署:与主流深度学习框架兼容,支持主流的硬件平台。

  • 持续更新和支持:活跃的社区和开发团队,提供及时的更新和技术支持。

3. 环境搭建与安装

在开始使用DeepSpeed之前,您需要确保您的开发环境满足一定的要求,并按照正确的步骤进行安装和配置。以下将详细介绍DeepSpeed的系统要求、安装步骤和配置指南。

系统要求

操作系统

  • Linux:DeepSpeed主要在Linux环境下开发和测试,推荐使用Ubuntu 18.04或更高版本。
  • Windows和macOS:虽然DeepSpeed可能在这些系统上运行,但官方主要支持Linux。

Python版本

  • Python 3.6及以上:确保安装了Python 3.6或更高版本。

PyTorch版本

  • PyTorch 1.5及以上:DeepSpeed与PyTorch深度集成,需提前安装兼容的PyTorch版本。
  • CUDA支持:如果需要使用GPU加速,需安装支持CUDA的PyTorch版本。

CUDA和NCCL

  • CUDA Toolkit:建议安装CUDA 10.1或更高版本。
  • NCCL库:用于多GPU通信,通常与CUDA一起安装。

硬件要求

  • GPU:NVIDIA GPU,支持CUDA,显存容量取决于模型大小。
  • 内存:充足的系统内存,有助于大型模型的训练。

其他依赖

  • MPI库(可选):用于多节点分布式训练,如OpenMPI或MPICH。
  • GCC编译器:用于编译DeepSpeed中的CUDA扩展,建议GCC 5.4.0及以上版本。

安装步骤

以下是安装DeepSpeed的详细步骤:

1. 安装Python和PyTorch

确保已经安装了兼容的Python和PyTorch版本。可以使用pipconda进行安装:

# 使用pip安装PyTorch(以CUDA 11.7为例)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117

2. 安装CUDA和NCCL

  • CUDA Toolkit:从NVIDIA官网下载并安装适用于您系统的CUDA Toolkit。
  • NCCL:通常与CUDA一起安装,或从NVIDIA NCCL官网获取。

3. 安装DeepSpeed

使用pip安装最新版本的DeepSpeed:

pip install deepspeed

如果需要安装特定版本,或者需要源代码安装,可以使用以下方法:

  • 安装指定版本

    pip install deepspeed==0.9.5
    
  • 从源码安装

    git clone https://github.com/microsoft/DeepSpeed.git
    cd DeepSpeed
    pip install .
    

4. 验证安装

运行以下命令,验证DeepSpeed是否安装成功:

deepspeed --version

如果显示DeepSpeed的版本信息,说明安装成功。

配置指南

DeepSpeed需要一些配置来启用特定的优化功能,主要通过配置文件和命令行参数进行。

1. DeepSpeed配置文件

DeepSpeed使用JSON格式的配置文件,定义了训练过程中的各种优化选项。以下是一个示例配置文件deepspeed_config.json

{"train_batch_size": 64,"gradient_accumulation_steps": 2,"fp16": {"enabled": true},"zero_optimization": {"stage": 2}
}
  • train_batch_size:全局训练批次大小。
  • gradient_accumulation_steps:梯度累积步数。
  • fp16:启用混合精度训练。
  • zero_optimization:配置ZeRO优化器的阶段。

2. 在脚本中集成DeepSpeed

在您的训练脚本中,需要做以下修改:

导入DeepSpeed
import deepspeed
修改模型和优化器的初始化
# 假设已有模型model和优化器optimizermodel_engine, optimizer, _, _ = deepspeed.initialize(args=args,model=model,model_parameters=model.parameters(),config="deepspeed_config.json"
)
  • args:包含命令行参数的对象,需要包含local_rank信息。
  • model_engine:DeepSpeed包装后的模型对象,用于替代原始的model
修改训练循环

使用model_engine代替原始的模型对象:

for data in dataloader:inputs, labels = dataoutputs = model_engine(inputs)loss = loss_fn(outputs, labels)model_engine.backward(loss)model_engine.step()

3. 使用命令行参数

在运行训练脚本时,需要通过DeepSpeed启动,并指定配置文件:

deepspeed --num_gpus=4 train.py --deepspeed deepspeed_config.json
  • –num_gpus:指定使用的GPU数量。
  • train.py:您的训练脚本。
  • –deepspeed:指定DeepSpeed的配置文件。

4. 配置优化选项

您可以在配置文件中启用或调整DeepSpeed的各种优化功能:

  • ZeRO优化器

    "zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true},"overlap_comm": true,"contiguous_gradients": true
    }
    
  • 混合精度训练

    "fp16": {"enabled": true,"loss_scale": 0,"loss_scale_window": 1000,"hysteresis": 2,"min_loss_scale": 1
    }
    
  • 梯度检查点

    "gradient_checkpointing": {"partition_activations": true,"contiguous_memory_optimization": true
    }
    

5. 其他配置选项

  • 学习率调度器:在配置文件中添加scheduler字段,指定学习率策略。
  • 日志和监控:配置wall_clock_breakdown等选项,启用详细的性能日志。

6. 注意事项

  • 版本兼容性:确保DeepSpeed版本与PyTorch和CUDA版本兼容。
  • 环境变量:在多节点训练中,可能需要配置MPI相关的环境变量。
  • 调试信息:在遇到问题时,可以启用DeepSpeed的调试选项,获取更多日志信息。

4. 快速入门

在完成环境搭建和安装后,您可能迫不及待地想要体验DeepSpeed带来的性能提升。本节将通过基本使用示例,帮助您快速上手,并介绍如何将DeepSpeed与PyTorch集成。

基本使用示例

以下将以一个简单的训练脚本为例,展示如何使用DeepSpeed来加速模型训练。

步骤1:准备训练脚本

假设您有一个使用PyTorch编写的训练脚本train.py,其中定义了模型、数据集和训练循环。

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader# 定义简单的模型
class SimpleModel(nn.Module):def __init__(self, input_size, output_size):super(SimpleModel, self).__init__()self.layer = nn.Linear(input_size, output_size)def forward(self, x):return self.layer(x)# 创建数据集和数据加载器
dataset = torch.utils.data.TensorDataset(torch.randn(1000, 10), torch.randn(1000, 1))
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)# 初始化模型、损失函数和优化器
model = SimpleModel(input_size=10, output_size=1)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

步骤2:编写DeepSpeed配置文件

创建一个名为deepspeed_config.json的配置文件,内容如下:

{"train_batch_size": 64,"gradient_accumulation_steps": 2,"fp16": {"enabled": true},"zero_optimization": {"stage": 1}
}

步骤3:修改训练脚本以集成DeepSpeed

导入DeepSpeed库
import deepspeed
初始化DeepSpeed

在训练脚本中,使用DeepSpeed的initialize函数来包装模型和优化器。

# 添加参数解析,用于DeepSpeed
import argparseparser = argparse.ArgumentParser()
parser = deepspeed.add_config_arguments(parser)
args = parser.parse_args()# 初始化DeepSpeed
model_engine, optimizer, _, _ = deepspeed.initialize(args=args,model=model,model_parameters=model.parameters(),config="deepspeed_config.json"
)
修改训练循环

使用model_engine替换原有的model,并使用DeepSpeed的优化步骤。

for epoch in range(num_epochs):for batch_idx, (inputs, targets) in enumerate(dataloader):outputs = model_engine(inputs)loss = criterion(outputs, targets)model_engine.backward(loss)model_engine.step()

步骤4:运行训练脚本

使用DeepSpeed命令运行训练脚本:

deepspeed train.py --deepspeed deepspeed_config.json

这样,您的模型训练就集成了DeepSpeed的优化功能。

与PyTorch的集成

DeepSpeed与PyTorch深度融合,允许您在现有的PyTorch代码基础上,轻松引入DeepSpeed的优化特性。

1. 深度融合的优势

  • 最小的代码修改:只需对原有的PyTorch代码进行少量修改,即可集成DeepSpeed。
  • 兼容PyTorch生态系统:支持PyTorch的所有特性,包括自定义模型、数据集和训练逻辑。
  • 灵活性:可以根据需要启用或禁用DeepSpeed的特性,如混合精度训练、ZeRO优化等。

2. 详细的集成步骤

以下是将DeepSpeed与PyTorch集成的详细步骤:

步骤1:添加DeepSpeed的命令行参数

DeepSpeed使用argparse来解析命令行参数,您需要在脚本中添加以下代码:

import argparse
import deepspeedparser = argparse.ArgumentParser(description='DeepSpeed-PyTorch Training')
parser = deepspeed.add_config_arguments(parser)
args = parser.parse_args()
步骤2:使用DeepSpeed初始化模型和优化器
model_engine, optimizer, _, _ = deepspeed.initialize(args=args,model=model,model_parameters=model.parameters(),config="deepspeed_config.json"
)
  • model_engine:DeepSpeed包装后的模型对象。
  • optimizer:DeepSpeed管理的优化器。
步骤3:替换训练循环中的模型和优化器

将训练循环中的model替换为model_engine,并使用model_engine.backward()model_engine.step()

for epoch in range(num_epochs):for batch_idx, (inputs, targets) in enumerate(dataloader):inputs = inputs.to(model_engine.local_rank)targets = targets.to(model_engine.local_rank)outputs = model_engine(inputs)loss = criterion(outputs, targets)model_engine.backward(loss)model_engine.step()
步骤4:处理数据并行和设备分配

DeepSpeed会自动处理数据并行和设备分配,但在某些情况下,您可能需要手动指定设备:

inputs = inputs.to(model_engine.device)
targets = targets.to(model_engine.device)
步骤5:保存和加载模型

使用DeepSpeed的模型保存和加载功能:

# 保存模型
model_engine.save_checkpoint(save_dir)# 加载模型
model_engine.load_checkpoint(load_dir)

3. 注意事项

  • 优化器:DeepSpeed会自动创建或包装优化器,您无需手动调用optimizer.step()
  • 学习率调度器:如果使用学习率调度器,需要确保与DeepSpeed兼容。
  • 混合精度:当启用FP16时,损失函数的计算和梯度回传都由DeepSpeed处理。

4. 与PyTorch Lightning的集成(可选)

如果您使用PyTorch Lightning,可以通过DeepSpeed的插件进行集成:

from pytorch_lightning import Trainer
from pytorch_lightning.plugins import DeepSpeedPlugin# 创建DeepSpeed插件
deepspeed_plugin = DeepSpeedPlugin(config="deepspeed_config.json")# 初始化Trainer
trainer = Trainer(plugins=[deepspeed_plugin],gpus=4,precision=16
)# 开始训练
trainer.fit(model)

5. DeepSpeed优化技术详解

DeepSpeed作为一个高性能的深度学习优化库,提供了多种先进的技术来提高大规模模型的训练效率。本节将详细介绍这些优化技术,包括ZeRO优化器的各个阶段、内存优化策略、计算加速方法以及通信效率提升。

ZeRO优化器的阶段和使用

背景介绍

在深度学习中,随着模型参数规模的不断扩大,传统的数据并行训练方法已难以满足大规模模型的训练需求。这是因为在数据并行中,每个GPU都需要保存一份完整的模型参数、梯度和优化器状态,这导致了显存的严重浪费。

ZeRO优化器概述

ZeRO(Zero Redundancy Optimizer)是一种创新的并行优化技术,旨在消除数据并行训练中的冗余内存开销。它通过在多个GPU之间分摊模型参数、梯度和优化器状态,极大地降低了单个设备的内存需求,使得训练上百亿甚至上万亿参数的模型成为可能。

ZeRO的三个阶段

ZeRO优化器分为三个阶段,每个阶段都在前一阶段的基础上进一步减少内存消耗:

  1. ZeRO Stage 1:优化器状态分片

    • 原理:将优化器状态(如Adam优化器中的一阶和二阶矩)在不同的GPU之间分片,每个GPU只保存自己负责的部分。
    • 效果:减少与优化器状态相关的内存占用,但模型参数和梯度仍在每个GPU上完整保存。
  2. ZeRO Stage 2:梯度分片

    • 原理:在Stage 1的基础上,将梯度也在GPU之间进行分片。
    • 效果:进一步减少内存消耗,每个GPU只需保存部分梯度。
  3. ZeRO Stage 3:参数分片

    • 原理:在前两个阶段的基础上,将模型参数也在GPU之间分片。
    • 效果:实现最大程度的内存节省,每个GPU只需保存自己负责的参数、梯度和优化器状态。

ZeRO的使用方法

要在DeepSpeed中使用ZeRO优化器,需要在配置文件中指定相应的阶段和设置。以下是一个示例配置:

{"zero_optimization": {"stage": 2,"offload_optimizer": {"device": "cpu","pin_memory": true},"overlap_comm": true,"contiguous_gradients": true}
}
  • stage:指定ZeRO的阶段(1、2或3)。
  • offload_optimizer:可选,将优化器状态卸载到CPU或NVMe以节省显存。
  • overlap_comm:启用通信与计算的重叠,提高训练效率。
  • contiguous_gradients:优化梯度的内存布局。

示例代码

import deepspeed# DeepSpeed配置
ds_config = {"train_batch_size": 64,"fp16": {"enabled": True},"zero_optimization": {"stage": 2}
}# 初始化DeepSpeed
model_engine, optimizer, _, _ = deepspeed.initialize(model=model,model_parameters=model.parameters(),config=ds_config
)

ZeRO的优势

  • 显著降低内存占用:使得在单个GPU上训练更大的模型成为可能。
  • 提高计算效率:允许使用更大的批次大小,提高GPU利用率。
  • 灵活性强:可以根据硬件资源选择合适的ZeRO阶段。

内存优化策略

除了ZeRO优化器,DeepSpeed还提供了其他内存优化策略,帮助进一步降低内存消耗。

1. 混合精度训练

  • 原理:使用半精度(FP16)或混合精度(BF16)来表示模型参数和计算,从而减少内存占用和加速计算。

  • 配置示例

    "fp16": {"enabled": true,"loss_scale": 0
    }
    

2. 梯度检查点(Gradient Checkpointing)

  • 原理:在前向传播时有选择地保存部分激活值,减少内存占用;在反向传播时重新计算这些激活值。

  • 配置示例

    "activation_checkpointing": {"partition_activations": true,"contiguous_memory_optimization": true
    }
    

3. 优化器状态卸载

  • 原理:将优化器状态从GPU内存卸载到CPU内存或NVMe存储。

  • 配置示例

    "zero_optimization": {"offload_optimizer": {"device": "cpu","pin_memory": true}
    }
    

4. 动态张量内存调度

  • 原理:智能地分配和释放张量内存,避免内存碎片和浪费。

5. 参数高效化技术

  • 参数共享:在模型中共享某些层的参数,减少总体参数数量。
  • 模型剪枝:移除对模型性能影响较小的参数。

计算加速方法

DeepSpeed通过多种技术手段加速计算,提高训练速度。

1. 混合精度训练

  • 优势:利用半精度计算的速度优势,提高训练吞吐量。
  • 硬件支持:充分利用NVIDIA Tensor Cores等硬件特性。

2. 操作融合(Operator Fusion)

  • 原理:将多个计算操作融合为一个核函数,减少内存访问和调度开销。
  • 实现:DeepSpeed提供了自定义的CUDA内核,实现常见操作的融合。

3. 稀疏注意力机制

  • 原理:在Transformer模型中,仅计算部分位置的注意力,降低计算复杂度。
  • 优势:支持处理更长的序列输入,计算复杂度从O(N^2)降至O(NlogN)或O(N)。

4. 高效CUDA内核

  • Layer Normalization:优化的LayerNorm实现。
  • Softmax:高性能的Softmax计算。
  • GEMM:优化的矩阵乘法。

5. 通信与计算重叠

  • 原理:在GPU执行计算的同时,进行通信操作,最大化资源利用率。

  • 配置

    "zero_optimization": {"overlap_comm": true
    }
    

通信效率提升

在分布式训练中,通信效率对整体性能有重大影响。DeepSpeed通过以下方式提升通信效率:

1. 1-bit Adam和1-bit LAMB优化器

  • 原理:对梯度进行1位量化压缩,并通过误差补偿机制保持精度。
  • 优势:将通信数据量减少到原来的1/32,大幅降低通信开销。

2. 通信与计算重叠

  • 原理:将通信操作与计算任务并行执行,减少等待时间。

3. 高效通信库

  • NCCL:使用NVIDIA的NCCL库实现高性能的GPU间通信。
  • MPI:在多节点环境中使用MPI库优化通信。

4. 优化的AllReduce算法

  • 原理:针对特定网络拓扑和带宽,优化AllReduce操作,减少通信延迟。

5. 通信压缩技术

  • 量化:将通信数据进行量化,降低数据量。
  • 稀疏化:仅传输重要的梯度信息。

6. 混合并行策略

  • 数据并行:将数据划分到不同的GPU上。
  • 模型并行:将模型参数划分到不同的GPU上。
  • 流水线并行:将模型分为不同的阶段,流水线式地在不同GPU上执行。

7. 分层通信策略

  • 原理:根据集群的网络结构,采用分层次的通信策略,优化节点间和GPU间的通信。

6. 模型训练与调优

在深度学习领域,模型的规模和复杂度正以惊人的速度增长。训练和调优这些大规模模型需要先进的技术和工具。DeepSpeed提供了一系列功能,帮助开发者应对训练大规模模型的挑战,包括混合精度训练、梯度检查点以及管道并行和模型并行技术。

训练大规模模型

挑战

  • 内存限制:大型模型需要巨大的显存容量,单个GPU无法满足需求。
  • 计算资源:训练时间长,需要大量的计算能力。
  • 通信开销:在分布式训练中,设备间的通信可能成为瓶颈。
  • 优化难度:需要精细的超参数调节和优化策略。

DeepSpeed的解决方案

  • ZeRO优化器:通过参数、梯度和优化器状态的分片,降低内存占用。
  • 并行技术:支持数据并行、模型并行、管道并行和混合并行。
  • 高效通信:优化了通信算法,减少了通信开销。
  • 自动调优:提供了工具和方法,简化了超参数调节过程。

实践指南

  1. 配置ZeRO Stage 3:在DeepSpeed配置文件中启用ZeRO Stage 3,实现参数分片。

    {"zero_optimization": {"stage": 3}
    }
    
  2. 使用并行技术:根据模型和硬件资源,选择合适的并行策略。

  3. 启用混合精度训练:降低内存和计算需求。

  4. 调整批次大小和学习率:根据实际情况,调整这些超参数以获得最佳性能。

混合精度训练(FP16、BF16)

背景

混合精度训练通过在模型训练中使用16位浮点数(FP16)或16位脑浮点数(BF16)来代替32位浮点数(FP32),以减少内存占用和提高计算速度。

优势

  • 内存节省:参数和激活值占用的内存减少一半。
  • 计算加速:现代GPU(如NVIDIA的Tensor Cores)对FP16有专门的优化。
  • 训练效率提高:更大的批次大小和更快的训练速度。

DeepSpeed的实现

在DeepSpeed中,启用混合精度训练非常简单,只需在配置文件中设置:

{"fp16": {"enabled": true,"loss_scale": 0}
}
  • enabled:启用混合精度训练。
  • loss_scale:损失缩放策略,0表示使用DeepSpeed的自动损失缩放。

BF16的支持

BF16具有与FP32相同的指数范围,但精度较低,适用于需要更高数值稳定性的场景。在支持BF16的硬件上(如NVIDIA A100 GPU),可以启用BF16训练:

{"bf16": {"enabled": true}
}

注意事项

  • 硬件支持:确保GPU支持FP16或BF16运算。
  • 数值稳定性:混合精度可能引入数值稳定性问题,使用自动损失缩放可以缓解。

实践示例

import deepspeed# DeepSpeed配置
ds_config = {"train_batch_size": 64,"fp16": {"enabled": True,"loss_scale": 0}
}# 初始化DeepSpeed
model_engine, optimizer, _, _ = deepspeed.initialize(model=model,model_parameters=model.parameters(),config=ds_config
)

梯度检查点(Gradient Checkpointing)

背景

深度神经网络的训练需要在前向传播中存储大量的激活值,以供反向传播使用。这些激活值占用了大量内存,特别是在深层模型中。

原理

梯度检查点通过在前向传播中有选择地保存部分激活值,其余的激活值在反向传播中重新计算。这种方法可以显著减少内存占用。

DeepSpeed的实现

在DeepSpeed中,启用梯度检查点需要在配置文件和代码中进行设置。

配置文件
{"activation_checkpointing": {"partition_activations": true,"contiguous_memory_optimization": true}
}
  • partition_activations:将激活值在多个GPU间分割。
  • contiguous_memory_optimization:优化内存布局。
代码中使用

需要对模型的部分进行修改,使用DeepSpeed的checkpointing函数。

from deepspeed.runtime.activation_checkpointing import checkpointdef forward(self, x):x = checkpoint(self.layer1, x)x = checkpoint(self.layer2, x)x = self.layer3(x)return x

优势

  • 内存节省:减少激活值的内存占用。
  • 训练更大模型:在有限的硬件资源下训练更深的模型。

代价

  • 计算开销增加:反向传播时需要重新计算前向激活值。
  • 训练时间:可能略有增加,需要权衡。

管道并行和模型并行技术

背景

当模型规模超出单个GPU的容量时,需要将模型划分到多个GPU上。模型并行和管道并行是两种常用的技术。

模型并行

原理

将模型的参数在多个GPU上分割,每个GPU只存储和计算一部分参数。

实现
  • 张量并行(Tensor Parallelism):将同一层的参数在多个GPU上分割。
  • 层并行(Layer Parallelism):将不同的层分配到不同的GPU。
DeepSpeed的支持

DeepSpeed可以与Megatron-LM等库结合,支持模型并行。

管道并行

原理

将模型分为多个阶段,每个阶段在不同的GPU上运行,形成流水线。

实现
  • 前向流水线:输入数据依次经过各个阶段。
  • 反向流水线:梯度反向传递。
DeepSpeed的实现

在DeepSpeed中,可以启用管道并行:

{"pipeline": {"enabled": true,"stages": 4}
}
  • stages:将模型划分为多少个阶段。

混合并行

可以将数据并行、模型并行和管道并行组合使用,形成混合并行,充分利用硬件资源。

优势

  • 突破内存限制:支持训练超大规模模型。
  • 提高效率:更好地利用多GPU、多节点的计算能力。

注意事项

  • 复杂性增加:实现和调试并行训练较为复杂。
  • 通信开销:并行策略可能增加通信量。

实践建议

  • 合理划分模型:根据模型结构和硬件拓扑,合理划分模型。
  • 优化通信:使用DeepSpeed的通信优化功能,减少通信瓶颈。
  • 测试和验证:在小规模上测试并行策略,确保正确性和性能。

7. DeepSpeed推理加速

推理优化概述

随着深度学习模型规模的不断扩大,推理阶段的计算和内存需求也随之增加。在实际应用中,低延迟和高吞吐量的推理性能对于用户体验和资源利用至关重要。DeepSpeed提供了一系列推理优化技术,旨在加速大规模模型的推理过程,满足高效部署的需求。

DeepSpeed Inference Engine

DeepSpeed推出了专门针对推理阶段的高性能引擎——DeepSpeed Inference Engine。该引擎针对Transformer等大型模型进行了深入优化,主要特点包括:

  • 超大模型支持:能够高效处理数十亿乃至上万亿参数的模型。
  • 高性能计算:利用自定义的CUDA内核和优化算法,提高推理速度。
  • 内存优化:通过参数分片和内存管理技术,降低内存占用。
  • 并行化支持:支持张量并行(Tensor Parallelism)和流水线并行(Pipeline Parallelism),充分利用多GPU的计算能力。
  • 低精度支持:兼容FP16、BF16等混合精度推理,进一步提升性能。

推理优化技术

  1. 张量并行(Tensor Parallelism)

    • 原理:将模型的权重张量在多个GPU之间切分,减少单个GPU的内存负担。
    • 优势:适用于参数规模超大的模型,有效降低推理延迟。
  2. 流水线并行(Pipeline Parallelism)

    • 原理:将模型划分为多个阶段,每个阶段在不同的GPU上执行,形成流水线式的推理过程。
    • 优势:提高GPU利用率,适合处理长序列输入。
  3. 算子融合(Operator Fusion)

    • 原理:将多个连续的算子融合为一个CUDA核函数,减少内存访问和调度开销。
    • 优势:提高计算效率,降低推理时间。
  4. 低精度推理

    • 原理:使用FP16或INT8等低精度数值格式进行推理,减少计算和内存需求。
    • 优势:在几乎不损失精度的情况下,大幅提升推理性能。
  5. 内存高效技术

    • 原理:通过参数分片、激活重计算等方法,优化内存使用。
    • 优势:允许在有限的GPU内存中运行更大的模型。
  6. 自定义CUDA内核

    • 原理:针对特定的计算模式,如自注意力机制,开发高效的CUDA实现。
    • 优势:优化关键路径,进一步提升推理速度。

高效部署与推理示例

在本节中,我们将介绍如何使用DeepSpeed Inference Engine进行高效的模型部署,并提供具体的推理示例。

环境准备

  1. 安装DeepSpeed

    pip install deepspeed
    
  2. 硬件要求

    • GPU:建议使用支持FP16的NVIDIA GPU,如V100、A100等。
    • CUDA和NCCL:确保CUDA和NCCL库已正确安装。
  3. 依赖库

    • PyTorch:版本需与DeepSpeed兼容,建议1.10以上。
    • Transformers(可选):如果使用预训练模型,如GPT-2、BERT等。

推理示例:GPT-2文本生成

以下示例展示了如何使用DeepSpeed加速GPT-2模型的文本生成。

步骤1:加载模型和分词器
import torch
import deepspeed
from transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载预训练的GPT-2模型和分词器
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
步骤2:配置DeepSpeed推理引擎
# DeepSpeed推理配置
ds_inference_config = {"mp_size": 2,  # 张量并行的GPU数量"dtype": torch.float16,  # 使用FP16"replace_method": "auto",  # 自动替换模型中的部分模块"replace_with_kernel_inject": True  # 启用内核注入
}
步骤3:初始化DeepSpeed推理引擎
# 初始化DeepSpeed推理引擎
model = deepspeed.init_inference(model,mp_size=ds_inference_config["mp_size"],dtype=ds_inference_config["dtype"],replace_method=ds_inference_config["replace_method"],replace_with_kernel_inject=ds_inference_config["replace_with_kernel_inject"]
)
步骤4:准备输入并进行推理
# 准备输入文本
input_text = "DeepSpeed is a machine learning framework that"
input_ids = tokenizer.encode(input_text, return_tensors='pt').to('cuda')# 进行推理
with torch.no_grad():outputs = model.generate(input_ids=input_ids,max_length=50,num_return_sequences=1,do_sample=True,temperature=0.7)# 解码并输出结果
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(generated_text)

配置详解

  • mp_size

    • 含义:张量并行的GPU数量。
    • 作用:指定参与并行计算的GPU数量,需与实际可用GPU数匹配。
  • dtype

    • 含义:数据类型,支持torch.float16torch.int8等。
    • 作用:设置推理时使用的精度类型,低精度可提高性能。
  • replace_method

    • 含义:模型替换方法,"auto"表示自动替换。
    • 作用:自动将模型中的部分模块替换为DeepSpeed优化的实现。
  • replace_with_kernel_inject

    • 含义:是否启用内核注入。
    • 作用:使用DeepSpeed自定义的CUDA内核,进一步优化计算。

多GPU并行运行

如果使用多GPU进行张量并行,需要通过torch.distributed.launchdeepspeed命令启动脚本。

deepspeed --num_gpus=2 gpt2_inference.py

性能测试与比较

通过启用DeepSpeed的推理加速,可以观察到:

  • 推理速度提升:相比原始模型,推理时间明显减少。
  • 资源利用率提高:多GPU并行提高了计算资源的利用效率。
  • 内存占用降低:内存优化使得在有限显存下运行更大的模型成为可能。

应用场景

  • 实时应用:如对话系统、实时翻译等需要低延迟的应用。
  • 大规模服务:如搜索引擎、推荐系统,需要高吞吐量的场景。
  • 模型部署:在云端或边缘设备上部署大模型,DeepSpeed的优化可降低硬件要求。

注意事项

  • 版本兼容性:确保PyTorch、Transformers和DeepSpeed版本兼容。
  • 硬件要求:多GPU并行需确保所有GPU规格一致,并正确配置了NCCL通信。
  • 参数调整:根据具体模型和硬件环境,调整配置参数以获得最佳性能。

进一步优化

  • INT8量化推理

    • 原理:使用8位整数进行推理,进一步降低计算和内存需求。
    • 实现:需要额外的量化步骤,DeepSpeed提供了相应的支持。
  • 自定义模型优化

    • 算子级优化:针对模型的特定算子,进行深度优化。
    • 模型剪枝:移除冗余的模型参数,减小模型规模。
  • 批量推理

    • 增加批次大小:在推理时处理多个输入,提升吞吐量。
    • 异步推理:使用异步调用,提高资源利用率。

8. 性能评估与案例分析

DeepSpeed作为一个旨在优化深度学习模型训练和推理性能的库,其效果需要通过实际的性能基准测试和应用案例来验证。本节将介绍DeepSpeed的性能基准测试结果,以及在实际应用中的成功案例,帮助读者更全面地了解DeepSpeed的优势和价值。

性能基准测试

1. 基准测试目标

性能基准测试的主要目标是评估DeepSpeed在以下方面的改进:

  • 训练速度:每秒处理的样本数(Throughput)。
  • 内存占用:模型训练所需的显存和内存资源。
  • 可扩展性:在多GPU、多节点环境下的性能提升。
  • 精度保持:在优化训练速度和内存的同时,模型精度是否保持。

2. 测试环境设置

  • 硬件配置

    • GPU:NVIDIA V100/A100等高性能GPU。
    • CPU:多核高主频CPU。
    • 内存:充足的系统内存,满足大规模模型的需求。
    • 网络:高速互联网络,如InfiniBand,支持多节点通信。
  • 软件配置

    • 操作系统:Ubuntu 18.04或更高版本。
    • CUDA版本:CUDA 11.0或更高,确保与GPU驱动兼容。
    • 深度学习框架:PyTorch 1.10或以上版本。
    • DeepSpeed版本:最新稳定版本。

3. 测试模型和数据集

  • 模型

    • GPT-2、GPT-3等Transformer架构的大规模语言模型。
    • BERT、大规模视觉Transformer(ViT)等。
  • 数据集

    • 自然语言处理:WikiText-103、OpenWebText等。
    • 计算机视觉:ImageNet、COCO等。

4. 基准测试结果

4.1 训练速度提升
  • 单GPU性能:与原生PyTorch相比,使用DeepSpeed在单GPU上训练大规模模型,吞吐量提升约 1.5倍至2倍
  • 多GPU扩展性:在8个GPU上,DeepSpeed实现了接近线性的加速,比原生数据并行的效率高出 20%至30%
4.2 内存占用减少
  • ZeRO Stage 1-3的影响

    • ZeRO Stage 1:内存占用减少约 40%
    • ZeRO Stage 2:内存占用减少约 60%
    • ZeRO Stage 3:内存占用减少超过 80%,使得单GPU能够训练原本无法容纳的超大模型。
4.3 混合精度训练效果
  • 训练速度:启用FP16后,训练速度提升 1.5倍
  • 精度保持:在ImageNet和GLUE等基准测试中,模型精度与FP32训练基本持平,差异在 0.1%以内
4.4 推理性能提升
  • 推理速度:使用DeepSpeed Inference Engine,推理速度比原生PyTorch提高 2倍以上
  • 内存占用:通过张量并行和内存优化,推理时的显存占用降低 50%,支持更大的批次推理。

5. 对比分析

  • 与Megatron-LM的比较

    • 训练效率:DeepSpeed在同等条件下的训练速度略高于Megatron-LM,且更易于配置和使用。
    • 内存优化:ZeRO优化器在内存节省方面具有显著优势。
  • 与Horovod的比较

    • 通信效率:DeepSpeed的通信优化策略使得多节点训练的通信开销更低。
    • 易用性:DeepSpeed集成了更多的优化功能,减少了手动配置的复杂性。

实际应用案例

案例一:微软的Turing-NLG模型

  • 背景:微软开发了当时最大的语言模型Turing-NLG,拥有 1700亿 参数。

  • 挑战:如此大规模的模型训练对计算资源和内存管理提出了极高的要求。

  • 解决方案:使用DeepSpeed的ZeRO优化器和并行技术。

  • 成果

    • 成功训练:借助DeepSpeed,在现有硬件上成功训练了Turing-NLG。
    • 性能提升:训练效率提升了 10倍,内存占用降低了 5倍
    • 应用效果:模型在自然语言生成任务中表现出色,推动了NLP领域的发展。

案例二:OpenAI的GPT-3推理加速

  • 背景:GPT-3作为一个拥有 1750亿 参数的模型,其推理成本和延迟是部署中的主要障碍。

  • 挑战:需要在保证精度的情况下,加速推理并降低资源消耗。

  • 解决方案:使用DeepSpeed Inference Engine进行推理优化。

  • 成果

    • 推理速度提升:相比原生实现,推理速度提升了 2.5倍
    • 内存占用降低:显存需求降低了 40%,使得在单个GPU上进行推理成为可能。
    • 部署成功:在多个实际应用中成功部署了GPT-3模型,提升了用户体验。

案例三:生物信息学中的蛋白质折叠预测

  • 背景:蛋白质结构预测需要处理复杂的生物序列,模型规模和计算复杂度都很高。

  • 挑战:需要训练和推理超大规模的Transformer模型,资源需求巨大。

  • 解决方案:应用DeepSpeed的稀疏注意力机制和内存优化策略。

  • 成果

    • 训练效率提高:训练时间缩短了 50%,加速了研究进展。
    • 模型精度提升:在关键评估指标上取得了更好的结果,推动了蛋白质研究领域的发展。

案例四:电商推荐系统的实时预测

  • 背景:电商平台需要实时分析用户行为,提供个性化的商品推荐。

  • 挑战:需要处理大量的数据,模型需要在低延迟下进行推理。

  • 解决方案:利用DeepSpeed的推理加速和低精度计算。

  • 成果

    • 推理延迟降低:平均响应时间减少了 30%,提高了用户体验。
    • 吞吐量提高:在相同的硬件资源下,处理的请求数量增加了 2倍
    • 资源成本降低:通过优化,减少了服务器数量,降低了运营成本。

案例五:自动驾驶中的感知模型训练

  • 背景:自动驾驶需要高精度的感知模型,处理多模态的传感器数据。

  • 挑战:模型复杂度高,训练数据量大,训练周期长。

  • 解决方案:采用DeepSpeed的混合并行策略和优化器。

  • 成果

    • 训练周期缩短:整体训练时间减少了 40%,加快了模型迭代。
    • 模型性能提升:在目标检测和识别任务中取得了更好的准确率。
    • 团队协作优化:简化了训练流程,提高了团队的开发效率。

9. 最佳实践

在使用DeepSpeed进行大规模深度学习模型的训练和部署时,遵循一些最佳实践可以帮助您充分发挥其性能优势。本节将分享性能优化技巧,并讨论常见问题及其解决方案,助您在实际应用中更高效地使用DeepSpeed。

性能优化技巧

1. 使用最新版本的DeepSpeed和PyTorch

  • 原因:新版本通常包含性能改进、bug修复和新功能。
  • 建议:定期检查并更新到最新稳定版本的DeepSpeed和PyTorch。

2. 合理选择ZeRO优化器的阶段

  • 策略
    • ZeRO Stage 1:适用于内存受限不严重的情况,提供一定的内存节省。
    • ZeRO Stage 2:在内存和通信之间取得平衡,适用于大多数场景。
    • ZeRO Stage 3:最大限度地减少内存占用,但通信开销较大,适用于超大模型。
  • 建议:根据模型规模和硬件资源,选择合适的ZeRO阶段。

3. 利用混合精度训练(FP16、BF16)

  • 优势:减少内存占用,提高计算速度。
  • 注意事项:确保硬件支持,并使用自动损失缩放(Loss Scaling)来保持数值稳定性。
  • 建议:在配置文件中启用fp16bf16,并监控训练过程中的精度变化。

4. 调整批次大小和梯度累积步数

  • 策略
    • 增大批次大小:提高GPU利用率,但可能受限于显存容量。
    • 梯度累积:通过累积小批次的梯度,模拟更大的批次大小。
  • 建议:结合实际情况,调整train_batch_sizegradient_accumulation_steps,以获得最佳性能。

5. 优化学习率和调度器

  • 原因:合适的学习率和调度策略对于模型收敛和性能至关重要。
  • 建议
    • 使用DeepSpeed支持的学习率调度器,如WarmupLRCosineAnnealingLR等。
    • 进行学习率搜索,找到适合您模型的最佳值。

6. 使用梯度检查点减少内存占用

  • 优势:在深度模型中显著降低内存需求。
  • 注意事项:可能增加计算开销,训练时间略有延长。
  • 建议:在配置文件中启用activation_checkpointing,并在模型中适当位置添加检查点。

7. 启用通信与计算重叠

  • 原因:提高多GPU、多节点训练时的效率。
  • 建议:设置overlap_commtrue,使通信与计算同时进行。

8. 优化硬件配置和网络拓扑

  • 策略
    • GPU一致性:确保使用相同型号和规格的GPU。
    • 网络带宽:使用高速互联网络,如InfiniBand,减少通信延迟。
  • 建议:根据模型和并行策略,合理规划硬件资源。

9. 使用DeepSpeed Profiler进行性能分析

  • 优势:定位性能瓶颈,指导优化方向。
  • 建议:启用profiling选项,分析训练过程中的计算和通信开销。

10. 定期监控和调整

  • 原因:模型训练过程复杂,可能受到多种因素影响。
  • 建议:定期检查训练日志和指标,根据需要调整配置和参数。

常见问题及解决方案

问题一:安装过程中的编译错误

  • 可能原因:依赖库版本不兼容,缺少必要的编译器或库。
  • 解决方案
    • 确保安装了兼容版本的CUDA、PyTorch和相关依赖。
    • 检查是否安装了GCC编译器,版本需满足要求。
    • 查看官方文档中的安装指南,按照步骤重新安装。

问题二:PyTorch和CUDA版本不兼容

  • 可能原因:PyTorch版本与CUDA版本不匹配。
  • 解决方案
    • 使用torch.version检查PyTorch和CUDA版本。
    • 从PyTorch官网根据CUDA版本安装对应的PyTorch版本。

问题三:性能未达预期

  • 可能原因:未正确启用DeepSpeed的优化功能,或配置不当。
  • 解决方案
    • 检查配置文件,确保已启用所需的优化选项。
    • 使用DeepSpeed Profiler分析性能瓶颈。
    • 调整批次大小、并行策略和其他参数。

问题四:显存不足导致训练中断

  • 可能原因:模型过大,内存优化策略未充分利用。
  • 解决方案
    • 启用或提升ZeRO优化器的阶段。
    • 使用梯度检查点和混合精度训练。
    • 考虑增加GPU数量或升级硬件。

问题五:训练不收敛或损失值异常

  • 可能原因:学习率不合适,混合精度导致数值不稳定。
  • 解决方案
    • 调整学习率和学习率调度器。
    • 启用自动损失缩放功能。
    • 检查数据预处理和模型实现是否存在问题。

问题六:多节点通信问题

  • 可能原因:NCCL、MPI配置错误,网络环境问题。
  • 解决方案
    • 确保所有节点的环境配置一致。
    • 检查NCCL和MPI的版本和配置。
    • 测试网络连接和带宽,排除硬件故障。

问题七:混合精度训练中的数值溢出或下溢

  • 可能原因:FP16精度不足,导致数值范围超出表示能力。
  • 解决方案
    • 使用自动损失缩放,或手动设置合适的损失缩放值。
    • 考虑使用BF16,如果硬件支持。

问题八:ZeRO优化器配置不当

  • 可能原因:ZeRO阶段选择不合适,参数设置错误。
  • 解决方案
    • 根据实际情况选择合适的ZeRO阶段。
    • 仔细阅读官方文档,正确设置ZeRO相关参数。

问题九:推理阶段的精度下降

  • 可能原因:低精度推理导致精度损失,或优化过程引入误差。
  • 解决方案
    • 评估低精度对模型精度的影响,必要时使用FP32推理。
    • 检查推理引擎的配置,确保参数正确。

问题十:日志和调试信息不足

  • 可能原因:默认日志级别过低,无法获取详细信息。
  • 解决方案
    • 在配置文件中启用详细的日志选项,如wall_clock_breakdown
    • 使用deepspeed命令行参数增加日志级别,如--deepspeed_logging_level=debug

问题十一:自定义模型与DeepSpeed兼容性问题

  • 可能原因:模型中使用了DeepSpeed不支持的算子或模块。
  • 解决方案
    • 检查模型代码,确保兼容性。
    • 如果使用自定义算子,考虑使用deepspeed.ops进行替换或封装。

问题十二:梯度累积导致显存占用过高

  • 可能原因:梯度累积步数过大,导致显存占用增加。
  • 解决方案
    • 适当减少gradient_accumulation_steps
    • 结合批次大小,找到性能和内存占用的平衡点。

问题十三:在分布式环境中随机数不同步

  • 可能原因:未正确设置随机种子,导致不同设备上的随机数不同。
  • 解决方案
    • 在代码中设置固定的随机种子,并确保在所有设备上同步。
    • 使用deepspeed.utils中的工具函数来同步随机状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文学习与撰写】,论文word文档中出现乱码的情况,文档中显示的乱码,都是英文字母之类的,但打印预览是正常的

目录 1、问题 2、解决方法 1、问题 写论文的时候,有时会出现乱码的情况, 如下图,这种情况, 可是 在打印预览的时候,就显示的正常 如下图, 2、解决方法 既然是文档正文显示错误,显示乱码&…

JAVA集合知识总结(六)

文章目录 JAVA集合知识总结(六)Queue1. Queue 接口2. Queue 常用方法3. Queue 的实现类介绍3.1 LinkedList3.2 PriorityQueue3.3 阻塞队列(BlockingQueue)3.4 Deque(双端队列) 4. 应用场景总结 JAVA集合知识总结(六) Queue Queue…

【HarmonyOS NEXT】服务端向终端推送消息——获取Push Token

【需求】 获取Push Token 【文档】 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/push-get-token-V5 【代码】 // EntryAbility.ets 文件 import { pushService } from kit.PushKit; export default class EntryAbility extends UIAbility {onCreat…

vue实现html转化pdf功能,pdf文件可以复制文字

之前使用 html2canvas 和 jsPDF 实现html转pdf,但是客户说不能复制pdf中的文字,要改一下,先说不能复制的方法,再说可以复制的方法 一,html2canvas 和 jsPDF(图片插入pdf不可复制) 创建pdf.js文…

【详解】下载MySql安装教程(帮助数据库下载)

此版本是我下载的版本,其他版本均可以。 1.官网下载相应的版本:MYSQL:8.0.33 https://www.mysql.com/ 2.点击DOWNLOADS进入 3.在上述界面当中往下翻,找到社区版的下载界面 4.点进社区版的界面 前三个是Linux系统下的安装&a…

Mysql索引失效的原因有哪些?

📚 避免索引失效是一种常见的SQL优化 MySQL是一种关系型数据库,它可以通过建立索引来提高查询效率。索引是一种数据结构,它可以让数据库快速地找到满足条件的记录,而不需要扫描整张表。但是,并不是所有的查询都能利用索…

1.centos 镜像

centos 它有官网的下载地址:https://vault.centos.org/ 选择想要的版本,我选择 centos7.8 进入到镜像目录 isos 选择 x86_64 选择想要的版本,我选择 CentOS-7-x86_64-DVD-2003.iso 安装就正常安装就行。我选择虚拟机安装。这个参考&…

git的安装以及入门使用

文章目录 git的安装以及入门使用什么是git?git安装git官网 git初始化配置使用方式初始化配置: git的安装以及入门使用 什么是git? Git 是一个免费开源的分布式版本控制系统,使用特殊的仓库数据库记录文件变化。它记录每个文件的…

⭐ Unity Pico PXR_SDK转场淡入淡出

PXR_ScreenFade 脚本:官方SDK 脚本实现了屏幕的淡入淡出功能,封装了 CloseEyes 和 OpenEyes 方法,可以通过传入 Action 执行淡入淡出完成后的逻辑。 FadeController 脚本: 通过 GetComponent 获取 PXR_ScreenFade 组件&#xff0…

前端开发设计模式——状态模式

目录 一、状态模式的定义和特点 二、状态模式的结构与原理 1.结构: 2.原理: 三、状态模式的实现方式 四、状态模式的使用场景 1.按钮的不同状态: 2.页面加载状态: 3.用户登录状态: 五、状态模式的优点 1.提…

Matplotlib和Seaborn数据可视化

目录 Matplotlib图表绘制 准备工作 折线图line 柱状图bar 水平条形图barh 饼图pie 散点图scatter 气泡图csatter 箱线图boxplot 直方图hist 蜂巢图hexbin Seaborn图表绘制 准备数据 关系散点图scatterplot 关系散点线形图replot 分类散点图stripplot 分类小提…

代码随想录算法训练营第五天| 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表基础课程笔记 1. 什么是哈希表 哈希表(Hash Table)又称为散列表,是一种基于关键码(Key)直接进行访问的数据结构。简单理解,数组其实也是一种哈希表。哈希表通过关键码映射到数组的索引,…

Flink窗口分配器WindowAssigner

前言 Flink 数据流经过 keyBy 分组后,下一步就是 WindowAssigner。 WindowAssigner 定义了 stream 中的元素如何被分发到各个窗口,元素可以被分发到一个或多个窗口中,Flink 内置了常用的窗口分配器,包括:tumbling wi…

前缀和和差分算法

文章目录 一维前缀和一维前缀和概念一维前缀和数组的构建 二维前缀和二维前缀和概念二维前缀和数组的构建 一维差分一维差分概念一维差分数组的构建 二维差分二维差分概念二维差分数组的构建 一维前缀和 一维前缀和概念 一维前缀和是一种常用的数据预处理方法,它能…

JS事件和DOM

1. DOM 1.1 基本概念 DOM,全称 Document Object Model,即文档对象模型。它是 Web 上最常用的 API 之一,是加载在浏览器中的文档模型,可以将文档表示为节点树(或称 DOM 树),其中每个节点代表文…

Docker system

docker system --help siqialiyun-sh-001:~/images$ sudo docker system --helpUsage: docker system COMMANDManage DockerCommands:df Show docker disk usage(显示docker磁盘使用情况)events Get real time events from the server(从服务器获取实时事件)in…

MySQL新手向:对比常用存储引擎

前言 为什么MySQL拥有的存储引擎有那么多,偏偏最常用的是InnoDB呢?带着这个问题,让我们对比几种常用的存储引擎,理解InnoDB的优势吧。 一、MyISAM存储引擎 1.1、MyISAM介绍 先说说MyISAM存储引擎的特点: 不支持事…

【协议】IIC总线协议学习

一、IIC基本介绍 设计I2C的初衷是减少电视机等复杂电子系统内部的布线数量,同时也降低制造成本。通过使用只有两根线的通信总线,它有效地减少了器件间连接的复杂性。 IIC总线是两线制总线,仅有串行数据线SDA和串行时钟线SCL进行通信。减少…

代码笔记:Linux系统上解压文件

zip unzip filename.zip -d /path/to/directorytar.gz tar -xzvf file.tar.gz -x: 表示提取(extract)文件,从压缩包中解压内容。-z: 表示使用 gzip 压缩,.tar.gz 文件是经过 gzip 压缩的 tar 包,因此需要这个选项来处…

存储设备专栏 2.5 -- linux 下块设备信息查看命令 lsblk 详细介绍】

> 请阅读【嵌入式及芯片开发学必备专栏】< 文章目录 lsblk 命令命令结构常用参数示例示例 1&#xff1a;基本用法示例 2&#xff1a;显示文件系统信息示例 3&#xff1a;仅列出磁盘示例 4&#xff1a;指定输出格式示例 5&#xff1a;以 JSON 格式输出 Summary lsblk 命令…