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

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs

基于之前的博客《使用LoRA微调Llama 2》的内容,我们深入研究了一种称为量化低秩调整(QLoRA)的参数高效微调(PEFT)方法。本次重点是利用QLoRA技术在单块AMD GPU上,使用ROCm微调Llama-2 7B模型。通过使用QLoRA,可以解决内存和计算能力限制方面的挑战。本次探索旨在展示如何利用QLoRA来增强对开源大型语言模型的可访问性。

QLoRA微调

QLoRA是一种结合了高精度计算技术和低精度存储方法的微调技术。这有助于在确保模型仍然高性能和精确的同时,保持模型大小的小巧。

QLoRA如何工作?

简而言之,QLoRA在不牺牲性能的前提下,优化了LLM微调的内存使用,与标准的16位模型微调形成了对比。具体来说,QLoRA采用4位量化压缩预训练语言模型。然后冻结语言模型参数,并引入少量的可训练参数,以低秩适配器(Low-Rank Adapters)的形式。在微调过程中,QLoRA通过冻结的4位量化预训练语言模型反向传播梯度到低秩适配器中。值得注意的是,在训练期间,只有LoRA层进行更新。要更深入了解LoRA,请参阅原始的LoRA论文。

QLoRA与LoRA的比较

QLoRA和LoRA都是两种参数高效的微调技术。LoRA作为一个独立的微调方法运作,而QLoRA则结合了LoRA作为一个辅助机制,以解决量化过程中引入的错误,并在微调期间进一步最小化资源需求。

一步步使用QLoRA对Llama 2进行微调

本节将指导您通过QLoRA一步步对具有70亿参数的Llama 2模型进行微调,该模型可以在单个AMD GPU上运行。实现这一成就的关键在于QLoRA的关键支持,它在有效减少内存需求方面发挥了不可或缺的作用。
为此,我们将使用以下设置:
- 硬件 & 操作系统:请访问此链接,查看与ROCm兼容的硬件和操作系统列表。
- 软件:
    - ROCm 6.1.0+
    - Pytorch for ROCm 2.0+
- 库:`transformers`、`accelerate`、`peft`、`trl`、`bitsandbytes`、`scipy`

在这篇博客中,我们使用单个MI250GPU以及Docker镜像rocm/pytorch:rocm6.1_ubuntu20.04_py3.9_pytorch_2.1.2进行了实验。

您可以在Github仓库中找到这篇博客中使用的完整代码。

1. 开始

我们的第一步是确认GPU的可用性。

!rocm-smi --showproductname
    ========================= ROCm System Management Interface ========================= =================================== Product Info ===================================GPU[0]      : 系列:      AMD INSTINCT MI250 (MCM) OAM AC MBAGPU[0]      : 型号:       0x0b0cGPU[0]      : 制造商:      Advanced Micro Devices, Inc. [AMD/ATI]GPU[0]      : SKU:         D65209GPU[1]      : 系列:      AMD INSTINCT MI250 (MCM) OAM AC MBAGPU[1]      : 型号:       0x0b0cGPU[1]      : 制造商:      Advanced Micro Devices, Inc. [AMD/ATI]GPU[1]      : SKU:         D65207=================================================================================================================== End of ROCm SMI Log ===============================

如果您的AMD机器上有不止一个GCDs或GPUs,让我们只使用一个图形计算模块(GCD)或GPU。

import os
os.environ["HIP_VISIBLE_DEVICES"]="0"import torch
use_cuda = torch.cuda.is_available()
if use_cuda:print('__CUDNN VERSION:', torch.backends.cudnn.version())print('__Number CUDA Devices:', torch.cuda.device_count())cunt = torch.cuda.device_count()
    __CUDNN VERSION: 2020000__Number CUDA Devices: 1

接下来我们将安装所需的库。

!pip install -q pandas peft==0.9.0 transformers==4.31.0 trl==0.4.7 accelerate scipy
安装bitsandbytes

ROCm需要特殊版本的bitsandbytes(bitsandbytes-rocm).

1. 使用以下代码安装bitsandbytes。
 

git clone --recurse https://github.com/ROCm/bitsandbytes
cd bitsandbytes
git checkout rocm_enabled
pip install -r requirements-dev.txt
cmake -DCOMPUTE_BACKEND=hip -S . #Use -DBNB_ROCM_ARCH="gfx90a;gfx942" to target specific gpu arch
make
pip install .

