如何从零训练多模态大模型(预训练方向)

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.

针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

汇总合集:

《大模型面试宝典》(2024版) 发布!


本文介绍如何训练 LLaVA v1.5 多模态模型。

LLaVA 训练包括特征对齐阶段(feature alignment stage)和视觉指令微调阶段(visual instruction tuning stage),其中特征对齐阶段使用 LAION-CC-SBU 数据集的 558K 子集(记为 LLaVA-Pretrain),目的是训练 MLP connector(或称为 projector),而视觉指令微调阶段使用 GPT-4 生成的 150K 条多模态指令跟随数据和来自学术任务的 515K 条 VQA 数据引导 LLaVA 模型遵从多模态指令。

官方给出的 LLaVA v1.5 使用了 8 个 A100 GPU(80G)进行训练,如果我们没有 8 个 GPU 或者足够的显存(80G),可以减小per_device_train_batch_size的值并增大gradient_accumulation_steps,始终保证全局 batch size 不变,其中 batch size 的大小等于 per_device_train_batch_sizexgradient_accumulation_stepsxnum_gpus 。

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了大模型算法岗技术与面试交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2040,备注:技术交流

用通俗易懂方式讲解系列

  • 用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)
  • 用通俗易懂的方式讲解:1.6万字全面掌握 BERT
  • 用通俗易懂的方式讲解:NLP 这样学习才是正确路线
  • 用通俗易懂的方式讲解:28张图全解深度学习知识!
  • 用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库
  • 用通俗易懂的方式讲解:实体关系抽取入门教程
  • 用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer
  • 用通俗易懂的方式讲解:图解 Transformer 架构
  • 用通俗易懂的方式讲解:大模型算法面经指南(附答案)
  • 用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期
  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain
  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统
  • 用通俗易懂的方式讲解:最全的大模型 RAG 技术概览
  • 用通俗易懂的方式讲解:利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序
  • 用通俗易懂的方式讲解:使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA
  • 用通俗易懂的方式讲解:面了 5 家知名企业的NLP算法岗(大模型方向),被考倒了。。。。。
  • 用通俗易懂的方式讲解:NLP 算法实习岗,对我后续找工作太重要了!。
  • 用通俗易懂的方式讲解:理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。
  • 用通俗易懂的方式讲解:基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统
  • 用通俗易懂的方式讲解:面试字节大模型算法岗(实习)
  • 用通俗易懂的方式讲解:大模型算法岗(含实习)最走心的总结
  • 用通俗易懂的方式讲解:大模型微调方法汇总

下面以 LLaVA-v1.5-13B 为例介绍 LLaVA 模型的训练。

特征对齐阶段

准备数据

下载 LLaVA-Pretrain[2] 数据集
# 将数据下载到 ./playground/data/LLaVA-Pretrain,否则需要修改启动脚本的 data_path 参数
huggingface-cli download --repo-type dataset liuhaotian/LLaVA-Pretrain --local-dir ./playground/data/LLaVA-Pretrain

LLaVA-Pretrain 包含 3 个文件:

  • blip_laion_cc_sbu_558k.json:此数据的构造过程是将 image-caption 数据添加随机选择的指令(例如:“Describe this image”)转换成多模态对话,下面是数据示例:
{
    'id': '004539375',
    'image': '00453/004539375.jpg',
    'conversations': [
      {
        'from': 'human',
        'value': 'Render a clear and concise summary of the photo.\n<image>'
      },
      {
        'from': 'gpt',
        'value': 'select luxury furniture 3 - inch gel memory foam mattress topper'
      }
    ]
  },
  • blip_laion_cc_sbu_558k_meta.json:包含 3 种元数据,分别是图像路径、图像 URL 和 blip_caption
{
    'id': '004539375',
    'image': '00453/004539375.jpg',
    'blip_caption': 'select luxury furniture 3 - inch gel memory foam mattress topper',
    'url': 'http://ec1.ostkcdn.com/images/products/8111140/P15459545.jpg'
  }
  • images.zip:LAION/CC/SBU 筛选后的子集
