主頁 >  其他 > ?openGauss資料庫原始碼決議系列文章—— AI查詢時間預測?

?openGauss資料庫原始碼決議系列文章—— AI查詢時間預測?

2021-09-23 11:53:07 其他

上一篇介紹了“8.5 指標采集、預測與例外檢測”的相關內容,本篇我們介紹“8.6 AI查詢時間預測”的相關精彩內容介紹,

8.6 AI查詢時間預測

在前面介紹過“慢SQL發現”特性,該特性的典型場景是新業務上線前的檢查,輸入源是提前采集到的SQL流水資料,慢SQL發現功能主要主要應用在多條SQL陳述句的批量檢查上,要求之前執行過SQL陳述句,因此給出的結果主要是定性的,在某些場景下可能難以滿足用戶對于評估精度的要求,
因此,為了彌補上述場景的不足,滿足用戶更精確的SQL時間預測需求,同時為AI優化器做鋪墊,實作了本章所述的功能,
由于實際業務場景具有復雜的特質,現有的資料庫靜態代價估計模型往往統計結果失準,從而選擇了一些執行計劃較差的路徑,因此,針對上述復雜場景,需要資料庫的代價估計模型具備自我更新的能力,本特性主要功能為基于查詢陳述句的歷史資料,對當前執行的SQL陳述句進行查詢耗時和基數的估算,

8.6.1 使用場景

AI查詢分析的前提是需要獲取執行計劃,首先需要根據用戶需求在查詢執行時收集復雜查詢實際查詢計劃(包括計劃結構、算子型別、相關資料源、過濾條件等)、各算子節點實際執行時間、優化器估算代價、實際回傳行數、優化器估算行數、SMP并發執行緒數、等資訊,將其記錄在資料表中,并進行持久化管理包括定期進行資料失效清理,
本功能主要分為兩個方面,一個是行數估算,一個是查詢預測,前者是后者預測好壞的前提,目前openGauss基于在線學習對執行計劃各層的結果集大小進行估算,僅起到展示作用,并未影響到執行計劃的生成,后續可幫助優化器更準確地進行結果集估算,從而獲取更優的執行計劃,
當前階段本需求會提供系統函式來進行預測,并加入到explain中進行實際比較驗證,

8.6.2 現有技術

當前學術界在AI4DB領域,對基于機器學習的行數估算和查詢時延預測有許多嘗試,

1. 傳統方法

正如資料庫優化器專家Guy Lohman在博客Is query optimization a “solved” problem中所說,傳統資料庫查詢性能預測的“阿喀琉斯之踵”便是中間結果集大小的估算,對于行數估算傳統基于統計資訊行數估算方法主要基于三類假設,
(1) 資料獨立分布假設,
(2) 均勻分布假設,
(3) 主外鍵假設,
而實際場景中資料往往存在一定的相關性和傾斜性,此時上述假設可能會被打破,導致傳統資料庫優化器在多表連接中間結果集大小估算中可能會存在數個數量級的誤差,
2000年以來,以基于采樣的估算、基于采樣的核密度函式估算、基于多列直方圖為代表的統計學方法被提出,用于解決資料相關性帶來的估算問題,然而這些方法都存在一個共性問題,就是模型無法進行增量維護,而收集這些額外的統計資訊會增加巨大的資料庫維護開銷,雖然在一些特定的問題場景(如多列Range條件選擇率)取得了很大的準確率提升,但并沒有被各大資料庫廠商廣泛采用,
傳統性能預測方法主要依賴代價模型,在以下幾個方面存在明顯劣勢,
(1) 準確性:隨著底層硬體架構和優化技術不斷演進,實際性能預測模型的復雜度遠不可以用線性模型來建模,
(2) 可擴展性:代價模型的開發成本較高,不能面面俱到地對用戶具體場景進行優化,
(3) 可校準性:代價模型靈活性僅局限于各資源維度線性相加時使用的系數,以及部分懲罰代價,靈活性較差,用戶實際使用時難以校準,
(4) 時效性:代價模型依賴統計資訊的收集和使用,目前缺乏增量維護方法,導致資料流動性較大的場景下統計資訊長期處于失效狀態,

