使用 accelerate + deepspeed zero stage 3 offload 进行 sft trainning 的自动设备映射: GPU 训练计算 + CPU 存储

run_peft_qlora_deepspeed_stage3.sh

#!/bin/bashexport MAX_JOBS=4
export OMP_NUM_THREADS=4
export disable_exllama=True
export CUDA_VISIBLE_DEVICES=0,1
export TORCH_CUDA_ARCH_LIST="8.6"
export TOKENIZERS_PARALLELISM=false
export CUDA_DEVICE_ORDER=PCI_BUS_ID
export TORCH_DISTRIBUTED_DEBUG=DETAIL
export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True# NCCL 优化
export NCCL_DEBUG=INFO
export NCCL_P2P_DISABLE=0
export NCCL_IGNORE_CPU_AFFINITY=1
export MASTER_ADDR=localhost
export MASTER_PORT=2022
export NCCL_SOCKET_IFNAME=ens34
export NCCL_MIN_NRINGS=8
export NCCL_MAX_NCHANNELS=8
export NCCL_ALGO=Ring
export NCCL_PROTO=Simpleaccelerate launch --config_file "deepspeed_config_z3_qlora.yaml"  train.py \
--seed 100 \
--model_name_or_path "models/Qwen3-Coder-30B-A3B-Instruct" \
--dataset_name "xxx.json" \
--chat_template_format "qwen3" \
--add_special_tokens False \
--append_concat_token False \
--splits "train,test" \
--max_seq_len 1024 \
--num_train_epochs 3 \
--logging_steps 5 \
--log_level "info" \
--logging_strategy "steps" \
--eval_strategy "epoch" \
--save_strategy "epoch" \
--bf16 True \
--packing False \
--learning_rate 1e-4 \
--lr_scheduler_type "cosine" \
--weight_decay 0.01 \
--warmup_ratio 0.1 \
--max_grad_norm 1.0 \
--output_dir "xxx_adapter" \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--gradient_checkpointing True \
--use_reentrant True \
--dataset_text_field "content" \
--use_flash_attn True \
--use_peft_lora True \
--lora_r 8 \
--lora_alpha 16 \
--lora_dropout 0.1 \
--lora_target_modules "all-linear" \
--use_4bit_quantization True \
--use_nested_quant True \
--bnb_4bit_compute_dtype "bfloat16" \
--bnb_4bit_quant_storage_dtype "bfloat16"

deepspeed_config_z3_qlora.yaml (使用 accelerate config 配置生成)

compute_environment: LOCAL_MACHINE
debug: false
deepspeed_config:deepspeed_config_file: ds_config.jsondeepspeed_moe_layer_cls_names: Qwen3MoeSparseMoeBlockzero3_init_flag: true
distributed_type: DEEPSPEED
downcast_bf16: "no"
dynamo_config:dynamo_backend: INDUCTOR
#  dynamo_mode: reduce-overheaddynamo_mode: defaultdynamo_use_dynamic: truedynamo_use_fullgraph: truedynamo_use_regional_compilation: true
enable_cpu_affinity: true
machine_rank: 0
main_training_function: main
num_machines: 1
num_processes: 2
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false

ds_config.json

{"fp16": {"enabled": "auto","loss_scale": 0,"loss_scale_window": 1000,"initial_scale_power": 16,"hysteresis": 2,"min_loss_scale": 1},"bf16": {"enabled": "auto"},"zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true},"offload_param": {"device": "cpu","pin_memory": true},"overlap_comm": true,"contiguous_gradients": true,"reduce_bucket_size": "auto","stage3_prefetch_bucket_size": "auto","stage3_param_persistence_threshold": "auto","sub_group_size": 1e9,"stage3_max_live_parameters": 1e9,"stage3_max_reuse_distance": 1e9,"stage3_gather_16bit_weights_on_model_save": "auto"},"gradient_accumulation_steps": "auto","gradient_clipping": "auto","steps_per_print": 2000,"train_batch_size": "auto","train_micro_batch_size_per_gpu": "auto","wall_clock_breakdown": false,"aio": {"enabled": true,"block_size": 256,"queue_depth": 8,"thread_count": 1,"single_submit": false,"overlap_events": true}
}