2. 检查bitsandbytes版本。

在撰写本博客时,版本为0.43.0。

%%bash
pip list | grep bitsandbytes

3. 引入所需的包。

import torch
from datasets import load_dataset
from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,TrainingArguments,pipeline
)
from peft import LoraConfig
from trl import SFTTrainer

2. 配置模型和数据

模型配置

在Hugging Face提交请求并等待几天后,您可以访问Meta的官方Llama-2模型。作为替代,我们将使用NousResearch的Llama-2-7b-chat-hf作为我们的基础模型(它与原始模型相同,但更易于访问)。

# 模型和分词器名称
base_model_name = "NousResearch/Llama-2-7b-chat-hf"
new_model_name = "llama-2-7b-enhanced" #您可以为微调后的模型起自己的名字# 分词器
llama_tokenizer = AutoTokenizer.from_pretrained(base_model_name, trust_remote_code=True)
llama_tokenizer.pad_token = llama_tokenizer.eos_token
llama_tokenizer.padding_side = "right"  
QLoRA 4-bit量化配置

正如论文所述,QLoRA以4位存储权重,允许在16位或32位精度下进行计算。这意呞着每当使用QLoRA权重张量时,我们就将张量去量化到16位或32位精度,然后执行矩阵乘法。可以选择各种组合,例如float16、bfloat16、float32等。可以尝试不同的4位量化变种,包括规范化浮点4(NF4)或纯浮点4量化。然而,根据论文中的理论考量和经验结果,建议选择NF4量化,因为它往往能提供更好的性能。
在我们的案例中,我们选择了以下配置:
- 使用NF4类型的4位量化
- 16位(float16)进行计算
- 双重量化,这在第一次量化后使用第二次量化,可以额外节省每个参数0.3位
量化参数可以通过BitsandbytesConfig控制(参见Hugging Face文档:https://huggingface.co/docs/transformers/main_classes/quantization#transformers.BitsAndBytesConfig)如下:
- 通过load_in_4bit激活4位加载
- 用bnb_4bit_quant_type指定用于量化的数据类型。注意,支持两种量化数据类型:fp4(四位浮点数)和nf4(规范化四位浮点数)。后者对于正态分布的权重理论上是最优的,因此我们推荐使用nf4。
- 用bnb_4bit_compute_dtype指定用于线性层计算的数据类型
- 通过bnb_4bit_use_double_quant激活嵌套量化

# 量化配置
quant_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type="nf4",bnb_4bit_compute_dtype=torch.float16,bnb_4bit_use_double_quant=True
)

加载模型并设置量化配置。

base_model = AutoModelForCausalLM.from_pretrained(base_model_name,quantization_config=quant_config,device_map="auto"
)
base_model.config.use_cache = False
base_model.config.pretraining_tp = 1
数据集配置

我们使用一个名为mlabonne/guanaco-llama2-1k的小型数据集对我们的基础模型进行了微调,以进行问答任务。这个数据集是timdettmers/openassistant-guanaco数据集的一个子集(1000个样本)。该数据集是一个由人类生成、人类标注的助理风格对话语料库,它包含35种不同语言的161443条消息,带有461292个质量评分。这导致超过10000棵完全标注的对话树。

