L1G5000 XTuner 微調個人小助手認知

使用 XTuner 微調 InternLM2-Chat-7B 實現自己的小助手認知

  • 1 環境配置與數據準備
    • 步驟 0. 使用 conda 先構建一個 Python-3.10 的虛擬環境
    • 步驟 1. 安裝 XTuner
  • 修改提供的數據
    • 步驟 0. 創建一個新的文件夾用于存儲微調數據
    • 步驟 1. 創建修改腳本
    • 步驟 2. 執行腳本
    • 步驟 3. 查看數據
  • 訓練啟動
    • 步驟 0. 復制模型
    • 步驟 1. 修改 Config
    • 步驟 2. 啟動微調
    • 步驟 3. 權重轉換
    • 步驟 4. 模型合并
  • 模型 WebUI 對話

參考文檔: 書生訓練營
XTuner 文檔鏈接

1 環境配置與數據準備

步驟 0. 使用 conda 先構建一個 Python-3.10 的虛擬環境

cd ~
#git clone 本repo
git clone https://github.com/InternLM/Tutorial.git -b camp4
mkdir -p /root/finetune && cd /root/finetune
conda create -n xtuner-env python=3.10 -y
conda activate xtuner-env

步驟 1. 安裝 XTuner

cd /root/Tutorial/docs/L1/XTuner
pip install -r requirements.txt
pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu121
# requirements.txt
accelerate==0.27.0
addict==2.4.0
aiohttp==3.9.3
aiosignal==1.3.1
aliyun-python-sdk-core==2.14.0
aliyun-python-sdk-kms==2.16.2
altair==5.2.0
annotated-types==0.6.0
anyio==4.2.0
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
arrow==1.3.0
arxiv==2.1.0
asttokens==2.4.1
async-lru==2.0.4
async-timeout==4.0.3
attrs==23.2.0
Babel==2.14.0
beautifulsoup4==4.12.3
bitsandbytes==0.42.0
bleach==6.1.0
blinker==1.7.0
cachetools==5.3.2
certifi==2024.2.2
cffi==1.16.0
charset-normalizer==3.3.2
click==8.1.7
colorama==0.4.6
comm==0.2.1
contourpy==1.2.0
crcmod==1.7
cryptography==42.0.2
cycler==0.12.1
datasets==2.17.0
debugpy==1.8.1
decorator==5.1.1
deepspeed==0.14.4
defusedxml==0.7.1
dill==0.3.8
distro==1.9.0
einops==0.8.0
einx==0.3.0
et-xmlfile==1.1.0
exceptiongroup==1.2.0
executing==2.0.1
fastapi==0.112.0
fastjsonschema==2.19.1
feedparser==6.0.10
filelock==3.14.0
fonttools==4.48.1
fqdn==1.5.1
frozendict==2.4.4
frozenlist==1.4.1
fsspec==2023.10.0
func-timeout==4.3.5
gast==0.5.4
gitdb==4.0.11
GitPython==3.1.41
google-search-results==2.4.2
griffe==0.40.1
h11==0.14.0
hjson==3.1.0
httpcore==1.0.3
httpx==0.26.0
huggingface-hub==0.24.2
idna==3.6
imageio==2.34.2
importlib-metadata==7.0.1
ipykernel==6.29.2
ipython==8.21.0
ipywidgets==8.1.2
isoduration==20.11.0
jedi==0.19.1
Jinja2==3.1.3
jmespath==0.10.0
json5==0.9.14
jsonpointer==2.4
jsonschema==4.21.1
jsonschema-specifications==2023.12.1
kiwisolver==1.4.5
lagent==0.2.1
lazy_loader==0.4
llvmlite==0.43.0
lxml==5.1.0
markdown-it-py==3.0.0
MarkupSafe==2.1.5
matplotlib==3.8.2
matplotlib-inline==0.1.6
mdurl==0.1.2
mistune==3.0.2
mmengine==0.10.3
modelscope==1.12.0
mpi4py_mpich==3.1.5
mpmath==1.3.0
multidict==6.0.5
multiprocess==0.70.16
nbclient==0.9.0
nbconvert==7.16.0
nbformat==5.9.2
nest-asyncio==1.6.0
networkx==3.2.1
ninja==1.11.1.1
notebook==7.0.8
notebook_shim==0.2.3
numba==0.60.0
numpy==1.26.4
nvidia-cublas-cu12==12.1.3.1
nvidia-cuda-cupti-cu12==12.1.105
nvidia-cuda-nvrtc-cu12==12.1.105
nvidia-cuda-runtime-cu12==12.1.105
nvidia-cudnn-cu12==8.9.2.26
nvidia-cufft-cu12==11.0.2.54
nvidia-curand-cu12==10.3.2.106
nvidia-cusolver-cu12==11.4.5.107
nvidia-cusparse-cu12==12.1.0.106
nvidia-nccl-cu12==2.19.3
nvidia-nvjitlink-cu12==12.3.101
nvidia-nvtx-cu12==12.1.105
openai==1.12.0
opencv-python==4.9.0.80
openpyxl==3.1.2
oss2==2.17.0
overrides==7.7.0
packaging==24.1
pandas==2.2.0
pandocfilters==1.5.1
parso==0.8.3
peft==0.8.2
pexpect==4.9.0
phx-class-registry==4.1.0
pillow==10.2.0
platformdirs==4.2.0
prometheus-client==0.19.0
prompt-toolkit==3.0.43
protobuf==4.25.2
psutil==5.9.8
ptyprocess==0.7.0
pure-eval==0.2.2
py-cpuinfo==9.0.0
pyarrow==15.0.0
pyarrow-hotfix==0.6
pybase16384==0.3.7
pycparser==2.21
pycryptodome==3.20.0
pydantic==2.6.1
pydantic_core==2.16.2
pydeck==0.8.1b0
Pygments==2.17.2
pynvml==11.5.0
pyparsing==3.1.1
python-dateutil==2.8.2
python-json-logger==2.0.7
python-pptx==0.6.23
PyYAML==6.0.1
pyzmq==25.1.2
qtconsole==5.5.1
QtPy==2.4.1
referencing==0.33.0
regex==2023.12.25
rfc3339-validator==0.1.4
rfc3986-validator==0.1.1
rich==13.4.2
rpds-py==0.17.1
safetensors==0.4.2
scikit-image==0.24.0
scipy==1.12.0
seaborn==0.13.2
Send2Trash==1.8.2
sentencepiece==0.1.99
sgmllib3k==1.0.0
simplejson==3.19.2
six==1.16.0
smmap==5.0.1
sniffio==1.3.0
sortedcontainers==2.4.0
soupsieve==2.5
stack-data==0.6.3
starlette==0.37.2
sympy==1.12
tenacity==8.2.3
termcolor==2.4.0
terminado==0.18.0
tifffile==2024.7.24
tiktoken==0.6.0
timeout-decorator==0.5.0
tinycss2==1.2.1
tokenizers==0.15.2
toml==0.10.2
tomli==2.0.1
toolz==0.12.1
torch==2.2.1
torchvision==0.17.1
tornado==6.4
tqdm==4.65.2
traitlets==5.14.1
transformers==4.39.0
transformers-stream-generator==0.0.4
triton==2.2.0
types-python-dateutil==2.8.19.20240106
typing_extensions==4.9.0
tzdata==2024.1
tzlocal==5.2
uri-template==1.3.0
urllib3==1.26.18
uvicorn==0.30.6
validators==0.22.0
watchdog==4.0.0
wcwidth==0.2.13
webcolors==1.13
webencodings==0.5.1
websocket-client==1.7.0
widgetsnbextension==4.0.10
XlsxWriter==3.1.9
xtuner==0.1.23
xxhash==3.4.1
yapf==0.40.2
yarl==1.9.4
zipp==3.17.0