utils.py

import os
import json
import torch
import transformers
import packaging.versionfrom enum import Enum
from peft import LoraConfig
from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,
)
from datasets.builder import DatasetGenerationError
from datasets import DatasetDict, load_dataset, load_from_diskDEFAULT_CHATML_CHAT_TEMPLATE = "{% for message in messages %}\n{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n'}}{% if loop.last and add_generation_prompt %}{{'<|im_start|>assistant\n' }}{% endif %}{% endfor %}"
DEFAULT_ZEPHYR_CHAT_TEMPLATE = "{% for message in messages %}\n{% if message['role'] == 'user' %}\n{{ '<|user|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'system' %}\n{{ '<|system|>\n' + message['content'] + eos_token }}\n{% elif message['role'] == 'assistant' %}\n{{ '<|assistant|>\n'  + message['content'] + eos_token }}\n{% endif %}\n{% if loop.last and add_generation_prompt %}\n{{ '<|assistant|>' }}\n{% endif %}\n{% endfor %}"class ZephyrSpecialTokens(str, Enum):user = "<|user|>"assistant = "<|assistant|>"system = "<|system|>"eos_token = "</s>"bos_token = "<s>"pad_token = "<pad>"@classmethoddef list(cls):return [c.value for c in cls]class ChatmlSpecialTokens(str, Enum):user = "<|im_start|>user"assistant = "<|im_start|>assistant"system = "<|im_start|>system"eos_token = "<|im_end|>"bos_token = "<s>"pad_token = "<pad>"@classmethoddef list(cls):return [c.value for c in cls]def format_alpaca_to_chatml(sample):"""Convert Alpaca format to ChatML format"""messages = []# Add system messagemessages.append({"role": "system","content": "You are a helpful assistant."})# Add user messageif sample["input"].strip():content = f"{sample['instruction']}\n{sample['input']}"else:content = sample["instruction"]messages.append({"role": "user","content": content})# Add assistant messagemessages.append({"role": "assistant","content": sample["output"]})return {"messages": messages}def create_datasets(tokenizer, data_args, training_args, apply_chat_template=False):def preprocess(samples):batch = []for conversation in samples["messages"]:batch.append(tokenizer.apply_chat_template(conversation, tokenize=False))return {"content": batch}def load_alpaca_dataset(data_path):"""Load and convert Alpaca format dataset to ChatML format"""with open(data_path, "r", encoding="utf-8") as f:data = json.load(f)# Convert Alpaca format to ChatML formatchatml_data = [format_alpaca_to_chatml(item) for item in data]# Convert to Hugging Face Datasetfrom datasets import Datasetreturn Dataset.from_list(chatml_data)raw_datasets = DatasetDict()# 检查是否为本地JSON文件if data_args.dataset_name.endswith(".json") and os.path.exists(data_args.dataset_name):# 加载整个数据集full_dataset = load_alpaca_dataset(data_args.dataset_name)# 根据splits参数分割数据集if "train" in data_args.splits and "test" in data_args.splits:# 90% 训练, 10% 测试split_dataset = full_dataset.train_test_split(test_size=0.1, seed=training_args.seed)raw_datasets["train"] = split_dataset["train"]raw_datasets["test"] = split_dataset["test"]elif "train" in data_args.splits:raw_datasets["train"] = full_datasetelif "test" in data_args.splits:raw_datasets["test"] = full_datasetelse:raise ValueError(f"Split type {data_args.splits} not recognized")else:# 处理Hub数据集或目录结构for split in data_args.splits.split(","):try:# 尝试从Hub加载dataset = load_dataset(data_args.dataset_name, split=split)raw_datasets[split] = datasetexcept Exception:# 检查本地数据集try:dataset = load_from_disk(os.path.join(data_args.dataset_name, split))raw_datasets[split] = datasetexcept Exception as e:raise ValueError(f"Could not load dataset split {split}: {str(e)}")if apply_chat_template:raw_datasets = raw_datasets.map(preprocess,batched=True,remove_columns=raw_datasets["train"].column_names,)train_data = raw_datasets["train"]valid_data = raw_datasets["test"] if "test" in raw_datasets else Noneprint(f"Size of the train set: {len(train_data)}. Size of the validation set: {len(valid_data) if valid_data else 0}")print(f"A sample of train dataset: {train_data[0]}")return train_data, valid_datadef create_and_prepare_model(args, data_args, training_args):if args.use_unsloth:from unsloth import FastLanguageModelbnb_config = Nonequant_storage_dtype = Noneif (torch.distributed.is_available()and torch.distributed.is_initialized()and torch.distributed.get_world_size() > 1and args.use_unsloth):raise NotImplementedError("Unsloth is not supported in distributed training")if args.use_4bit_quantization:compute_dtype = getattr(torch, args.bnb_4bit_compute_dtype)quant_storage_dtype = getattr(torch, args.bnb_4bit_quant_storage_dtype)bnb_config = BitsAndBytesConfig(load_in_4bit=args.use_4bit_quantization,bnb_4bit_quant_type=args.bnb_4bit_quant_type,bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=args.use_nested_quant,bnb_4bit_quant_storage=quant_storage_dtype,)if compute_dtype == torch.float16 and args.use_4bit_quantization:major, _ = torch.cuda.get_device_capability()if major >= 8:print("=" * 80)print("Your GPU supports bfloat16, you can accelerate training with the argument --bf16")print("=" * 80)elif args.use_8bit_quantization:bnb_config = BitsAndBytesConfig(load_in_8bit=args.use_8bit_quantization)if args.use_unsloth:if torch.xpu.is_available():raise NotImplementedError("XPU hasn't supported unsloth yet")# Load modelmodel, _ = FastLanguageModel.from_pretrained(model_name=args.model_name_or_path,max_seq_length=training_args.max_seq_length,dtype=None,load_in_4bit=args.use_4bit_quantization,)else:torch_dtype = (quant_storage_dtype if quant_storage_dtype and quant_storage_dtype.is_floating_point else torch.float32)# Prepare model loading argumentsmodel_kwargs = {"trust_remote_code": True,"torch_dtype": torch_dtype,}if args.use_flash_attn:# 确保使用 float16# model_kwargs["torch_dtype"] = torch.float16if torch.xpu.is_available():print("XPU hasn't supported flash_attn yet, use eager implementation instead.")model_kwargs["attn_implementation"] = "eager"else:model_kwargs["attn_implementation"] = "flash_attention_2"# Only add quantization_config if bnb_config is not Noneif bnb_config is not None:model_kwargs["quantization_config"] = bnb_configmodel = AutoModelForCausalLM.from_pretrained(args.model_name_or_path, **model_kwargs)peft_config = Nonechat_template = Noneif args.use_peft_lora and not args.use_unsloth:peft_config = LoraConfig(lora_alpha=args.lora_alpha,lora_dropout=args.lora_dropout,r=args.lora_r,bias="none",task_type="CAUSAL_LM",target_modules=args.lora_target_modules.split(",")if args.lora_target_modules != "all-linear"else args.lora_target_modules,)special_tokens = Nonechat_template = Noneif args.chat_template_format == "chatml":special_tokens = ChatmlSpecialTokenschat_template = DEFAULT_CHATML_CHAT_TEMPLATEelif args.chat_template_format == "zephyr":special_tokens = ZephyrSpecialTokenschat_template = DEFAULT_ZEPHYR_CHAT_TEMPLATEif special_tokens is not None:tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path,pad_token=special_tokens.pad_token.value,bos_token=special_tokens.bos_token.value,eos_token=special_tokens.eos_token.value,additional_special_tokens=special_tokens.list(),trust_remote_code=True,)tokenizer.chat_template = chat_template# make embedding resizing configurable?# Transformers 4.46.0+ defaults uses mean_resizing by default, which fails with QLoRA + FSDP because the# embedding could be on meta device, therefore, we set mean_resizing=False in that case (i.e. the status quo# ante). See https://github.com/huggingface/accelerate/issues/1620.uses_transformers_4_46 = packaging.version.parse(transformers.__version__) >= packaging.version.parse("4.46.0")uses_fsdp = os.environ.get("ACCELERATE_USE_FSDP", "false").lower() == "true"# Check if the model is quantizedis_quantized = (bnb_config is not None) or (getattr(model, "hf_quantizer", None) is not None)if is_quantized and uses_fsdp and uses_transformers_4_46:model.resize_token_embeddings(len(tokenizer), pad_to_multiple_of=8, mean_resizing=False)else:model.resize_token_embeddings(len(tokenizer), pad_to_multiple_of=8)else:tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path, trust_remote_code=True)tokenizer.pad_token = tokenizer.eos_tokenif args.use_unsloth:# Do model patching and add fast LoRA weightsmodel = FastLanguageModel.get_peft_model(model,lora_alpha=args.lora_alpha,lora_dropout=args.lora_dropout,r=args.lora_r,target_modules=args.lora_target_modules.split(",")if args.lora_target_modules != "all-linear"else args.lora_target_modules,use_gradient_checkpointing=training_args.gradient_checkpointing,random_state=training_args.seed,max_seq_length=training_args.max_seq_length,)return model, peft_config, tokenizer