# Dataset
data_name = "mlabonne/guanaco-llama2-1k"
training_data = load_dataset(data_name, split="train")
# check the data
print(training_data.shape)
# #11 is a QA sample in English
print(training_data[11])
    (1000, 1){'text': '<s>[INST] write me a 1000 words essay about deez nuts. [/INST] The Deez Nuts meme first gained popularity in 2015 on the social media platform Vine. The video featured a young man named Rodney Bullard, who recorded himself asking people if they had heard of a particular rapper. When they responded that they had not, he would respond with the phrase "Deez Nuts" and film their reactions. The video quickly went viral, and the phrase became a popular meme. \n\nSince then, Deez Nuts has been used in a variety of contexts to interrupt conversations, derail discussions, or simply add humor to a situation. It has been used in internet memes, in popular music, and even in politics. In the 2016 US presidential election, a 15-year-old boy named Brady Olson registered as an independent candidate under the name Deez Nuts. He gained some traction in the polls and even made appearances on national news programs.\n\nThe Deez Nuts meme has had a significant impact on popular culture. It has become a recognizable catchphrase that people use to add humor to everyday conversations. The meme has also been used to satirize politics and other serious issues. For example, in 2016, a group of activists in the UK used the phrase "Deez Nuts for President" as part of a campaign to encourage young people to vote in the EU referendum. </s><s>[INST] Rewrite the essay in a more casual way. Instead of sounding proffesional, sound like a college student who is forced to write the essay but refuses to do so in the propper way. Use casual words and slang when possible. [/INST] Yo, so you want me to write a 1000-word essay about Deez Nuts? Alright, fine. So, this whole thing started on Vine back in 2015. Some dude named Rodney Bullard made a video where he would ask people if they knew a rapper, and when they said no, he would hit them with the classic line: "Deez Nuts!" People loved it, and it became a viral meme.\n\nNowadays, Deez Nuts is used for all kinds of stuff. You can throw it out there to interrupt someone or just to be funny. It\'s all over the internet, in music, and even in politics. In fact, during the 2016 US presidential election, a kid named Brady Olson registered as an independent candidate under the name Deez Nuts. He actually got some attention from the media and made appearances on TV and everything.\n\nThe impact of Deez Nuts on our culture is pretty huge. It\'s become a thing that everyone knows and uses to add some humor to their everyday conversations. Plus, people have used it to make fun of politics and serious issues too. Like, in the UK, some groups of activists used the phrase "Deez Nuts for President" to encourage young people to vote in the EU referendum.\n\nThere you have it, a thousand words about Deez Nuts in a more casual tone. Can I go back to playing video games now? </s>'}
## There is a dependency during training
!pip install tensorboardX

3. 开始微调

使用以下代码设置训练参数:

# 训练参数
train_params = TrainingArguments(output_dir="./results_modified",num_train_epochs=1,per_device_train_batch_size=4,gradient_accumulation_steps=1,optim="paged_adamw_32bit",save_steps=50,logging_steps=50,learning_rate=2e-4,weight_decay=0.001,fp16=False,bf16=False,max_grad_norm=0.3,max_steps=-1,warmup_ratio=0.03,group_by_length=True,lr_scheduler_type="constant",report_to="tensorboard"
)
使用QLoRA配置训练

现在您可以将LoRA集成到基准模型中,并评估其附加参数。LoRA实质上是向现有权重中添加了一对秩分解权重矩阵(称为更新矩阵),并且只训练新增加的权重。

from peft import get_peft_model
# LoRA配置
peft_parameters = LoraConfig(lora_alpha=8,lora_dropout=0.1,r=8,bias="none",task_type="CAUSAL_LM"
)
model = get_peft_model(base_model, peft_parameters)
model.print_trainable_parameters()
    trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.06220594176090199

注意LoRA只增加了0.062%的参数,这只是原始模型的一小部分。我们将通过微调更新这一百分比的参数,如下所示。

# 带有QLoRA配置的Trainer
fine_tuning = SFTTrainer(model=base_model,train_dataset=training_data,peft_config=peft_parameters,dataset_text_field="text",tokenizer=llama_tokenizer,args=train_params
)# 训练
fine_tuning.train()

输出看起来像这样:

[250/250 05:31, Epoch 1/1]\
Step     Training Loss \
50       1.557800 \
100      1.348100\
150      1.277000\
200      1.324300\
250      1.347700TrainOutput(global_step=250, training_loss=1.3709784088134767, metrics={'train_runtime': 335.085, 'train_samples_per_second': 2.984, 'train_steps_per_second': 0.746, 'total_flos': 8679674339426304.0, 'train_loss': 1.3709784088134767, 'epoch': 1.0})
使用QLoRA训练期间检查内存使用

在训练期间,您可以在终端使用“rocm-smi”命令来检查内存使用情况。该命令将产生以下输出,它告诉了内存和GPU的使用情况。

========================= ROCm System Management Interface =========================
=================================== Concise Info ===================================
GPU  Temp (DieEdge)  AvgPwr  SCLK     MCLK     Fan  Perf  PwrCap  VRAM%  GPU%  
0    50.0c           352.0W  1700Mhz  1600Mhz  0%   auto  560.0W   17%   100%  
====================================================================================
=============================== End of ROCm SMI Log ================================

