大模型蒸餾(distillation)---從DeepseekR1-1.5B到Qwen-2.5-1.5B蒸餾

?

目錄

1.1 蒸餾目標

2 環境準備

2.1依賴庫安裝

2.2 硬件要求

2.3 模型與數據集下載

2.3.1 教師模型下載

2.3.2 學生模型下載

?2.3.3 數據集準備或下載

?3.過程日志

?4. 模型加載與配置

4.1 加載教師模型

4.2 加載學生模型

4.3 數據預處理函數??

?4.4 數據收集器

4.5 定義訓練參數

4.6 定義蒸餾配置

4.7 定義訓練配置

4.8 創建蒸餾器?

4.9 開始蒸餾?

?5. 完整代碼

6.結合上述內容和TextBrewer,自己重新整理了一遍代碼,僅供參考:

1.1 蒸餾目標

將?DeepSeek?的推理能力遷移到?Qwen-2.5;

確保學生模型與?Qwen-2.5?的原始功能(如對話、多語言支持)兼容。

2 環境準備

2.1依賴庫安裝

pip install torch torchvision transformers datasets2.2
pip install accelerate # 加速分布式訓練
pip install evaluate # 評估指標

2.2 硬件要求

GPU:建議使用單張或多張?NVIDIA GPU(如?V100、A100)建議至少?24GB。

CUDA:安裝與?PyTorch?兼容的?CUDA?版本。

2.3 模型與數據集下載

2.3.1 教師模型下載

Qwen-2.5-1.5B從huggingface 下載,離線下載方式(從https://hf-mirror.com離線下載):

$env:HF_ENDPOINT = "https://hf-mirror.com"huggingface-cli download Qwen/Qwen2.5-1.5B --local-dir ./models/qwen2.5-1.5B --local-dir-use-symlinks False

2.3.2 學生模型下載

Qwen-2.5-1.5B

$env:HF_ENDPOINT = "https://hf-mirror.com"huggingface-cli download Qwen/Qwen2.5-1.5B --local-dir ./models/qwen2.5-1.5B --local-dir-use-symlinks False

?2.3.3 數據集準備或下載

建議使用大規模文本數據集(如?wikitex、Wikipedia、BooksCorpus、OpenWebText?等)。離線下載地址(從https://www.kaggle.com/datasets/jayanthbontha/wikitext下載)

?3.過程日志

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)# 獲取當前腳本文件的絕對路徑
current_script_path = os.path.abspath(__file__)
logger.info(f"Current script path: {current_script_path}")# 獲取當前腳本文件所在的目錄
current_script_dir = os.path.dirname(current_script_path)
logger.info(f"Current script directory: {current_script_dir}")

?4. 模型加載與配置

4.1 加載教師模型

# 加載教師模型(DeepSeek-R1:1.5B)
teacher_model_name = os.path.join(current_script_dir, "../models/DeepSeek-R1-Distill-Qwen-1.5B")
logger.info(f"Loading teacher model: {teacher_model_name}")
teacher_tokenizer = AutoTokenizer.from_pretrained(teacher_model_name,local_files_only=True
)
teacher_model = AutoModelForCausalLM.from_pretrained(teacher_model_name,local_files_only=True
)

4.2 加載學生模型

# 加載學生模型(Qwen)
student_model_name = os.path.join(current_script_dir, "../models/qwen2.5-1.5B")  # 確保模型名稱正確
logger.info(f"Loading student model: {student_model_name}")
student_tokenizer = AutoTokenizer.from_pretrained(student_model_name,local_files_only=True
)
student_model = AutoModelForCausalLM.from_pretrained(student_model_name,local_files_only=True
)

4.3 數據預處理函數??

dataset.map()?是?Hugging Face datasets?庫中用于對數據集進行批量預處理的核心方法。當?batched=True?時,它會將數據集分批(batch)傳遞給?preprocess_function,而不是逐個樣本處理。這種批量處理方式效率更高,尤其適合大規模數據集。

# 數據預處理
logger.info(f"Preprocess_function")
def preprocess_function(examples):return teacher_tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)logger.info("Preprocessing train dataset")
train_dataset = train_dataset.map(preprocess_function, batched=True)
logger.info("Preprocessing eval dataset")
eval_dataset = eval_dataset.map(preprocess_function, batched=True)

