(含代码)利用NVIDIA Triton加速Stable Diffusion XL推理速度
在 NVIDIA AI 推理平台上使用 Stable Diffusion XL 生成令人惊叹的图像
扩散模型正在改变跨行业的创意工作流程。 这些模型通过去噪扩散技术迭代地将随机噪声塑造成人工智能生成的艺术,从而基于简单的文本或图像输入生成令人惊叹的图像。 这可以应用于许多企业用例,例如创建个性化营销内容、为照片中的对象生成富有想象力的背景、设计动态的高质量环境和游戏角色等等。
虽然扩散模型可以成为增强工作流程的有用工具,但大规模部署时模型的计算量可能非常大。 在 CPU 等非专用硬件上生成单批四个图像可能需要几分钟的时间,这可能会阻碍创意流程,并成为许多希望满足严格服务级别协议 (SLA) 的开发人员的障碍。
在这篇文章中,我们将向您展示 NVIDIA AI 推理平台如何通过Stable Diffusion XL (SDXL) 来解决这些挑战。 我们从企业在生产中部署 SDXL 时面临的常见挑战开始,深入探讨由 NVIDIA L4 Tensor Core GPU、NVIDIA TensorRT 和 NVIDIA Triton 推理服务器提供支持的 Google Cloud G2 实例如何帮助缓解这些挑战。 我们介绍了领先的 AI 计算机视觉初创公司 Let’s Enhance 如何在 NVIDIA AI 推理平台和 Google Cloud 上使用 SDXL,使企业只需单击一下即可创建迷人的产品图像。 最后,我们提供了有关如何开始使用 Google Cloud 上的 SDXL 进行经济高效的图像生成的分步教程。
解决 SDXL 生产部署挑战
在生产中部署任何人工智能工作负载都会面临一系列挑战。 其中包括在现有模型服务基础设施中部署模型,通过优化推理请求的批处理来提高吞吐量和延迟,以及使基础设施成本符合预算限制。
然而,由于扩散模型对卷积神经网络的依赖、图像预处理和后处理操作的要求以及严格的企业 SLA 要求,在生产中部署扩散模型的挑战非常突出。
在这篇文章中,我们将深入研究这些方面,并探讨 NVIDIA 全栈推理平台如何帮助缓解这些问题。
利用 GPU 专用Tensor Core
Stable Diffusion 的核心是 U-Net 模型,该模型从噪声图像(一组随机数矩阵)开始。 这些矩阵被切成更小的子矩阵,在其上应用一系列卷积(数学运算),产生精细的、噪音较小的输出。 每个卷积都需要乘法和累加运算。 该去噪过程会迭代多次,直到获得新的、增强的最终图像。
鉴于其计算复杂性,该过程显着受益于特定类型的 GPU 核心,例如 NVIDIA Tensor 核心。 这些专用内核是从头开始构建的,旨在加速矩阵乘法累加运算,从而加快图像生成速度。
NVIDIA 通用 L4 GPU 拥有超过 200 个 Tensor Core,对于希望在生产环境中部署 SDXL 的企业来说是理想的经济高效的 AI 加速器。 企业可以通过 Google Cloud 等云服务提供商访问 L4 GPU,Google Cloud 是第一个通过其 G2 实例在云中提供 L4 GPU 的 CSP。
图像预处理和后处理的自动化
在使用 SDXL 的实际企业应用程序中,该模型是更广泛的 AI 管道的一部分,其中包括其他计算机视觉模型以及预处理和后处理图像编辑步骤。
例如,使用 SDXL 为新产品发布活动创建背景场景可能需要先进行初步的放大预处理步骤,然后再将产品图像输入 SDXL 模型以进行场景生成。 生成的 SDXL 图像输出可能还需要进一步的后处理,例如使用图像升级器升级到更高分辨率,然后才适合在营销活动中使用。
使用功能齐全的 AI 推理模型服务器(例如开源 Triton 推理服务器)可以自动将这些不同的预处理和后处理步骤拼接到简化的 AI 管道中。 这样就无需编写手动代码或在计算环境中来回复制数据,从而引入不必要的延迟并浪费昂贵的计算和网络资源。
通过使用 Triton Inference Server 为 SDXL 模型提供服务,您可以利用模型集成功能,该功能使您能够定义如何使用低代码方法将一个模型的输出作为下一个模型的输入。 您可以选择在 CPU 上运行预处理和后处理步骤,在 GPU 上运行 SDXL 模型,或者选择在 GPU 上运行整个管道以实现超低延迟应用程序。 任一选项均可让您充分灵活地控制 SDXL 管道的端到端延迟。
生产环境的高效扩展
随着越来越多的企业计划将 SDXL 纳入其业务线,有效批处理传入用户请求和最大化 GPU 利用率的挑战变得越来越复杂。 这种复杂性源于需要最大限度地减少延迟以获得积极的用户体验,同时提高吞吐量以降低运营成本。
使用 TensorRT 等开源 GPU 模型优化器,再加上具有并发模型执行和动态批处理功能的推理服务器(如 Triton Inference Server),可以缓解这些挑战。
例如,考虑与其他 TensorFlow 和 PyTorch 图像分类或特征提取 AI 模型并行运行 SDXL 模型的场景,特别是在具有大量传入客户端请求的生产环境中。 在这里,SDXL 模型可以使用 TensorRT 进行编译,从而优化模型以实现低延迟推理。
Triton 推理服务器还可以通过其动态批处理和并发推理功能,有效地批处理和跨模型分发大量传入请求,无论其后端框架如何。 这种方法优化了吞吐量,使企业能够以更少的资源和更低的总拥有成本满足用户需求。
将普通的产品照片变成美丽的营销资产
Let’sEnhance 是一家利用 NVIDIA AI 推理平台的强大功能在生产环境中为 SDXL 提供服务的公司的一个很好的例子。 这家开创性的 AI 初创公司三年多来一直使用 Triton Inference Server 在 NVIDIA Tensor Core GPU 上部署 30 多个 AI 模型。
最近,Let’sEnhance 庆祝其最新产品 AI Photoshoot 的推出,该产品使用 SDXL 模型将普通的产品照片转换为用于电子商务网站和营销活动的美丽视觉资产。
凭借 Triton Inference Server 对各种框架和后端的强大支持,再加上其动态批处理功能集,Let’s Enhance 创始人兼首席技术官 Vlad Pranskevichus 能够将 SDXL 模型无缝集成到现有的 AI 管道中,而 ML 工程团队的参与最少, 腾出时间进行研究和开发工作。
通过成功的概念验证,这家 AI 图像增强初创公司发现,通过将 SDXL 模型迁移到 Google Cloud G2 实例上的 NVIDIA L4 GPU,成本可降低 30%,并概述了到 2024 年中期完成多个管道迁移的路线图。
使用 L4 GPU 和 TensorRT 开始使用 SDXL
在下一部分中,我们将演示如何在 Google Cloud 的 G2 实例上快速部署 TensorRT 优化版本的 SDXL,以获得最佳性价比。 要使用 NVIDIA 驱动程序在 Google Cloud 上启动虚拟机实例,请按照以下步骤操作。
选择以下机器配置选项:
- Machine type: g2-standard-8
- CPU platform: Intel Cascade Lake
- Minimum CPU platform: None
- Display device: Disabled
- GPUs: 1 x NVIDIA L4
g2-standard-8 机器类型配备 1 个 NVIDIA L4 GPU 和 4 个 vCPU。 根据需要多少内存,可以使用更大的机器类型。
选择以下启动磁盘选项,确保选择源映像:
- Type: Balanced persistent disk
- Size: 500 GB
- Zone: us-central1-a
- Labels: None
- In use by: instance-1
- Snapshot schedule: None
- Source image: c0-deeplearning-common-gpu
- Encryption type: Google-managed
- Consistency group: None
Google 深度学习 VM 包含最新的 NVIDIA GPU 库。
VM 实例启动并运行后,在浏览器窗口中选择“连接”、“SSH”、“打开”和“身份验证”。 这会在浏览器窗口中加载 SSH 终端。
按照以下步骤,使用使用 TensorRT 优化的 Stable Diffusion XL 生成图像。
克隆 TensorRT OSS 存储库:
git clone https://github.com/NVIDIA/TensorRT.git -b release/9.2 --single-branchcd TensorRT
安装 nvidia-docker 并启动 PyTorch 容器:
docker run --rm -it --gpus all -v $PWD:/workspace nvcr.io/nvidia/pytorch:24.01-py3 /bin/bash
安装最新的 TensorRT 版本:
python3 -m pip install --upgrade pip
python3 -m pip install --pre --upgrade --extra-index-url https://pypi.nvidia.com tensorrt
安装所需的软件包:
export TRT_OSSPATH=/workspace
export HF_TOKEN=<your_hf_token_to_download_models>
cd $TRT_OSSPATH/demo/Diffusion
pip3 install -r requirements.txt
现在运行TensorRT优化的Stable Diffusion XL模型,提示“装饰艺术,现实”:
python3 demo_txt2img_xl.py "art deco, realistic" --hf-token=$HF_TOKEN --version xl-1.0 --batch-size 1 --build-static-batch --num-warmup-runs 5 --seed 3 --verbose --use-cuda-graph
这会生成一个令人惊叹的图像,可以在notebook中查看:
from IPython.display import display
from PIL import Image
img = Image.open('output/xl_base-fp16-art_deco,_-1-xxxx.png')
display(img)
恭喜! 您已使用经过 TensorRT 优化的 Stable Diffusion XL 生成了示例图像。
为了提高吞吐量,您可以使用更大的机器类型,利用多达 8 个 L4 GPU 并在每个 GPU 上加载模型以实现高效的并行处理。 为了实现更快的推理,您可以调整去噪步骤数、图像分辨率或精度。 例如,将前面示例中的降噪步骤数从 30 减少到 20,可使吞吐量提高 1.5 倍图像/秒。
L4 GPU 具有出色的性价比。 与 NVIDIA A100 Tensor Core GPU 相比,它每美元生成的图像数量增加了 1.4 倍,非常适合成本敏感型应用程序和离线批量图像生成。 然而,相对于 L4,A100 或 H100 是延迟敏感型应用程序的更好选择,生成图像的速度分别快 3.8-7.9 倍。
性能取决于推理过程中的多个因素,包括批量大小、分辨率、去噪步骤和数据精度。 有关进一步优化和配置选项的更多信息,请参阅 /NVIDIA/TensorRT GitHub 存储库中的 DemoDiffusion 示例。
使用 Triton Inference Server 在生产环境中部署 SDXL
以下介绍了如何在 g2-standard-32 机器类型上使用 Triton Inference Server 在生产环境中部署 SDXL 模型。
克隆 Triton 推理服务器教程存储库:
git clone https://github.com/triton-inference-server/tutorials.git -b r24.02 --single-branchcd tutorials/Popular_Models_Guide/StableDiffusion
构建 Triton Inference Server diffusion容器镜像:
./build.sh
在容器映像中运行交互式 shell。 以下命令启动容器并将当前目录挂载为工作空间:
./run.sh
构建Stable Diffusion XL TensorRT 引擎。 这需要几分钟的时间。
./scripts/build_models.sh --model stable_diffusion_xl
完成后,预期输出将如下所示:
diffusion-models|-- stable_diffusion_xl|-- 1| |-- xl-1.0-engine-batch-size-1| |-- xl-1.0-onnx| `-- xl-1.0-pytorch_model`-- config.pbtxt
启动 Triton 推理服务器。 在这个demo中,我们使用EXPLICIT模型控制模式来控制加载哪个Stable Diffusion版本。 有关生产部署的更多信息,请参阅安全部署注意事项。
tritonserver --model-repository diffusion-models --model-control-mode explicit --load-model stable_diffusion_xl
完成后,预期输出将如下所示:
<SNIP>
I0229 20:22:22.912465 1440 server.cc:676]
+---------------------+---------+--------+
| Model | Version | Status |
+---------------------+---------+--------+
| stable_diffusion_xl | 1 | READY |
+---------------------+---------+--------+
<SNIP>/sy
在单独的交互式 shell 中启动一个新容器来运行示例 Triton Inference Server 客户端。 以下命令启动容器并将当前目录挂载为工作空间:
./run.sh
将提示发送到 Stable Diffusion XL:
python3 client.py --model stable_diffusion_xl --prompt "butterfly in new york, 4k, realistic" --save-image
恭喜! 您已成功使用 Triton 部署 SDXL。
使用 Triton Inference Server 进行动态批处理
启动并运行基本的 Triton 推理服务器后,您现在可以增加 max_batch_size
参数以启用动态批处理。
如果 Triton 推理服务器正在运行,请将其停止。 可以通过在交互式 shell 中输入 CTRL-C 来停止服务器。
编辑模型配置文件 ./diffusion-models/stable_diffusion_xl/config.pbtxt
,将批量大小增加到 2:
- 之前:max_batch_size:1
- 之后:max_batch_size:2
重建批量大小为 2 的 TRT 引擎。需要几分钟。
./scripts/build_models.sh --model stable_diffusion_xl
完成后,预期输出将如下所示:
diffusion-models
|-- stable_diffusion_xl|-- 1| |-- xl-1.0-engine-batch-size-2| |-- xl-1.0-onnx| `-- xl-1.0-pytorch_model`-- config.pbtxt
重新启动 Triton 推理服务器:
tritonserver --model-repository diffusion-models --model-control-mode explicit --load-model stable_diffusion_xl
完成后,预期输出将如下所示:
<SNIP>
I0229 20:22:22.912465 1440 server.cc:676]
+---------------------+---------+--------+
| Model | Version | Status |
+---------------------+---------+--------+
| stable_diffusion_xl | 1 | READY |
+---------------------+---------+--------+
<SNIP>
向服务器发送并发请求。 为了使服务器能够动态批处理多个请求,必须有多个客户端并行发送请求。 示例客户端使您能够增加客户端数量以了解动态批处理的优势。
python3 client.py --model stable_diffusion_xl --prompt "butterfly in new york, 4k, realistic" --clients 2 –requests 5
检查服务器日志和指标。 启用动态批处理、并发请求和信息级日志记录后,该示例将打印出有关 TensorRT 引擎的每个请求中包含的提示数量的附加信息。
57291 │ I0229 20:36:23.017339 2146 model.py:184] Client Requests in Batch:2
57292 │ I0229 20:36:23.017428 2146 model.py:185] Prompts in Batch:2
总结
在 NVIDIA AI 推理平台上部署 SDXL 可为企业提供可扩展、可靠且经济高效的解决方案。
TensorRT 和 Triton 推理服务器都可以释放性能并简化生产就绪部署,并作为 NVIDIA AI Enterprise 的一部分包含在 Google Cloud Marketplace 上。 AI Enterprise 提供 NVIDIA 支持服务以及支持 AI 推理的开源容器和框架的企业级稳定性、安全性和可管理性。
企业开发人员还可以选择使用 NVIDIA Picasso(视觉内容定制生成 AI 的代工厂)来训练、微调、优化和推断扩散基础模型。
SDXL 作为 NVIDIA AI 基础模型的一部分并在 NGC 目录中提供。 它提供了易于使用的界面,可直接从浏览器快速尝试 SDXL。
我将在 NVIDIA GTC 大会期间为大家带来免费中文在线解读:
NVIDIA CUDA 最新特性以及生成式 AI 相关内容,包括 Stable Diffusion 模型部署实践,以及介绍用于视觉内容生成的 Edify 模型,点击链接了解详情并注册参会:
https://www.nvidia.cn/gtc-global/session-catalog/?search=WP62435%20WP62832%20WP62400&ncid=ref-dev-945313#/
相关文章:

