当前位置: 首页 > news >正文

Keras深度学习框架第二十讲:使用KerasCV中的Stable Diffusion进行高性能图像生成

1、绪论

1.1 概念

为便于后文讨论,首先进行相关概念的陈述。

  • Stable Diffusion:Stable Diffusion 是一个在图像生成领域广泛使用的技术,尤其是用于文本到图像的转换。它基于扩散模型(Diffusion
    Models),这是一种深度生成模型,通过逐步去除图像中的噪声来生成新图像。Stable Diffusion
    是一种特定的实现,以其稳定性和高质量的图像生成能力而闻名。

  • KerasCV:Keras 是一个高级神经网络API,能够运行在 TensorFlow、Theano 或 CNTK 之上。KerasCV 是 Keras 的一个扩展库,专注于计算机视觉任务。虽然目前并没有一个官方的 KerasCV 库被广泛接受,但这样的命名通常意味着一个专注于计算机视觉的 Keras 扩展。

  • 高性能图像生成:这指的是使用高效且强大的计算方法来生成高质量的图像。在深度学习和计算机视觉中,高性能通常意味着模型能够在较短时间内处理大量数据,同时保持或提高生成的图像质量。

1.2 本文探讨的范围

本文将展示如何使用KerasCV实现的稳定性.ai的文本到图像模型Stable Diffusion,根据文本提示生成新颖的图像。

Stable Diffusion是一个功能强大、开源的文本到图像生成模型。尽管存在多个开源实现,可以让您轻松地从文本提示创建图像,但KerasCV的实现提供了一些独特优势。这些包括XLA编译和混合精度支持,这两者结合在一起实现了最先进的生成速度。

本文将探索KerasCV的Stable Diffusion实现,展示如何使用这些强大的性能提升,并探索它们提供的性能优势。

注意:如果要在torch后端运行,请在所有地方将jit_compile设置为False。Stable Diffusion的XLA编译目前不适用于torch。

1.3 Stable Diffusion的优缺点

Stable Diffusion 是一种强大的开源文本到图像生成模型,它使用扩散模型(Diffusion Models)来逐步去除图像中的噪声,从而生成新的图像。以下是 Stable Diffusion 的一些主要优点和缺点:

优点:

  • 高质量输出:Stable Diffusion 能够根据文本描述生成高分辨率、逼真的图像,满足各种设计需求。
  • 可控的生成过程:通过调整扩散参数和逆向过程,可以控制生成过程的速度和效果,使用户能够根据自己的需求和偏好生成图像。
  • 广泛的适用性:该模型适用于各种领域,如艺术创作、产品设计、虚拟现实等,为这些领域提供了更多的创意和可能性。
  • 可扩展性:随着深度学习技术的不断进步,Stable Diffusion 的性能和效果有望进一步提升。
  • 高稳定性:Stable Diffusion 通过引入新的稳定性系数来控制模型的稳定性,避免了其他扩散模型中出现的不稳定性问题。
  • 较快的训练速度:通过使用更小的批次大小和更少的步骤来训练模型,Stable Diffusion 提高了训练速度。

缺点:

  • 计算资源需求高:Stable Diffusion 的训练和生成过程需要大量的计算资源和时间,尤其是在生成高分辨率图像时。
  • 超参数调优:Stable Diffusion 的性能和效果可能受到许多超参数的影响,如扩散参数、模型架构等,因此需要进行细致的调优。
  • 牺牲多样性:由于引入了稳定性系数,Stable Diffusion 可能会在一定程度上牺牲生成样本的多样性。
  • 生成样本速度可能较慢:虽然训练速度有所提升,但在生成样本时,Stable Diffusion 的速度可能会相对较慢。

总的来说,Stable Diffusion 是一种功能强大的文本到图像生成模型,具有广泛的应用前景。然而,它也面临一些挑战,如计算资源需求高和需要细致的超参数调优。随着技术的不断发展,这些问题有望得到解决。

1.4 设置

安装

!pip install -q --upgrade keras-cv
!pip install -q --upgrade keras  # Upgrade to Keras 3.

导入

import time
import keras_cv
import keras
import matplotlib.pyplot as plt

2、Stable Diffusion的使用方法

2.1 构建模型

使用类似如下的代码构建模型

model = keras_cv.models.StableDiffusion(img_width=512, img_height=512, jit_compile=False
)

2.2 编辑文本提示

按照以下代码的方式给模型输入文本提示