解压images.zip
# 解压到 ./playground/data/LLaVA-Pretrain/images,否则需要修改启动脚本的 image_folder 参数
unzip ./playground/data/LLaVA-Pretrain/images.zip -d ./playground/data/LLaVA-Pretrain/images

启动训练

在这个阶段,使用 8 个 A100(80G)训练 LLaVA-v1.5-13B 大约需要 5.5 小时。

启动的脚本是scripts/v1_5/pretrain.sh,它的内容如下:

#!/bin/bash
deepspeed llava/train/train_mem.py \
    --deepspeed ./scripts/zero2.json \  # 使用 DeepSpeed ZeRO-2
    --model_name_or_path lmsys/vicuna-13b-v1.5 \  # 语言模型是 lmsys/vicuna-13b-v1.5
    --version plain \
    --data_path ./playground/data/LLaVA-Pretrain/blip_laion_cc_sbu_558k.json \  # 训练样本文件
    --image_folder ./playground/data/LLaVA-Pretrain/images \  # 存放图像的目录
    --vision_tower openai/clip-vit-large-patch14-336 \  # 视觉编码器
    --mm_projector_type mlp2x_gelu \  # projector 的类型
    --tune_mm_mlp_adapter True \  # 是否训练 projector
    --mm_vision_select_layer -2 \
    --mm_use_im_start_end False \
    --mm_use_im_patch_token False \
    --bf16 True \
    --output_dir ./checkpoints/llava-v1.5-13b-pretrain \  # 保存的路径
    --num_train_epochs 1 \
    --per_device_train_batch_size 32 \
    --per_device_eval_batch_size 4 \
    --gradient_accumulation_steps 1 \
    --evaluation_strategy 'no' \
    --save_strategy 'steps' \
    --save_steps 24000 \
    --save_total_limit 1 \
    --learning_rate 1e-3 \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type 'cosine' \
    --logging_steps 1 \
    --tf32 True \
    --model_max_length 2048 \
    --gradient_checkpointing True \
    --dataloader_num_workers 4 \
    --lazy_preprocess True \
    --report_to wandb

启动脚本:

sh ./scripts/v1_5/pretrain.sh

启动训练后,会自动下载语言模型视觉编码器的权重,完成权重的下载后会提示是否需要使用 wandb 可视化结果,这里按需选择即可。

图片

接下来就开始了训练,下面是 loss 的部分日志:

图片

训练完成后,权重会保存在./checkpoints/llava-v1.5-13b-pretrain目录。

视觉指令微调阶段

完成特征对齐阶段的训练后,我们进入视觉指令微调阶段。注意:如果我们跳过特征对齐阶段的训练,则需要将对应的 projector 下载到./checkpoints目录,下载的命令如下:

huggingface-cli download liuhaotian/llava-v1.5-mlp2x-336px-pretrain-vicuna-13b-v1.5 --local-dir ./checkpoints/llava-v1.5-13b-pretrain

准备数据

下载数据集
  • 下载 llava_v1_5_mix665k.json[3]
# 将数据下载到 ./playground/data/LLaVA-Instruct-150K
huggingface-cli download --repo-type dataset liuhaotian/LLaVA-Instruct-150K --local-dir ./playground/data/LLaVA-Instruct-150K
cp ./playground/data/LLaVA-Instruct-150K/llava_v1_5_mix665k.json ./playground/data/llava_v1_5_mix665k.json

下面是 llava_v1_5_mix665k.json 的示例:

{
    'id': '000000033471',  // 样本的唯一 id
    'image': 'coco/train2017/000000033471.jpg',  // 可以是绝对路径,也可以是相对于 image_folder 的路径
    'conversations': [
      {
        'from': 'human',
        'value': '<image>\nWhat are the colors of the bus in the image?'
      },
      {
        'from': 'gpt',
        'value': 'The bus in the image is white and red.'
      },
      {
        'from': 'human',
        'value': 'What feature can be seen on the back of the bus?'
      },
      {
        'from': 'gpt',
        'value': 'The back of the bus features an advertisement.'
      },
      {
        'from': 'human',
        'value': 'Is the bus driving down the street or pulled off to the side?'
      },
      {
        'from': 'gpt',
        'value': 'The bus is driving down the street, which is crowded with people and other vehicles.'
      }
    ]
  },
  • 下载 COCO train2017[4]
