微调Llama2自我认知

一、概述

最近在学习了解大模型微调相关的内容,在学习的过程中也遇到了很多问题,所以将自己的学习过程记录下来,希望对大模型微调感兴趣的小伙伴提供一点帮助,本文主要介绍一下如何通过SFT微调Llama2的自我认知,先看一下微调前后的效果比对:

微调前:

微调后:

通过本文的学习,你将了解如下内容:

  • 如何使用SFT微调Llama2
  • 如何导出微调后的大模型
  • 如何使用FastChat实现 OpenAI 兼容的 RESTful API 接口

二、环境与模型选择

环境配置

使用 nvidia-smi 命令查看 GPU 的配置,微调的GPU配置如下:

$nvidia-smi     
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.161.03   Driver Version: 470.161.03   CUDA Version: 11.7     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA A800-SXM...  Off  | 00000000:8E:00.0 Off |                    0 |
| N/A   30C    P0    69W / 400W |  17320MiB / 81251MiB |      0%      Default |
|                               |                      |             Disabled |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

微调 Llama2 需要 1 个GPU,24G 内存,较低的内存会导致加载模型较慢。

开源框架和模型

  • 微调的模型: [Chinese-Llama-2-7b]
  • 微调框架: [LLaMA-Efficient-Tuning]
  • 提供openai兼容的RESTful API框架: [FastChat
  • 本地知识库问答应用框架: [LangChain-Chatchat]

由于Llama2本身的中文对齐较弱,这里没有直接使用 meta-llama/Llama-2-7b而是使用 LinkSoul/Chinese-Llama-2-7b进行微调,微调方法是类似的,感兴趣的可以基于 meta-llama/Llama-2-7b 进行微调。下面详细介绍一下微调的步骤。

三、SFT微调

1、下载预训练模型

在 huggingface上面搜索模型名称,可以看到下载模型的方式如下:

新建一个 models 文件夹用来存放下载的大模型,使用下面的命令下载预训练模型:

# 在当前目录新建一个 models 文件夹用来存放大模型
mkdir models
# 使用下面的命令下载模型,模型比较大,下载过程较缓慢,
git lfs install
git clone https://huggingface.co/LinkSoul/Chinese-Llama-2-7b# 设置下面的环境变量,则不会下载大文件,只会下载小文件
GIT_LFS_SKIP_SMUDGE=1

2、下载微调框架

使用如下命令,在当前目录下载微调框架 [LLaMA-Efficient-Tuning]**

git clone https://github.com/hiyouga/LLaMA-Efficient-Tuning.git

进入 LLaMA-Efficient-Tuning 目录:

cd LLaMA-Efficient-Tuning

3、准备微调数据

进入微调框架LLaMA-Efficient-Tuning目录后,找到存放微调数据的data目录,如下所示:

我们可以查看一下 self_cognition.json自我认知文件内容如下:

可以看到 <NAME><AUTHOR>是占位符,我们只需要复制一份文件,将对应的占位符替换为需要的名称即可,复制一份文件是为了自我认知的模版文件可复用,我替换后的文件内容如下,你可以改成自己的名字:

微调数据准备好了后,需要在 dataset_info.json 中配置如下:

{"self_cognition": {"file_name": "self_cognition.json","file_sha1": "6287a730ada924fc5d9eadc6d8f865e01b7a6f67"}
}

dataset_info.json文件会被转换为 python 的字典,self_cognition就是字典的 key,在微调的时候需要指定的数据集名称就是该 key,file_sha1 文件的摘要可以不填,file_name就是微调文件的名称,如果该微调文件在data目录中,则直接指定名称即可,如果在data目录的子目录中,则需要指定子目录的名字,举例如下:

4、开始SFT微调

微调数据准备好后就可以开始执行微调了,使用如下命令进行微调:

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \--stage sft \--do_train \--dataset self_cognition \--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b \--output_dir /ossfs/workspace/llama2-sft/checkpoint-01 \--template default \--finetuning_type lora \--lora_target q_proj,v_proj \--overwrite_cache \--per_device_train_batch_size 4 \--gradient_accumulation_steps 4 \--lr_scheduler_type cosine \--logging_steps 10 \--save_steps 2000 \--learning_rate 1e-3 \--num_train_epochs 10.0 \--plot_loss \--fp16

下面是对这个大模型训练命令中各个参数的详细解释:

--stage sft: 训练阶段。这里指定为sft,表示进行模型的微调(self-supervised fine-tuning)阶段。--do_train: 是否进行训练,设置为True表示进行训练。还可以设置为(--do_eval:表示评估,--do_predict:表示预测)--dataset self_cognition: 数据集名称。这里指定为self_cognition,表示使用自我认知数据集。--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b: 预训练模型的名称或路径。这里指定为/ossfs/workspace/models/Chinese-Llama-2-7b,表示加载路径下的预训练模型。--output_dir /ossfs/workspace/llama2-sft/checkpoint-01: 训练输出目录。训练过程中生成的模型和日志将保存在该目录下。--template default: 模板名称。这里指定为default,表示使用默认模板。--finetuning_type lora: 微调类型。这里指定为lora,表示使用LoRA(Language Representation with Additive Transformation)微调方法。--lora_target q_proj,v_proj: LoRA微调的目标层。这里指定为q_proj,v_proj,表示只对q_proj和v_proj两个层进行微调。--overwrite_cache: 是否覆盖缓存。设置为True表示覆盖缓存。--per_device_train_batch_size 4: 每个设备的训练批次大小。这里指定为4,表示每个设备上的训练批次大小为4。--gradient_accumulation_steps 4: 梯度累积步数。这里指定为4,表示每4个步骤累积一次梯度。--lr_scheduler_type cosine: 学习率调度器类型。这里指定为cosine,表示使用余弦学习率调度器。--logging_steps 10: 日志记录步数。每训练多少步记录一次训练日志。--save_steps 2000: 模型保存步数。每训练多少步保存一次模型。--learning_rate 1e-3: 学习率。这里指定为1e-3,表示初始学习率为0.001。--num_train_epochs 10.0: 训练轮数。这里指定为10.0,表示进行10轮训练。--plot_loss: 是否绘制损失曲线。设置为True表示绘制损失曲线。--fp16: 是否使用混合精度(half-precision)训练。设置为True表示使用混合精度训练。

以上是对该大模型训练命令中各个参数的解释。根据需求,可以根据实际情况进行相应参数的修改。不同的参数设置会对训练过程和结果产生影响,需要根据具体任务和数据集进行调整。

微调过程比较耗时,需要耐心等待

启动微调命令后,输出日志如下,需要用户输入是否需要 wandb (一个深度学习轻量级可视化工具)将训练结果可视化,我这里选择不可视化训练结果。

微调命令结束后可以看到如下日志输出,从日志中可以看到微调后的模型 checkpoint 的位置、损失曲线的信息以及训练的汇总信息:

查看损失曲线:

损失曲线图像解读:

在大模型训练过程中,train loss 图像是指每个训练批次的损失值随训练轮次的变化情况。这个图像可以用来解读训练过程中模型的收敛情况和学习进展。

train loss 图像的纵轴表示损失值,横轴表示训练轮次或训练批次。通常,初始阶段的损失值较高,随着训练的进行,损失值会逐渐下降。如果损失值趋向于稳定,说明模型已经收敛,训练效果良好。如果损失值下降很慢,可能需要更多的训练轮次或调整模型超参数。如果损失值波动较大,可能存在过拟合或其他问题,需要进一步调整模型或数据。

解读train loss 图像时,可以观察以下几个方面:

  1. 初始阶段的损失值高低,较高的初始损失值可能表明模型初始化不合适,需要调整初始化方法。
  2. 损失值下降的速率,较快的下降速率可能表明模型对数据的学习能力较强,但也可能存在过拟合的风险。
  3. 损失值的稳定性,稳定的损失值说明模型已经收敛,训练效果较好。如果损失值在一定范围内波动,可以考虑增加训练轮次或使用正则化等方法进一步优化模型。
  4. 训练过程中的异常情况,如损失值突然上升或跳跃,可能表明出现了问题,需要检查模型或数据是否存在异常。

总之,train loss 图像可以提供对模型训练过程的直观理解,帮助调整模型和优化训练策略,以达到更好的训练效果。

train loss 的值下降到什么范围表示模型的训练效果较好?

train loss 的值下降到一个较低的范围可以表示模型的训练效果较好。具体的判断标准可以根据具体的任务和数据集来确定,没有一个统一的阈值。

一种常见的做法是观察 train loss 图像的趋势,如果随着训练的进行,train loss 不断下降并趋于稳定,说明模型对训练数据的拟合效果较好,训练效果较好。

此外,可以根据验证集的表现来评估模型的训练效果。如果验证集的损失值也在下降并趋于稳定,且与训练集的损失值相近,说明模型在训练集和验证集上都能取得较好的效果,训练效果较好。

需要注意的是,train loss 仅仅是一个指标,不能完全代表模型的训练效果。还需要综合考虑模型在其他指标上的表现,如准确率、精确率、召回率等,以及在实际应用场景中的效果。

5、测试微调后的模型

微调框架 LLaMA-Efficient-Tuning中提供了三种测试使用微调模型的方式,如下所示:

  • api_demo.py:使用api的方式调用微调模型
  • cli_demo.py:在命令行中调用微调模型
  • web_demo.py:在web页面中调用微调模型

由于我这里的服务器没有外网访问的地址,所以使用 cli_demo.py命令行的方式手动测试微调后的模型,启动命令如下:

CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py \--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b \--checkpoint_dir /ossfs/workspace/llama2-sft/checkpoint-01\--template llama2

查看 cli_demo.py 源码,调用了 ChatModel.stream_chat(query, history)ChatModel的构造方法中调用了 get_infer_args(args),如下所示:

get_infer_args(args)如下所示,可以看到只有 LoRA 的微调支持指定多个 checkpoint

在模型参数中可以看到指定 checkpoint_dir 时可以使用 分隔多个 checkpoint:

所以如果你使用 LoRA 进行微调,那么当有多个微调任务,生成多个 checkpoint 时,多个 checkpoint 可以使用 分隔,假设你微调了两个checkpoint:/ossfs/workspace/llama2-sft/checkpoint-01/ossfs/workspace/llama2-sft/checkpoint-02,那么你可以使用下面的命令测试两个微调后的模型,如下所示:

CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py \--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b \--checkpoint_dir /ossfs/workspace/llama2-sft/checkpoint-01,/ossfs/workspace/llama2-sft/checkpoint-02\--template default

因为我这里只微调了自我认知,并且将在微调的时候指定 --output_dir /ossfs/workspace/llama2-sft/checkpoint-01,所以使用下面的命令来测试微调后的模型即可:

CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py \--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b \--checkpoint_dir /ossfs/workspace/llama2-sft/checkpoint-01\--template default

运行测试命令需要再次加载模型,比较耗时,需要耐心等待,运行成功后可以看到如下输出:

接下来就可以问一些自我认知的问题进行验证了,如下所示:

6、导出微调后的模型

经过前面的微调,如果微调后的模型通过了测试就可以将微调后的模型导出,使用如下命令即可:

CUDA_VISIBLE_DEVICES=0 python src/export_model.py \--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b \--checkpoint_dir /ossfs/workspace/llama2-sft/checkpoint-01\--output_dir /ossfs/workspace/sft-models/my-llama5 \--template default

我这里使用 --output_dir 将模型导出到 /ossfs/workspace/sft-models/my-llama5目录中,可以看到目录中包括如下内容:

7、微调模型提供RESTful API接口

经过前面的步骤,我们已经将自己微调后的模型导出了,现在我们可以使用 FastChat 将模型发布为 [openai 兼容的RESTful API]以便外部服务使用。

FastChat 为其支持的模型提供与 OpenAI 兼容的 API,因此您可以使用 FastChat 作为 OpenAI API 的本地直接替代品。[FastChat 服务器与openai-python]库和 cURL 命令兼容。

支持以下 OpenAI API:

  • Chat Completions
  • Completions
  • Embeddings

RESTful API 服务器

首先,启动控制器

python3 -m fastchat.serve.controller

运行命令输出内容如下:

然后,启动模型,通过 --model-path 指定模型的路径,这里我们指定前面微调后的模型路径 /ossfs/workspace/sft-models/my-llama5

python3 -m fastchat.serve.model_worker --model-path /ossfs/workspace/sft-models/my-llama5

运行命令输出内容如下:

最后,启动 RESTful API 服务器

python3 -m fastchat.serve.openai_api_server --host localhost --port 8000

运行命令输出内容如下:

现在,让我们测试 API 服务器。

OpenAI官方SDK

目标openai_api_server.py是实现一个完全兼容 OpenAI 的 API 服务器,因此模型可以直接与[openai-python]库一起使用。

首先,安装openai-python:

pip install --upgrade openai

然后使用下面的代码与模型进行测试:

import openai
# to get proper authentication, make sure to use a valid key that's listed in
# the --api-keys flag. if no flag value is provided, the `api_key` will be ignored.
openai.api_key = "EMPTY"
openai.api_base = "http://localhost:8000/v1"# 这里指定微调的模型名字,也就是保存模型文件的文件夹名称
model = "my-llama5"# create a chat completion
completion = openai.ChatCompletion.create(model=model,messages=[{"role": "user", "content": "你是谁"}]
)
# print the completion
print(completion.choices[0].message.content)

在jupyterlab中运行上面的代码,输出结果如下:

8、微调模型和本地知识库整合

因为后面打算学习了解一下将大模型和知识库整合,所以我这里先使用本地知识库问答应用框架: [LangChain-Chatchat] ****和微调后的模型整合。下面我先简单介绍一下整合的步骤,后面会再写一篇文章详细介绍一下大模型和本地知识库相关的内容。

首先下载 Langchain-Chatchat,使用如下命令:

git clone https://github.com/chatchat-space/Langchain-Chatchat.git

进入 Langchain-Chatchat,使用下面的命令安装 python 依赖库:

cd Langchain-Chatchatpip install -r requirements.txtpip install -r requirements_api.txt

使用下面的命令复制一份配置文件:

cp configs/model_config.py.example configs/model_config.py

如下所示:

model_config.py 配置文件需要修改如下内容,在llm_model_dict指定模型的地址,并且设置LLM_MODEL的名称和 llm_model_dict的 key 对应,如下所示:

llm_model_dict = {"llama2": {"local_model_path": "/ossfs/workspace/sft-models/my-llama5","api_base_url": "http://localhost:8888/v1",  # 修改为fastchat服务中的"api_base_url""api_key": "EMPTY"}
}# LLM 名称
LLM_MODEL = "llama2"

接下来就可以使用下面的命令启动 llm_api.py

python server/llm_api.py

启动成功后可以使用下面的代码在 jupyterlab 中进行验证:

# 服务启动后接口调用示例:
import openai
openai.api_key = "EMPTY" # Not support yet
openai.api_base = "http://localhost:8888/v1"model = "llama2"def get_answer(content):# create a chat completioncompletion = openai.ChatCompletion.create(model=model,messages=[{"role": "user", "content": content}])print('用户:', content)# print the completionprint('模型:',completion.choices[0].message.content)get_answer('你是谁')
get_answer('你叫什么名字')

验证输出结果如下:


如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

Summaries

摘要是网格项&#xff0c;它利用聚合函数来显示有关所显示数据的摘要信息&#xff1a;总记录计数、最小值等。 GridControl-Grid View Summary Types 汇总 汇总总数&#xff08;GridSummaryItem&#xff09;是根据所有数据网格记录计算的&#xff0c;并显示在视图页脚中。启…

【ACM出版-EI稳检索】第三届金融创新、金融科技与信息技术国际学术会议(FFIT 2024,7月26-28)

第三届金融创新、科技与信息技术国际学术会议&#xff08;FFIT 2024&#xff09;将于2024年07月26-28日于重庆举行。 FFIT2024 将围绕“金融创新”、"金融科技”与“信息技术”等相关最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、…

第三阶段Spark

Spark和PySpark的介绍 PySpark的相关设置 安装PySpark库 pip install pyspark pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark 构建PySpark执行环境入口对象 # 导包 from pyspark import SparkConf, SparkContext# 创建SparkConf类对象 conf SparkConf()…

算法题--华为od机试考试(整数对最小和、素数之积、找城市)

目录 整数对最小和 题目描述 注意 输出描述 示例1 输入 输出 说明 解析 答案 素数之积 题目描述 输入描述 输出描述 示例1 输入 输出 说明 示例2 输入 输出 说明 解析 找城市 题目描述 输入 输出 示例1 输入 输出 示例2 输入 输出 说明 解析…

Nvidia显卡GeForce Experience录屏操作流程

安装软件 首先我们从英伟达官网下载GeForce Experience程序&#xff0c;安装在电脑中GeForce Experience&#xff08;简称 GFE&#xff09;自动更新驱动并优化游戏设置 | NVIDIA 登录软件 安装完成后登录 开启录屏功能 登录后点击右上角的设置&#xff08;小齿轮图标&#x…

隐藏Python运行产生的缓存文件(__pycache__)

不少同学使用VScode 提交或运行python代码的时候&#xff0c;出现一些缓存文件 类似于(__pycache__) 这种&#xff0c;对于我这种有一丢丢强迫症的人来说&#xff0c;运行一次就得删除一次&#xff0c;那有没有什么办法将其隐藏的&#xff1f; 在vscode编辑器中打开设置&#…

HarmonyOS Next开发学习手册——创建轮播 (Swiper)

Swiper 组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 针对复杂页面场景&#xff0c;可以使用 Sw…

第2章_开发板使用

文章目录 第2章 开发板使用2.1 硬件连接2.1.1 连接 ST-Link2.1.2 连接 USB 串口2.1.3 连接 SPI 屏 2.2 运行测试程序验证硬件2.2.1 硬件接线&#xff08;RS485、CAN&#xff09;2.2.2 编译工程2.2.3 配置调试器2.2.4 烧录运行 2.3 创建第 1 个工程2.3.1 创建工程2.3.2 选择调试…

动态规划基础练习

我们需要先从数组较大的开始进行处理&#xff0c;每次考察上下左右的&#xff0c;比较当前存储的最大值和转移来的值&#xff0c;哪一个大一点 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std;int n, m; int a[105][105]; int addx[] { 0,…

pandas合并,拆分excel

目录 一:按照列进行拆分 二:将某几列的数据写入新excel 三:合并两个sheet数据到一个excel的一个sheet中 我们以商品销售明细为例,说明下excel的数据拆分和合并,我们的原始数据如下: 一:按照列进行拆分 现在我们需要统计下是否配送和支付方式为维度进行分组以后得数据…

成品视频素材下载网站有哪些?剪辑好可以用的视频素材网站分享

对于初学者在制作短视频时&#xff0c;常常希望能够快速获取高质量的素材。如果你正计划从事短视频创作&#xff0c;这里推荐几个优秀的成品素材网站&#xff0c;希望能对你有所帮助。 首先推荐的是蛙学网 作为国内用户首选的成品视频素材平台之一。这里提供丰富的视频素材库&…

SM2258XT量产工具,SM2258XT开卡三星SSV4颗粒成功分享,SM2259XT量产参考教程,威刚ADATA SP580开卡记录

前两天拆了笔记本上的威刚ADATA SP580 240GB&#xff0c;准备做移动硬盘用&#xff0c;装入移动硬盘盒之后接入电脑&#xff0c;发现系统可认盘&#xff0c;SMART显示正常&#xff0c;Windows的磁盘管理能显示正确容量&#xff0c;但处于未初始化状态&#xff0c;且始终无法初始…

装载问题(回溯法)

#include<iostream> using namespace std; int n;//货物的数量 int c;//轮船的总的载重量 int cw;//轮船当前的载重量 int r;//货物的总重量 int w[1000];//n个货物各自的重量 int x[1000];//当前最优解 int bestx[1000];//最优解 int bestw;//货物的最优载重量 void Bac…

单调队列优化DP——AcWing 135. 最大子序和

单调队列优化DP 定义 单调队列优化DP是一种在动态规划&#xff08;Dynamic Programming, DP&#xff09;中应用的数据结构优化方法。它利用单调队列&#xff08;Monotonic Queue&#xff09;这一数据结构来高效维护一个区间内的最值&#xff08;通常是最大值或最小值&#xf…

C++输出彩色方块

1.使用方法 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0xab); ———————————————————————————————————————— 0 黑色 1 蓝色 2 绿色 3 湖蓝色 4 红色 5 紫色 6 黄色 7 白色 8 灰色 9 …

QT事件处理及实例(鼠标事件、键盘事件、事件过滤)

这篇文章通过鼠标事件、键盘事件和事件过滤的三个实例介绍事件处理的实现。 鼠标事件及实例 鼠标事件包括鼠标的移动、按下、松开、单击和双击等。 创建一个MouseEvent项目&#xff0c;通过项目介绍如何获得和处理鼠标事件。程序效果如下图所示。 界面布局代码如下&#xff…

算法金 | K-均值、层次、DBSCAN聚类方法解析

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 聚类分析概述 聚类分析的定义与意义 聚类分析&#xff08;Clustering Analysis&#xff09;是一种将数据对象分成多个簇&#xff08;…

如何解决java程序CPU负载过高问题

1、介绍 在生产环境中&#xff0c;有时会遇到cpu占用过高且一直下不去的场景。这种情况可能会导致服务器宕机&#xff0c;进而中断对外服务&#xff0c;也会影响硬件寿命。 2、原因 1、Java代码存在因递归不当等原因导致的死循环的问题&#xff0c;推荐有条件的循环&#xf…

【Linux】性能分析器 perf 详解(一):简介、安装、stat命令演示

1、简介 perf 是由 Linux 官方提供的系统性能分析工具 。它包含两部分: perf_events ,Linux 内核中的一个子系统perf 命令,用户空间的应用程序内核子系统 perf_events 提供了性能计数器(hardware performance counters)和性能事件的支持,它以事件驱动型的方式工作,通过…

(笔记)Error: qemu-virgl: Failed to download resource “qemu-virgl--test-image“解决方法

错误&#xff1a; > Downloading https://www.ibiblio.org/pub/micro/pc-stuff/freedos/files/distributions/1.2/FD12FLOPPY.zip curl: (22) The requested URL returned error: 404Error: qemu-virgl: Failed to download resource "qemu-virgl--test-image" D…