(含代码)利用NVIDIA Triton加速Stable Diffusion XL推理速度
在 NVIDIA AI 推理平台上使用 Stable Diffusion XL 生成令人惊叹的图像 扩散模型正在改变跨行业的创意工作流程。 这些模型通过去噪扩散技术迭代地将随机噪声塑造成人工智能生成的艺术,从而基于简单的文本或图像输入生成令人惊叹的图像。 这可以应用于许多企业用例&…...

【Spring】学习Spring框架那点小事儿
Spring作者:Rod Johnson Rod Johnson 是一位软件开发人员和作家,他在软件开发领域有着广泛的影响力。他出生于澳大利亚,拥有计算机科学和音乐双学位(能写出有优雅的代码一定有艺术细胞)。 Rod Johnson 在 2002 年出版…...

L2-035 完全二叉树的层序遍历(Python)
L2-035 完全二叉树的层序遍历 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是完美二叉树。对于深度为 D 的,有 N 个结点的二叉树,若其结点对应于相同深度…...
get命令使用提交代码
当你想要通过Git提交代码时,以下是一个详细的案例,包括从创建更改到推送到远程仓库的整个过程: 首先,确保你已经在本地仓库目录中进行了需要的更改。 添加更改到暂存区: git add . 这会将所有更改添加到Git的暂存区&…...

