DatawhaleAI夏令营 多模态大模型

news2024/9/21 10:40:01

任务讲解

此次的任务和一般以模型为中心的任务不同,是以数据为核心的。要求在官方给定的数据集的基础上进行数据清洗和数据合成,生成更为优质的数据集,以提高多模态模型的性能。(此次的模型以图文能力为主)

我们将会对给定的数据集进行 data-juicer 的处理,data-juicer相当于是一个数据集的处理管线,它可以帮我们用各类定制化的算子实现的pipeline来对我们的数据集进行多样组合的处理,同时我们也可以用 data-juicer 复现很多无论是传统多模态、大语言模型还是视频理解相关模型的数据处理工作;在处理工作结束后,我们将会使用 MGM 增强框架来对多模态模型进行微调。

多模态模型有两个关键组件,一是视觉编码器,二是语言模型,其中我们将会使用 gemma 作为我们的语言模型基座,gemma-2B 是谷歌开源的强大人工智能模型,参数量只有2B;而对于视觉编码器我们将会使用使用 CLIP-L (clip-vit-large-patch14-336)。这两个模型我们也可以在微调代码中可以完全看见全流程。

所以,我们需要做的事情是尽量找到合适的方式组织数据集,通过算子的排列组合演奏出美妙的数据奏曲;不过 data-juicer 的算子还是比较多的,之后我们会对他的细节进行详细学习。

Baseline详解

具体的代码大家可以去链接里找到,Datawhale提供了非常详尽的教程。

Datawhale (linklearner.com)

在此只是大概回顾一下整个baseline的流程。

环境准备

SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)

# for data-juicer
echo "[1] Installing toolkit/data-juicer"
cd ${SCRIPT_DIR}/toolkit
git clone https://github.com/modelscope/data-juicer.git
cd data-juicer
pip install ".[all]"

# for MGM training
echo "[2] Installing toolkit/training"
cd ${SCRIPT_DIR}/toolkit/training
pip install -e .
pip install flash-attn --no-build-isolation

echo "Done"

这个部分就是最基础的环境准备。

下载数据集

SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)

# for base models
echo "[1] Downloading base models for training..."
mkdir -p ${SCRIPT_DIR}/toolkit/training/model_zoo/LLM/gemma
cd ${SCRIPT_DIR}/toolkit/training/model_zoo/LLM/gemma
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/models/gemma-2b-it.tar.gz
tar zxvf gemma-2b-it.tar.gz

mkdir -p ${SCRIPT_DIR}/toolkit/training/model_zoo/OpenAI
cd ${SCRIPT_DIR}/toolkit/training/model_zoo/OpenAI
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/models/clip-vit-large-patch14-336.tar.gz
tar zxvf clip-vit-large-patch14-336.tar.gz
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/models/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup.tar.gz
tar zxvf openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup.tar.gz

# for training data
echo "[2] Downloading seed datasets..."
mkdir -p ${SCRIPT_DIR}/input
cd ${SCRIPT_DIR}/input
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/data/stage_1/pretrain_stage_1_10k.tar.gz
tar zxvf pretrain_stage_1_10k.tar.gz
cd pretrain_stage_1_10k
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/data/stage_1/mgm_pretrain_stage_1_10k.jsonl
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/data/stage_1/stage_1.json

echo "[3] Downloading finetuning datasets..."
mkdir -p ${SCRIPT_DIR}/toolkit/training/data
cd ${SCRIPT_DIR}/toolkit/training/data
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/data/stage_1/finetuning_stage_1_12k.tar.gz
tar zxvf finetuning_stage_1_12k.tar.gz
cd finetuning_stage_1_12k
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/data/stage_1/mgm_instruction_stage_1_12k.json

# for eval data
echo "[4] Downloading evaluation datasets"
mkdir -p ${SCRIPT_DIR}/toolkit/training/data
cd ${SCRIPT_DIR}/toolkit/training/data
axel -n 5 http://dail-wlcb.oss-cn-wulanchabu.aliyuncs.com/dj-competition/better_synth/data/stage_1/eval_stage_1.tar.gz
tar zxvf eval_stage_1.tar.gz