驗證一下:

xtuner list-cfg
在這里插入圖片描述

修改提供的數據

步驟 0. 創建一個新的文件夾用于存儲微調數據

mkdir -p /root/finetune/data && cd /root/finetune/data
cp -r /root/Tutorial/data/assistant_Tuner.jsonl  /root/finetune/data

步驟 1. 創建修改腳本

# 創建 `change_script.py` 文件
touch /root/finetune/data/change_script.py
import json
import argparse
from tqdm import tqdmdef process_line(line, old_text, new_text):# 解析 JSON 行data = json.loads(line)# 遞歸函數來處理嵌套的字典和列表def replace_text(obj):if isinstance(obj, dict):return {k: replace_text(v) for k, v in obj.items()}elif isinstance(obj, list):return [replace_text(item) for item in obj]elif isinstance(obj, str):return obj.replace(old_text, new_text)else:return obj# 處理整個 JSON 對象processed_data = replace_text(data)# 將處理后的對象轉回 JSON 字符串return json.dumps(processed_data, ensure_ascii=False)def main(input_file, output_file, old_text, new_text):with open(input_file, 'r', encoding='utf-8') as infile, \open(output_file, 'w', encoding='utf-8') as outfile:# 計算總行數用于進度條total_lines = sum(1 for _ in infile)infile.seek(0)  # 重置文件指針到開頭# 使用 tqdm 創建進度條for line in tqdm(infile, total=total_lines, desc="Processing"):processed_line = process_line(line.strip(), old_text, new_text)outfile.write(processed_line + '\n')if __name__ == "__main__":parser = argparse.ArgumentParser(description="Replace text in a JSONL file.")parser.add_argument("input_file", help="Input JSONL file to process")parser.add_argument("output_file", help="Output file for processed JSONL")parser.add_argument("--old_text", default="尖米", help="Text to be replaced")parser.add_argument("--new_text", default="聞星", help="Text to replace with")args = parser.parse_args()main(args.input_file, args.output_file, args.old_text, args.new_text)