为了更全面地理解QLoRA对训练的影响,我们将进行量化分析,比较QLoRA、LoRA和完整参数微调。这项分析将包括内存使用、训练速度、训练损失和其他相关指标,提供它们各自影响的全面评估。

4. QLoRA、LoRA和全参数微调的比较

我们将在前一篇有关如何使用LoRA微调Llama 2模型的博客文章的基础上——该文章展示了用LoRA和全参数方法微调Llama 2模型——增加QLoRA的结果。这旨在提供一个全面概述,结合了使用这三种微调方法所获得的见解。

Metric

Full-parameter

LoRA

QLoRA

Trainable parameters

6,738,415,616

4,194,304

4,194,304

Mem usage/GB

128

83.2

10.88

Number of GCDs

2

2

1

Training Speed

3 hours

9 minutes

6 minutes

Training Loss

1.368

1.377

1.347

• 内存使用量:
    ◦ 在全参数微调的情况下,有 6,738,415,616 个可训练参数,导致在训练反向传播阶段期间内存消耗显著。
    ◦ 相比之下,LoRA和QLoRA只引入了 4,194,304 个可训练参数,仅占全参数微调中总可训练参数的 *0.062%*。
    ◦ 当监控训练期间的内存使用时,很明显,使用LoRA进行微调仅使用了全参数微调内存使用量的65%。而QLoRA的表现更为出色,将内存消耗大幅降低到只有8%。
    ◦ 这为在有限的硬件资源限制下增加批量大小、最大序列长度和在更大的数据集上进行训练提供了机会。
• 训练速度:
    ◦ 结果表明,全参数微调需要 几小时 才能完成,而LoRA和QLoRA的微调仅需 *几分钟*。
    ◦ 训练速度加快的几个因素包括:
        ▪ LoRA中更少的可训练参数意味着更少的导数计算以及更少的存储和更新权重所需的内存。

        ▪ 全参数微调更容易受到内存限制的制约,在数据移动成为训练瓶颈时。这反映在更低的GPU利用率上。虽然调整训练设置可以缓解这一点,但可能需要更多的资源(额外的GPU)和更小的批量大小。
• 准确度:
    ◦ 在两次训练会话中,都观察到了训练损失的显著降低。我们对于三种微调方法都达到了相差无几的训练损失。
    ◦ 在QLoRA的原始研究中,作者提到了由于量化不精确而导致的性能损失,可以通过量化后的适配器微调完全恢复。与这个见解一致,我们的实验验证并呼应了这一观察,强调了在量化过程后恢复性能的适配器微调的有效性。 

5. 使用QLoRA微调后的模型进行测试

