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

大型语言模型在AMD GPU上的推理优化

Large language model inference optimizations on AMD GPUs — ROCm Blogs

大型语言模型(LLMs)已经改变了自然语言处理和理解,促进了在多个领域中的众多人工智能应用。LLMs在包括AI助手、聊天机器人、编程、游戏、学习、搜索和推荐系统在内的多个领域具有各种有前景的用例。这些应用利用LLMs的能力提供个性化和互动的体验,增强了用户的参与度。

LLMs使用变换器架构来解决梯度消失和爆炸的问题。该架构允许轻松并行化自我关注,使其能够有效地利用多个GPU。其他架构,如递归神经网络(RNN)及其变体(例如LSTM和GRU),在处理长单词序列时存在困难。

尽管具有令人印象深刻的能力,但像GPT和Llama这样的LLMs在用于商业应用之前需要积极的优化,由于它们的大参数规模和自回归顺序处理行为。已经做了许多努力,通过使用GPU的计算容量(TFLOPs)和内存带宽(GB/s)来提高LLMs的吞吐量、延迟和内存占用。

我们将通过比较AMD的MI250和MI210 GPU上的Llama-2-7B和Llama-2-70B模型的性能指标来讨论这些优化技术。

模型特点:Llama2-7b和Llama2-70b

Llama2-7b和70b模型能够处理32,000个词汇。这些模型可以处理最大长度为4,096个令牌序列。Llama2通过采用以下新特征优化了其训练和推理性能:
• *Sigmoid线性单元(SiLU)激活*:替换了常用的线性整流单元(ReLU),以减少消失的梯度问题,实现更平滑的激活。
• *旋转位置嵌入*:减少了经典绝对位置嵌入层的计算成本,同时保持了令牌序列的位置信息。
• *预归一化*:LlamaRMSNorm模块归一化了*输入*而不是*输出*,这减少了梯度消失和爆炸问题。

在Llama-2-7b模型中,自我关注模块中有32个注意力头;每个头有128维。多层感知器(MLP)模块的中间大小有11,008,它由三层组成:`gate_proj`、`up_proj`和`down_proj`。

基于它们的行为,大型语言模型(LLMs)被归类为以下几种:
• *遮蔽语言模型(MLM)*:在提供的上下文词汇之间预测一个新的遮蔽词。BERT就是MLM的一个例子。
• *因果语言模型(CLM)*:在提供的上下文词汇之后预测下一个词。一个众所周知的CLM例子是GPT文本生成。CLM也被称为自回归的标记生成模型,因为其按顺序处理行为。
在这篇博客中,我们更专注于讨论Llama2 CLM。

在CLM(因果语言模型)中,生成令牌分为以下两个阶段:
• *首个令牌生成时间(TTFT)*:生成第一个令牌所需要的时间。填充前延迟被定义为跨请求的平均TTFT。在下面的图中,TTFT是从输入提示“The largest continent”生成“in”所需要的时间。
• *每个输出令牌的时间(TPOT)*:以自回归方式生成每个输出令牌所花费的时间。输出解码延迟被定义为跨请求的平均TPOT,通常使用输出解码阶段所需的时间来估算。在下图中,TPOT是“the”的解码延迟。
TTFT和TPOT被用来计算CLM中的延迟:
延迟 = TTFT + TPOT * (max_new_tokens - 1) 

在*预填充*阶段之后的输入维度,在词嵌入之后,与*批次大小*输入序列长度*成比例。预填充阶段的令牌是同时被处理的。然而,*输出解码*阶段的输入,在词嵌入之后,与*批次大小*成比例;这一阶段的令牌是顺序处理的。这就是为什么当批次大小为1时输出解码操作由高且窄的GEMM(或者是GEMV)组成的原因。

为了简单起见,我们采用了贪婪解码方式来生成令牌,它已知是从输出对数中解码令牌时开销最小的。在实际的聊天机器人场景中,允许生成丰富和出人意料的输出令牌时,最好考虑基于采样的解码以及更高的束宽度。但是,在贪婪解码方案中,自回归的CLM从模型输出对数生成排名第一的令牌。