echo "Done"

这里我们下载得到用于训练、评测模型的数据,同时解释一下axel:一个linux用于加速下载的轻量级工具。

数据处理

Image Caption任务结合了计算机视觉和自然语言处理,目标是让AI理解图像并自动生成描述

我们选择BLIP作为多模态caption算子,Data-juicer调用该算子来进行图片对应文字字幕的获取。

(BLIP 是 2022 年的 caption 工作,发表在 ICML-2022,在多模态大模型还没有横空出世的时候,BLIP就是那个时代的caption小王子(当然现在已经是老王子了);对我们来说 BLIP 以他免费、免费、免费、且参数量小的优势为我们所称道)

首先需要下载BLP模型:

### 下载BLIP模型,大概需要20分钟
from modelscope import snapshot_download

model_dir = snapshot_download('goldsj/blip2-opt-2.7b', 
                              cache_dir='/root/autodl-tmp/better_synth_challenge_baseline/models', 
                              revision='master')

dataset_path: input/pretrain_stage_1_10k/mgm_pretrain_stage_1_10k.jsonl
export_path: output/image_captioning_output/res_10k.jsonl

np: 1
process:
  - image_captioning_mapper:
      hf_img2seq: '/root/autodl-tmp/better_synth_baseline_autoDL/models/goldsj/blip2-opt-2___7b'  # You can replace this path to a local downloaded HF model
      keep_original_sample: false  # we only need the recaptioned captions

训练

主要是分为pretrain和finetune环节。

首先是有关显卡的相关配置,这里强烈建议大家对照教程认真设置。

#!/bin/bash
############################################################################
########################### Editable Part Begins ###########################
############################################################################

# exp meta information
EXP_NAME=default
PRETRAIN_DATASET=../output/image_captioning_output/res_10k.jsonl
PRETRAIN_DATASET_IMAGE_PATH=../input/pretrain_stage_1_10k

# training args
# pretraining
# make sure PRETRAIN_BATCH_SIZE_PER_GPU * PRETRAIN_GRADIENT_ACCUMULATION_STEPS * num_gpus = 256
# **NOTICE**: the default setting is for 1 GPU
PRETRAIN_BATCH_SIZE_PER_GPU=2
PRETRAIN_GRADIENT_ACCUMULATION_STEPS=128
PRETRAIN_DATALOADER_NUM_WORKERS=4
# finetuning
# make sure FINETUNE_BATCH_SIZE_PER_GPU * FINETUNE_GRADIENT_ACCUMULATION_STEPS * num_gpus = 128
# **NOTICE**: the default setting is for 1 GPU
FINETUNE_BATCH_SIZE_PER_GPU=2
FINETUNE_GRADIENT_ACCUMULATION_STEPS=64
FINETUNE_DATALOADER_NUM_WORKERS=4
# log and ckpt
LOGGING_STEP=1
CKPT_SAVE_STEPS=100
TOTAL_SAVE_CKPT_LIMIT=1

# inference args
# inference for some benchmarks supports multi-gpus
INFER_CUDA_IDX="0"
############################################################################
############################ Editable Part Ends ############################
############################################################################
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)

ORIGINAL_DATASET_ALL=$SCRIPT_DIR/../input/pretrain_stage_1_10k/stage_1.json

# check the global size
PRETRAIN_PASS=`python $SCRIPT_DIR/training/preprocess/check_global_batch_size.py $PRETRAIN_BATCH_SIZE_PER_GPU $PRETRAIN_GRADIENT_ACCUMULATION_STEPS 256`
if [ "$PRETRAIN_PASS" = "False" ]; then
    echo "[ERROR] The global batch size of pretraining stage is not 256! Please check and retry."
    exit
fi
FINETUNE_PASS=`python $SCRIPT_DIR/training/preprocess/check_global_batch_size.py $FINETUNE_BATCH_SIZE_PER_GPU $FINETUNE_GRADIENT_ACCUMULATION_STEPS 128`
if [ "$FINETUNE_PASS" = "False" ]; then
    echo "[ERROR] The global batch size of finetuning stage is not 128! Please check and retry."
    exit