# 以FP16重新加载模型,并与微调后的权重合并
base_model = AutoModelForCausalLM.from_pretrained(base_model_name,low_cpu_mem_usage=True,return_dict=True,torch_dtype=torch.float16,device_map="auto"
)
from peft import LoraConfig, PeftModel
model = PeftModel.from_pretrained(base_model, new_model_name)
model = model.merge_and_unload()# 重新加载分词器以便保存
tokenizer = AutoTokenizer.from_pretrained(base_model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

现在,让我们上传模型到Hugging Face,这样我们就可以进行后续测试或与他人分享。要进行此步骤,您需要一个有效的Hugging Face账户。

现在我们可以使用基础模型(原始的)和微调后的模型进行测试。

测试基础模型
# Generate Text using base model
query = "What do you think is the most important part of building an AI chatbot?"
text_gen = pipeline(task="text-generation", model=base_model_name, tokenizer=llama_tokenizer, max_length=200)
output = text_gen(f"<s>[INST] {query} [/INST]")
print(output[0]['generated_text'])
测试微调后的模型
# Generate Text using fine-tuned model
query = "What do you think is the most important part of building an AI chatbot?"
text_gen = pipeline(task="text-generation", model=new_model_name, tokenizer=llama_tokenizer, max_length=200)
output = text_gen(f"<s>[INST] {query} [/INST]")
print(output[0]['generated_text'])
    <s>[INST] What do you think is the most important part of building an AI chatbot? [/INST] The most important part of building an AI chatbot is to ensure that it is able to understand and respond to user input in a way that is both accurate and natural-sounding.To achieve this, you will need to use a combination of natural language processing (NLP) techniques and machine learning algorithms to enable the chatbot to understand and interpret user input, and to generate appropriate responses.Some of the key considerations when building an AI chatbot include:1. Defining the scope and purpose of the chatbot: What kind of tasks or questions will the chatbot be able to handle? What kind of user input will it be able to understand?2. Choosing the right NLP and machine learning algorithms: There are many different NLP and machine learning algorithms available, and the right ones will depend on the

现在您可以根据给定的查询观察两个模型的输出。正如预期的那样,由于微调过程改变了模型的权重,两个输出显示了微小的差异。

相关文章:

增强大型语言模型(LLM)可访问性:深入探究在单块AMD GPU上通过QLoRA微调Llama 2的过程

Enhancing LLM Accessibility: A Deep Dive into QLoRA Through Fine-tuning Llama 2 on a single AMD GPU — ROCm Blogs 基于之前的博客《使用LoRA微调Llama 2》的内容&#xff0c;我们深入研究了一种称为量化低秩调整&#xff08;QLoRA&#xff09;的参数高效微调&#xff0…...

空间复杂度 线性表,顺序表尾插。

各位少年&#xff0c;大家好&#xff0c;我是那一脸阳光&#xff0c;本次分享的主题是时间复杂度和空间复杂度 还有顺序表文章讲解和分享&#xff0c;如有不对可以评论区指导。 时间复杂度例题 // 计算斐波那契递归Fib的时间复杂度&#xff1f; long long Fib(size_t N){if(N…...

linux创建用户、切换用户、删除用户

创建用户 # 创建新用户 sudo useradd newuser# 设置新用户的密码 sudo passwd newuser切换用户 # 切换到新用户 su newuser# 验证用户切换 whoami 删除用户 # 删除用户 sudo userdel -r username# 验证用户是否已被删除 grep username /etc/passwd 如果删除用户时提示&…...

BC64 牛牛的快递(c++)

牛牛的快递 题目描述输入描述输出描述示例代码 解题思路例如 题目描述 牛牛正在寄快递&#xff0c;他了解到快递在 1kg 以内的按起步价 20 元计算&#xff0c;超出部分按每 kg 1元计算&#xff0c;不足 1kg 部分按 1kg计算。如果加急的话要额外付五元&#xff0c;请问牛牛总共要…...

离线linux通过USB连接并使用手机网络

离线linux通过USB连接并使用手机网络 引场景 引 离线环境要安装一些软件特别麻烦&#xff0c;要自己去官网下载对应的包&#xff0c;然后上传到服务器上&#xff0c;再解压&#xff0c;编译&#xff0c;执行&#xff0c;配置变量等等&#xff0c;错一步都可能安装失败。有网络…...

I2C总线8位IO扩展器PCF8574

PCF8574用于I2C总线的远程8位I/O扩展器 PCF8574国产有多个厂家有替代产品&#xff0c;图示为其中一款HT8574 1 产品特点 低待机电流消耗&#xff1a;10 uA&#xff08;最大值&#xff09; I2C 转并行端口扩展器 漏极开路中断输出 与大多数微控制器兼容 具有大电流驱动能力的闭…...

webClient + fastJSON2 获取json格式的数据,同时解析至java class 并 下划线转驼峰

webClient中 .accept(MediaType.APPLICATION_JSON) 决定返回值是什么格式一般情况可以不写&#xff0c;但这里要获取JSON格式的 .bodyToMono(String.class)指定返回类型 fastJSON2中 Student student JSON.parseObject(result, Student.class, JSONReader.Feature.SupportSm…...

4、SpringMVC 实战小项目【加法计算器、用户登录、留言板、图书管理系统】

SpringMVC 实战小项目 3.1 加法计算器3.1.1 准备⼯作前端 3.1.2 约定前后端交互接⼝需求分析接⼝定义请求参数:响应数据: 3.1.3 服务器代码 3.2 ⽤⼾登录3.2.1 准备⼯作3.2.2 约定前后端交互接⼝3.2.3 实现服务器端代码 3.3 留⾔板实现服务器端代码 3.4 图书管理系统准备后端 3…...

OpenCV--形态学

形态学 形态学图像全局二值化自适应阈值腐蚀操作膨胀开运算闭运算形态学梯度顶帽操作黑帽操作 形态学 从图像中提取对表达和描绘区域形状有意义的图像分量 图像全局二值化 import cv2 import numpy as np """ 图像全局二值化--0与255 二值化的主要目的是通过…...

【LinuxC语言】IP地址相关的函数

文章目录 前言inet_addr()inet_aton()inet_ntoa()示例代码总结前言 在Linux C语言编程中,处理网络通信是一个核心主题,其中涉及到的IP地址相关函数扮演着至关重要的角色。这些函数允许我们在不同的网络层次上操作和管理IP地址,从而实现有效的数据传输和通信控制。本文将介绍…...

QT事件处理系统之五:自定义事件的发送案例 sendEvent和postEvent接口

1、案例 双击窗口,会发送 自定义事件,然后在事件过滤中心进行拦截处理自定义事件。 2、核心代码 /*解释:双击窗口时,将产生双击事件,然后该事件被包裹成一个对象,随后将会被发往event事件中心,然后进行事件的处理(Widget对象);因为m_lineEdit开启了事件过滤机制,所…...

模版与策略模式

一&#xff0c;怎么选择 如果需要固定的执行流程&#xff0c;选模版 如果不需要固定的执行流程&#xff0c;只需要对一个方法做具体抽象&#xff0c;选策略 参考文章&#xff1a; 常用设计模式汇总&#xff0c;告诉你如何学习设计模式 二&#xff0c;常用写法 子类 exten…...

SQL-Python

师从黑马程序员 数据库介绍 数据库就是存储数据的库 数据组织&#xff1a;库->表->数据 数据库和SQL的关系 MySQL的基础命令 SQL基础 SQL语言的分类 SQL的语法特征 DDL-库管理 show DATABASES;use sys;SELECT database();CREATE DATABASE test CHARSET utf-8;SHOW D…...

mysql索引以及优化

索引的作用 在数据库表中对字段建立索引可以大大提高查询速度 mysql索引类型 普通索引唯一索引&#xff1a; 唯一索引列的值必须唯一允许有空值&#xff0c;如果是组合索引&#xff0c;则列值的组合必须唯一create unique index indexName on mytable(username(length))修改表结…...

【pytorch06】 维度变换

常用API view/reshapesqueeze/unsqueezetranspose/t/permuteexpand/repeat view和reshape view操作的基本前提是保证numel()一致 a.view(4,28*28)的物理意义是把行宽以及通道合并在一起&#xff0c;对于4张图片&#xff0c;我们直接把所有数据都合在一起&#xff0c;用一个7…...

移动Web开发实战内容要点!!!

移动web开发 目录 移动web开发 第一章、Web开发标准与网页网站制作介绍 1.1Web开发标准 1.2网页基本构成元素 第二章、Web开发技术基础 2.1HTML的主要特点&#xff1a; 2.2HTML基本知识 2.3CSS样式 2.4JavaScript 第三章、打造移动Web应用程序 3.1为什么Android会成…...

spdlog生产者消费者模式

spdlog生产者消费者模式 spdlog提供了异步模式&#xff0c;显示的创建async_logger, 配合环形队列实现的消息队列和线程池实现了异步模式。异步logger提交日志信息和自身指针&#xff0c; 任务线程从消息队列中取出消息后执行对应的sink和flush动作。 1. 环形队列 1.1 环形队…...

日语 13 14

13. スピーチの依頼 いらい 自信 自信 自信 自信 自信 じしん 折り入って 折り入って 折り入って おりいって  诚恳 頼み 頼み 頼み 頼み 頼み  たのみ 请求 整備 整備 整備 整備 整備 せいび 维修 肥満 肥満 肥満 肥満 肥満 ひまん 肥胖 権利 …...

初学者应该掌握的MySQL数据库的基本组成部分及概念

MySQL数据库作为一种开源的关系型数据库管理系统&#xff0c;被广泛应用于Web应用开发和数据存储。它具有高性能、易用性和可靠性等特点&#xff0c;是开发者们的首选之一。在本篇文章中&#xff0c;我们将详细介绍MySQL数据库的核心组成部分&#xff0c;帮助你深入理解这个强大…...

四川汇聚荣科技有限公司怎么样?

在探讨一家科技公司的综合实力时&#xff0c;我们往往从多个维度进行考量&#xff0c;包括但不限于公司的发展历程、产品与服务的质量、市场表现、技术创新能力以及企业文化。四川汇聚荣科技有限公司作为一家位于中国西部的科技企业&#xff0c;其表现和影响力自然也受到业界和…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...