train.py

import os
import gc
import sys
import torchfrom typing import Optional
from trl import SFTConfig, SFTTrainer
from dataclasses import dataclass, field
from transformers import HfArgumentParser, set_seed
from new_utils import create_and_prepare_model, create_datasets# 清理缓存
gc.collect()
torch.cuda.empty_cache()# Define and parse arguments.
@dataclass
class ModelArguments:"""Arguments pertaining to which model/config/tokenizer we are going to fine-tune from."""model_name_or_path: str = field(metadata={"help": "Path to pretrained model or model identifier from huggingface.co/models"})max_seq_length: Optional[int] = field(default=512,metadata={"help": "The maximum total input sequence length after tokenization."},)chat_template_format: Optional[str] = field(default="none",metadata={"help": "chatml|zephyr|none. Pass `none` if the dataset is already formatted with the chat template."},)lora_alpha: Optional[int] = field(default=16)lora_dropout: Optional[float] = field(default=0.1)lora_r: Optional[int] = field(default=64)lora_target_modules: Optional[str] = field(default="q_proj,k_proj,v_proj,o_proj,down_proj,up_proj,gate_proj",metadata={"help": "comma separated list of target modules to apply LoRA layers to"},)use_nested_quant: Optional[bool] = field(default=False,metadata={"help": "Activate nested quantization for 4bit base models"},)bnb_4bit_compute_dtype: Optional[str] = field(default="float16",metadata={"help": "Compute dtype for 4bit base models"},)bnb_4bit_quant_storage_dtype: Optional[str] = field(default="uint8",metadata={"help": "Quantization storage dtype for 4bit base models"},)bnb_4bit_quant_type: Optional[str] = field(default="nf4",metadata={"help": "Quantization type fp4 or nf4"},)use_flash_attn: Optional[bool] = field(default=False,metadata={"help": "Enables Flash attention for training."},)use_peft_lora: Optional[bool] = field(default=False,metadata={"help": "Enables PEFT LoRA for training."},)use_8bit_quantization: Optional[bool] = field(default=False,metadata={"help": "Enables loading model in 8bit."},)use_4bit_quantization: Optional[bool] = field(default=False,metadata={"help": "Enables loading model in 4bit."},)use_reentrant: Optional[bool] = field(default=False,metadata={"help": "Gradient Checkpointing param. Refer the related docs"},)use_unsloth: Optional[bool] = field(default=False,metadata={"help": "Enables UnSloth for training."},)@dataclass
class DataTrainingArguments:dataset_name: Optional[str] = field(default="timdettmers/openassistant-guanaco",metadata={"help": "The preference dataset to use."},)append_concat_token: Optional[bool] = field(default=False,metadata={"help": "If True, appends `eos_token_id` at the end of each sample being packed."},)add_special_tokens: Optional[bool] = field(default=False,metadata={"help": "If True, tokenizers adds special tokens to each sample being packed."},)splits: Optional[str] = field(default="train,test",metadata={"help": "Comma separate list of the splits to use from the dataset."},)def main(model_args, data_args, training_args):# Set seed for reproducibilityset_seed(training_args.seed)# modelmodel, peft_config, tokenizer = create_and_prepare_model(model_args, data_args, training_args)# gradient ckptmodel.config.use_cache = not training_args.gradient_checkpointingtraining_args.gradient_checkpointing = training_args.gradient_checkpointing and not model_args.use_unslothif training_args.gradient_checkpointing:training_args.gradient_checkpointing_kwargs = {"use_reentrant": model_args.use_reentrant}training_args.dataset_kwargs = {"append_concat_token": data_args.append_concat_token,"add_special_tokens": data_args.add_special_tokens,}# datasetstrain_dataset, eval_dataset = create_datasets(tokenizer,data_args,training_args,apply_chat_template=model_args.chat_template_format != "none",)# trainertrainer = SFTTrainer(model=model,processing_class=tokenizer,args=training_args,train_dataset=train_dataset,eval_dataset=eval_dataset,peft_config=peft_config,)trainer.accelerator.print(f"{trainer.model}")if hasattr(trainer.model, "print_trainable_parameters"):trainer.model.print_trainable_parameters()# traincheckpoint = Noneif training_args.resume_from_checkpoint is not None:checkpoint = training_args.resume_from_checkpointtrainer.train(resume_from_checkpoint=checkpoint)# saving final modelif trainer.is_fsdp_enabled:trainer.accelerator.state.fsdp_plugin.set_state_dict_type("FULL_STATE_DICT")trainer.save_model()if __name__ == "__main__":parser = HfArgumentParser((ModelArguments, DataTrainingArguments, SFTConfig))if len(sys.argv) == 2 and sys.argv[1].endswith(".json"):# If we pass only one argument to the script and it's the path to a json file,# let's parse it to get our arguments.model_args, data_args, training_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1]))else:model_args, data_args, training_args = parser.parse_args_into_dataclasses()try:main(model_args, data_args, training_args)# 清理缓存gc.collect()torch.cuda.empty_cache()finally:import torch.distributed as dist# 确保无论训练成功或失败都清理资源if dist.is_initialized():dist.destroy_process_group()

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

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