fi

# check number of dataset samples
MAX_SAMPLE_NUM=200000
SAMPLED_PRETRAIN_DATASET=$PRETRAIN_DATASET-200k.jsonl
python $SCRIPT_DIR/training/preprocess/check_sample_number.py $PRETRAIN_DATASET $SAMPLED_PRETRAIN_DATASET $MAX_SAMPLE_NUM

# convert dataset from dj format to llava format
PRETRAIN_DATASET_JSON=$SAMPLED_PRETRAIN_DATASET.json
python $SCRIPT_DIR/data-juicer/tools/multimodal/data_juicer_format_to_target_format/dj_to_llava.py $SAMPLED_PRETRAIN_DATASET $PRETRAIN_DATASET_JSON --image_special_token "<__dj__image>" --restore_questions True --original_llava_ds_path $ORIGINAL_DATASET_ALL

pretrain阶段:

# train model
PRETRAIN_NAME=MGM-2B-Pretrain-$EXP_NAME
FINETUNE_NAME=MGM-2B-Finetune-$EXP_NAME
AUX_SIZE=768

NUM_TRAIN_EPOCHS=1
PRETRAIN_SAMPLE_NUM=200000

mkdir -p $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME

deepspeed $SCRIPT_DIR/training/mgm/train/train_mem.py \
    --deepspeed $SCRIPT_DIR/training/scripts/zero2_offload.json \
    --model_name_or_path $SCRIPT_DIR/training/model_zoo/LLM/gemma/gemma-2b-it \
    --version gemma \
    --data_path $PRETRAIN_DATASET_JSON \
    --image_folder $PRETRAIN_DATASET_IMAGE_PATH \
    --vision_tower $SCRIPT_DIR/training/model_zoo/OpenAI/clip-vit-large-patch14-336 \
    --vision_tower_aux $SCRIPT_DIR/training/model_zoo/OpenAI/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup \
    --mm_projector_type mlp2x_gelu \
    --tune_mm_mlp_adapter True \
    --mm_vision_select_layer -2 \
    --mm_use_im_start_end False \
    --mm_use_im_patch_token False \
    --image_size_aux $AUX_SIZE \
    --bf16 True \
    --output_dir $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME \
    --num_train_epochs $NUM_TRAIN_EPOCHS \
    --per_device_train_batch_size $PRETRAIN_BATCH_SIZE_PER_GPU \
    --per_device_eval_batch_size 4 \
    --gradient_accumulation_steps $PRETRAIN_GRADIENT_ACCUMULATION_STEPS \
    --evaluation_strategy "no" \
    --save_strategy "steps" \
    --save_steps $CKPT_SAVE_STEPS \
    --save_total_limit $TOTAL_SAVE_CKPT_LIMIT \
    --learning_rate 1e-3 \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type "cosine" \
    --logging_steps $LOGGING_STEP \
    --tf32 True \
    --model_max_length 2048 \
    --gradient_checkpointing True \
    --dataloader_num_workers $PRETRAIN_DATALOADER_NUM_WORKERS \
    --lazy_preprocess True \
    --report_to none \
    2>&1 | tee $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME/pretrain.log

这里我们使用的就是 mgm 框架在进行微调,我们可以看到其中的详细参数以及数据集的地址,包括使用的是 deepseed(使用的是zero2 的优化策略,使用内存换显存,这也是为什么内存需求比较大)我们可以看到其中前面提到的大语言模型以及对应的视觉编码器。

finetune阶段:

mkdir -p $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME

