上一篇介紹了 8.6 AI查詢時間預測的相關內容,本篇我們介紹“8.7 DeepSQL、8.8 小結”的相關精彩內容介紹。
前面提到的功能均為AI4DB領域,AI與數據庫結合還有另外一個大方向,即DB4AI。在本章中,我們將介紹openGauss的DB4AI能力,探索通過數據庫來高效驅動AI任務的新途徑。
數據庫DB4AI功能的實現,即在數據庫內實現AI算法,以更好的支撐大數據的快速分析和計算。目前openGauss的DB4AI能力通過DeepSQL特性來呈現。這里提供了一整套基于SQL的機器學習、數據挖掘以及統計學的算法,用戶可以直接使用SQL語句進行機器學習工作。DeepSQL能夠抽象出端到端的、從數據到模型的數據研發過程,配合底層的計算引擎及數據庫自動優化,讓具備基礎SQL知識的用戶即可完成大部分的機器學習模型訓練及預測任務。整個分析和處理都運行在數據庫引擎中,用戶可以直接分析和處理數據庫內的數據,不需要在數據庫和其他平臺之間進行數據傳遞,避免在多個環境之間進行不必要的數據移動,并且整合了碎片化的數據開發技術棧。
如今,學術界與工業界在DB4AI這個方向已經了取得了許多成果。很多傳統的商業關系數據庫都已經支持了DB4AI能力,通過內置AI組件適配數據庫內的數據處理和環境,可以對數據庫存儲的數據進行處理,最大程度地減少數據移動的花費。同時,很多云數據庫、云計算數據分析平臺也都具備DB4AI能力。同時還可能具備Python、R語言等接口,便于數據分析人員快速入門。
在DB4AI領域,同樣具備很出色的開源軟件,例如Apache頂級開源項目MADlib。它兼容PostgreSQL數據庫,很多基于PostgreSQL數據庫源碼基線進行開發的數據庫也可以很容易進行適配。MADlib可以為結構化和非結構化數據提供統計和機器學習的方法,并利用聚集函數實現在分布式數據庫上的并行化計算。MADlib支持多種機器學習、數據挖掘算法,例如回歸、分類、聚類、統計、圖算法等,累計支持的算法達到70多個,在目前發布的1.17版本中MADlib支持深度學習。MADlib使用類SQL語法作為對外接口,通過創建UDF(user-defined function,用戶自定義函數)的方式將AI任務集成到數據庫中。
當前openGauss的DB4AI模塊,兼容開源的MADlib,在原始MADlib開源軟件的基礎上進行了互相適配和增強,性能相比在PostgreSQL數據庫上運行的MADlib性能更優。同時,openGauss基于MADlib框架,實現了其他工業級的、常用的算法,例如XGBoost、Prophet、GBDT以及推薦系統等。與此同時,openGauss還具備原生的AI執行計劃與執行算子,該部分特性會在后續版本中開源。因此,本章內容主要介紹openGauss是如何兼容MADlib的。
MADlib的文件結構及說明如表8-16所示,MADlib的代碼可通過其官方網站獲?。篽ttps://madlib.apache.org/。
文件結構 | 說明 | |
cmake | - | Cmake相關文件 |
? | /array_ops | 數組array操作模塊 |
/kmeans | Kmeans相關模塊 | |
/sketch | 詞頻統計處理相關模塊 | |
/stemmer | 詞干處理相關模塊 | |
/svec | 稀疏矩陣相關模塊 | |
/svec_util | 稀疏矩陣依賴模塊 | |
/utils | 其他公共模塊 | |
src/bin | - | 工具模塊,用于安裝、卸載、部署等 |
src/bin/madpack | - | 數據庫交互模塊 |
src/dbal | - | 詞干處理相關模塊 |
src/libstemmer | - | 工具依賴文件 |
src/madpack | - | 里面包含公共的模塊 |
src/modules | - | 關聯規則算法 |
/assoc_rules | 包括凸算法的實現 | |
/convex | 包括條件隨機場算法 | |
/crf | 彈性網絡算法 | |
/elastic_net | 廣義線性模型 | |
/glm | 隱狄利克雷分配 | |
/lda | 線性代數操作 | |
/linalg | 線性系統模塊 | |
/linear_systems | 概率模塊 | |
/prob | 決策樹和隨機森林 | |
/recursive_partitioning | 回歸算法 | |
/regress | 采樣模塊 | |
/sample | 數理統計類模塊 | |
/stats | 時間序列 | |
/utilities | 包含pg,gaussdb平臺相關接口 | |
src/ports | - | 接口,鏈接db |
src/ports/postgres | - | 針對pg系,相關算法 |
/dbconnector | 關聯規則算法 | |
/modules | 貝葉斯算法 | |
/modules/bayes | 共軛梯度法 | |
/modules/conjugate_gradient | 包括多層感知機 | |
/modules/convex | 條件隨機場 | |
/modules/crf | 彈性網絡 | |
/modules/elastic_net | Prophet時序預測 | |
/modules/gbdt | Gdbt算法 | |
/modules/glm | 廣義線性模型 | |
/modules/graph | 圖模型 | |
/modules/kmeans | Kmeans算法 | |
/modules/knn | Knn算法 | |
/modules/lda | 隱狄利克雷分配 | |
/modules/linalg | 線性代數操作 | |
/modules/linear_systems | 線性系統模塊 | |
/modules/pca | PCA降維 | |
/modules/prob | 概率模塊 | |
/modules/recursive_partitioning | 決策樹和隨機森林 | |
/modules/sample | 回歸算法 | |
/modules/stats | 采樣模塊 | |
/modules/summary | 數理統計類模塊 | |
/modules/svm | 描述性統計的匯總函數 | |
/modules/tsa | Svm算法 | |
/modules/validation | 時間序列 | |
/modules/xgboost_gs | 交叉驗證 | |
src/utils | - | Xgboost算法 |
用戶通過調用UDF即可進行模型的訓練和預測,相關的結果會保存在表中,存儲在數據庫上。以訓練過程為例,MADlib在openGauss上執行的整體流程如圖8-22所示。
前文展示了MADlib各個模塊的功能和作用,從結構上看,用戶可以針對自己的算法進行擴展。前文中提到的XGBoost、GBDT和Prophet三個算法是我們在原來基礎上擴展的算法。本小節將以自研的GBDT模塊為例,介紹基于MADlib框架的擴展。
GBDT文件結構如表8-17所示。
文件結構 | 說明 |
gbdt/gbdt.py_in | python代碼 |
gbdt/gbdt.sql_in | 存儲過程代碼 |
gbdt/test/gbdt.sql | 測試代碼 |
在sql_in文件中,定義上層SQL-like接口,使用PL/pgSQL或者PL/python實現。
在SQL層中定義UDF函數,下述代碼實現了類似重載的功能。
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT, list_of_features_to_exclude TEXT, weights TEXT)RETURNS VOID AS $$ SELECT MADLIB_SCHEMA.gbdt_train($1, $2, $3, $4, $5, $6, $7, 30::INTEGER);$$ LANGUAGE sql VOLATILE;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT, list_of_features_to_exclude TEXT)RETURNS VOID AS $$ SELECT MADLIB_SCHEMA.gbdt_train($1, $2, $3, $4, $5, $6, NULL::TEXT);$$ LANGUAGE sql VOLATILE;CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT)RETURNS VOID AS $$ SELECT MADLIB_SCHEMA.gbdt_train($1, $2, $3, $4, $5, NULL::TEXT);$$ LANGUAGE sql VOLATILE;
其中,輸入表、輸出表、特征等必備信息需要用戶指定。其他參數提供缺省的參數,比如權重weights,如果用戶沒有指定自定義參數,程序會用默認的參數進行運算。
在SQL層定義PL/python接口,代碼如下:
CREATE OR REPLACE FUNCTION MADLIB_SCHEMA.gbdt_train( training_table_name TEXT, output_table_name TEXT, id_col_name TEXT, dependent_variable TEXT, list_of_features TEXT, list_of_features_to_exclude TEXT, weights TEXT, num_trees INTEGER, num_random_features INTEGER, max_tree_depth INTEGER, min_split INTEGER, min_bucket INTEGER, num_bins INTEGER, null_handling_params TEXT, is_classification BOOLEAN, predict_dt_prob TEXT, learning_rate DOUBLE PRECISION, verbose BOOLEAN, sample_ratio DOUBLE PRECISION)RETURNS VOID AS $$PythonFunction(gbdt, gbdt, gbdt_fit)$$ LANGUAGE plpythonu VOLATILE;
PL/pgSQL或者SQL函數最終會調用到一個PL/python函數。
“PythonFunction(gbdt, gbdt, gbdt_fit)”是固定的用法,這也是一個封裝的m4宏,會在編譯安裝的時候,會進行宏替換。
PythonFunction中,第一個參數是文件夾名,第二個參數是文件名,第三個參數是函數名。PythonFunction宏會被替換為“from gdbt.gdbt import gbdt_fit”語句。所以要保證文件路徑和函數正確。
在python層中,實現訓練函數,代碼如下:
def gbdt_fit(schema_madlib,training_table_name, output_table_name, id_col_name, dependent_variable, list_of_features, list_of_features_to_exclude, weights, num_trees, num_random_features, max_tree_depth, min_split, min_bucket, num_bins, null_handling_params, is_classification, predict_dt_prob = None, learning_rate = None, verbose=False, **kwargs): … plpy.execute("""ALTER TABLE {training_table_name} DROP COLUMN IF EXISTS gradient CASCADE """.format(training_table_name=training_table_name)) create_summary_table(output_table_name, null_proxy, bins["cat_features"], bins["con_features"], learning_rate, is_classification, predict_dt_prob, num_trees, training_table_name)
在python層實現預測函數,代碼如下:
def gbdt_predict(schema_madlib, test_table_name, model_table_name, output_table_name, id_col_name, **kwargs): num_tree = plpy.execute("""SELECT COUNT(*) AS count FROM {model_table_name}""".format(**locals()))[0]["count"] if num_tree == 0: plpy.error("The GBDT-method has no trees") elements = plpy.execute("""SELECT * FROM {model_table_name}_summary""".format(**locals()))[0]…
在py_in文件中,定義相應的業務代碼,用python實現相應處理邏輯。
在安裝階段,sql_in和py_in會被GNU m4解析為正常的python和sql文件。這里需要指出的是,當前MADlib框架只支持python2版本,因此,上述代碼實現也是基于python2完成的。
這里以通過支持向量機算法進行房價分類為例,演示具體的使用方法。
(1) 數據集準備,代碼如下:
DROP TABLE IF EXISTS houses;CREATE TABLE houses (id INT, tax INT, bedroom INT, bath FLOAT, price INT, size INT, lot INT);INSERT INTO houses VALUES(1 , 590 , 2 , 1 , 50000 , 770 , 22100),(2 , 1050 , 3 , 2 , 85000 , 1410 , 12000),(3 , 20 , 3 , 1 , 22500 , 1060 , 3500), …(12 , 1620 , 3 , 2 , 118600 , 1250 , 20000),(13 , 3100 , 3 , 2 , 140000 , 1760 , 38000),(14 , 2070 , 2 , 3 , 148000 , 1550 , 14000),(15 , 650 , 3 , 1.5 , 65000 , 1450 , 12000);
(2) 模型訓練
① 訓練前配置相應schema和兼容性參數,代碼如下:
SET search_path="$user",public,madlib;SET behavior_compat_options = "bind_procedure_searchpath";
② 使用默認的參數進行訓練,分類的條件為‘price < 100000’,SQL語句如下:
DROP TABLE IF EXISTS houses_svm, houses_svm_summary; SELECT madlib.svm_classification("public.houses","public.houses_svm","price < 100000","ARRAY[1, tax, bath, size]");
(3) 查看模型,代碼如下:
/x onSELECT * FROM houses_svm;/x off
結果如下:
-[ RECORD 1 ]------+-----------------------------------------------------------------coef | {.113989576847,-.00226133300602,-.0676303607996,.00179440841072}loss | .614496714256667norm_of_gradient | 108.171180769224num_iterations | 100num_rows_processed | 15num_rows_skipped | 0dep_var_mapping | {f,t}
(4) 進行預測,代碼如下:
DROP TABLE IF EXISTS houses_pred; SELECT madlib.svm_predict("public.houses_svm","public.houses","id","public.houses_pred");
(5) 查看預測結果,代碼如下:
SELECT *, price < 100000 AS actual FROM houses JOIN houses_pred USING (id) ORDER BY id;
結果如下:
id | tax | bedroom | bath | price | size | lot | prediction | decision_function | actual----+------+---------+------+--------+------+-------+------------+-------------------+-------- 1 | 590 | 2 | 1 | 50000 | 770 | 22100 | t | .09386721875 | t 2 | 1050 | 3 | 2 | 85000 | 1410 | 12000 | t | .134445058042 | t … 14 | 2070 | 2 | 3 | 148000 | 1550 | 14000 | f | -1.9885277913972 | f 15 | 650 | 3 | 1.5 | 65000 | 1450 | 12000 | t | 1.1445697772786 | t(15 rows
查看誤分率,代碼如下:
SELECT COUNT(*) FROM houses_pred JOIN houses USING (id) WHERE houses_pred.prediction != (houses.price < 100000);
結果如下:
count------- 3(1 row)
(6) 使用svm其他核進行訓練,代碼如下:
DROP TABLE IF EXISTS houses_svm_gaussian, houses_svm_gaussian_summary, houses_svm_gaussian_random; SELECT madlib.svm_classification( "public.houses","public.houses_svm_gaussian","price < 100000","ARRAY[1, tax, bath, size]","gaussian","n_components=10", "", "init_stepsize=1, max_iter=200" );
進行預測,并查看訓練結果。
DROP TABLE IF EXISTS houses_pred_gaussian; SELECT madlib.svm_predict("public.houses_svm_gaussian","public.houses","id", "public.houses_pred_gaussian");SELECT COUNT(*) FROM houses_pred_gaussian JOIN houses USING (id) WHERE houses_pred_gaussian.prediction != (houses.price < 100000);
結果如下:
count -------+ 0 (1 row)
(7) 其他參數
除了指定不同的核方法外,還可以指定迭代次數、初始參數,比如init_stepsize,max_iter,class_weight等。
openGauss當前通過兼容開源的Apache MADlib機器學習庫來具備機器學習能力。通過對原有MADlib框架的適配,openGauss實現了多種自定義的工程化算法擴展。
除兼容業界標桿PostgreSQL系的Apache MADlib來獲得它的業務生態外,openGauss也在自研原生的DB4AI引擎,并支持端到端的全流程AI能力,這包括模型管理、超參數優化、原生的SQL-like語法、數據庫原生的AI算子與執行計劃等,性能相比MADlib具有5倍以上的提升。該功能將在后續逐步開源。
本章中,介紹了openGauss團隊在AI與數據庫結合中的探索,并重點介紹了AI4DB中的參數自調優、索引推薦、異常檢測、查詢時間預測、慢SQL發現等特性,以及openGauss的DB4AI功能。無論從哪個方面講,AI與數據庫的結合遠不止于此,此處介紹的這些功能也僅是一個開端,在openGauss的AI功能上還有很多事情要做、還有很多路要走。包括AI與優化器的進一步結合;打造全流程的AI自治能力,實現全場景的故障發現與自動修復;利用AI改造數據庫內的算法與邏輯等都是演進的方向。
雖然AI與數據庫結合已經取得了長遠的進步,但是還面臨著如下的挑戰。
(1) 算力問題:額外的AI計算產生的算力代價如何解決?會不會導致性能下降。
(2) 算法問題:使用AI算法與數據庫結合是否會帶來顯著的收益?算法額外開銷是否很大?算法能否泛化,適用到普適場景中?選擇什么樣的算法更能解決實際問題?
(3) 數據問題:如何安全的提取和存儲AI模型訓練所需要的數據,如何面對數據冷熱分類和加載啟動問題?
上述問題在很大程度上是一個權衡問題,既要充分利用AI創造的靈感,又要充分繼承和發揚數據庫現有的理論與實踐,這也是openGauss團隊不斷探索的方向。
感謝大家學習第8章 AI技術中“8.7 DeepSQL、8.8 小結”的精彩內容,下一篇我們開啟“第9章 安全管理源碼解析”的相關內容的介紹。
敬請期待。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/121547.html
摘要:本文整理了年月國產數據庫大事件和重要產品發布消息。柏睿數據庫加速安全卡面向全球重磅發布。月日,在全球數字經濟大會成果發布會上,中國移動北京分公司與國產數據庫領域新銳企業柏睿數據簽署戰略合作協議。本次大賽主要面向全國愛好數據庫的高校學生。 本文整理了2021年8月國產數據庫大事件和重要產品發布消息。目錄8月國產數據庫大事記TOP108月國產數據庫大事記時間線產品/版本發布兼容認證8月排行榜新增...
摘要:年月國產數據庫流行度排行榜前名達夢本月分數下跌,總分,位于榜單第二位。人大金倉保持增長態勢,本月分數大幅上漲,總分,位于榜單第九位。達夢入選其中,位列總榜第國產數據庫第。月日,人大金倉與天津科大正式簽訂聯合人才培養協議。2021年11月國產數據庫流行度排行榜前15名 ? 達夢本月分數下跌10.88,總分467.45,位于榜單第二位。作為具有完全自主知識產權的國產數據庫廠商,今年達夢的...
.markdown-body{word-break:break-word;line-height:1.75;font-weight:400;font-size:15px;overflow-x:hidden;color:#333}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body...
摘要:年月國產數據庫流行度排行榜前名連續三個月的分數下跌讓名次下降一位,以分的總分來到榜單第三。國產數據庫流行度排行榜與趨勢變化本月分數下跌,總分,位于榜單第五。 2021年10月國產數據庫流行度排行榜前15名 連續三個月的分數下跌讓OceanBase名次下降一位,以424.83分的總分來到榜單第三。本月,OceanBase有幾個重要事件,如亮相2021中國國際服務貿易交流會,參與HICOO...
閱讀 3161·2023-04-25 19:09
閱讀 3874·2021-10-22 09:54
閱讀 1743·2021-09-29 09:35
閱讀 2904·2021-09-08 09:45
閱讀 2231·2021-09-06 15:00
閱讀 2766·2019-08-29 15:32
閱讀 1028·2019-08-28 18:30
閱讀 370·2019-08-26 13:43