images = model.text_to_image("photograph of an astronaut riding a horse", batch_size=3)def plot_images(images):plt.figure(figsize=(20, 20))for i in range(len(images)):ax = plt.subplot(1, len(images), i + 1)plt.imshow(images[i])plt.axis("off")plot_images(images)

在这里插入图片描述
下面,我们看一个更复杂的示例

images = model.text_to_image("cute magical flying dog, fantasy art, ""golden color, high quality, highly detailed, elegant, sharp focus, ""concept art, character concepts, digital painting, mystery, adventure",batch_size=3,
)
plot_images(images)

在这里插入图片描述

3、工作原理

Stable Diffusion 并不是基于魔法的,它是一种“潜在扩散模型”。让我们深入了解一下这意味着什么。

程序员可能对超分辨率有所了解:可以通过训练一个深度学习模型来对输入图像进行去噪,从而将其转换为更高分辨率的版本。深度学习模型并不是通过神奇地恢复从嘈杂的低分辨率输入中缺失的信息来实现这一点的——相反,该模型使用其训练数据分布来“想象”出最可能基于输入的视觉细节。要了解更多关于超分辨率的信息,你可以查看以下 Keras.io 教程:

  • 使用高效的子像素卷积神经网络的图像超分辨率
  • 用于单图像超分辨率的增强深度残差网络

当程序员将这个想法推向极致时,可能会开始思考——如果我们只在纯噪声上运行这样的模型会怎样?模型将“对噪声进行去噪”并开始生成一个全新的图像。通过多次重复这个过程,程序员可以将一小块噪声转变为越来越清晰和高分辨率的人造图片。

这2020 年在《High-Resolution Image Synthesis with Latent Diffusion Models》中提出的潜在扩散的关键思想。要深入了解扩散模型,程序员可以查看 Keras.io 上的教程《Denoising Diffusion Implicit Models》。

要将潜在扩散模型转化为文本到图像系统,程序员还需要添加一个关键功能:通过提示关键字控制生成的视觉内容。这是通过“条件化”(conditioning)实现的,这是一种经典的深度学习技术,包括将表示文本的向量与噪声块连接起来,然后在包含 {图像: 描述} 对的数据集上训练模型。

这就产生了 Stable Diffusion 架构。Stable Diffusion 由三部分组成:

  • 文本编码器,将你的提示转换为潜在向量。
  • 扩散模型,反复“去噪”一个 64x64 的潜在图像块。
  • 解码器,将最终的 64x64 潜在块转换为更高分辨率的 512x512 图像。

首先,程序员的文本提示被文本编码器投影到潜在向量空间,这只是一个预训练并固定的语言模型。然后,该提示向量与随机生成的噪声块连接起来,通过一系列的“步骤”被扩散模型反复“去噪”(你运行的步骤越多,图像就越清晰、越漂亮——默认值是 50 步)。

最后,64x64 的潜在图像通过解码器以高分辨率正确渲染。

总的来说,这是一个相当简单的系统——Keras 实现包含在四个文件中,总共不到 500 行代码:

  • text_encoder.py: 87 行代码
  • diffusion_model.py: 181 行代码
  • decoder.py: 86 行代码
  • stable_diffusion.py: 106 行代码

但是,一旦程序员在数十亿张图片及其描述上进行训练,这个相对简单的系统就开始看起来像魔法一样。就像费曼(Feynman)对宇宙的描述:“它并不复杂,只是有很多!”

3.1 KerasCV的Stable Diffusion模型的优点

在多个公开的Stable Diffusion实现中,为什么你应该选择keras_cv.models.StableDiffusion呢?

除了易于使用的API之外,KerasCV的Stable Diffusion模型还带有一些强大的优势,包括:

  • 图模式执行(Graph mode execution):这种方式可以更高效地执行计算图,因为它允许优化和并行化计算。
  • 通过jit_compile=True启用XLA编译:XLA(Accelerated Linear Algebra)是TensorFlow的一个特性,它可以将多个计算步骤融合为一个优化的操作,从而提高执行速度。
  • 支持混合精度计算:混合精度计算允许模型在较低精度的数据类型上运行,如FP16(半精度浮点数),这通常可以提高速度并减少内存消耗,同时保持模型精度。

当这些特性组合在一起时,KerasCV的Stable Diffusion模型运行速度比原始实现快得多。为了进行比较,我们运行了基准测试,比较了HuggingFace的diffusers实现的Stable Diffusion与KerasCV实现的运行时。两个实现的任务都是为每张图像生成3张图像,每张图像的步数为50。在这个基准测试中,我们使用了Tesla T4 GPU。