wget http://images.cocodataset.org/zips/train2017.zip -P ./playground/data/coco
unzip ./playground/data/coco/train2017.zip -d ./playground/data/coco
  • 下载 GQA images[5]
wget https://downloads.cs.stanford.edu/nlp/data/gqa/images.zip -P ./playground/data/gqa
unzip ./playground/data/gqa/images.zip -d ./playground/data/gqa
  • •下载 OCR-VQA[6] 将 OCR-VQA 中的 dataset.json 和 loadDataset.py 文件下载到 ./playground/data/ocr_vqa 目录。注释 loadDataset.py 中的 pdb.set_trace()后执行下面的命令:
cd ./playground/data/ocr_vqa
python loadDataset.py
# 回到 LLaVA 目录
cd ../../../

使用下面的代码处理 OCR-VQA 图像的后缀问题[7]:

import json
import os

with open('./playground/data/llava_v1_5_mix665k.json') as f:
    samples = json.load(f)

for sample in samples:
    if 'image' not in sample:
        continue

    img_path = os.path.join('./playground/data', sample['image'])
    if not os.path.exists(img_path):
        # 处理 OCR-VQA 图像后缀和 llava_v1_5_mix665k.json 中的后缀不一致问题
        img_path_wo_ext = os.path.splitext(img_path)[0]
        for ext in ['.png', '.gif']:
            real_path = img_path_wo_ext + ext
            if os.path.exists(real_path):
                # 重命名
                os.replace(real_path, img_path)
                break

也可以参考 https://github.com/haotian-liu/LLaVA/pull/1458 给出的路径下载 ORC-VQA 数据。

  • 下载 TextVQA[8]
wget https://dl.fbaipublicfiles.com/textvqa/images/train_val_images.zip -P ./playground/data/textvqa
unzip ./playground/data/textvqa/train_val_images.zip -d ./playground/data/textvqa
  • 下载 VisualGenome part1[9] 和 part2[10]
wget https://cs.stanford.edu/people/rak248/VG_100K_2/images.zip -P ./playground/data/vg
wget https://cs.stanford.edu/people/rak248/VG_100K_2/images2.zip -P ./playground/data/vg
unzip ./playground/data/vg/images.zip -d ./playground/data/vg
unzip ./playground/data/vg/images2.zip -d ./playground/data/vg
数据集结构

完成数据集的下载后,检查数据集的目录结构是否和下面的一致:

├── coco
│   ├── train2017
│   │   ├── xxx.jpg
├── gqa
│   ├── images
│   │   ├── xxx.jpg
├── llava_v1_5_mix665k.json
├── ocr_vqa
│   ├── dataset.json
│   ├── images
│   │   ├── xxx.jpg
│   └── loadDataset.py
├── textvqa
│   ├── train_images
│   │   ├── xxx.jpg
│── vg
├── └── VG_100K
│   │   ├── xxx.jpg
├── │── VG_100K_2
│   │   ├── xxx.jpg

使用下面的代码检查数据目录结构:

import json
import os

with open('./playground/data/llava_v1_5_mix665k.json') as f:
    samples = json.load(f)

missing_cnt = 0  # 记录图像路径不存在的个数
for sample in samples:
    if 'image' not in sample:
        continue

    img_path = os.path.join('./playground/data', sample['image'])
    if not os.path.exists(img_path):
        missing_cnt += 1

print(missing_cnt)

如果 missing_cnt 为 0,则说明数据的目录结构是正确的。

启动训练

在启动训练前,请查看 https://github.com/haotian-liu/LLaVA/issues/1144 以避免训练结束后权重保存出错。

在这个阶段,使用 8 个 A100(80G)训练 LLaVA-v1.5-13B 大约需要 20 小时。启动的脚本是scripts/v1_5/finetune.sh,它的内容如下:

#!/bin/bash

