主頁 >  其他 > 解密Prompt系列6. lora指令微調扣細節-請冷靜,1個小時真不夠~

解密Prompt系列6. lora指令微調扣細節-請冷靜,1個小時真不夠~

2023-04-30 07:45:49 其他

上一章介紹了如何基于APE+SELF自動化構建指令微調樣本,這一章咱就把微調跑起來,主要介紹以Lora為首的低引數微調原理,環境配置,微調代碼,以及大模型訓練中顯存和耗時優化的相關技術細節

標題這樣寫是因為上周突然收到了一周內上線一版chatbo的命令,原因無它領導們都刷到了《一個小時你也可以擁有ChatGPT》,《100美金訓練ChatGPT》,《僅訓練3小時超越ChatGPT》,《人人都可以擁有ChatGPT》,,,領導說人人都有了為啥我沒有呀?!!真誠呼吁標題黨們求手下留情,留人一命!于是這里我換個標題來Debuff!Debuff!

看到這里本文最重要的部分已經說完了,累了的小伙伴可以撤退了,五一快樂~

低引數微調原理

  • LORA:LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • 原理:INTRINSIC DIMENSIONALITY EXPLAINS THE EFFECTIVENESS
    OF LANGUAGE MODEL FINE-TUNING
  • 前人的肩膀:Adapter: Parameter-Efficient Transfer Learning for NLP

我們之前在解密Prompt系列3. 凍結LM微調Prompt介紹過一些soft-prompt,包括P-Tunning和Prompt-Tunning也屬于低引數微調,這些方案是通過引數拼接的方案引入額外引數,這里介紹另一類方案,同樣是凍結LLM的引數,通過引數相加的方案引入額外引數, 相較soft-prompt最明顯的優勢,就是不會占用輸入token的長度,

LoRA的原理比較簡單,原始全量微調其實就是在原始模型引數上通過微調加入增量\(W = W_0+\Delta W\),那我們可以通過凍結原始引數\(W_0\),并且把增量部分通過低秩分解方式進一步降低引數量級\(\Delta W=A*B^T\),原始引數的維度是\(d*d\), 則低秩分解后的引數量級是\(2*r*d\),因為這里的r<<d,因此可以起到大幅降低微調引數量級的效果,如下圖

核心代碼如下

## 初始化低秩矩陣A和B
self.lora_A.update(nn.ModuleDict({adapter_name: nn.Linear(self.in_features, r, bias=False)}))
self.lora_B.update(nn.ModuleDict({adapter_name: nn.Linear(r, self.out_features, bias=False)}))
self.scaling[adapter_name] = lora_alpha / r

## 向前計算
result = F.linear(x, transpose(self.weight, self.fan_in_fan_out), bias=self.bias)
result += (
    self.lora_B[self.active_adapter](
        self.lora_A[self.active_adapter](self.lora_dropout[self.active_adapter](x))
    )
    * self.scaling[self.active_adapter]
)

論文測驗了在多數場景下適當的LORA微調和全量微調的效果不相上下,一個可能原因是INTRINSIC DIMENSIONALITY論文中提出,雖然語言模型整體引數空間很大,但具體到每個任務其實有各自的隱表征空間(intrisic dimension),這個隱表征空間的維度并不高, 因此在微調程序中加入低秩分解并不一定會影響微調效果,使用LORA微調有以下幾個細節

  1. 對哪些引數進行微調:基于Transformer結構,LORA只對每層的Self-Attention的部分進行微調,有\(W_q, W_k, W_v, W_O\)四個映射層引數可以進行微調,消融實驗顯示只微調\(W_q\)效果略差,微調\(W_q, W_v\)的效果和微調\(W_q, W_k, W_v, W_O\)的效果相似,需要注意不同模型引數名稱不同,像chatglm對應的引數名稱就是query_key_value
  2. Rank的選取:Rank的取值作者對比了1-64,效果上Rank在4-8之間最好,再高并沒有效果提升,不過論文的實驗是面向下游單一監督任務的,因此在指令微調上根據指令分布的廣度,Rank選擇還是需要在8以上的取值進行測驗,
  3. alpha引數:alpha其實是個縮放引數,本質和learning rate相同,所以為了簡化我默認讓alpha=rank,只調整lr,這樣可以簡化超參
  4. 初始化:A和Linear層的權重相同Uniform初始化,B是zero初始化,這樣最初的Lora權重為0,所以Lora引數是從頭學起,并沒有那么容易收斂,