设备特性:MI210

AMD的Instinct™ MI210在FP16数据类型下的最大计算能力为181 TFLOPs。要完全利用矩阵核心的性能,GEMM的矩阵尺寸应足够大。具有大批次的LLM预填充解码阶段使用大输入矩阵,并且能从矩阵核心的高性能中获益。使用MI210,在提示序列长度和批次大小都很大的预填充阶段,GEMM操作是计算受限的。

MI210能够提供最大的双倍数据速率(DDR)内存带宽,达到1.6 TB/s。输出解码顺序处理令牌。这种自回归解码只有序列长度的一个维度(这使得高且窄的GEMT或GEMV)其中操作是内存受限的。由于LLM输出令牌生成的这种顺序性质,输出解码从DDR带宽中受益。

MI250由MI210的两个图形计算模块(GCD)组成。因此,MI250具有MI210两倍的计算能力、内存大小和内存带宽。LLM可以在MI250的两个硅片上用张量并行(TP)、流水线并行(PP)或数据并行(DP)的模型并行方式进行赋值。这种数据并行可以使LLM的吞吐量翻倍,同时存在两倍模型参数复制的开销。由于缺少开销,张量并行广泛被使用,因其有能力将更大的LLM适配到具有一些集合操作同步开销的高容量MI250 DDR上。

在前面的图表中,请注意,单个MI250 GCD的瓶颈线与MI210的相似。

软件设置

在主机上安装ROCm

要在主机上安装ROCm 6.0,请参阅[安装指南](ROCm installation options — ROCm installation (Linux))。

设置docker