然后修改如下: 打開 change_script.py ,修改 --new_text 中 default=“聞星” 為你的名字

步驟 2. 執行腳本

# usage:python change_script.py {input_file.jsonl} {output_file.jsonl}
cd ~/finetune/data
python change_script.py ./assistant_Tuner.jsonl ./assistant_Tuner_change.jsonl

步驟 3. 查看數據

cat assistant_Tuner_change.jsonl | head -n 3

訓練啟動

步驟 0. 復制模型

在InternStudio開發機中的已經提供了微調模型,可以直接軟鏈接即可。

本模型位于/root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat

mkdir /root/finetune/modelsln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2_5-7b-chat /root/finetune/models/internlm2_5-7b-chat

步驟 1. 修改 Config

# cd {path/to/finetune}
cd /root/finetune
mkdir ./config
cd config
xtuner copy-cfg internlm2_5_chat_7b_qlora_alpaca_e3 ./

修改config文件,

#######################################################################
#                          PART 1  Settings                           #
#######################################################################
- pretrained_model_name_or_path = 'internlm/internlm2_5-7b-chat'
+ pretrained_model_name_or_path = '/root/finetune/models/internlm2_5-7b-chat'- alpaca_en_path = 'tatsu-lab/alpaca'
+ alpaca_en_path = '/root/finetune/data/assistant_Tuner_change.jsonl'evaluation_inputs = [
-    '請給我介紹五個上海的景點', 'Please tell me five scenic spots in Shanghai'
+    '請介紹一下你自己', 'Please introduce yourself'
]#######################################################################
#                      PART 3  Dataset & Dataloader                   #
#######################################################################
alpaca_en = dict(type=process_hf_dataset,
-   dataset=dict(type=load_dataset, path=alpaca_en_path),
+   dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),tokenizer=tokenizer,max_length=max_length,
-   dataset_map_fn=alpaca_map_fn,
+   dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length,use_varlen_attn=use_varlen_attn)

修改后如下