?4.4 數據收集器

DataCollatorForLanguageModeling?是?Hugging Face transformers?庫中的一個數據整理類(Data Collator),用于在訓練語言模型(如?BERT、GPT?等)時動態生成訓練樣本。它可以根據任務需求(如掩碼語言模型(MLM)或因果語言模型(CLM))對輸入數據進行預處理。

# 數據收集器
logger.info("DataCollatorForLanguageModeling")
data_collator = DataCollatorForLanguageModeling(tokenizer=teacher_tokenizer, mlm=False)

mlm(關鍵參數):作用:控制是否啟用**掩碼語言模型(MLM)**模式。

mlm=True:隨機掩碼輸入中的部分?token(如?BERT?訓練方式),生成?[MASK]?標記。

mlm=False:禁用掩碼,適用于因果語言模型(CLM)(如?GPT?訓練方式),輸入和標簽為原始?token?序列。

4.5 定義訓練參數

# 定義訓練參數
logger.info("Creating trainer")
training_args = TrainingArguments(output_dir="./results",            # 訓練結果保存路徑eval_strategy="epoch",             # 每個 epoch 結束時評估learning_rate=5e-5,                # 學習率(默認 5e-5 是常見選擇)per_device_train_batch_size=2,     # 每個設備的訓練 batch size(GPU 單卡)per_device_eval_batch_size=2,      # 每個設備的評估 batch sizenum_train_epochs=3,                # 訓練輪次(3 輪可能較短,需根據任務調整)weight_decay=0.01,                 # 權重衰減(L2 正則化)logging_dir="./logs",              # 日志保存路徑logging_steps=100,                 # 每 100 步記錄一次日志fp16=False,                        # 是否啟用混合精度訓練(建議開啟)gradient_accumulation_steps=4,     # 梯度累積步數(等效 batch_size=8)report_to="tensorboard",           # 使用 TensorBoard 記錄訓練過程# tensorboard_dir="./tensorboard"  # 可選:指定 TensorBoard 日志目錄
)

4.6 定義蒸餾配置