Lora的優點很明顯,低引數,適合小樣本場景;可以拔插式的使用,快速針對不同下游任務訓練不同的lora權重;完全沒有推理延時,這個在后面代碼中會提到推理時,可以預先把lora權重merge到原始權重上,

但Lora微調雖好,個人在嘗試中感受到的局限性就是adapter類的微調方案可能更適合下游單一任務型別/生成風格,至于是否適合作為通用指令微調的解決方案,有個問題我也沒有搞懂,就是通用的指令樣本是否真的有統一的低秩空間表征?這個表征又是什么含義?因為指令微調階段的樣本其實是混合的多任務指令樣本,這種情況下lora是否合適,感覺需要更全面的評估(當前出來的眾多LLama們都缺少合理統一全面可比的Evaluation),當前就我們的嘗試情況lora的效果并不及預期,

環境配置

  • GPU 云服務廠商對比

我用了featurize和攬睿星舟,云服務廠商的選擇主要看是否有jupyter,存盤夠大,下載快,能連git,有高配torch環境,這兩家在眾多小廠里脫穎而出,4090的卡一個小時也就3塊錢,來來來盆友辛苦把推廣費結一下~

強調下環境配置,想跑通微調,搞定環境你就成功了80%!運氣好1分鐘,運氣差1天都在原地打轉

  1. 實體環境:TRX4090 + py38 + torch2.0 + CUDA12
  2. python環境:主要坑在transforemrs和peft,幾個相關issue包括:llama tokenizer special token有問題,peft adapter.bin微調不更新,Bug with fan_in_fan_out,我一個不差都踩中了,,,
# 以下配置可能會隨時間變化,出了問題就去issue里面刨吧
# 要相信你不是唯一一個大冤種!
accelerate
appdirs
loralib
bitsandbytes
black
black[jupyter]
datasets
fire
transformers>=4.28.0
git+https://github.com/huggingface/peft.git
sentencepiece
gradio
wandb
cpm-kernel

模型初始化

以下代碼主要整合自alpaca-lora和chatglm-finetune,其實lora微調的代碼本身并不復雜,相反是如何加速大模型訓練,降低顯存占用的一些技巧大家可能不太熟悉,模型初始化代碼如下,get_peft_model會初始化PeftModel把原模型作為base模型,并在各個self-attention層加入lora層,同時改寫模型forward的計算方式,

主要說下load_in_8bit和prepare_model_for_int8_training,這里涉及到2個時間換空間的大模型顯存壓縮技巧,

from peft import get_peft_model, LoraConfig, prepare_model_for_int8_training, set_peft_model_state_dict
from transformers import AutoTokenizer, AutoModel

model = AutoModel.from_pretrained("THUDM/chatglm-6b", load_in_8bit=True, torch_dtype=torch.float16, trust_remote_code=True, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = prepare_model_for_int8_training(model)

lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=8,
    lora_alpha=8,
    lora_dropout=0.05,
)
model = get_peft_model(model, lora_config)
model.config.use_cache = False

模型顯存占用分成兩個部分,一部分是靜態顯存基本由模型引數量級決定,另一部分是動態顯存在向前傳播的程序中每個樣本的每個神經元都會計算激活值并存盤,用于向后傳播時的梯度計算,這部分和batchsize以及引數量級相關,以下8bit量化優化的是靜態顯存,而梯度檢查優化的是動態顯存,

1. 8bit Quantization

https://huggingface.co/blog/hf-bitsandbytes-integration

from_pretrained中的load_in_8bit引數是bitsandbytes庫賦予的能力,會把加載模型轉化成混合8bit的量化模型,注意這里的8bit模型量化只用于模型推理,通過量化optimizer state降低訓練時顯存的時8bit優化器是另一個功能不要搞混喲~

模型量化本質是對浮點引數進行壓縮的同時,降低壓縮帶來的誤差, 8-bit quantization是把原始FP32(4位元組)壓縮到Int8(1位元組)也就是1/4的顯存占用,如上加載后會發現除lora層外的多數層被轉化成int型別如下