矩阵乘积知识
参考:矩阵点乘【矩阵点乘计算公式】_万动力 矩阵乘 矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义 [1] 。 哈达码积 别名:矩阵点乘&…...

10、设计模式之外观模式(Facade)
一、什么是外观模式 这个大家一定是经常使用的,外观模式(门面模式)是一种结构型设计模式。它提供一个统一的接口,用于访问子系统中的一组接口,隐藏了系统的复杂性。最简单的应用就是,当controller层的逻辑处…...
小程序APP为什么要选择游戏盾SDK防护DDOS
小程序APP为什么要选择游戏盾SDK防护DDOS?在移动互联网高速发展的今天,小程序APP已经成为了人们日常生活中不可或缺的一部分。无论是购物、娱乐还是社交,小程序APP都为我们提供了极大的便利。然而,随着小程序APP的普及,…...

STL之deque容器代码详解
1 基础概念 功能: 双端数组,可以对头端进行插入删除操作。 deque与vector区别: vector对于头部的插入删除效率低,数据量越大,效率越低。 deque相对而言,对头部的插入删除速度回比vector快。 vector访问…...

Liunx文件系统和基础IO
文件系统和基础IO 基础IOc语言基础IO函数当前路径和标准流系统IO系统调用函数重定向FILE文件结构体 在谈缓存区问题理解文件系统初识inode 基础IO c语言基础IO函数 打开与关闭 FILE *fopen(char *filename, const char *mode);选项还可以是 r/w/a 意味着为可读可写打开。 2…...