我们所有的基准测试都是开源的,可以在GitHub上找到,并且可以在Colab上重新运行以重现结果。基准测试的结果如下表所示:

GPU ModelImplementationRuntime (s)
Tesla T4KerasCV (Warm Start)28.97
Tesla T4diffusers (Warm Start)41.33
Tesla V100KerasCV (Warm Start)12.45
Tesla V100diffusers (Warm Start)12.72

在Tesla T4上,执行时间提高了30%!尽管在V100上的提升幅度较小,但我们通常期望在所有的NVIDIA GPU上,基准测试的结果都将一致地偏向于KerasCV。

为了完整性,我们报告了冷启动和热启动的生成时间。冷启动执行时间包括模型创建和编译的一次性成本,因此在生产环境中(在那里你会多次重用相同的模型实例)它是可以忽略的。尽管如此,以下是冷启动的数据:

GPUModelRuntime (Cold Start)
Tesla T4KerasCV83.47s
Tesla T4diffusers46.27s
Tesla V100KerasCV76.43s
Tesla V100diffusers13.90s

注意:每个优化在硬件设置之间的性能提升可能会有很大的差异。

3.2 模型的基准测试方法

为了后续的讨论,我们先来对未优化模型进行基准测试:

benchmark_result = []
start = time.time()
images = model.text_to_image("A cute otter in a rainbow whirlpool holding shells, watercolor",batch_size=3,
)
end = time.time()
benchmark_result.append(["Standard", end - start])
plot_images(images)print(f"Standard model: {(end - start):.2f} seconds")
keras.backend.clear_session()  # Clear session to preserve memory.

在这里插入图片描述

3.3混合精度

“混合精度”是指在计算时使用float16精度,同时将权重存储在float32格式中。这是为了利用现代NVIDIA GPU上float16操作比float32操作具有显著更快内核支持的事实。

在Keras中启用混合精度计算只需调用:

keras.mixed_precision.set_global_policy("mixed_float16")

之后,我们就能够非常简单的使用float16了:

model = keras_cv.models.StableDiffusion(jit_compile=False)print("Compute dtype:", model.diffusion_model.compute_dtype)
print("Variable dtype:",model.diffusion_model.variable_dtype,
)
By using this model checkpoint, you acknowledge that its usage is subject to the terms of the CreativeML Open RAIL-M license at https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE
Compute dtype: float16
Variable dtype: float32

这样,上面构建的模型现在使用混合精度计算;在计算时使用float16操作的速度优势,同时以float32精度存储变量。

# Warm up model to run graph tracing before benchmarking.
model.text_to_image("warming up the model", batch_size=3)start = time.time()
images = model.text_to_image("a cute magical flying dog, fantasy art, ""golden color, high quality, highly detailed, elegant, sharp focus, ""concept art, character concepts, digital painting, mystery, adventure",batch_size=3,
)
end = time.time()
benchmark_result.append(["Mixed Precision", end - start])
plot_images(images)print(f"Mixed precision model: {(end - start):.2f} seconds")
keras.backend.clear_session()

在这里插入图片描述

3.4XLA编译

TensorFlow和JAX内置了XLA(加速线性代数)编译器。keras_cv.models.StableDiffusion原生支持jit_compile参数。将此参数设置为True可以启用XLA编译,从而显著提高速度。

# Set back to the default for benchmarking purposes.
keras.mixed_precision.set_global_policy("float32")model = keras_cv.models.StableDiffusion(jit_compile=True)
# Before we benchmark the model, we run inference once to make sure the TensorFlow
# graph has already been traced.
images = model.text_to_image("An avocado armchair", batch_size=3)
plot_images(images)
y using this model checkpoint, you acknowledge that its usage is subject to the terms of the CreativeML Open RAIL-M license at https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE50/50 ━━━━━━━━━━━━━━━━━━━━ 48s 209ms/step

在这里插入图片描述
XLA对标结果

start = time.time()
images = model.text_to_image("A cute otter in a rainbow whirlpool holding shells, watercolor",batch_size=3,
)
end = time.time()
benchmark_result.append(["XLA", end - start])
plot_images(images)print(f"With XLA: {(end - start):.2f} seconds")
keras.backend.clear_session()
50/50 ━━━━━━━━━━━━━━━━━━━━ 11s 210ms/step
With XLA: 10.63 seconds