# Copyright (c) OpenMMLab. All rights reserved.
import torch
from datasets import load_dataset
from mmengine.dataset import DefaultSampler
from mmengine.hooks import (CheckpointHook, DistSamplerSeedHook, IterTimerHook,LoggerHook, ParamSchedulerHook)
from mmengine.optim import AmpOptimWrapper, CosineAnnealingLR, LinearLR
from peft import LoraConfig
from torch.optim import AdamW
from transformers import (AutoModelForCausalLM, AutoTokenizer,BitsAndBytesConfig)from xtuner.dataset import process_hf_dataset
from xtuner.dataset.collate_fns import default_collate_fn
from xtuner.dataset.map_fns import alpaca_map_fn, template_map_fn_factory
from xtuner.engine.hooks import (DatasetInfoHook, EvaluateChatHook,VarlenAttnArgsToMessageHubHook)
from xtuner.engine.runner import TrainLoop
from xtuner.model import SupervisedFinetune
from xtuner.parallel.sequence import SequenceParallelSampler
from xtuner.utils import PROMPT_TEMPLATE, SYSTEM_TEMPLATE#######################################################################
#                          PART 1  Settings                           #
#######################################################################
# Model
pretrained_model_name_or_path = '/root/finetune/models/internlm2_5-7b-chat'
use_varlen_attn = False# Data
alpaca_en_path = '/root/finetune/data/assistant_Tuner_change.jsonl'
prompt_template = PROMPT_TEMPLATE.internlm2_chat
max_length = 2048
pack_to_max_length = True# parallel
sequence_parallel_size = 1# Scheduler & Optimizer
batch_size = 1  # per_device
accumulative_counts = 1
accumulative_counts *= sequence_parallel_size
dataloader_num_workers = 0
max_epochs = 3
optim_type = AdamW
lr = 2e-4
betas = (0.9, 0.999)
weight_decay = 0
max_norm = 1  # grad clip
warmup_ratio = 0.03# Save
save_steps = 500
save_total_limit = 2  # Maximum checkpoints to keep (-1 means unlimited)# Evaluate the generation performance during the training
evaluation_freq = 500
SYSTEM = SYSTEM_TEMPLATE.alpaca
evaluation_inputs = ['請介紹一下你自己', 'Please introduce yourself'
]#######################################################################
#                      PART 2  Model & Tokenizer                      #
#######################################################################
tokenizer = dict(type=AutoTokenizer.from_pretrained,pretrained_model_name_or_path=pretrained_model_name_or_path,trust_remote_code=True,padding_side='right')model = dict(type=SupervisedFinetune,use_varlen_attn=use_varlen_attn,llm=dict(type=AutoModelForCausalLM.from_pretrained,pretrained_model_name_or_path=pretrained_model_name_or_path,trust_remote_code=True,torch_dtype=torch.float16,quantization_config=dict(type=BitsAndBytesConfig,load_in_4bit=True,load_in_8bit=False,llm_int8_threshold=6.0,llm_int8_has_fp16_weight=False,bnb_4bit_compute_dtype=torch.float16,bnb_4bit_use_double_quant=True,bnb_4bit_quant_type='nf4')),lora=dict(type=LoraConfig,r=64,lora_alpha=16,lora_dropout=0.1,bias='none',task_type='CAUSAL_LM'))#######################################################################
#                      PART 3  Dataset & Dataloader                   #
#######################################################################
alpaca_en = dict(type=process_hf_dataset,dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),tokenizer=tokenizer,max_length=max_length,dataset_map_fn=None,template_map_fn=dict(type=template_map_fn_factory, template=prompt_template),remove_unused_columns=True,shuffle_before_pack=True,pack_to_max_length=pack_to_max_length,use_varlen_attn=use_varlen_attn)sampler = SequenceParallelSampler \if sequence_parallel_size > 1 else DefaultSampler
train_dataloader = dict(batch_size=batch_size,num_workers=dataloader_num_workers,dataset=alpaca_en,sampler=dict(type=sampler, shuffle=True),collate_fn=dict(type=default_collate_fn, use_varlen_attn=use_varlen_attn))#######################################################################
#                    PART 4  Scheduler & Optimizer                    #
#######################################################################
# optimizer
optim_wrapper = dict(type=AmpOptimWrapper,optimizer=dict(type=optim_type, lr=lr, betas=betas, weight_decay=weight_decay),clip_grad=dict(max_norm=max_norm, error_if_nonfinite=False),accumulative_counts=accumulative_counts,loss_scale='dynamic',dtype='float16')# learning policy
# More information: https://github.com/open-mmlab/mmengine/blob/main/docs/en/tutorials/param_scheduler.md  # noqa: E501
param_scheduler = [dict(type=LinearLR,start_factor=1e-5,by_epoch=True,begin=0,end=warmup_ratio * max_epochs,convert_to_iter_based=True),dict(type=CosineAnnealingLR,eta_min=0.0,by_epoch=True,begin=warmup_ratio * max_epochs,end=max_epochs,convert_to_iter_based=True)
]# train, val, test setting
train_cfg = dict(type=TrainLoop, max_epochs=max_epochs)#######################################################################
#                           PART 5  Runtime                           #
#######################################################################
# Log the dialogue periodically during the training process, optional
custom_hooks = [dict(type=DatasetInfoHook, tokenizer=tokenizer),dict(type=EvaluateChatHook,tokenizer=tokenizer,every_n_iters=evaluation_freq,evaluation_inputs=evaluation_inputs,system=SYSTEM,prompt_template=prompt_template)
]if use_varlen_attn:custom_hooks += [dict(type=VarlenAttnArgsToMessageHubHook)]# configure default hooks
default_hooks = dict(# record the time of every iteration.timer=dict(type=IterTimerHook),# print log every 10 iterations.logger=dict(type=LoggerHook, log_metric_by_epoch=False, interval=10),# enable the parameter scheduler.param_scheduler=dict(type=ParamSchedulerHook),# save checkpoint per `save_steps`.checkpoint=dict(type=CheckpointHook,by_epoch=False,interval=save_steps,max_keep_ckpts=save_total_limit),# set sampler seed in distributed evrionment.sampler_seed=dict(type=DistSamplerSeedHook),
)# configure environment
env_cfg = dict(# whether to enable cudnn benchmarkcudnn_benchmark=False,# set multi process parametersmp_cfg=dict(mp_start_method='fork', opencv_num_threads=0),# set distributed parametersdist_cfg=dict(backend='nccl'),
)# set visualizer
visualizer = None# set log level
log_level = 'INFO'# load from which checkpoint
load_from = None# whether to resume training from the loaded checkpoint
resume = False# Defaults to use random seed and disable `deterministic`
randomness = dict(seed=None, deterministic=False)# set log processor
log_processor = dict(by_epoch=False)