deepspeed $SCRIPT_DIR/training/mgm/train/train_mem.py \
    --deepspeed $SCRIPT_DIR/training/scripts/zero2_offload.json \
    --model_name_or_path $SCRIPT_DIR/training/model_zoo/LLM/gemma/gemma-2b-it \
    --version gemma \
    --data_path $SCRIPT_DIR/training/data/finetuning_stage_1_12k/mgm_instruction_stage_1_12k.json \
    --image_folder $SCRIPT_DIR/training/data/finetuning_stage_1_12k \
    --vision_tower $SCRIPT_DIR/training/model_zoo/OpenAI/clip-vit-large-patch14-336 \
    --vision_tower_aux $SCRIPT_DIR/training/model_zoo/OpenAI/openclip-convnext-large-d-320-laion2B-s29B-b131K-ft-soup \
    --pretrain_mm_mlp_adapter $SCRIPT_DIR/../output/training_dirs/$PRETRAIN_NAME/mm_projector.bin \
    --mm_projector_type mlp2x_gelu \
    --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 \
    --image_size_aux $AUX_SIZE \
    --bf16 True \
    --output_dir $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME \
    --num_train_epochs $NUM_TRAIN_EPOCHS \
    --per_device_train_batch_size $FINETUNE_BATCH_SIZE_PER_GPU \
    --per_device_eval_batch_size 4 \
    --gradient_accumulation_steps $FINETUNE_GRADIENT_ACCUMULATION_STEPS \
    --evaluation_strategy "no" \
    --save_strategy "steps" \
    --save_steps $CKPT_SAVE_STEPS \
    --save_total_limit $TOTAL_SAVE_CKPT_LIMIT \
    --learning_rate 2e-5 \
    --weight_decay 0. \
    --warmup_ratio 0.03 \
    --lr_scheduler_type "cosine" \
    --logging_steps $LOGGING_STEP \
    --tf32 True \
    --model_max_length 2048 \
    --gradient_checkpointing True \
    --dataloader_num_workers $FINETUNE_DATALOADER_NUM_WORKERS \
    --lazy_preprocess True \
    --report_to none \
    2>&1 | tee $SCRIPT_DIR/../output/training_dirs/$FINETUNE_NAME/finetuning.log

主要就是多了个 pretrain_mm_mlp_adapter 以及一些学习参数的不同。

测评

# inference for submission
# TextVQA
echo "Infer on TextVQA..."
bash $SCRIPT_DIR/eval/textvqa.sh $FINETUNE_NAME $INFER_CUDA_IDX
# MMBench
echo "Infer on MMBench..."
bash $SCRIPT_DIR/eval/mmbench.sh $FINETUNE_NAME "mmbench_dev_20230712" $INFER_CUDA_IDX

# copy this script to output
cp $0 $SCRIPT_DIR/../output/train.sh

# info
echo "Training and Inference done."
echo "Training checkpoints are stored in output/training_dirs/$FINETUNE_NAME."
echo "Inference results are stored in output/eval_results/$FINETUNE_NAME."

具体是通过 TextVQA 以及 MMBench 的测试验证

优化策略

可以看到上述的训练过程中并没有对官方给出的数据集进行一些更加深入的清晰甚至合成一些需要的数据。

为了提高多模态模型的能力,我们往往需要具有更高的内容一致性的数据:

这里具体指训练数据中图片和关于图片的描述之间的匹配度。

大致的方法即可以采用的有关算子有下面一些(根据Data-juicer开发者的分享总结)

图文CLIP相似度

图片和描述较为符合的数据一般具有较高的图文CLIP相似度(>0.3),即图片和描述具有较高的一致性。

图文BLIP匹配分

图片和描述较为符合的数据一般具有较高的图文BLIP匹配分

图文内容主体召回率

图文内容主体召回率指的是,在图片描述中提取出一些内容主体比如例子中的家具、枕头等,然后在图像中进行识别,看能否识别出相应对象。

质量和多样性

多算子

以上算子可以单独作为指标对数据进行筛选,也可以相互组合。但需要注意的是,单独使用效果较好的算子不一定组合起来就能实现更好的效果。

重复数据

同时,关于重复数据有趣的一点是:

对于一致性不够的数据处理方式也有两种:

(1)根据图片生成更为一致的描述

相较于原描述,新的描述更为清晰、简洁。(原描述中具体的信息如princess kate 对于模型来说可能是较难学习到的)

(2)根据描述生成更为一致的图片

相较于原图片,新图片去除了水印,并且放大了其中的太阳这个内容主体。

最后,关于合成的数据,其实也不能盲目相信,可以进行多轮的数据合成和数据清洗。