2. 機器學習方法

機器學習模型在模型復雜度、可校準性、可增量維護性幾個維度的優勢能夠彌補傳統優化器代價模型的不足,基于機器學習的查詢性能預測逐漸成為資料庫學術界和產業界的主流研究方向之一,
除前文8.3節慢SQL發現部分介紹過相關方法外,清華大學的Learned Cost Estimator模型基于Multi-task Learning和字符條件的Word-Embedding方法進一步提升了預測準確率,
至此,機器學習方法雖然從實驗效果上看達到了較高的準確率,但現實業務場景持續性的資料分布變化對模型的在線學習能力提出了要求,openGauss采用了資料驅動的在線學習模式,通過內核不斷收集歷史作業性能資訊,并在AI Engine側使用了R-LSTM(recursive long short term memory,遞回長短期記憶網路)模型對算子級查詢時延和中間結果集大小進行預測,

8.6.3 實作原理

在這里插入圖片描述

圖8-15 AI查詢性能預測架構示意圖

總體而言,查詢性能預測由資料庫內核側和AI Engine側兩個部分組成,如圖8-15所示,
(1) 資料庫內核側除提供資料庫基本功能外還需要對歷史資料進行收集和持久化管理,并通過curl向AI Engine側發送HTTPS請求,
(2) AI Engine提供模型訓練、執行預測、模型管理等介面,基于Flask框架的服務端接受HTTPS請求,該流程如圖8-16所示,
在這里插入圖片描述

圖 8-16 資料庫內核和AI Engine行程關系示意圖

開啟資料收集相關引數后(其對性能可能有5%左右的影響,取決于實際業務負載情況),歷史性能資料被持久化收集在資料庫的系統表中,用于模型的訓練,
模型訓練之前,用戶需要對模型引數進行配置(詳見8.6.5使用示例),用戶訓練指令下發之后,內核行程會向AI Engine側發送configure請求,用于初始化機器學習模型,configure流程時序如圖8-17所示,
在這里插入圖片描述

圖8-17 configure流程時序圖

模型配置成功后,內核行程向AI Engine側發送train請求,觸發訓練,該流程如圖8-18所示,
在這里插入圖片描述

圖8-18 train流程時序圖 模型訓練之后,用戶下發預測指令,資料庫會先向AI Engine側發送setup請求,用于模型加載,加載成功后發送predict請求得到預測結果,如圖8-19所示, 圖8-19 模型預測完整流程時序圖,分為setup和predict兩個階段 本特性架構上支持多模型,目前已實作R- LSTM模型,該模型架構如圖8-20所示, 計劃中,算子間的執行順序也會影響算子的性能,基于這種特性,我們使用了LSTM神經網路模型來學習計劃中算子間這種有意義的依賴關系,并根據行數/時間預測的場景對模型的結構、損失函式、優化演算法等方面進行針對性的優化,提高此場景下學習和預測的準確率, 輸入:查詢計劃樹,各節點上的算子型別,對應表名列名以及過濾條件, 輸出:行數、startup time、total time、Peak Memory, 在編碼(encoding)階段,每個計劃節點(plan node)被編碼成固定長度,連接成序列作為輸入LSTM神經網路的特征值, LSTM具有多個重復神經網路模塊組成的鏈式網路,在每個模塊中都有三個函式來決定歷史時序中的哪些資訊將被傳遞到下一個時序的網路模塊中,最后一個模塊的輸出值h_t即為模型回傳的預測結果,