【Python+Selenium学习系列5】Selenium特殊元素定位之-鼠标悬停操作
前言 Selenium模拟用户在浏览器中的操作,比如点击按钮。在某些场景下,我们需要模拟鼠标悬停的操作,来触发一些隐藏的元素。本文将介绍Python Selenium实现鼠标悬停操作。 鼠标悬停,即当光标与其名称表示的元素重叠时触发的事件&…...

简介:基于 OpenTiny 组件库的 rendereless 无渲染组件架构
在 HAE 自研阶段,我们实现的数据双向绑定、面向对象的 JS 库、配置式开发的注册表等特性,随着前端技术的高速发展现在已经失去存在的意义,但是在 AUI 阶段探索的新思路新架构,经过大量的业务落地验证,再次推动前端领域…...
tcp 连接数上限突破
连接数上限条件 文件句柄的限制 一个tcp连接就需要占用一个文件描述符,一旦文件描述符用完,新的连接就会返回给我们错误是:Can’topen so many files。linux系统出于安全角度的考虑,在多个维度对于可打开的文件描述符进行了限制…...

解决 mmseg/models/decode_heads/mask2former_head.py 中__init__()关键字参数错误
目录 【1 - 问题描述】 【2 - 报错位置检查】 【3 - 问题解决】 【4 - 解决的过程】 【1 - 问题描述】 在mmsegmentation中运行mask2former模型的分割任务遇到报错缺少关键字的错误: TypeError: class Mask2FormerHead in mmseg/models/decode_heads/mask2form…...