deepspeed llava/train/train_mem.py \
    --deepspeed ./scripts/zero3.json \  # 使用 DeepSpeed ZeRO-3
    --model_name_or_path lmsys/vicuna-13b-v1.5 \
    --version v1 \
    --data_path ./playground/data/llava_v1_5_mix665k.json \  # 训练样本
    --image_folder ./playground/data \  # 存放图像的目录
    --vision_tower openai/clip-vit-large-patch14-336 \
    --pretrain_mm_mlp_adapter ./checkpoints/llava-v1.5-13b-pretrain/mm_projector.bin \
    --mm_projector_type mlp2x_gelu \  # projector 的类型
    --mm_vision_select_layer -2 \
    --mm_use_im_start_end False \
    --mm_use_im_patch_token False \
    --image_aspect_ratio pad \
    --group_by_modality_length True \
    --bf16 True \
    --output_dir ./checkpoints/llava-v1.5-13b \
    --num_train_epochs 1 \
    --per_device_train_batch_size 16 \
    --per_device_eval_batch_size 4 \
    --gradient_accumulation_steps 1 \
    --evaluation_strategy 'no' \
    --save_strategy 'steps' \
    --save_steps 50000 \
    --save_total_limit 1 \
    --learning_rate 2e-5 \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type 'cosine' \
    --logging_steps 1 \
    --tf32 True \
    --model_max_length 2048 \
    --gradient_checkpointing True \
    --dataloader_num_workers 4 \
    --lazy_preprocess True \
    --report_to wandb

启动脚本:

sh ./scripts/v1_5/finetune.sh

启动训练后,会询问是否需要使用 wandb 可视化结果,这里按需选择即可。

图片

接下来就开始了训练,下面是 loss 的部分日志:

图片

训练完成后,权重会保存在./checkpoints/llava-v1.5-13b目录。注意:如果单卡显存不足 80G,可以使用 LoRA 微调脚本 finetune_lora.sh[11]。完成训练后,可以参考 LLaVA 评测[12]对模型的性能进行评测。

微调自定义数据集

参考 Finetune LLaVA on Custom Datasets[13]

将训练样本以列表的形式保存到 json 文件,其中每一个样本是一个字典,它至少包含三个字段:

  • id:全局唯一的字符串

  • image:图片的路径,可以是绝对路径,也可以是相对于image_folder的相对路径

  • conversations:人类和语言模型的对话

下面是一个示例:

[
  {
    'id': '997bb945-628d-4724-b370-b84de974a19f',
    'image': 'part-000001/997bb945-628d-4724-b370-b84de974a19f.jpg',
    'conversations': [
      {
        'from': 'human',
        'value': '<image>\nWrite a prompt for Stable Diffusion to generate this image.'
      },
      {
        'from': 'gpt',
        'value': 'a beautiful painting of chernobyl by nekro, pascal blanche, john harris, greg rutkowski, sin jong hun, moebius, simon stalenhag. in style of cg art. ray tracing. cel shading. hyper detailed. realistic. ue 5. maya. octane render. '
      },
    ]
  },
  ...
]

完成数据的处理后,修改 finetune.sh[14] 中的 data_path 参数(必须)以及其他想要调整的参数(可选,例如学习率)。

修改完成后,即可启动训练:

sh ./scripts/v1_5/finetune.sh

以上就是 LLaVA 的训练流程。

引用链接