在這里插入圖片描述
在這里插入圖片描述
其中,Хt是當前時序模塊的輸入,ht﹣?是當前時序模塊的輸入,是前一個時序的輸出資訊,使用sigmoid(σ)函式得到當前細胞狀態中將要輸出的部分Οt;Ct表示所有歷史時序保留的資訊,通過tanh函式處理后與當前狀態輸出資訊Οt相乘得到此狀態的輸出ht,將具有三個元素的一維向量 [startup time, total time, cardinality] 的預測結果同真實資料進行比較,使用ratio-error計算模型的損失函式,
在這里插入圖片描述

圖8-20 模型架構圖

8.6.4 關鍵原始碼決議

1. 專案結構

AI Engine側涉及的主要檔案路徑為openGauss-server/src/gausskernel/dbmind/tools/predictor,其檔案結構如表8-13所示,

表8-13 AI Engine檔案結構

檔案結構

說明

install

部署所需檔案路徑

install/ca_ext.txt

證書組態檔

install/requirements-gpu.txt

使用GPU(graphics processing unit,圖形處理器)訓練依賴庫串列

install/requirements.txt

使用CPU訓練依賴庫串列

install/ssl.sh

證書生成腳本

python

專案代碼路徑

python/certs.py

加密通信

python/e_log

系統日志路徑

python/log

模型訓練日志路徑

python/log.conf

組態檔

python/model.py

機器學習模型

python/run.py

服務端主函式

python/saved_models

模型訓練checkpoint

python/settings.py

工程組態檔

python/uploads

Curl傳輸的檔案存放路徑

內核側主要涉及的檔案路徑為openGauss-server/src/gausskernel/optimizer/util/learn,其檔案結構如表8-14所示,

表8-14 內核端主要檔案結構

檔案結構

說明

comm.cpp

通信層代碼實作

encoding.cpp

資料編碼

ml_model.cpp

通用模型呼叫介面

plan_tree_model.cpp

樹狀模型呼叫介面

2. 訓練流程

內核側的模型訓練介面通過ModelTrainInternal函式實作,該函式的關鍵部分如下:

static void ModelTrainInternal(const char* templateName, const char* modelName, ModelAccuracy** mAcc)
{
  …
    /* 對于樹形模型呼叫對應的訓練介面 */
    char* trainResultJson = TreeModelTrain(modelinfo, labels);
    /* 決議回傳結果 */
    …
    ModelTrainInfo* info = GetModelTrainInfo(jsonObj);
    cJSON_Delete(jsonObj);
    /* 更新模型資訊 */
    Relation modelRel = heap_open(OptModelRelationId, RowExclusiveLock);
   …
    UpdateTrainRes(values, datumsMax, datumsAcc, nLabel, mAcc, info, labels);

    HeapTuple modelTuple = SearchSysCache1(OPTMODEL, CStringGetDatum(modelName));
   …
    HeapTuple newTuple = heap_modify_tuple(modelTuple, RelationGetDescr(modelRel), values, nulls, replaces);
    simple_heap_update(modelRel, &newTuple->t_self, newTuple);
CatalogUpdateIndexes(modelRel, newTuple);
…
}

內核側的樹狀模型訓練介面通過TreeModelTrain函式實作,核心代碼如下:

char* TreeModelTrain(Form_gs_opt_model modelinfo, char* labels)
{
    char* filename = (char*)palloc0(sizeof(char) * MAX_LEN_TEXT);
    char* buf = NULL;
    /* configure階段 */
    ConfigureModel(modelinfo, labels, &filename);

    /* 將編碼好的資料寫入臨時檔案 */
    SaveDataToFile(filename);

    /* Train階段 */
    buf = TrainModel(modelinfo, filename);
    return buf;
}