有兴趣的可以了解一下sandbox(协助你快速评估算子调度效果,快速实验得到好的数据集清洗菜谱。)

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

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

相关文章

搜维尔科技:驾驶模拟器背后的技术: Varjo的虚拟/混合现实 (VR/XR)提供独特的优势,最终加快汽车开发创新的步伐

专业驾驶模拟器广泛应用于车辆开发&#xff0c;帮助汽车行业在开发过程的早期做出更好的设计决策。总体目标是为测试驾驶员提供最真实的驾驶体验&#xff0c;包括动态动作和声音&#xff0c;并测试控制算法或辅助系统等功能。环境越真实&#xff0c;驾驶员的体验就越接近最终车…

[vue] pdf.js / vue-pdf 文件花屏问题

vue-pdf内核也是pdf.js&#xff0c;修改方式一样 在pdf.worker.js中加入几行代码&#xff0c;追加到”precinct.zeroBitPlanesTree zeroBitPlanesTree;“之后。 for (var l 0; l < layerNumber; l) {if (readBits(1) ! 0) {throw new JpxError("Invalid tag tree&qu…

vba代码插入折线图

xqwertyy52152018139hi303533312015 Sub test()Set sht1 ThisWorkbook.Worksheets("示例")x sht1.Range("I1").Lefty sht1.Range("I1").Topw sht1.Range("N15").Width * 15h sht1.Range("N15").Height * 25Set ch1 s…

Progressive Multi-modal Conditional Prompt Tuning

文章汇总 动机 图像的重复消化有助于提高分类精度。ProMPT不是直接进行预测&#xff0c;而是多次重新访问原始图像以检查答案&#xff0c;逐步将预测从粗糙细化到精确。 希望达到的效果如下&#xff1a; 图7:通过迭代进化&#xff0c;ProMPT逐步将CLIP产生的错误结果纠正为正…

el-select远程搜索,查询条件为空,没有搜索到数据时,展示“无数据”

el-select远程搜索&#xff0c;查询条件为空&#xff0c;没有搜索到数据时&#xff0c;展示“无数据” 现状&#xff1a;1、查询条件没有值&#xff0c;远程接口没有数据时&#xff0c;不展示“无数据”&#xff1b; 2、查询条件有值&#xff0c;远程接口没有数据时&#xff0c…

公用事业公司签署大规模电力供应协议

随着人工智能技术的迅猛发展&#xff0c;美国公用事业公司与数据中心运营商之间的电力供应协议数量显著增加&#xff0c;为未来几季度的销售和利润增长奠定了基础。根据高盛今年5月发布的一份报告&#xff0c;到2030年&#xff0c;数据中心的发电量预计将占美国总发电量的8%&am…

autoware中ROS2学习笔记

文章目录 一、学习资料&#xff1a;1.1、说明1.2、Autoware Documentation1.3、Autoware Universe Documentation1.4、总结 二、概述三、ros2--节点组件什么是组件容器组件的实现原理可组合节点--节点组件什么是节点组件为什么需要可组合节点创建可组合节点时构造函数为什么需要…

Android 12系统源码_屏幕设备(一)DisplayManagerService的启动

前言 DisplayManagerService是Android Framework中管理显示屏幕相关的模块&#xff0c;各种Display的连接、配置等&#xff0c;都是通过DMS和来管理控制。 在DMS模块中&#xff0c;对显示屏幕的描述分为物理显示屏(physical display)和逻辑显示屏(logical display)&#xff0c…

您知道有哪些主流的大模型LLM开源项目吗?

随着人工智能技术的飞速发展&#xff0c;大模型LLM&#xff08;Large Language Models&#xff09;已成为自然语言处理领域的一股不可阻挡的潮流。从早期的探索到今天的广泛应用&#xff0c;LLM在理解、生成和处理人类语言方面取得了令人瞩目的成就。本文旨在提供一个全面的视角…

【网络安全】密码重置中毒漏洞解析