[1] 官方教程: https://github.com/haotian-liu/LLaVA?tab=readme-ov-file#train
[2] LLaVA-Pretrain: https://huggingface.co/datasets/liuhaotian/LLaVA-Pretrain
[3] llava_v1_5_mix665k.json: https://huggingface.co/datasets/liuhaotian/LLaVA-Instruct-150K/blob/main/llava_v1_5_mix665k.json
[4] COCO train2017: http://images.cocodataset.org/zips/train2017.zip
[5] GQA images: https://downloads.cs.stanford.edu/nlp/data/gqa/images.zip
[6] OCR-VQA: https://drive.google.com/drive/folders/1_GYPY5UkUy7HIcR0zq3ZCFgeZN7BAfm_?usp=sharing
[7] OCR-VQA 图像的后缀问题: https://github.com/haotian-liu/LLaVA/issues/601
[8] TextVQA: https://dl.fbaipublicfiles.com/textvqa/images/train_val_images.zip
[9] part1: https://cs.stanford.edu/people/rak248/VG_100K_2/images.zip
[10] part2: https://cs.stanford.edu/people/rak248/VG_100K_2/images2.zip
[11] finetune_lora.sh: https://github.com/haotian-liu/LLaVA/blob/main/scripts/v1_5/finetune_lora.sh
[12] LLaVA 评测: https://github.com/haotian-liu/LLaVA?tab=readme-ov-file#evaluation
[13] Finetune LLaVA on Custom Datasets: https://github.com/haotian-liu/LLaVA/blob/main/docs/Finetune_Custom_Data.md
[14] finetune.sh: https://github.com/haotian-liu/LLaVA/blob/main/scripts/v1_5/finetune.sh

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

所爱隔山海,上海婚恋交友app开发,我奔向你

每每讲到婚恋&#xff0c;就有感叹“难”的声音&#xff0c;在婚恋市场上&#xff0c;到处充斥者“难”的声音&#xff0c;更有胜者&#xff0c;甚至发出了“难于上青天”的感叹。在婚恋市场蹉跎浮沉的青年俊女们&#xff0c;越挫越勇&#xff0c;向着爱的呼唤&#xff0c;一次…

Java工具-实现无损png转换jpg格式

目录 1、背景说明 2、通过代码实现格式转换 3、无损转化 4、说明 读取 PNG 图像&#xff1a; 创建空的 JPG 图像&#xff1a; 绘制 PNG 图像到 JPG 图像&#xff1a; 设置 JPG 图片压缩质量&#xff1a; 写入 JPG 文件并关闭流&#xff1a; 5、jpg转png 1、背景说明 …

Opencv图像梯度计算

Opencv图像梯度计算 Sobel算子 可以理解为是做边缘检测的一种方法。 首先说明自己对图像梯度的简单理解&#xff1a;简单理解就是图像的颜色发生变化的边界区域在X方向和Y方向上的梯度值 Gx Gy 而Gx和Gy处的梯度的计算—使用下面的公式来进行计算。 G x [ − 1 0 1 − 2 0 …

计算机网络(5) ARP协议

什么是ARP 地址解析协议&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确定…

【MySQL】mysql中常见的内置函数(日期、字符串、数学函数)

文章目录 案例表日期函数字符串函数数学函数其他函数 案例表 emp students 表 exam_result 表 日期函数 注意current_time和now的区别 案例一&#xff1a; 创建一张表用来记录生日&#xff0c;表结构如下 添加日期&#xff1a; insert tmp (birthday) values (2003-01-3…

香港CN2线路回国加速CDN介绍

随着互联网的迅猛发展&#xff0c;跨境数据传输的需求日益增加。尤其对于中国内地用户来说&#xff0c;访问海外网站和应用时&#xff0c;常常会面临网络延迟高、加载速度慢的问题。为了优化这一体验&#xff0c;香港 CN2 线路回国加速 CDN 成为了许多企业和个人的首选解决方案…

从Log4j和Fastjson RCE漏洞认识jndi注入

文章目录 前言JNDI注入基础介绍靶场搭建漏洞验证注入工具 log4j RCE漏洞分析漏洞靶场检测工具补丁绕过 Fastjson RCE漏洞分析漏洞靶场检测工具补丁绕过 总结 前言 接着前文的学习《Java反序列化漏洞与URLDNS利用链分析》&#xff0c;想了解为什么 Fastjson 反序列化漏洞的利用…

Java中的方法重写与重载

在Java编程语言中&#xff0c;方法重写&#xff08;Override&#xff09;和方法重载&#xff08;Overload&#xff09;是实现代码多态性的两种基本方式。它们允许程序员以多种方式使用相同的方法名&#xff0c;增加了程序的可读性和可重用性&#xff0c;但它们的应用场景和规则…

Nginx+KeepAlived高可用负载均衡集群的部署