當然壓縮方式肯定不是直接四舍五入,那樣會帶來巨大的精度壓縮損失,常見的量化方案有absolute-maximum和zero-point,它們的差異只是rescale的方式不同,這里簡單說下absmax,如下

先尋找tensor矩陣的絕對值的最大值,并計算最大值到127的縮放因子,然后使用該縮放因子對整個tensor進行縮放后,再round到整數,這樣就把浮點數映射到了INT8,逆向回到float的原理相同,

當然以上的縮放方案依舊存在精度損失,以及當矩陣中存在outlier時,這個精度損失會被放大,例如當tensor中絕大部分取值在1以下,有幾個值在100+,則縮放后,所有1以下的tensor資訊都會被round抹去,因此LLM.int8()的實作對outlier做了進一步的優化,把outlier和非outlier的矩陣分開計算,再把結果進行合并來降低outlier對精度的影響,

prepare_model_for_int8_training是對在Lora微調中使用LLM.int8()進行了適配用來提高訓練的穩定性,主要包括

  • layer norm層保留FP32精度
  • 輸出層保留FP32精度保證解碼時隨機sample的差異性

2. gradient checkpoint

https://medium.com/tensorflow/fitting-larger-networks-into-memory-583e3c758ff9

prepare_model_for_int8_training函式還做了一件事就是設定gradient_checkpointing=True,這是另一個時間換空間的技巧,

gradient checkpoint的實作是在向前傳播的程序中使用torch.no_grad()不去存盤中間激活值,降低動態顯存的占用,而只是保存輸入和激活函式,當進行反向傳播的時候,會重新獲取輸入和激活函式計算激活值用于梯度計算,因此向前傳播會計算兩遍,所以需要更多的訓練時間,

use_cache設定為False,是因為和gradient checkpoint存在沖突,因為use_cache是對解碼速度的優化,在解碼器解碼時,存盤每一步輸出的hidden-state用于下一步的輸入,而因為開啟了gradient checkpoint,中間激活值不會存盤,因此use_cahe=False,其實#21737已經加入了引數檢查,這里設定只是為了不輸出warning,

模型訓練

訓練基本和常規訓練基本相同,代碼如下,主要說下模型存盤和加載以及混合精度訓練

import datasets
from transformers import Trainer, DataCollatorForSeq2Seq

if resume_from_checkpoint:
    lora_weight = torch.load(ckpt_name)
    set_peft_model_state_dict(model, lora_weight)

train_data = https://www.cnblogs.com/gogoSandy/p/datasets.load_from_disk(dataset_path)

class ModifiedTrainer(Trainer):
    def save_model(self, output_dir=None, _internal_call=False):
        # 改寫trainer的save_model,在checkpoint的時候只存lora權重
        from transformers.trainer import TRAINING_ARGS_NAME

        os.makedirs(output_dir, exist_ok=True)
        torch.save(self.args, os.path.join(output_dir, TRAINING_ARGS_NAME))
        saved_params = {
            k: v.to("cpu") for k, v in self.model.named_parameters() if v.requires_grad
        }
        torch.save(saved_params, os.path.join(output_dir, "adapter_model.bin"))
        
trainer = ModifiedTrainer(
    model=model,
    train_dataset=train_data,
        args=transformers.TrainingArguments(
            per_device_train_batch_size=8,
            gradient_accumulation_steps=16,
            num_train_epochs=10,
            learning_rate=3e-4,
            fp16=True,
            logging_steps=10,
            save_steps=200,
            output_dir=output_dir
        ),
    data_collator=DataCollatorForSeq2Seq(
        tokenizer, pad_to_multiple_of=8, return_tensors="pt", padding=True
    ),
)
trainer.train()
model.save_pretrained(train_args.output_dir)

1. 模型的存盤和加載

因為peftModel重寫了原始model的save_pretrained函式,只把lora層的權重進行存盤,因此model.save_pretrained只會存盤lora權重,而trainer的save_model函式沒有做相應的重寫,因此我們重寫下對應的function,避免checkpoint寫入原始模型全部引數,

相應的如果你從ckpt加載lora權重去繼續訓練的話,也是對PeftModel中的Lora權重進行加載,

2. 混合精度訓練