相关文章

JAVA上门家政维修服务系统源码微信小程序+微信公众号+APP+H5

一、功能介绍用户端&#xff1a;精准分类、支持家政、维修、万能服务、一口价、报价、线上、各类家政服务、优惠专区、师傅入驻、商家入驻、我的需求、补费明细、我的投诉&#xff1b;师傅端&#xff1a;接单池、消息通知、接单管理、今日订单、师傅入驻、我的钱包、实名认证&a…

GCKontrol对嵌入式设备FPGA设计流程的高效优化

1 前言FPGA&#xff08;Field-Programmable Gate Array&#xff0c;现场可编程逻辑门阵列&#xff09;是一种可编程的半导体器件&#xff0c;因其硬件可重构性、硬件并行计算能力、低延迟和实时性的优势&#xff0c;广泛应用于数字电路设计、原型验证和系统加速等领域。但开发…

DBAPI免费版对比apiSQL免费版

DBAPI简介 零代码开发api服务&#xff0c;只需编写sql&#xff0c;就可以生成http api服务。支持api动态创建&#xff0c;兼容多种数据库。 适用于BI报表、数据可视化大屏的后端接口快速开发。 旨在为企业数据服务的发布提供完整解决方案 一、DBAPI免费版本支持1个数据源连接支…