目录 一.KeepAlived补充知识 1.一个合格的群集应该具备的特点 2.健康检查&#xff08;探针&#xff09;常用的工作方式 3.相关面试问题 问题1 问题2 二.Keepealived脑裂现象 1.现象 2.原因 硬件原因 运用配置原因 3.解决 4.预防 方法1 方法2 方法3 方法4 三.…

【Spine学习04】之让角色动起来

1、切换左上角模式&#xff1a;设置改为动画 2、选择两个手臂的大臂节点 3、打开勾选自动关键帧按钮 4、开始K帧&#xff1a; Space空格可以快捷查看小黄人所有关键帧

英语翻译人工翻译优势

在全球化的时代&#xff0c;跨文化交流至关重要&#xff0c;而翻译则是连接不同语言和文化的重要桥梁。尽管近年来人工智能翻译取得了显著进展&#xff0c;但人工翻译的需求仍然无可替代&#xff0c;尤其是在专业和技术翻译领域。下面从专业角度阐述人工翻译相较于人工智能翻译…

python如何终止程序运行

方法1&#xff1a;采用sys.exit(0)&#xff0c;正常终止程序&#xff0c;从图中可以看到&#xff0c;程序终止后shell运行不受影响。 方法2&#xff1a;采用os._exit(0)关闭整个shell&#xff0c;从图中看到&#xff0c;调用sys._exit(0)后整个shell都重启了&#xff08;RESTAR…

[c++刷题]贪心算法.N01

题目如上: 首先通过经验分析&#xff0c;要用最少的减半次数&#xff0c;使得数组总和减少至一半以上&#xff0c;那么第一反应就是每次都挑数组中最大的数据去减半&#xff0c;这样可以是每次数组总和值减少程度最大化。 代码思路:利用大根堆去找数据中的最大值&#xff0c;…

VScode中连接并使用docker容器

前提条件&#xff1a; 1.在windows下安装Docker Desktop(方法可见下面的教程) Docker Desktop 安装使用教程-CSDN博客 2.在vscode安装3个必备的插件 3.先在ubuntu中把docker构建然后运行 4.打开vscode&#xff0c;按下图顺序操作 调试好之后上传到git上&#xff0c;然后后面…

李宏毅深度学习01——基本概念简介

视频链接 基本概念 Regression&#xff08;回归&#xff09;&#xff1a; 类似于填空 Classification&#xff08;分类&#xff09;&#xff1a; 类似于选择 Structure Learning&#xff08;机器学习&#xff09;&#xff1a; &#xff1f;&#xff1f; 机器学习找对应函数…

字符串排序-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第82讲。 字符串排序&#…

SSH协议

SSH协议简介 SSH&#xff08;Secure Shell&#xff09;是一种网络安全协议&#xff0c;用于在不安全的网络环境中提供加密的远程登录和其他网络服务。它通过加密和认证机制实现安全的访问和文件传输等业务&#xff0c;是Telnet、FTP等不安全远程shell协议的安全替代方案。 SSH协…

HSP_08章 断点调试

P100 断点调试 1. 基本介绍 一个实际场景 在开发中&#xff0c;新手程序员在查找错误时&#xff0c;这时有经验的程序员就会提示&#xff0c;可以用断点调试&#xff0c;一步一步的看源码执行的过程, 从而发现错误所在。 断点调试介绍 -基本介绍 2. 函数的调试

使用Ventoy制作U盘启动安装系统

简介 Ventoy是一个制作可启动U盘的开源工具。 无需反复地格式化U盘。你只要制作一次U盘启动盘&#xff0c;后面你只需要把 ISO/WIM/IMG/VHD(x)/EFI 等类型的系统镜像文件直接拷贝到U盘里面就可以启动了&#xff0c;无需其他操作。可以一次性拷贝很多个不同类型的镜像文件&…

文件监控工具——inotify-tools使用

在做灰盒测试和恶意程序分析的时候&#xff0c;经常需要寻找创建、删除、修改的文件&#xff0c;而在无法确定操作的文件或生成的文件路径时&#xff0c;就需要用到可以监控文件和目录的工具了。比如测试任意文件上传时&#xff0c;文件名被改为随机字符串且HTTP响应中不返回文…