要设置官方的[PyTorch ROCm Docker容器](https://hub.docker.com/r/rocm/pytorch/tags),请使用以下命令:

docker run -it --network=host --device=/dev/kfd --device=/dev/dri --group-add=video --ipc=host --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --shm-size 8G --name llm_optimization rocm/pytorch:rocm6.0_ubuntu22.04_py3.9_pytorch_2.0.1

配置库和工具集

运行以下命令来安装PyTorch 2.3夜间版本:

pip3 uninstall torch torchvision torchaudio pytorch-triton-rocm -y
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/rocm6.0

有关库的设置,请参考Hugging Face的transformers。

有关工具集的设置,请参考[文本生成推理 (TGI)]。

在MI210上Llama-2-7b的优化比较

• Prefill 延迟

• 输出解码延迟

默认机器学习框架

PyTorch 2支持两种运行模式:急切模式和编译模式。急切模式是PyTorch的默认模式,在这种模式下,模型的运算符会在运行时遇到时顺序执行。编译模式在LLM推理优化技术中有所涵盖。

为了运行LLM解码器模型(例如,Llama-2),Hugging Face提供了transformers库在PyTorch之上运行模型。

transformers库在其[APIs]中使用多种令牌生成选项作为参数。在这篇博客中,为了公平地比较每种优化的性能,采用了这些选项:
• *预填充*:使用2048序列长度的提示符,随着批量大小的增加,预填充延迟会增加,因为预填充期间的大型GEMM计算是计算受限的。
• *输出解码*:当批量大小增加时,输出解码延迟并不会大幅增加,因为这个阶段的GEMM的算术强度仍然受到内存带宽的限制。

LLM推理优化技术

在这里,我们讨论各种LLM推理优化技术。

PyTorch编译模式

在[PyTorch编译模式]中,模型被合成为图形,然后降级为主要运算符。这些运算符使用TorchInductor进行编译,它使用OpenAI的Triton作为GPU加速的基础模块。PyTorch编译模式的一个优点是其GPU内核是用Python编写的,这使得修改和扩展它们变得更容易。由于模型运算在运行前就已融合,PyTorch编译模式通常会提供更高的性能,这使得部署高性能内核变得容易。

为了在PyTorch编译模式下运行LLM解码器模型(例如,Llama2),必须显式地将模型的特定层次指定为编译目标。PyTorch编译模式要求在LLM解码器模型的输入批量大小和序列长度在运行时可能改变的情况下重新编译。为了支持动态输入形状的重新编译,请设置参数`dynamic=True`。

for i in range(model.config.num_hidden_layers):model.model.decoder.layers[i].self_attn = torch.compile(model.model.decoder.layers[i].self_attn, backend="inductor", mode="default", dynamic=True)

• *预填充*:预填充延迟显著降低。但是,对于LLM解码器模型,它仍然会因为各种批量大小和输入序列长度而遭受巨大的初始重新编译开销。预填充延迟是在初始重新编译(预热)之后测量的。
• *输出解码*:输出解码延迟略有改善,因为模型部分编译了。然而,由于部分密钥/值缓存的动态形状,图形回落到了急切模式。有一种努力来解决这个问题(被称为[静态密钥/值缓存](Accelerating Generative AI with PyTorch II: GPT, Fast | PyTorch))。静态密钥/值缓存与`torch.compile`一起使用时,可以显著提高输出解码性能,但我们的博客并未涵盖此内容。

Flash Attention v2

Flash Attention(flash_attention)算法旨在解决在transformer的多头注意力(MHA)模块中,查询、密钥和值组件所需的大量内存移动问题。通过将部分查询平铺并存储在更快的缓存内存中,而不是在MHA计算期间不断从较慢的外部DDR内存中读取,这一目标得以实现。`flash_attention v2`](https://arxiv.org/abs/2307.08691)可以在长输入序列长度上最大化并行性,与原生的MHA相比,可以显著提升性能。

您可以无缝地使用最新的Hugging Face transform库中的*flash_attention v2模块*来自ROCm。

from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(model_id, attn_implementation="flash_attention_2")

• *预填充*:Flash Attention模块显著降低了大批量大小和长序列长度的预填充处理延迟,因为MHA矩阵的维度与这些成比例。这导致了flash attentions的更大收益。
• 输出解码:flash_attention在输出解码阶段效果不明显,因为序列长度仅为1。

内存高效多头注意力

内存高效的多头注意力(Xformers)是Meta提供的一系列可定制模块,用于优化变换器模型。Xformers的主要特点是内存高效的多头注意力(MHA)模块,它可以在多头注意力处理过程中显著减少内存流量。这个模块采用与`flash_attention`相似的算法来减少DDR读写带宽。
你可以无缝地将Xformers的内存高效MHA模块适用于ROCM集成到Hugging Face的变换器库中。
- *预填充*:与`flash_attention v2`出于相同的原因,内存高效的MHA在处理大批量尺寸和长序列长度时也显著减少了预填充处理延迟。
- *输出解码*:Xformers在输出解码阶段效果不明显,因为序列长度仅为1。

分页注意力(vLLM)

分页注意力(paged_attention)是vLLM推理系统的一种算法,可以有效减少内存消耗,并在输出解码阶段将延迟降低两到四倍。分页注意力通过使用虚拟内存和分页来管理输出解码阶段的键值缓存(K-V缓存),减少内存碎片。传统的K-V缓存会为输出的最大令牌长度(根据模型的不同为2,048或4,096)预分配内存,如果实际解码长度更短,就可能导致内存碎片。这种基于分页的虚拟内存可以在波束搜索大和多个请求并行运行时节省K-V缓存内存。
vLLM的paged_attention模块适用于ROCM目前是可用的。
- *预填充*:分页注意力在预填充阶段效果不明显,因为这个阶段不使用K-V缓存。
- *输出解码*:分页注意力可以显著降低解码延迟。

PyTorch TunableOp

PyTorch TunableOp允许你使用高性能的rocblas和hipblaslt库进行GEMM。它会对LLM进行性能分析,并准备每个MHA和MLP模块的最佳性能GEMM内核。在运行时,会启动最佳性能GEMM内核,而不是PyTorch内建的GEMM内核。
PyTorch TunableOp目前已经可用。
- *预填充*:结合`flash_attention v2`,PyTorch TunableOp在不同批量大小下显示出显著的性能提升。
- *输出解码*:结合分页注意力,PyTorch TunableOp也显著降低了高瘦GEMM(或GEMV)的延迟。因此,输出解码性能最大限度地受益于rocBLAS和hipBLASLt GEMMs。

多GPU LLM推理优化

预填充延迟

• 输出解码延迟

Hugging Face 文本生成推理

在进行多GPU推理和训练的扩展时,需要使用模型并行技术,例如张量并行(TP)、流水线并行(PP)或数据并行(DP)。张量并行(TP)因为不会导致流水线泡沫而被广泛使用;数据并行(DP)虽然吞吐量高,但需要将参数的副本复制到GPU的DDR中。

在这篇博客中,我们使用TP技术将模型分布在多个GPU上,并使用Hugging Face的文本生成推理(TGI)来测量多GPU的大型语言模型(LLM)推理性能。Hugging Face的TGI实现包括兼容ROCm的`flash_attention`和`paged_attention`,与PyTorch TunableOp的兼容性,以及对ROCm启用的量化(如GPTQ)的支持,这些特点使得它成为一个好选择。

一台服务器配备了4块MI250显卡,总共拥有8个图形计算核心(GCDs)。每个GCD拥有64 GB的HBM内存。

为了充分利用多个MI250 GPU,您需要考虑GPU GCDs之间的互连带宽,因为GCD间的连接吞吐量是不均匀的。例如,在TP=4的情况下,联合使用GCD#0、1、4、6将提供最佳性能,因为集体操作(如全归约或全集合)在TP中会造成较少的同步开销。

在启用非统一内存访问(NUMA)平衡时,GPU必须等待来自页面错误的内存管理单元(MMU)的预先通知器变更。因此,我们推荐禁用NUMA平衡,以避免定期自动平衡干扰GPU操作。

echo 0 > /proc/sys/kernel/numa_balancing

• 填充阶段(Prefill) 和 输出解码阶段(Output decoding):使用8 GCDs (TP=8)的案例展示了比使用4 GCDs (TP=4)更好的填充和输出解码延迟。延迟增强并没有翻倍,因为同步每一层的多头自注意力(MHA)和多层感知机(MLP)的集体操作也是一个巨大的延迟瓶颈。

总结

在这篇博客中,我们介绍了几种软件优化技术,用于在AMD CDNA2 GPUs上部署最先进的大型语言模型(LLMs)。这些包括PyTorch 2编译、Flash Attention v2、`paged_attention`、PyTorch TunableOp以及多GPU推理。这些优化技术已经被AI社区广泛采纳。使用这些优化,根据批量大小和输入序列长度,你可以享受高达三倍的即开即用加速。

相关文章:

大型语言模型在AMD GPU上的推理优化

Large language model inference optimizations on AMD GPUs — ROCm Blogs 大型语言模型(LLMs)已经改变了自然语言处理和理解,促进了在多个领域中的众多人工智能应用。LLMs在包括AI助手、聊天机器人、编程、游戏、学习、搜索和推荐系统在内的…...

Apple - Core Foundation Design Concepts

本文翻译整理自:Core Foundation Design Concepts(更新日期:2013-12-16 https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFDesignConcepts/CFDesignConcepts.html#//apple_ref/doc/uid/10000122i 文章…...

lua中的lfs库介绍

lua中的lfs库介绍 说明常用函数解析lfs.attributeslfs.chdirlfs.currentdirlfs.dirlfs.mkdirlfs.rmdirlfs.locklfs.touchlfs.linklfs.setmodelfs.symlinkattributes 说明 lfs是lua中的一个文件系统库,提供了更多高级的文件和目录操作功能,使得lua可以更方…...

PyCharm 快捷键积累

1、快速格式化:Ctrl Alt L Ctrl Alt L 快捷键在 PyCharm 中是用于格式化代码的,它不仅仅适用于 HTML 代码,而是适用于多种编程和标记语言。...

C++进阶之AVL树

个人主页:点我进入主页 专栏分类:C语言初阶 C语言进阶 数据结构初阶 Linux C初阶 C进阶​ ​​​​算法 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂 目录 一.前言 二.插入 三.旋转 3.1右旋 …...

sizeof 和 strlen 比较

sizeof 和 strlen 在 C 语言中都是用于获取某种“大小”的,但它们之间有着显著的区别。 sizeof sizeof 是一个运算符,用于计算数据类型或对象在内存中的大小(以字节为单位)。它可以在编译时确定结果,因为它计算的是类…...

音视频开发—FFmpeg 打开摄像头进行RTMP推流

实验平台:Ubuntu20.04 摄像头:普通USB摄像头,输出格式为YUV422 1.配置RTMP服务器推流平台 使用Nginx 配置1935端口即可,贴上教程地址 ubuntu20.04搭建Nginxrtmp服务器) 2.配置FFmpeg开发环境 过程较为简单,这里不…...

D触发器(D Flip-Flop)与D锁存器(D Latch)

1 基础概念 我们先来简单回顾一下D触发器(D flip-flop)和D锁存器(D latch)的概念,以及它们在数字电路中的作用。 1.1 D触发器(D Flip-Flop) D触发器是一种数字存储器件,它在时钟信号…...

JDK19特性

JDK19特性 一、JAVA19概述 JDK 19 2022 年 9 月 20 日正式发布以供生产使用,非长期支持版本。不过,JDK 19 中有一些比较重要的新特性值得关注。 JDK 19 只有 7 个新特性: JEP 405: Record Patterns(记录模式)[1] (预览)JEP 422: Linux/RISC-V Port[2]JEP 424: Foreign …...

sql语句中常用的函数有那些

1、字符串函数 CONCAT(string1, string2, ...): 连接两个或多个字符串。 UPPER(string): 将字符串转换为大写。 LOWER(string): 将字符串转换为小写。 TRIM(string): 去除字符串两端的空格。 LENGTH(string): 返回字符串的长度。 SUBSTRING(string, start, length): 从字符串中…...

odoo17 小变更3 Warning、 “attrs “和 “states “不再用

odoo17 小变更 1、Warning from odoo.exceptions import ValidationError,Warning ImportError: cannot import name Warning from odoo.exceptions (D:\od172406\odoo\exceptions.py) 2、自 17.0 版起,不再使用 "attrs "和 "states "属性。 …...

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述 游戏暂停的功能是通过设置timeScale0实现的,不过在暂停游戏的时候,需要对角色进行预览和设置,为了实现这个功能,是通过鼠标控制相机的操作,为了使相机的操作丝滑,获取鼠标操作系数乘以Time.delta…...

服务端代码编写中MySql大小写在Java中报错问题解决

报错信息: 原因:MySql和Java变量大小写产生的冲突。 经过查阅各个博客等,得出浅显结论(不一定对):MySql大小写不敏感,Java大小写敏感,当Javabean转为MySql数据库表时,Ja…...

CRMEB 多店商品详情页装修说明

一、功能介绍 商家可调整商品详情各板块样式,可根据不同的需求开启或关闭单独的板块 二、操作流程 装修 > 商品详情 三、功能说明 1、商品信息 可控制商品详情页面商品信息的显示与隐藏 2、会员信息,排行榜 控制商品详情页面会员信息及排行榜的…...

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…...

简说PIP换源

概述 PIP(Python Package Installer)是 Python 的包管理工具,用于安装和管理 Python 包。默认情况下,PIP 从 Python 官方的包仓库(即 PyPI)下载和安装包。然而,由于网络原因,访问官…...

django学习入门系列之第三点《CSS基础样式介绍2》

文章目录 文字对齐方式外边距内边距往期回顾 文字对齐方式 水平对齐方式 text-align: center;垂直对齐方式 /* 注意&#xff0c;这个只能是一行来居中 */ line-height:/*长度*/ ;样例 <!DOCTYPE html> <html lang"en"> <head><meta charset…...

分布式光纤测温DTS在工程现场中稳定性与可靠性如何?

20年前&#xff0c;分布式光纤测温(Distributed Temperature Sensing&#xff0c;DTS)技术的发展尚不成熟&#xff0c;设备成本高昂&#xff0c;其稳定性与可靠性也存在一定问题。然而&#xff0c;经过二十多年的不断发展与创新&#xff0c;DTS技术在工程现场应用中取得了显著进…...

PHP多线程模块parallel的编译安装和多线程编程演示

从PHP7开始&#xff0c;多线程编原有的pthreads已经不在维护&#xff0c;而是使用parallel替代。 由于是新的模块&#xff0c;样例代码很少&#xff0c;这里总结一个简单的代码和详细的备注供大家参考。 编译和安装 parallel需要启用ZTS&#xff08;Zend Thread Safety&…...

记录grid布局属性

grid布局 分为容器和项目元素 容器属性 #container{display:grid;grid-template-columns:100px 100px 100px;/* 1fr 表示比例为占1份 */grid-template-columns:1fr 100px 1fr;/*100px为1列,自动填充,容器宽度不足则换行*/grid-template-columns:repeat(auto-fill,100px);/* …...

12.爬虫---PyMysql安装与使用

12.PyMysql安装与使用 1.安装 PyMySQL2.使用PyMySQL2.1创建数据表2.2连接数据库2.3增加数据2.4修改数据2.5查询数据2.6删除数据2.7关闭连接 3.总结 MySQL 安装可以看这篇文章MySql 安装与使用&#xff08;非常详细&#xff09; 1.安装 PyMySQL PyMySQL是Python中用于连接MySQL…...

VS2022遇到的两个问题

问题一&#xff1a;找不到定义的头文件 别的博主说是&#xff1a;在属性页里面进行改写&#xff0c;改成是&#xff0c;我试过之后并不行&#xff1b; 解决思路&#xff1a;但其实在右边视图里面找到你自己定义的头文件加到你运行文件中就行&#xff1b;因为程序就只有一个入口…...

【Android14 ShellTransitions】(六)SyncGroup完成

这一节的内容在WMCore中&#xff0c;回想我们的场景&#xff0c;是在Launcher启动某一个App&#xff0c;那么参与动画的就是该App对应Task&#xff08;OPEN&#xff09;&#xff0c;以及Launcher App对应的Task&#xff08;TO_BACK&#xff09;。在确定了动画的参与者后&#x…...

技术管理转型之战:决策之道-管理中的智慧与策略

文章目录 引言一、决策的重要性二、常见的决策方式1. 理性决策&#xff08;Rational Decision Making&#xff09;2. 有限理性&#xff08;Bounded Rationality&#xff09;3. 直觉决策&#xff08;Intuitive Decision Making&#xff09;4. 循证管理&#xff08;Evidence-Base…...

Shell脚本:条件语句(if、case)

目录 硬编码 硬编码的缺点 条件判断 $? 命令行语句 判断指定目录是否存在 判断指定文件是否存在 判断指定对象是否存在 表达式形式语句 判断对象是否存在 判断对象是否有权限 与、或、非 运算 与运算 或运算 非运算 比较大小 判断磁盘利用率实验步骤 字符串…...

在Linux上为Windows目标配置Qt交叉编译

问题描述 我想使用Linux x86_64主机为Windows x86_64目标交叉编译Qt库&#xff08;最终也包括我的应用程序&#xff09;。我觉得自己已经接近成功了&#xff0c;但可能对整个过程有一些基本的误解。 我从在我的Fedora机器上安装所有mingw包开始&#xff0c;并修改了win32-g的…...

Introduction to linear optimization 第 2 章课后题答案 11-15

线性规划导论 Introduction to linear optimization (Dimitris Bertsimas and John N. Tsitsiklis, Athena Scientific, 1997)&#xff0c; 这本书的课后题答案我整理成了一个 Jupyter book&#xff0c;发布在网址&#xff1a; https://robinchen121.github.io/manual-introdu…...

Java——包

一、包 1、简要介绍 在Java编程语言中&#xff0c;包&#xff08;Package&#xff09; 是一种用来组织和管理类&#xff08;Class&#xff09;和接口&#xff08;Interface&#xff09;的机制。包为开发者提供了一种逻辑分组的方式&#xff0c;使代码更加模块化、结构化和易于…...

Pipeline知识小记

在scikit-learn&#xff08;通常缩写为sklearn&#xff09;中&#xff0c;Pipeline是一个非常重要的工具&#xff0c;它允许你将多个数据转换步骤&#xff08;如特征选择、缩放等&#xff09;和估计器&#xff08;如分类器、回归器等&#xff09;组合成一个单一的估计器对象。这…...

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具&#xff0c;适用于开发人员和测试人员。它提供了一个直观的界面&#xff0c;用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例&#xff0c;以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…...

人工智能对决:ChatGLM与ChatGPT,探索发展历程

图: a robot is writing code on a horse, By 禅与计算机程序设计艺术 目录 ChatGLM:...

探索Python元类的奥秘及其应用场景

探索Python元类的奥秘及其应用场景 一、引言 在Python中&#xff0c;元类&#xff08;Metaclasses&#xff09;是一个相对高级且容易被忽视的主题。然而&#xff0c;对于深入理解Python的面向对象编程模型以及进行高级框架和库的设计来说&#xff0c;元类是一个不可或缺的工具…...

C语言基础关键字的含义和使用方法

​关键字在C语言中扮演着非常重要的角色&#xff0c;它们定义了语言的基本构造和语法规则&#xff0c;通过使用关键字&#xff0c;开发者可以创建变量、定义数据类型、控制程序流程&#xff08;如循环和条件判断&#xff09;、声明函数等。由于这些字是保留的&#xff0c;所以编…...

【Golang - 90天从新手到大师】Day09 - string

系列文章合集 Golang - 90天从新手到大师 String 一个字符串是一个不可改变的字节序列。字符串可以包含任意的数据&#xff0c;但是通常是用来包含人类可读的文本。 len()返回字符串字节数目&#xff08;不是rune数&#xff09;。 通过索引可以访问某个字节值&#xff0c;0…...

网络安全与区块链技术:信任与安全的融合

# 网络安全与区块链技术&#xff1a;信任与安全的融合 在网络空间&#xff0c;信任是一种宝贵而稀缺的资源。区块链技术以其独特的分布式账本、加密算法和共识机制&#xff0c;为构建网络安全提供了新的解决方案。本文将探讨网络安全与区块链技术如何融合&#xff0c;以增强信…...

MySQL之复制(九)

复制 复制管理和维护 确定主备是否一致 在理想情况下&#xff0c;备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误&#xff0c;备库同样可能因为MySQL自身的特性导致数据不一致&#xff0c;例如MySQL的Bug、网络中断、服务…...

【面试干货】 Java 中的 HashSet 底层实现

【面试干货】 Java 中的 HashSet 底层实现 1、HashSet 的底层实现2、 HashSet 的特点3、 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; HashSet 是 Java 集合框架中的一个重要成员&#xff0c;它提供了不存储重复元素的集合。但是&am…...

爬虫经典案例之爬取豆瓣电影Top250(方法二)

在上一篇文章的基础上&#xff0c;改进了代码质量&#xff0c;增加了多个正则表达式匹配&#xff0c;但同事也增加了程序执行的耗时。 from bs4 import BeautifulSoup import requests import time import re from random import randint import pandas as pdurl_list [https…...

如何优化React应用的性能?

优化React应用的性能是一个多方面的过程&#xff0c;涉及到代码的编写、组件的设计、资源的管理等多个层面。以下是一些常见的性能优化策略&#xff1a; 避免不必要的渲染: 使用React.memo、useMemo和useCallback来避免组件或其子组件不必要的重新渲染。 代码分割: 使用React.…...

css文字镂空加描边

css文字镂空加描边 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>文字镂空</title><style>/* 公用样式 */html,body{width: 100%;height: 100%;position: relative;}/* html{overflow-y: scroll;} */*{margi…...

python数据分析与可视化

Python 在数据分析和可视化方面有着广泛的应用,并且拥有众多强大的库和工具来支持这些任务。以下是一些常用的 Python 库和它们的主要用途: 数据分析 Pandas: Pandas 是 Python 中用于数据处理和分析的主要库。 它提供了数据框(DataFrame)和序列(Series)两种数据结构…...

webkit 的介绍

WebKit 是一个开源的网页浏览器引擎&#xff0c;它是 Safari 浏览器和许多其他应用程序的基础。WebKit 最初由苹果公司开发&#xff0c;并在2005年作为开源项目发布。WebKit 的核心组件包括 WebCore 和 JavaScriptCore。以下是 WebKit 的详细介绍&#xff1a; ### WebKit 的主…...

make与makefile

目录 一、make的默认目标文件与自动推导 二、不能连续make的原因 执行原理 touch .PHONY伪目标 make指令不回显 makefile多文件管理 简写依赖方法 三、回车与换行 四、缓冲区 一、make的默认目标文件与自动推导 假设这是一个makefile文件&#xff0c;make的时候默认生…...

深度神经网络一

文章目录 深度神经网络 (DNN)1. 概述2. 基本概念3. 网络结构 深度神经网络的层次结构详细讲解1. 输入层&#xff08;Input Layer&#xff09;2. 隐藏层&#xff08;Hidden Layers&#xff09;3. 输出层&#xff08;Output Layer&#xff09;整体流程深度神经网络的优点深度神经…...

Pnpm:包管理的新星,如何颠覆 Npm 和 Yarn

在探索现代 JavaScript 生态系统时&#xff0c;我们常常会遇到新兴技术的快速迭代和改进。其中&#xff0c;包管理工具的发展尤为重要&#xff0c;因为它们直接影响开发效率和项目性能。最近&#xff0c;pnpm 作为一种新的包管理工具引起了广泛关注。它不仅挑战了传统工具如 np…...

汽车IVI中控开发入门及进阶(三十二):i.MX linux开发之Yocto

前言: 对于NXP的i.mx,如果基于linux开发,需要熟悉以下文档: IMX_YOCTO_PROJECT_USERS_GUIDE.pdf IMX_LINUX_USERS_GUIDE.pdf IMX_GRAPHICS_USERS_GUIDE.pdf 如果基于android开发,需要熟悉一下文档: Android_Auto_Quick_Start_Guide.pdf ANDROID_USERS_GUIDE.pdf …...

tessy 编译报错:单元测试时,普通桩函数内容相关异常场景

目录 1&#xff0c;失败现象 2&#xff0c;原因分析 1&#xff0c;失败现象 1&#xff0c;在 step 桩函数正常的情况下报错。 2&#xff0c;测试代码执行的数据流 和 step 桩函数内容不一致。 2&#xff0c;原因分析 桩函数分为 test object, test case, test step 三种类别。…...

计算机专业是否仍是“万金油”

作为一名即将参加高考的学生&#xff0c;我站在人生的分岔路口上&#xff0c;面临着选择大学专业的重大抉择。在这个关键节点&#xff0c;计算机相关专业是否仍是炙手可热的选择&#xff1f;  首先&#xff0c;从行业的角度来看&#xff0c;计算机相关专业确实在近年来持续火…...

雷池社区版自动SSL

正常安装雷池&#xff0c;并配置站点&#xff0c;暂时不配置ssl 不使用雷池自带的证书申请。 安装&#xff08;acme.sh&#xff09;&#xff0c;使用域名验证方式生成证书 先安装git yum install git 或者 apt-get install git 安装完成后使用 git clone https://gitee.com/n…...

怎样减少徐州服务器租用的成本?

服务器租用的出现&#xff0c;十分便于网络行业的发展&#xff0c;但是随着服务器租用的广泛应用&#xff0c;整体还是有着一定的成本的吗&#xff0c;不同的服务器类型在价格方面也是不同的&#xff0c;那么企业在选择服务器租用后&#xff0c;怎样才能减少服务器租用的成本呢…...