步驟 2. 啟動微調

cd /root/finetune
conda activate xtuner-envxtuner train ./config/internlm2_5_chat_7b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero2 --work-dir ./work_dirs/assistTuner

xtuner train 命令用于啟動模型微調進程。
該命令需要一個參數:CONFIG 用于指定微調配置文件。這里我們使用修改好的配置文件 internlm2_5_chat_7b_qlora_alpaca_e3_copy.py。
訓練過程中產生的所有文件,包括日志、配置文件、檢查點文件、微調后的模型等,默認保存在 work_dirs 目錄下,我們也可以通過添加 --work-dir 指定特定的文件保存位置。
–deepspeed 則為使用 deepspeed, deepspeed 可以節約顯存。

步驟 3. 權重轉換

模型轉換的本質其實就是將原本使用 Pytorch 訓練出來的模型權重文件轉換為目前通用的 HuggingFace 格式文件,那么我們可以通過以下命令來實現一鍵轉換。

我們可以使用 xtuner convert pth_to_hf 命令來進行模型格式轉換

xtuner convert pth_to_hf 命令用于進行模型格式轉換。
該命令需要三個參數:
CONFIG 表示微調的配置文件,
PATH_TO_PTH_MODEL 表示微調的模型權重文件路徑,即要轉換的模型權重,
SAVE_PATH_TO_HF_MODEL 表示轉換后的 HuggingFace 格式文件的保存路徑。
–fp32 代表以fp32的精度開啟,假如不輸入則默認為fp16
–max-shard-size {GB} 代表每個權重文件最大的大小(默認為2GB)

cd /root/finetune/work_dirs/assistTunerconda activate xtuner-env# 先獲取最后保存的一個pth文件
pth_file=`ls -t /root/finetune/work_dirs/assistTuner/*.pth | head -n 1 | sed 's/:$//'`
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm2_5_chat_7b_qlora_alpaca_e3_copy.py ${pth_file} ./hf

步驟 4. 模型合并

對于 LoRA 或者 QLoRA 微調出來的模型其實并不是一個完整的模型,而是一個額外的層(Adapter),訓練完的這個層最終還是要與原模型進行合并才能被正常的使用。

對于全量微調的模型(full)其實是不需要進行整合這一步的,因為全量微調修改的是原模型的權重而非微調一個新的 Adapter ,因此是不需要進行模型整合的。

在 XTuner 中提供了一鍵合并的命令 xtuner convert merge,在使用前我們需要準備好三個路徑,包括原模型的路徑、訓練好的 Adapter 層的(模型格式轉換后的)路徑以及最終保存的路徑。

xtuner convert merge命令用于合并模型。該命令需要三個參數:LLM 表示原模型路徑,ADAPTER 表示 Adapter 層的路徑, SAVE_PATH 表示合并后的模型最終的保存路徑。

參數名解釋
–max-shard-size {GB} 代表每個權重文件最大的大小(默認為2GB)
–device {device_name} 這里指的就是device的名稱,可選擇的有cuda、cpu和auto,默認為cuda即使用gpu進行運算
–is-clip 這個參數主要用于確定模型是不是CLIP模型,假如是的話就要加上,不是就不需要添加