https://huggingface.co/docs/transformers/main/en/perf_train_gpu_one#fp16-training

除了默認的全精度FP32,引數精度還有半精度FP16,以及BF16和TF32,最常用也是這里使用的是FP16的混合精度,

實作原理是并非所有變數都需要全精度存盤,如果把部分中間變數轉化成半精度,則計算效率會大幅提升,加上一些GPU對FP16計算做了優化,吞吐上比全精度會快2~5倍,

不過只使用半精度訓練同樣會帶來量化誤差,主要包括:資料溢位因為半精度比全精度的范圍更小,訓練到后期因為梯度越來越小可能會下溢位;舍入誤差梯度變小后,因為精度有限,導致梯度更新被四舍五入,更新了個寂寞,

為了解決以上的問題引入了混合精度訓練,簡單來說就是向前傳遞時,模型權重、激活值和梯度都使用FP16進行存盤,同時會拷貝一份模型權重以FP32存盤,向后傳播optimizer更新時會更新FP32的引數,因此混合精度訓練并不會節省記憶體,只會提高模型訓練速度,

模型推理

推理有兩個方案,一個和訓練相同,直接加入Lora層,不過會增加推理延時因為多了lora層的計算,適合線下測評用,如下

from peft import PeftModel
from transformers import AutoModel, AutoTokenizer

model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True, load_in_8bit=True, device_map='auto')
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = PeftModel.from_pretrained(model, "./lora_ckpt")
model.half().to(device)
model.eval()

另一個沒有推理延時的方案,是先把lora權重和原始模型權重進行合并,把合并后的引數存盤成新的bin檔案,然后和加載常規模型一樣加載合并后的模型引數進行推理,權重合并的代碼如下

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
# when merging disable int8
model = AutoModel.from_pretrained(
    "THUDM/chatglm-6b", load_in_8bit=False, torch_dtype=torch.float16,
    trust_remote_code=True, device_map={"": "cpu"},
)
## 用來檢查權重是否合并成功,合并成功weight會改變
first_weight = model.base_model.layers[0].attention.query_key_value.weight
first_weight_old = first_weight.clone()

# 回傳的不是新的模型,而是在原始模型上加了adapter層
lora_model = PeftModel.from_pretrained(
    model,
    "./lora_ckpt",
    device_map={"": "cpu"},
    torch_dtype=torch.float16,
)
# 報錯:A*B shape mismatch,大概率是get_peft_model錯誤修改了peft_config里面的fan_in_fan_out引數,某個peft的revision有這個bug
lora_model = lora_model.merge_and_unload()
lora_model.train(False)

# 報錯:大概率peft訓練有問題,檢查adapter.bin大小
assert not torch.allclose(first_weight_old, first_weight), 'Weight Should Change after Lora Merge'

# lora模型權重把原模型權重加了prefix,這里移除恢復原始key
deloreanized_sd = {
    k.replace("base_model.model.", ""): v
    for k, v in lora_model.state_dict().items()
    if "lora" not in k
}
# 保存合并后的模型權重
lora_model.save_pretrained(output_dir, state_dict=deloreanized_sd)

更多Prompt相關論文·教程,開源資料·模型,以及AIGC相關玩法戳這里DecryptPrompt


Reference

  1. https://blog.csdn.net/anycall201/article/details/129959567
  2. 蘇劍林. (Jun. 20, 2022). 《Ladder Side-Tuning:預訓練模型的“過墻梯” 》[Blog post]. Retrieved from https://kexue.fm/archives/9138
  3. 蘇劍林. (Apr. 17, 2023). 《梯度視角下的LoRA:簡介、分析、猜測及推廣 》[Blog post]. Retrieved from https://kexue.fm/archives/9590
    4.https://github.com/huggingface/blog/blob/main/notebooks/HuggingFace_int8_demo.ipynb
  4. ChatGLM-Finetune
  5. Alpaca-lora

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551505.html

標籤:其他

上一篇:Midjourney 創建私人畫圖機器人(保姆級教程)

下一篇:返回列表