# 定義蒸餾配置  weight:添加權重,"loss": "mse"
logger.info("Creating distillation config")
distill_config = DistillationConfig(temperature=2.0,  # 溫度參數,控制軟標簽的平滑程度hard_label_weight=0.5,  # 真實標簽損失權重kd_loss_type="ce",      # 知識蒸餾損失類型(交叉熵)intermediate_matches=[  # 中間層匹配配置{"layer_T": 6,    # 教師模型的第6層"layer_S": 6,    # 學生模型的第6層"feature": "hidden",  # 匹配隱藏層特征"weight": 1.0,   # 中間層損失權重"loss": "mse"    # 使用均方誤差損失}])

4.7 定義訓練配置

# 定義訓練配置
logger.info("Creating training config")
train_config = TrainingConfig(device="cuda" if torch.cuda.is_available() else "cpu",  # 設備選擇log_dir="./logs",                                     # 日志目錄output_dir="./outputs"                                # 模型輸出目錄# save_best_model=True,  # 是否保存最佳模型(注釋狀態)# save_last_model=True,  # 是否保存最后模型(注釋狀態)# save_model_every_epoch=True,  # 是否每輪保存模型(注釋狀態)# tensorboard_dir="./tensorboard"  # TensorBoard 日志目錄(注釋狀態))

4.8 創建蒸餾器?

# 創建蒸餾器
logger.info("Creating distiller")
distiller = GeneralDistiller(train_config=train_config,        # 訓練配置(包含設備、路徑等)distill_config=distill_config,    # 蒸餾配置(溫度、損失權重等)model_T=teacher_model,            # 教師模型model_S=student_model,            # 學生模型adaptor_T=None,                   # 教師模型適配器(未配置)adaptor_S=None                    # 學生模型適配器(未配置)
)

4.9 開始蒸餾?

# 開始蒸餾
with distiller:  # 使用蒸餾器上下文管理器,確保資源正確初始化和釋放logger.info("Starting training")  # 記錄訓練開始日志# 初始化 Trainer,集成模型蒸餾配置trainer = Trainer(model=student_model,  # 學生模型(需要訓練的小模型)args=training_args,   # 訓練參數(如學習率、批次大小、設備等)train_dataset=train_dataset,  # 訓練數據集(包含輸入和標簽)eval_dataset=eval_dataset,    # 驗證數據集(用于評估模型性能)data_collator=data_collator,  # 數據批量處理函數(將單條數據組合成批次)# processing_class=teacher_tokenizer  # 注意:此處可能存在問題(見下方說明)# 正確做法:適配器或數據處理邏輯應在蒸餾配置中處理)# 開始模型訓練trainer.train()  # 啟動訓練循環,包含前向傳播、損失計算、反向傳播等logger.info("Training finished")  # 記錄訓練結束日志

?5. 完整代碼

import osimport torch
from transformers import AutoModelForCausalLM, AutoTokenizer, DataCollatorForLanguageModeling, Trainer, \TrainingArguments
from textbrewer import GeneralDistiller, TrainingConfig, DistillationConfig
from datasets import load_dataset
import logging# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)# 獲取當前腳本文件的絕對路徑
current_script_path = os.path.abspath(__file__)
logger.info(f"Current script path: {current_script_path}")# 獲取當前腳本文件所在的目錄
current_script_dir = os.path.dirname(current_script_path)
logger.info(f"Current script directory: {current_script_dir}")# 加載教師模型(DeepSeek-R1:1.5B)
teacher_model_name = os.path.join(current_script_dir, "../models/DeepSeek-R1-Distill-Qwen-1.5B")
logger.info(f"Loading teacher model: {teacher_model_name}")
teacher_tokenizer = AutoTokenizer.from_pretrained(teacher_model_name,local_files_only=True
)
teacher_model = AutoModelForCausalLM.from_pretrained(teacher_model_name,local_files_only=True
)# 加載學生模型(Qwen)
student_model_name = os.path.join(current_script_dir, "../models/qwen2.5-1.5B")  # 確保模型名稱正確
logger.info(f"Loading student model: {student_model_name}")
student_tokenizer = AutoTokenizer.from_pretrained(student_model_name,local_files_only=True
)
student_model = AutoModelForCausalLM.from_pretrained(student_model_name,local_files_only=True
)# 準備數據集
datasets_name = os.path.join(current_script_dir, "../models/Dataset/wikitext-2-raw/")  # 確保模型名稱正確
data_files = {"train": datasets_name+"wiki.train.raw","test": datasets_name+"wiki.test.raw"
}
logger.info(f"Loading dataset from local files: {data_files}")
dataset = load_dataset("text", data_files=data_files)
train_dataset = dataset["train"]
eval_dataset = dataset["test"]# 數據預處理
logger.info(f"Preprocess_function")
def preprocess_function(examples):return teacher_tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512)logger.info("Preprocessing train dataset")
train_dataset = train_dataset.map(preprocess_function, batched=True)
logger.info("Preprocessing eval dataset")
eval_dataset = eval_dataset.map(preprocess_function, batched=True)# 數據收集器
logger.info("DataCollatorForLanguageModeling")
data_collator = DataCollatorForLanguageModeling(tokenizer=teacher_tokenizer, mlm=False)# 定義訓練參數
logger.info("Creating trainer")
training_args = TrainingArguments(output_dir="./results",            # 訓練結果保存路徑eval_strategy="epoch",             # 每個 epoch 結束時評估learning_rate=5e-5,                # 學習率(默認 5e-5 是常見選擇)per_device_train_batch_size=2,     # 每個設備的訓練 batch size(GPU 單卡)per_device_eval_batch_size=2,      # 每個設備的評估 batch sizenum_train_epochs=3,                # 訓練輪次(3 輪可能較短,需根據任務調整)weight_decay=0.01,                 # 權重衰減(L2 正則化)logging_dir="./logs",              # 日志保存路徑logging_steps=100,                 # 每 100 步記錄一次日志fp16=False,                        # 是否啟用混合精度訓練(建議開啟)gradient_accumulation_steps=4,     # 梯度累積步數(等效 batch_size=8)report_to="tensorboard",           # 使用 TensorBoard 記錄訓練過程# tensorboard_dir="./tensorboard"  # 可選:指定 TensorBoard 日志目錄
)# 定義蒸餾配置  weight:添加權重,"loss": "mse"
logger.info("Creating distillation config")
distill_config = DistillationConfig(temperature=2.0,  # 溫度參數,控制軟標簽的平滑程度hard_label_weight=0.5,  # 真實標簽損失權重kd_loss_type="ce",      # 知識蒸餾損失類型(交叉熵)intermediate_matches=[  # 中間層匹配配置{"layer_T": 6,    # 教師模型的第6層"layer_S": 6,    # 學生模型的第6層"feature": "hidden",  # 匹配隱藏層特征"weight": 1.0,   # 中間層損失權重"loss": "mse"    # 使用均方誤差損失}]
)# 定義訓練配置
logger.info("Creating training config")
train_config = TrainingConfig(device="cuda" if torch.cuda.is_available() else "cpu",  # 設備選擇log_dir="./logs",                                     # 日志目錄output_dir="./outputs"                                # 模型輸出目錄# save_best_model=True,  # 是否保存最佳模型(注釋狀態)# save_last_model=True,  # 是否保存最后模型(注釋狀態)# save_model_every_epoch=True,  # 是否每輪保存模型(注釋狀態)# tensorboard_dir="./tensorboard"  # TensorBoard 日志目錄(注釋狀態)
)# 創建蒸餾器
logger.info("Creating distiller")
distiller = GeneralDistiller(train_config=train_config,        # 訓練配置(包含設備、路徑等)distill_config=distill_config,    # 蒸餾配置(溫度、損失權重等)model_T=teacher_model,            # 教師模型model_S=student_model,            # 學生模型adaptor_T=None,                   # 教師模型適配器(未配置)adaptor_S=None                    # 學生模型適配器(未配置)
)# 開始蒸餾
with distiller:  # 使用蒸餾器上下文管理器,確保資源正確初始化和釋放logger.info("Starting training")  # 記錄訓練開始日志# 初始化 Trainer,集成模型蒸餾配置trainer = Trainer(model=student_model,  # 學生模型(需要訓練的小模型)args=training_args,  # 訓練參數(如學習率、批次大小、設備等)train_dataset=train_dataset,  # 訓練數據集(包含輸入和標簽)eval_dataset=eval_dataset,  # 驗證數據集(用于評估模型性能)data_collator=data_collator,  # 數據批量處理函數(將單條數據組合成批次)# processing_class=teacher_tokenizer  # 注意:此處可能存在問題(見下方說明)# 正確做法:適配器或數據處理邏輯應在蒸餾配置中處理)# 開始模型訓練trainer.train()  # 啟動訓練循環,包含前向傳播、損失計算、反向傳播等trainer.save_model()logger.info("Training finished")  # 記錄訓練結束日志
復制代碼

參考:

模型蒸餾(Distillation)案例--從DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸餾 - InProsperity - 博客園

模型蒸餾(Distillation)案例--從DeepSeek-R1-1.5B 到 Qwen-2.5-1.5B 的模型蒸餾-CSDN博客

6.結合上述內容和TextBrewer,自己重新整理了一遍代碼,僅供參考:

import os
import torch
import logging
from transformers import (AutoModelForCausalLM,AutoTokenizer,DataCollatorForLanguageModeling,get_linear_schedule_with_warmup
)
from textbrewer import GeneralDistiller, TrainingConfig, DistillationConfig
from datasets import load_dataset
from torch.optim import AdamW# 配置日志
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s - %(message)s',handlers=[logging.FileHandler("distillation.log"),logging.StreamHandler()]
)
logger = logging.getLogger(__name__)# 設備設置
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
logger.info(f"Using device: {device}")# ======================
# 1. 加載模型和Tokenizer
# ======================
def load_models_and_tokenizers():"""加載教師和學生模型"""# 教師模型 (DeepSeek-R1 1.5B)teacher_model_name = "deepseek-ai/deepseek-r1-1.5b"logger.info(f"Loading teacher model: {teacher_model_name}")teacher_tokenizer = AutoTokenizer.from_pretrained(teacher_model_name)teacher_model = AutoModelForCausalLM.from_pretrained(teacher_model_name,torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32).to(device)# 學生模型 (Qwen 1.5B)student_model_name = "Qwen/Qwen1.5-1.8B"logger.info(f"Loading student model: {student_model_name}")student_tokenizer = AutoTokenizer.from_pretrained(student_model_name)student_model = AutoModelForCausalLM.from_pretrained(student_model_name,torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32).to(device)# 對齊tokenizer(關鍵步驟!)if teacher_tokenizer.vocab != student_tokenizer.vocab:logger.warning("Tokenizers not aligned, adding special tokens...")student_tokenizer.add_special_tokens({'pad_token': '[PAD]'})student_model.resize_token_embeddings(len(student_tokenizer))return teacher_model, student_model, teacher_tokenizer, student_tokenizer# ======================
# 2. 數據準備
# ======================
def prepare_data(student_tokenizer):"""加載并預處理數據"""# 加載數據集(示例使用wikitext)dataset = load_dataset("wikitext", "wikitext-2-raw-v1")# 預處理函數def preprocess_function(examples):return student_tokenizer(examples["text"],truncation=True,padding="max_length",max_length=512,return_tensors="pt")# 處理數據集train_dataset = dataset["train"].map(preprocess_function,batched=True,remove_columns=["text"])eval_dataset = dataset["validation"].map(preprocess_function,batched=True,remove_columns=["text"])# 數據收集器data_collator = DataCollatorForLanguageModeling(tokenizer=student_tokenizer,mlm=False)return train_dataset, eval_dataset, data_collator# ======================
# 3. 蒸餾配置
# ======================
def get_distillation_config():"""配置蒸餾參數"""return DistillationConfig(temperature=2.0,  # 初始溫度temperature_scheduler=lambda x: max(0.5, 2.0 - 0.1 * x),  # 溫度衰減hard_label_weight=0.3,  # 真實標簽權重kd_loss_weight=0.7,  # 蒸餾損失權重kd_loss_type="ce",  # 交叉熵損失intermediate_matches=[{"layer_T": [6, 12, 18],  # 教師模型層"layer_S": [3, 6, 9],  # 學生模型層"feature": "hidden",  # 隱藏狀態"loss": "cosine",  # 余弦相似度損失"weight": 0.5,"proj": ["linear", 1536, 1024]  # 維度投影},{"layer_T": [9, 15],"layer_S": [4, 7],"feature": "attention",  # 注意力矩陣"loss": "mse","weight": 0.3}])# ======================
# 4. 訓練配置
# ======================
def get_training_config():"""配置訓練參數"""return TrainingConfig(output_dir="./distill_output",device=device,fp16=torch.cuda.is_available(),gradient_accumulation_steps=4,ckpt_frequency=500,  # 每500步保存檢查點log_steps=100,max_grad_norm=1.0,  # 梯度裁剪save_optimizer=False  # 為節省空間不保存優化器)# ======================
# 5. 優化器設置
# ======================
def get_optimizer(model):"""配置優化器和學習率調度"""optimizer = AdamW(model.parameters(),lr=5e-5,weight_decay=0.01)scheduler = get_linear_schedule_with_warmup(optimizer,num_warmup_steps=500,num_training_steps=3000)return optimizer, scheduler# ======================
# 主函數
# ======================
def main():# 1. 加載模型和數據teacher_model, student_model, teacher_tokenizer, student_tokenizer = load_models_and_tokenizers()train_dataset, eval_dataset, data_collator = prepare_data(student_tokenizer)# 2. 配置蒸餾distill_config = get_distillation_config()train_config = get_training_config()# 3. 初始化蒸餾器distiller = GeneralDistiller(train_config=train_config,distill_config=distill_config,model_T=teacher_model,model_S=student_model,adaptor_T=None,  # 使用默認適配器adaptor_S=None)# 4. 準備優化器optimizer, scheduler = get_optimizer(student_model)# 5. 開始蒸餾logger.info("Starting distillation...")with distiller:distiller.train(optimizer=optimizer,scheduler=scheduler,train_dataset=train_dataset,eval_dataset=eval_dataset,batch_size=2,num_epochs=3,data_collator=data_collator,callback=None)# 6. 保存最終模型student_model.save_pretrained("./final_student_model")student_tokenizer.save_pretrained("./final_student_model")logger.info("Distillation completed!")if __name__ == "__main__":main()

另外,可以了解Text Generation WebUI,集成不同大模型進行推理,測試。

https://github.com/oobabooga/text-generation-webui

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93023.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93023.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93023.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過redis_exporter監控redis cluster

環境說明: 現在有一套redis cluster,部署是3主機6實例架構部署。需要采集對應的指標,滿足異常監控告警,性能分析所需。 環境準備 以下環境需要提前部署完成。 redis cluser prometheus alertmanager grafna redis_exporter部署 我…

第二十天(正則表達式與功能實際運用)

在程序員一生的工作中,遇到的最多的數據就是字符串字符串里面很有可能有很多的不需要的信息我們需要從中間挑選出我們需要的如果循環去寫,比較簡單的時候問題不大規則多了,你的工作量會成倍上升的為了解決這個問題 ---- 正則表達式正則表達式…

0基礎法考隨手筆記 03(刑訴05 刑事證據與證明+06 強制措施)

1.如何區分書證和電子數據 書面材料是否為書證?→ 看內容是否直接源于案件事實(不是 “記錄別人陳述” 的載體)。 證據清單是否為證據?→ 看誰做的清單(偵查人員做的勘查筆錄是證據,當事人做的目錄不是&…

資產負債表及其數據獲取

文章目錄資產負債表及其數據獲取資產負債表資產負債表在股票投資中的意義AKShare中的資產負債表數據接口(深滬為例)接口描述調用示例總結資產負債表及其數據獲取 資產負債表 資產負債表(Balance Sheet)是反映企業在某一特定日期財…

數據倉庫深度探索系列 | 開篇:開啟數倉建設新征程

數據倉庫深度探索系列 | 開篇:開啟數倉建設新征程 在當今信息技術飛速發展的背景下,企業面臨著數據量的爆炸式增長。企業不僅要高效管理海量數據,還需從中提取關鍵信息以支持復雜決策。數據倉庫已從單純的數據存儲工具,演變為支持…

Linux如何執行系統調用及高效執行系統調用:深入淺出的解析

文章目錄如何執行系統調用及高效執行系統調用:深入淺出的解析一、什么是系統調用?1.1 系統調用的作用1.2 系統調用的分類二、如何執行系統調用?2.1 系統調用的觸發2.2 庫函數與系統調用的關系2.3 系統調用的示例2.4 錯誤處理三、如何高效執行…

基于 XGBoost 與 SHAP 的醫療自動化辦公與可視化系統(上)

摘要 隨著信息技術的飛速發展和醫療健康數據的爆炸式增長,現代醫療機構面臨著日益復雜的數據處理挑戰。醫生和行政人員常常需要花費大量時間在數據提取、整理、分析和報告生成等重復性、事務性的工作上,這不僅降低了工作效率,也限制了醫護人員將更多精力投入到直接的患者護…

基于Kafka實現簡單的延時隊列

生命無罪,健康萬歲,我是laity。 我曾七次鄙視自己的靈魂: 第一次,當它本可進取時,卻故作謙卑; 第二次,當它在空虛時,用愛欲來填充; 第三次,在困難和容易之間&…

OceanBase 4.3.5 解析:DDL性能診斷

背景DDL操作通常耗時較長,特別是涉及補數據流程的DDL語句。在執行過程中,用戶面臨兩個主要痛點:一是無法實時獲取DDL執行進度,難以區分長時間運行是正常現象還是由內部異常導致的停滯;二是執行效率經常低于預期&#x…

幸福網咖訂座點餐小程序的設計與實現

文章目錄前言詳細視頻演示具體實現截圖后端框架SpringBoot微信小程序持久層框架MyBaits成功系統案例:參考代碼數據庫源碼獲取前言 博主介紹:CSDN特邀作者、985高校計算機專業畢業、現任某互聯網大廠高級全棧開發工程師、Gitee/掘金/華為云/阿里云/GitHub等平臺持續…

C語言————練習題冊(答案版)

目錄 每日更新5-10題,感興趣可以訂閱 一.理解函數、操作符、占位符 1.1 歡迎來到C語言的世界 1.2 輸入和輸出 1.3 浮點數的打印 1.4 字符串的打印 1.14 I am iron man 1.5 求和運算 1.6 計算比例 1.7 求商求余 1.8 不同數位上的數字 1.8.1 求個位數 1.8…

haproxy配置詳解

1、haproxy簡介 HAProxy是法國開發者 威利塔羅(Willy Tarreau) 在2000年使用C語言開發的一個開源軟件 是一款具備高并發(萬級以上)、高性能的TCP和HTTP負載均衡器 支持基于cookie的持久性,自動故障切換,支持正則表達式及web狀態統計 企業版網站&#xff…

計網-TCP可靠傳輸

TCP(傳輸控制協議)的可靠傳輸是通過一系列機制保證數據準確、有序、不丟失地到達接收方。以下是TCP可靠傳輸的詳細過程及核心機制:1. 數據分塊與序列號(Seq)分塊:應用層數據被分割成適合傳輸的TCP報文段&am…

數智管理學(三十九)

第三章 數智化對管理理論的沖擊第三節 系統理論與生態化管理的強化系統理論作為理解企業運作與環境互動的重要框架,一直強調企業是一個由多個相互關聯子系統構成的整體,其核心要素包括整體性、開放性、動態性和反饋機制。在傳統管理視角下,這…

哈希表(c語言)

文章目錄哈希表哈希表知識點哈希表概念負載因子哈希表的優缺點哈希沖突哈希函數常見哈希函數處理哈希沖突開放定址法線性探測二次探測鏈地址法哈希表的實現哈希表的核心:HashMap核心函數:從創建到銷毀創建哈希表:hashmap_create()銷毀哈希表:hashmap_des…

【Canvas與旗幟】條紋版大明三辰旗

【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>十三條紋版大明三辰旗 Draft1</title><style type"text/…

【Java】空指針(NullPointerException)異常深度攻堅:從底層原理到架構級防御,老司機的實戰經驗

寫Java代碼這些年&#xff0c;空指針異常&#xff08;NullPointerException&#xff09;就像甩不掉的影子。線上排查問題時&#xff0c;十次有八次最后定位到的都是某個對象沒處理好null值。但多數人解決問題只停留在加個if (obj ! null)的層面&#xff0c;沒從根本上想過為什么…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 主頁-評論用戶時間占比環形餅狀圖實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解主頁-評論用戶時間占比環形餅狀圖實現 視頻…

Redis面試精講 Day 5:Redis內存管理與過期策略

【Redis面試精講 Day 5】Redis內存管理與過期策略 開篇 歡迎來到"Redis面試精講"系列的第5天&#xff01;今天我們將深入探討Redis內存管理與過期策略&#xff0c;這是面試中經常被問及的核心知識點。對于后端工程師而言&#xff0c;理解Redis如何高效管理內存、處…

ICMPv6報文類型詳解表

一、錯誤報文類型&#xff08;Type 1-127&#xff09;Type值名稱Code范圍觸發條件示例典型用途1Destination Unreachable0-60: 無路由到目標1: 通信被管理員禁止2: 地址不可達3: 端口不可達4: 分片需要但DF標志設置5: 源路由失敗6: 目的地址不可達網絡故障診斷2Packet Too Big0…