CTFHub SSRF通关笔记8:数字IP Bypass 原理详解与渗透实战

目录 一、SSRF 二、数字IP原理 1、IP多进制 &#xff08;1&#xff09;十进制整数格式 (Dword / 长整数格式) &#xff08;2&#xff09;八进制格式 (Octal IP) &#xff08;3&#xff09;十六进制格式 (Hex IP) 2、SSRF绕过 三、渗透实战 1、打开靶场 2、尝试127.0.…

C++中双引号和单引号的区别(全面分析)

我在刷算法题的时候经常遇到&#xff0c;用了 出现警告或者使用" "直接报错&#xff0c;尤其是在字符串部分&#xff08;py玩家后遗症/(ㄒoㄒ)/~~&#xff09;在详细了解后总结一下加强记忆。 总的来说在 C 中&#xff0c;双引号 "" 和单引号 是完全不同…

Ubuntu20.04仿真 |iris四旋翼添加云台相机详述

申明&#xff1a; 1、本人使用的是Ubuntu20.04ros1gazeboxtdronepx4的仿真组合 2、为了使传感器模型和飞机模型解耦合&#xff0c;实现不同平台对传感器可直接调用&#xff0c;本系列博文涉及的所有传感器均不直接添加在相应平台的sdf当中&#xff0c;而是通过编写xxx_joint.…