未经许可 不得转载。 文章目录 概述重置密码的正常流程如何构造密码重置投毒攻击悬垂标记攻击概述 密码重置投毒是一种技术,攻击者利用该技术操纵易受攻击的网站,使其生成指向其控制域的密码重置链接。此行为可被用来窃取重置任意用户密码所需的秘密令牌,并最终盗取其帐户。…

最新级联文生图技术,StableCascade模型部署

Stable Cascade是 Stability AI 开发的一款先进的文生图&#xff08;Text-to-Image&#xff09;生成模型。 Stable Cascade由三个模型组成&#xff1a;Stage A、Stage B 和 Stage C&#xff0c;它们分别处理图像生成的不同阶段&#xff0c;形成了一个“级联”&#xff08;Casc…

TCP/UDP实现网络通信

TCP实现网络通信 1.服务端 #include<myhead.h>//1服务端定义:端口号\id号 #define SER_PIPR 6666 #define SER_IP "196.168.111.186" //通过ifconfig查看ip int main(int argc, const char *argv[]) {//1创建套接字int sfd socket(AF_INET,SOCK_STREAM,0);…

AI绘画大模型-StableDiffusion最强模型sd3(本地安装方法)

​ 前言/introduction Stable Diffusion 3&#xff08;简称SD3&#xff09;是Stability AI最新推出的文本到图像生成模型。相比前代模型&#xff0c;SD3在生成质量、细节表现以及运行效率上有了显著提升&#xff0c;尤其在细腻的图像渲染和复杂的场景构建方面表现出色。SD3模型…

旅游展示系统2024(代码+论文+ppt)

旅游展示系统2024(代码论文ppt),编号:sp013 代码经过修正,确保可以运行,下载地址在文末 技术栈: springbottvuemysql 展示: 下载地址: https://download.csdn.net/download/hhtt19820919/89642334 备注: 专业承接各种程序java,c,c,python,cuda,AI 运行有问题请私信我,私…

深兰科技创始人陈海波入选“2024先锋科创家?硬科技商业先锋榜”

8月14日&#xff0c;2024先锋科创家系列榜单揭晓&#xff0c;深兰科技创始人、董事长陈海波先生凭借创新精神和商业洞察力成功入选&#xff0c;荣登“2024先锋科创家•硬科技商业先锋榜”。 该榜单评选由财联社《科创板日报》联合上海科学技术情报研究所(ISTIS)共同发起&#x…

ImagePicker插件的用法

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何选择视频文件"相关的内容&#xff0c;本章回中将介绍如何混合选择图片和视频文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

网页版IntelliJ IDEA部署

在服务器部署网页 IntelliJ IDEA 引言 大家好&#xff0c;我是小阳&#xff0c;今天要为大家带来一个黑科技——如何在云端部署和使用WEB版的IntelliJ IDEA&#xff0c;让你在任何地方都可以随心所欲地进行Java开发。这个方法特别适合那些用着老旧Windows电脑&#xff0c;部署…

基于springboot的医药管理系统

TOC springboot194基于springboot的医药管理系统 绪论 1.1 选题背景 当人们发现随着生产规模的不断扩大&#xff0c;人为计算方面才是一个巨大的短板&#xff0c;所以发明了各种计算设备&#xff0c;从结绳记事&#xff0c;到算筹&#xff0c;以及算盘&#xff0c;到如今的…

系统架构设计师 - 软件工程(1)

软件工程 软件工程&#xff08;13-22分&#xff09;非常重要软件开发方法原型法【需求阶段】结构化法面向对象方法面向服务的方法其他软件开发方法 软件开发模型瀑布模型 SDLC增量与迭代螺旋模型V 模型 和喷泉模型构件组装模型 CBSD统一过程 UP敏捷方法 逆向工程需求工程需求定…

无障碍服务屏蔽_关闭无障碍服务快捷方式

问题描述&#xff1a; 1&#xff09;部分app 存在无障碍服务功能&#xff0c;需要关闭 2&#xff09;对于客户自研App&#xff0c;自己具备系统签名自己直接开启了无障碍服务并且打开了无障碍服务快捷方式&#xff0c;如何关闭无障碍服务快捷开关 文章目录 问题现象问题描述 屏…