AI Engine側配置的Web服務的URI是/configure,訓練階段的URI是/train.下面的代碼段展示了訓練程序,

  def fit(self, filename):
        keras.backend.clear_session()
        set_session(self.session)
        with self.graph.as_default():
            # 根據模型入參和出參維度變化情況,判斷是否需要初始化模型
            feature, label, need_init = self.parse(filename) 
            os.environ['CUDA_VISIBLE_DEVICES'] = '0'
            epsilon = self.model_info.make_epsilon()
            if need_init: # 冷啟動訓練
                epoch_start = 0
                self.model = self._build_model(epsilon)
            else: # 增量訓練
                epoch_start = int(self.model_info.last_epoch)
                ratio_error = ratio_error_loss_wrapper(epsilon)
                ratio_acc_2 = ratio_error_acc_wrapper(epsilon, 2)
                self.model = load_model(self.model_info.model_path,
                                        custom_objects={'ratio_error': ratio_error, 'ratio_acc': ratio_acc_2})
            self.model_info.last_epoch = int(self.model_info.max_epoch) + epoch_start
            self.model_info.dump_dict()
            log_path = os.path.join(settings.PATH_LOG, self.model_info.model_name + '_log.json')
            if not os.path.exists(log_path):
                os.mknod(log_path, mode=0o600)
            # 訓練日志記錄回呼函式
            json_logging_callback = LossHistory(log_path, self.model_info.model_name, self.model_info.last_epoch)
            # 資料分割
            X_train, X_val, y_train, y_val = \
                train_test_split(feature, label, test_size=0.1)
            # 模型訓練
            self.model.fit(X_train, y_train, epochs=self.model_info.last_epoch,
                           batch_size=int(self.model_info.batch_size), validation_data=(X_val, y_val),
                           verbose=0, initial_epoch=epoch_start, callbacks=[json_logging_callback])
            # 記錄模型checkpoint
            self.model.save(self.model_info.model_path)
            val_pred = self.model.predict(X_val)
            val_re = get_ratio_errors_general(val_pred, y_val, epsilon)
            self.model_logger.debug(val_re)
            del self.model
            return val_re

3. 預測流程

內核側的模型預測程序主要通過ModelPredictInternal函式實作,樹狀模型預測程序通過TreeModelPredict函式實作,內核側的樹狀模型預測程序會占用一些與AI Engine進行通信的信令,該通信程序如下:

char* TreeModelPredict(const char* modelName, char* filepath, const char* ip, int port)
{
    …
    if (!TryConnectRemoteServer(conninfo, &buf)) {
        DestroyConnInfo(conninfo);
        ParseResBuf(buf, filepath, "AI engine connection failed.");
        return buf;
    }

    switch (buf[0]) {
        case '0': {
            ereport(NOTICE, (errmodule(MOD_OPT_AI), errmsg("Model setup successfully.")));
            break;
        }
        case 'M': {
            ParseResBuf(buf, filepath, "Internal error: missing compulsory key.");
            break;
        }
…
    }
    /* Predict階段 */
    …
    if (!TryConnectRemoteServer(conninfo, &buf)) {
        ParseResBuf(buf, filepath, "AI engine connection failed.");
        return buf;
    }
    switch (buf[0]) {
        case 'M': {
            ParseResBuf(buf, filepath, "Internal error: fail to load the file to predict.");
            break;
        }
        case 'S': {
            ParseResBuf(buf, filepath, "Internal error: session is not loaded, model setup required.");
            break;
        }
        default: {
            break;
        }
    }
    return buf;
}

AI Engine側的Setup程序的Web介面是/model_setup,預測階段的Web介面是/predict,他們的協議都是Post,

4. 資料編碼

資料編碼分為以下兩個維度,
(1) 算子維度:包括每個執行計劃算子的屬性,如表8-15所示,

表8-15 算子維度

屬性名

含義

編碼策略

Optname

算子型別

One-hot

Orientation

回傳元組存盤格式

One-hot

Strategy

邏輯屬性

One-hot

Options

物理屬性

One-hot

Quals

謂詞

hash

Projection

回傳投影列

hash

(2) 計劃維度,
對于每個算子,在其固有屬性之外,openGauss還對query id,plan node id和parent node id進行了記錄,在訓練/預測階段,使用這些資訊將算子資訊重建為樹狀計劃結構,且可以遞回構建子計劃樹來進行資料增強,從而提升模型泛化能力,樹狀資料結構如圖8-21所示,
在這里插入圖片描述