在这里插入图片描述
在目标GPU上,XLA实现了2倍的速度提升。

4、总结

在构建高性能的稳定扩散推理流程时,关键在于利用现代计算硬件和软件优化技术来最大化模型的推理速度和效率。以下是构建此类流程时需要考虑的关键点:

  • 硬件选择:选择支持高效浮点运算和并行处理的现代GPU硬件,如NVIDIA的GPU系列。这些GPU通常具有强大的计算能力和优化的硬件加速功能,能够显著提升模型的推理速度。

  • 混合精度计算:利用混合精度计算技术,即在计算过程中使用float16精度,并将权重存储在float32格式中。这种策略能够减少内存占用和计算量,同时保持足够的数值稳定性。在NVIDIA GPU上,float16操作通常比float32操作更快,因此可以显著提高推理速度。

  • XLA编译:启用TensorFlow或JAX中的XLA编译器,将计算图编译成优化的机器代码。XLA编译器能够自动进行各种优化,如循环展开、内联函数和向量化等,从而进一步提高推理性能。

  • 模型优化:对稳定扩散模型进行必要的优化,如剪枝、量化或模型压缩等。这些技术可以减少模型的复杂性和参数量,从而加快推理速度并减少内存占用。

  • 批处理:在可能的情况下,使用批处理来一次性处理多个输入数据。这可以充分利用GPU的并行处理能力,提高推理吞吐量。

  • 数据预处理和后处理:优化数据预处理和后处理流程,确保它们与推理流程相匹配并尽可能高效。例如,使用适当的数据加载器和缓存机制来加速数据读取。

  • 软件优化:利用最新的深度学习框架和库(如TensorFlow、PyTorch或JAX),这些库通常包含了许多针对高性能计算的优化功能。同时,确保你的代码是高效且并发友好的,以便充分利用多核CPU和GPU资源。

  • 监控与调优:在推理流程运行过程中进行性能监控,并使用性能分析工具来识别瓶颈和潜在优化点。根据监控结果进行调整和优化,以实现最佳性能。

综上所述,构建高性能的稳定扩散推理流程需要综合考虑硬件选择、计算精度、编译优化、模型优化、批处理、数据预处理和后处理以及软件优化等多个方面。通过结合这些技术和策略,可以显著提高模型的推理速度和效率,从而在处理大规模图像和视频数据时获得更好的性能。

相关文章:

Keras深度学习框架第二十讲:使用KerasCV中的Stable Diffusion进行高性能图像生成

1、绪论 1.1 概念 为便于后文讨论,首先进行相关概念的陈述。 Stable Diffusion:Stable Diffusion 是一个在图像生成领域广泛使用的技术,尤其是用于文本到图像的转换。它基于扩散模型(Diffusion Models),这…...

C/C++ vector详解

要想了解STL,就必须会看: cplusplus.comhttps://legacy.cplusplus.com/ 官方内容全都是英文的,可以参考: C/C初始识https://blog.csdn.net/2301_77087344/article/details/138596294?spm1001.2014.3001.5501 vector&#xff…...

使用libtorch加载YOLOv8生成的torchscript文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…...

Oracle 并行和 session 数量的

这也就是为什么我们指定parallel为4,而实际并行度为8的原因。 insert create index,发现并行数都是加倍的 Indexes seem always created with parallel degree 1 during import as seen from a sqlfile. The sql file shows content like: CREATE INDE…...

Android 版本与 API level 以及 NDK 版本对应

采用 Android studio 开发 Android app 的时候,需要选择支持的最低 API Level 和使用的 NDK 版本,对应开发 app 的最低 SDK 版本: 在 app 的 build.gradle 文件里,对应于代码如下: 目前各版本的占有率情况如下&#xf…...

护网经验面试题目原版

文章目录 一、护网项目经验1.项目经验**Hvv的分组和流程**有没有遇到过有意思的逻辑漏洞?有没有自己开发过武器/工具?有做过代码审计吗?有0day吗有cve/cnvd吗?有src排名吗?有没有写过技战法有钓鱼经历吗?具…...

ipa 覆盖算法测试

相关文章 ipa 功能包测试 ipa 分区算法 ipa 分区算法总结,部分算法图解 ipa 覆盖算法分析(一) ipa 覆盖算法分析(二) 测试 网上找的地图: fig.1 测试地图 opencv fig.2 opencv 显示的覆盖路径 rviz fi…...