《人工智能AI之机器学习基石》系列 第 16 篇:关联规则与数据挖掘——“啤酒与尿布”传奇背后的增长秘密

《人工智能AI之机器学习基石》⑯ 专栏核心理念: 用通俗语言讲清楚机器学习的核心原理,强调“洞察+ 技术理解 + 应用连接”,构建一个完整的、富有启发性的知识体系。 引言:藏在购物车里的“读心术” 朋友们,欢迎回到我们的AI基石之旅。 在过去的两次探索中,我们深入…

Spring Boot 的自动配置原理

Spring Boot 的自动配置是其 "约定大于配置" 理念的核心实现&#xff0c;它能自动配置 Spring 应用所需的各种组件&#xff0c;大幅减少手动配置。下面从核心注解、加载流程、条件过滤等方面详细讲解其原理&#xff0c;并结合关键源码说明。一、自动配置的入口&#…

谷歌云平台(Google Cloud Platform, GCP)介绍(全球领先的云计算服务平台,为企业和开发者提供包括计算、存储、数据分析、人工智能、机器学习、网络和安全等在内的全面云服务)

文章目录**1. GCP的核心优势****1.1 全球领先的基础设施****1.2 强大的数据分析和人工智能能力****1.3 卓越的安全性和合规性****1.4 灵活的定价模式****2. GCP的主要服务****2.1 计算服务****2.2 存储和数据库****2.3 网络服务****2.4 人工智能与大数据****2.5 安全与管理工具…

RISC-V异常机制和异常定位

不少人在调试RISC-V core时&#xff0c;面对异常的出现不知所措&#xff0c;不知道如何定位代码问题。这里将从RISC-V异常机制以及几个异常实例学习下。 1 异常机制 1.1 什么是异常 异常是软件程序员不得不要深入了解的&#xff0c;首先在学习异常机制前&#xff0c;对异常要…

c++中导出函数调用约定为__stdcall类型函数并指定导出函数名称