標籤雲
其他(158327) Python(38110) JavaScript(25398) Java(18011) C(15221) 區塊鏈(8261) C#(7972) AI(7469) 爪哇(7425) MySQL(7152) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5334) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4565) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1964) Web開發(1951) HtmlCss(1929) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1857) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 解密Prompt系列6. lora指令微調扣細節-請冷靜,1個小時真不夠~

    上一章介紹了如何基于APE+SELF自動化構建指令微調樣本。這一章咱就把微調跑起來,主要介紹以Lora為首的低引數微調原理,環境配置,微調代碼,以及大模型訓練中顯存和耗時優化的相關技術細節 ......

    uj5u.com 2023-04-30 07:45:49 more
  • Midjourney 創建私人畫圖機器人(保姆級教程)

    本教程收集于:AIGC從入門到精通教程匯總 之前給大家介紹過了Midjourney 的注冊教程:AI繪畫:Midjourney 注冊(保姆級教程) 也有Stable Diffusion(開源)的本地搭建教程:AI數字繪畫:stable-diffusion 本地部署教程 你是不是遇到以下問題: 1.M ......

    uj5u.com 2023-04-30 07:45:04 more
  • AtCoder Beginner Contest 300

    A - N-choice question (abc300 a) 題目大意 給定一個元素互不相同的陣列$c$和 $a,b$,找到 $i$使得 $c_i = a + b$ 解題思路 直接for回圈尋找即可。 神奇的代碼 ```cpp #include using namespace std; usin ......

    uj5u.com 2023-04-30 07:43:40 more
  • 中國剩余定理(CRT)學習筆記

    約定 $A\perp B$ 表示 $\gcd(A,B)=1$。 $A\mid B$ 表示 $B\equiv 0\pmod{A}(A\neq0)$。 引入 考慮以下這道題: 有物不知其數,三三數之剩二,五五數之剩三,七七數之剩二。 問物幾何?—— 《孫子算經》 也就是說,求出下列關于 $x$ 方程組的 ......

    uj5u.com 2023-04-30 07:43:37 more
  • Codeforces Round 868 Div 2

    A. A-characteristic (CF 1823 A) 題目大意 要求構造一個僅包含$1$和 $-1$的長度為 $n$的陣列 $a$,使得存在 $k$個下標對 $(i, j), i < j$滿足 $a_i \times a_j = 1$。 解題思路 當有$x$個 $1$, $y$個 $-1$ ......

    uj5u.com 2023-04-30 07:43:30 more
  • Vulnhub之GreenOptics靶機詳細測驗程序

    GreenOptics 識別目標主機IP地址 ─(kali?kali)-[~/Vulnhub/GreenOptic] └─$ sudo netdiscover -i eth1 -r 192.168.56.0/24 Currently scanning: Finished! | Screen View ......

    uj5u.com 2023-04-30 07:41:20 more
  • Spring RCE漏洞

    Spring RCE漏洞 一、漏洞概況與影響 CVE編號:CVE-2022-22965 受影響范圍: Spring Framework 5.3.X < 5.3.18 Spring Framework 5.2.X < 5.2.20 JDK >=9 使用Tomcat中間件且開啟了Tomcat日志記錄的應 ......

    uj5u.com 2023-04-30 07:41:16 more
  • xss-labs靶場

    在線XSS-labs靶場:https://xssaq.com/yx/ 靶場搭建 靶場是直接使用docker搭建的 docker pull vulfocus/xss-labs 啟動靶場 docker run -p 8005:80 vulfocus/xss-labs 瀏覽器訪問IP+8005 windo ......

    uj5u.com 2023-04-30 07:40:25 more
  • Spring Cloud Gateway RCE

    Spring Cloud Gateway RCE 一、基本介紹 CVE編號:CVE-2022-22947 ?Spring Cloud Gateway是Spring中的一個API網關。其3.1.0及3.0.6版本(包含)以前存在一處SpEL運算式注入漏洞,當攻擊者可以訪問Actuator API的情況 ......

    uj5u.com 2023-04-29 07:26:50 more
  • [筆記] ELMO, BERT, GPT 簡單講解 - 李宏毅

    國內視頻地址:https://www.bilibili.com/video/BV17441137fa/?spm_id_from=333.880.my_history.page.click&vd_source=bda72e785d42f592b8a2dc6c2aad2409 1 NLP 基礎 1.1 ......

    uj5u.com 2023-04-29 07:26:19 more