圖8-21 樹狀資料結構示意圖 內核側的樹狀資料編碼通過GetOPTEncoding函式實作,

5. 模型結構

AI Engine的模型決議、訓練和預測見8.6.4章節,下面的代碼展示了模型的結構,

class RnnModel():
    def _build_model(self, epsilon):
        model = Sequential()
        model.add(LSTM(units=int(self.model_info.hidden_units), return_sequences=True, input_shape=(None, int(self.model_info.feature_length))))
        model.add(LSTM(units=int(self.model_info.hidden_units), return_sequences=False))
        model.add(Dense(units=int(self.model_info.hidden_units), activation='relu'))
        model.add(Dense(units=int(self.model_info.hidden_units), activation='relu'))
        model.add(Dense(units=int(self.model_info.label_length), activation='sigmoid'))
        optimizer = keras.optimizers.Adadelta(lr=float(self.model_info.learning_rate), rho=0.95)
        ratio_error = ratio_error_loss_wrapper(epsilon)
        ratio_acc_2 = ratio_error_acc_wrapper(epsilon, 2)
        model.compile(loss=ratio_error, metrics=[ratio_acc_2], optimizer=optimizer)
        return model

AI Engine的損失函式使用ratio error(部分文獻中使用qerror代稱),該損失函式相較于MRE和MSE的優勢在于其能夠等價地懲罰高估和低估兩種情況,公式為:
在這里插入圖片描述
ε宣告為性能預測值的無窮小值,防止分母為0的情況發生,

8.6.5 使用示例

AI查詢時間預測功能使用示例如下,
① 定義性能預測模型,代碼如下:

INSERT INTO gs_opt_model VALUES(‘rlstm’, ‘model_name’, ‘host_ip’, ‘port’);

② 通過GUC引數開啟資料收集,配置的引數串列,代碼如下:

enable_resource_track = on;
enable_resource_record = on;

③ 編碼訓練資料,代碼如下:

SELECT gather_encoding_info('db_name');

④ 校準模型,代碼如下:

SELECT model_train_opt('template_name', 'model_name');

⑤ 監控訓練狀態,代碼如下:

SELECT track_train_process('host_ip', 'port');

⑥ 通過explain + SQL陳述句來預測SQL查詢的性能,代碼如下:

EXPLAIN (..., predictor 'model_name') SELECT ...

獲得結果,其中,“p-time”列為標簽預測值,

Row Adapter  (cost=110481.35..110481.35 rows=100 p-time=99..182 width=100) (actual time=375.158..375.160 rows=2 loops=1)

8.6.6 演進路線

目前模型的泛化能力不足,依賴外置的AI Engine組件,且深度學習網路比較重,這會為部署造成困難;模型需要資料進行訓練,冷啟動階段的銜接不夠順暢,后續從以下幾個方面演進,
(1) 加入不同復雜度模型,并支持多模型融合分析,提供更健壯的模型預測結果和置信度,
(2) AI Engine考慮加入任務佇列,目前僅支持單并發預測/訓練,可以考慮建立多個服務端進行并發業務,
(3) 基于在線學習/遷移學習的增強,考慮對損失函式加入錨定懲罰代價來避免災難遺忘問題,同時優化資料管理模式,考慮data score機制,根據資料時效性賦權,
(4) 將本功能與優化器深度結合,探索基于AI的路徑選擇方法,

感謝大家學習第8章 AI技術中“8.6 AI查詢時間預測”的精彩內容,下一篇我們開啟“8.7 DeepSQL”的相關內容的介紹,
敬請期待,

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

標籤:其他

上一篇:33張圖解flink sql應用提交(建議收藏!)

下一篇:透視Hbase資料模型|概念視圖|物理視圖

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(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
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more