开发环境在Visual studio 2022版本下&#xff0c;为防止编译器重命名函数名称&#xff08;会加上8等等乱七八糟的东西&#xff09;&#xff0c;我们对函数名称进行指定&#xff1a;一、新建.def文件&#xff0c;名称须与dll名称相同&#xff0c;并放在与cpp文件相同文件夹下&am…

Vision Transformer (ViT) :Transformer在computer vision领域的应用(二)

METHOD,论文主要部分 In model design we follow the original Transformer (Vaswani et al., 2017) as closely as possible. An advantage of this intentionally simple setup is that scalable NLP Transformer architectures – and their efficient implementations –…

AI 论文周报丨红队测试语言模型/多视角 3D 点追踪方法/蛋白质表示学习框架/密码学漏洞检测新框架……

近年来&#xff0c;已有若干方法尝试从单目视频实现 3D 点跟踪&#xff0c;然而由于在遮挡和复杂运动等挑战性场景中难以准确估计 3D 信息&#xff0c;这些方法的性能仍难以满足实际应用对高精度与鲁棒性的要求。 基于此&#xff0c;苏黎世联邦理工学院、卡内基梅隆大学联合提出…

STM32 通过USB的Mass Storage Class读写挂载的SD卡出现卡死问题

问题描述&#xff1a;使用stm32cubemx生成的sdio和usb Mass Storage Class的代码后&#xff0c;在USB_DEVICE\App\usbd_storage_if.c文件里面的接口调用以下函数出现卡死问题&#xff1a; SD_Driver.disk_initialize(0); SD_Driver.disk_read(lun, buf, blk_addr, blk_len) SD_…

Go语言中 error 接口与自定义错误类型的深入解析

在 Go 语言开发中&#xff0c;我们经常需要处理各种错误情况。Go 语言通过 error 接口提供了一套简洁而强大的错误处理机制。然而&#xff0c;当涉及到自定义错误类型时&#xff0c;许多开发者会遇到一些令人困惑的问题。本文将通过一个实际案例来深入探讨这个问题。 问题背景 …

字幕编辑工具推荐,Subtitle Edit v4.0.13发布:增强语音识别+优化翻译功能

大家好呀&#xff0c;不知道大家有没有做自媒体相关工作的呢&#xff0c;你们是不是也觉得剪辑视频时最头疼的往往不是画面而是字幕&#xff0c;时间轴对不上、格式不兼容、需要手动翻译&#xff0c;这些琐碎工作消耗的精力甚至超过剪辑本身。 当你试遍各种在线工具却发现要么…

【Java后端】Spring Boot 集成雪花算法唯一 ID

Spring Boot 实现基于雪花算法的分布式唯一 ID 生成器在分布式系统中&#xff0c;我们经常需要生成 全局唯一 ID&#xff0c;比如用户 ID、订单号、消息 ID 等。常见的方式有&#xff1a;数据库自增主键、UUID、Redis/Zookeeper 分布式 ID 服务、百度 UidGenerator、美团 Leaf …

C语言初尝试——洛谷

一、C数组&#xff1a;C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。声明数组在 C 中要声明一个数组&#xff0c;需要指定元素的类型和元素的数量&#xf…

C++八大排序

C排序算法一、概览二、代码实现1.冒泡排序2.插入排序3.希尔排序4.堆排序5.选择排序6.快速排序7.归并排序三、排序时间、空间复杂度总结排序&#xff0c;是C各大算法当中非常常见的一个步骤&#xff08;过程&#xff09;&#xff0c;通常我们使用便捷的algorithmalgorithmalgori…

每天五分钟深度学习:深层神经网络的优势

本文重点 在人工智能领域,深层神经网络(DNN)的崛起标志着技术范式的根本性转变。相较于传统浅层神经网络(如单层感知机、线性回归模型),深层网络通过引入多层隐藏层,实现了对复杂数据模式的深度解析与高效建模。 深层神经网络 神经网络中输入层表示神经网络的第0层,…