linuxwindows硬件信息midecod和wmic命令

1、命令dmidecode -t实例 1.1命令格式 dmidecode -t [类型代码或名称 ] 指令 1.2获取系统信息 [rootlala docker]# dmidecode -t 1 1.3获取主板信息: [rootshanghai docker]# dmidecode -t 2 1.4获取CPU ID dmidecode -t 4 | grep ID 1.5获取系统序列号 …...

03. SpringBoot 整合 Redis

文章目录 Jedis导入依赖测试连接Jedis 实现事务 SpringBoot 整合 RedisRedisTemplateSpringBoot 整合 Redis 测试RedisTemplate 序列化RedisUtils Jedis Jedis 是 Redis 官方推荐的 Java 连接工具。 导入依赖 </dependencies><dependency><groupId>redis.c…...

01-Linux【准备篇】

一、学Linux的作用&#xff1f; 1.Linux下开发(部署)软件项目 2.Linux运维 二、Linux的强与弱 1.薄弱 个人桌面领域的应用 此领域是传统Linux应用薄弱的环节&#xff0c;近些年随着Ubuntu、fedora等优秀桌面环境的兴起&#xff0c;Linux在个人桌面领域的占有率在慢慢提高…...

在IDEA中配置servlet(maven配置完成的基础下)

在IDEA中配置servlet&#xff08;maven配置完成的基础下&#xff09; 1.先新建一个项目 2.选择尾巴是webapp的&#xff0c;名称自定义 3.点击高级设置&#xff0c;修改组id 点击创建&#xff0c;等待jar包下载完成。在pom.xml中配置以下 <dependency><groupId>ja…...

pyqt6水平布局

效果预览 main_window.ui <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>MainWindow</class><widget class"QMainWindow" name"MainWindow"><property name"geo…...

CLIP论文学习

学习来自B站bryanyzhu...

手把手教大家,怎么查看抖音小店的类目保证金?

大家好&#xff0c;我是喷火龙。 抖音小店的类目保证金也介绍过很多次了&#xff0c;不同的类目有不同的保证金&#xff0c;要想准确的知道自己想做的类目要交多少保证金的话&#xff0c;还是去官网查询比较可靠。 今天&#xff0c;就教大家怎么去查询自己想做的类目要交多少…...

5.24作业

...

Linux之LLVM、Clang、Clang++区别及用法实例(六十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…...

CentOS7 安装 Mysql 5.7:密码查看与修改、更改端口、开机启动

文章目录 下载 MySQL yum包安装MySQL源安装MySQL服务端,需要等待一些时间启动MySQL修改密码方式一&#xff1a;临时密码获取临时密码&#xff0c;MySQL5.7为root用户随机生成了一个密码通过临时密码登录MySQL&#xff0c;进行修改密码操作 方式二&#xff1a;skip-grant-tables…...

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(十三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 我们&#xff0c;继续讲一…...

linux替换文件中的字符串

linux替换文件中的字符串 方法一&#xff1a;使用sed命令进行替换 sed -i s/原字符串/新字符串/g 文件名 ex: sed -i s/2024-04-25%/2024-04-26%/g sql10.sql ex:,"analyzer":"ik_analyzer" 替换为空 sed -i s/,"analyzer":"ik_analyz…...

【前端每日基础】day22——js控制结构

循环语句用于重复执行代码块。 for 循环 常用于需要精确控制循环次数的情况。 for (let i 0; i < 5; i) {console.log("Iteration:", i); }while 循环 当条件为真时重复执行代码块&#xff0c;适用于循环次数不确定但条件明确的情况。 let i 0;while (i <…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比

2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...

关于疲劳分析的各种方法

疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数&#xff0c;可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础&#xff0c;采用雨流法取出一个个相互独立、互不相关的应力循环&…...

git删除本地分支和远程分支

删除本地分支 git branch -d 分支名删除远程分支 git push origin --delete 分支名...

浏览器工作原理01 [#]Chrome架构:仅仅打开了1个页面,为什么有4个进程

引用 浏览器工作原理与实践 Chrome打开一个页面需要启动多少进程&#xff1f;你可以点击Chrome浏览器右上角的“选项”菜单&#xff0c;选择“更多工具”子菜单&#xff0c;点击“任务管理器”&#xff0c;这将打开Chrome的任务管理器的窗口&#xff0c;如下图 和Windows任务管…...