cd /root/finetune/work_dirs/assistTuner
conda activate xtuner-envexport MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert merge /root/finetune/models/internlm2_5-7b-chat ./hf ./merged --max-shard-size 2GB

模型 WebUI 對話

cd ~/Tutorial/tools/L1_XTuner_code
# 直接修改xtuner_streamlit_demo.py腳本文件第18行
- model_name_or_path = "Shanghai_AI_Laboratory/internlm2_5-7b-chat"
+ model_name_or_path = "/root/finetune/work_dirs/assistTuner/merged"conda activate xtuner-envpip install streamlit==1.31.0
streamlit run /root/Tutorial/tools/L1_XTuner_code/xtuner_streamlit_demo.py
# 運行后,確保端口映射正常,如果映射已斷開則需要重新做一次端口映射
ssh -CNg -L 8501:127.0.0.1:8501 root@ssh.intern-ai.org.cn -p *****

最后,通過瀏覽器訪問:http://127.0.0.1:8501 來進行對話了
在這里插入圖片描述

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

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

相關文章

網絡協議安全的攻擊手法

1.使用SYN Flood泛洪攻擊: SYN Flood(半開放攻擊)是最經典的ddos攻擊之一,他利用了TCP協議的三次握手機制,攻擊者通常利用工具或控制僵尸主機向服務器發送海量的變源端口的TCP SYN報文,服務器響應了這些報文后就會生成大量的半連…

人工智能學習路線全鏈路解析

一、基礎準備階段(預計 2-3 個月) (一)數學知識鞏固與深化 線性代數(約 1 個月): 矩陣基礎:回顧矩陣的定義、表示方法、矩陣的基本運算(加法、減法、乘法)&…

Redis 安裝與 Spring Boot 集成指南

安裝 Redis 和將其與 Spring Boot 應用集成是構建高效緩存解決方案的常見步驟。以下是詳細的指南,幫助你在本地環境中安裝 Redis,并在 Spring Boot 項目中配置和使用它。 1. 安裝 Redis Windows 環境 Redis 官方并不直接支持 Windows,但你…

3d打印材料是塑料么?pla petg

3D 打印材料不僅限于塑料,但塑料確實是最常見的材料類型之一。以下是一些常用的3D打印塑料材料的介紹: 1. PLA(聚乳酸) ? 特點:可生物降解,環保,容易打印,表面光滑。 ? 適用…

linux-磁盤io性能指標!

一. 引文: 平時查看或者監控磁盤io時,基本上都是用的現成的工具/腳本, 對其了解的還是很淺,特參考一些資料整理了下,留個隨筆。 二.磁盤I/O性能指標: 磁盤 I/O 是 Unix/Linux 系統管理中一個非常重要的組成部分。磁盤…

Excel 技巧08 - 如何計算某類(比如紅色背景色)單元格的總和? (★)

本文講了如何在Excel中計算某類(比如紅色背景色)單元格的總和。 1,如何計算某類(比如紅色背景色)單元格的總和? 技巧就是先把它們給標記出來,然后就好統計了。 那么如何找出來呢? 對,就是通過紅色。 按下Ctrl F 點…

awr報告無法生成:常見分析手段

awr報告無法生成:常見分析手段 STATISTICS_LEVEL和OPEN_MODEAWR快照是否能自動生成?AWR快照能否手動生成?日志有無ORA-12751或ORA-32701報錯?MMON進程是否被掛起?排查數據庫隱藏參數分析快照生成錯誤信息分析AWR Snapshot Tracing分析AWR Table Flush是否超時STATISTICS_L…

uni-app無限級樹形組件簡單實現

因為項目一些數據需要樹形展示&#xff0c;但是官網組件沒有。現在簡單封裝一個組件在app中使用&#xff0c;可以無線嵌套&#xff0c;展開&#xff0c;收縮&#xff0c;獲取子節點數據等。 簡單效果 組件TreeData <template><view class"tree"><te…

互聯網架構變遷:從 TCP/IP “呼叫” 到 NDN “內容分發” 的逐浪之旅

本文將給出關于互聯網架構演進的一個不同視角。回顧一下互聯網的核心理論基礎產生的背景&#xff1a; 左邊是典型的集中控制通信網絡&#xff0c;很容易被摧毀&#xff0c;而右邊的網絡則沒有單點問題&#xff0c;換句話說它很難被全部摧毀&#xff0c;與此同時&#xff0c;分…