如何使用 ArcGIS Pro 分析爆炸波及建筑
假设在某栋建筑内发生了爆炸,需要根据爆炸的范围分析出来波及的建筑,对于这一需求,我们可以通过ArcGIS Pro来实现,这里为大家介绍一下分析的方法,希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载…...

LoadBalancer (本地负载均衡)
1.loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别 Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。 loadbalancer本地负载均衡,在调用微服务接口时候&a…...

每日一题 第一期 洛谷 铺地毯
[NOIP2011 提高组] 铺地毯 https://www.luogu.com.cn/problem/P1003 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 …...

Linux 多线程开发
第三章 Linux 多线程开发 3.1 线程3.1.2 线程操作3.1.2 线程属性 3.2 线程同步3.2.1 互斥量/锁3.2.2 死锁3.2.3 读写锁 3.3 生产者消费者模型3.3.1 条件变量3.3.2 信号量/灯 网络编程系列文章: 第1章 Linux系统编程入门(上) 第1章 Linux系统…...
Android 9.0 关于在系统Launcher3中调用截图api总是返回null的解决方案
1.概述 在9.0的系统rom产品定制化开发中,在Launcher3的开发中,在某些时候需要调用截图接口来进行截屏功能实现,而在Launcher3中发现调用系统截屏接口SurfaceControl.screenshot进行截图的时候始终为null, 获取不到系统当前页面的截屏功能,所以需要找到当前截屏失败的原因然…...
openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程
文章目录 openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程概述笔记实验环境实验备注END openssl3.2 - exp - 用openssl命令行来模拟ECC加解密的全流程 概述 工程中要用到ECC加解密, 先去查了资料. 在网上能查到一些大佬们写的ECC加解密实现(基于openssl API), 不…...

【Linux进阶之路】HTTP协议
文章目录 一、基本概念1.HTTP2.域名3.默认端口号4.URL 二、请求与响应1.抓包工具2.基本框架3.简易实现3.1 HttpServer3.2 HttpRequest3.2.1 version13.2.2 version23.2.3 version3 总结尾序 一、基本概念 常见的应用层协议: HTTPS (HyperText Transfer Protocol Sec…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...