移遠BC28_opencpu方案_pin腳分配

先上圖&#xff0c;BC28模塊的pin腳如圖所示&#xff1a; 下面看看GPIO的復用管腳 然后我自己整理了一份完整的pin功能列表

Eureka緩存機制

一、Eureka的CAP特性 Eureka是一個AP系統&#xff0c;它優先保證可用性&#xff08;A&#xff09;和分區容錯性&#xff08;P&#xff09;&#xff0c;而不保證強一致性&#xff08;C&#xff09;。這種設計使得Eureka在分布式系統中能夠應對各種故障和分區情況&#xff0c;保…

2025年第三屆“華數杯”國際賽A題解題思路與代碼(Python版)

游泳競技策略優化模型代碼詳解 第一題&#xff1a;速度優化模型 在這一部分&#xff0c;我們將詳細解析如何通過數學建模來優化游泳運動員在不同距離比賽中的速度分配策略。 1. 模型概述 我們的模型主要包含三個核心文件&#xff1a; speed_optimization.py: 速度優化的核…

micro-app【微前端系列教程】禁用樣式隔離

全局禁用樣式隔離 所有應用的樣式隔離都會停止 import microApp from micro-zoe/micro-appmicroApp.start({disableScopecss: true, // 默認值false })指定子應用取消禁用樣式隔離 <micro-app namexx urlxx disableScopecssfalse></micro-app>指定子應用禁用樣式…

深度學習筆記11-優化器對比實驗(Tensorflow)

&#x1f368; 本文為&#x1f517;365天深度學習訓練營中的學習記錄博客&#x1f356; 原作者&#xff1a;K同學啊 目錄 一、導入數據并檢查 二、配置數據集 三、數據可視化 四、構建模型 五、訓練模型 六、模型對比評估 七、總結 一、導入數據并檢查 import pathlib,…

FFmpeg Muxer HLS

使用FFmpeg命令來研究它對HLS協議的支持程度是最好的方法&#xff1a; ffmpeg -h muxerhls Muxer HLS Muxer hls [Apple HTTP Live Streaming]:Common extensions: m3u8.Default video codec: h264.Default audio codec: aac.Default subtitle codec: webvtt. 這里面告訴我…

Apache和PHP:構建動態網站的黃金組合

在當今的互聯網世界&#xff0c;網站已經成為了企業、個人和機構展示自己、與用戶互動的重要平臺。而在這些動態網站的背后&#xff0c;Apache和PHP無疑是最受開發者青睞的技術組合之一。這一組合提供了高效、靈活且可擴展的解決方案&#xff0c;幫助您快速搭建出強大的網站&am…

git相關操作筆記

git相關操作筆記 1. git init git init 是一個 Git 命令&#xff0c;用于初始化一個新的 Git 倉庫。執行該命令后&#xff0c;Git 會在當前目錄創建一個 .git 子目錄&#xff0c;這是 Git 用來存儲所有版本控制信息的地方。 使用方法如下&#xff1a; &#xff08;1&#xff…

Docker Desktop 構建java8基礎鏡像jdk安裝配置失效解決

Docker Desktop 構建java8基礎鏡像jdk安裝配置失效解決 文章目錄 1.問題2.解決方法3.總結 1.問題 之前的好幾篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop環境構建java8的最小jre基礎鏡像&#xff0c;前幾天我使用Docker Desktop環境重新構建了一個…

VUE + pdfh5 實現pdf 預覽,主要用來uniappH5實現嵌套預覽PDF

1. 安裝依賴 npm install pdfh5 2. pdfh5 預覽(移動端&#xff0c;h5) npm install pdfh5 , &#xff08;會報錯&#xff0c;需要其他依賴&#xff0c;不能直接用提示的語句直接npm下載&#xff0c;依舊會報錯&#xff0c;npm報錯&#xff1a;These dependencies were not fou…

Node.js——fs(文件系統)模塊

個人簡介 &#x1f440;個人主頁&#xff1a; 前端雜貨鋪 &#x1f64b;?♂?學習方向&#xff1a; 主攻前端方向&#xff0c;正逐漸往全干發展 &#x1f4c3;個人狀態&#xff1a; 研發工程師&#xff0c;現效力于中國工業軟件事業 &#x1f680;人生格言&#xff1a; 積跬步…