AINode
AINode
AINode 是支持時序相關(guān)模型注冊、管理、調(diào)用的 IoTDB 原生節(jié)點(diǎn),內(nèi)置業(yè)界領(lǐng)先的自研時序大模型,如清華自研時序模型 Timer 系列,可通過標(biāo)準(zhǔn) SQL 語句進(jìn)行調(diào)用,實(shí)現(xiàn)時序數(shù)據(jù)的毫秒級實(shí)時推理,可支持時序趨勢預(yù)測、缺失值填補(bǔ)、異常值檢測等應(yīng)用場景。
系統(tǒng)架構(gòu)如下圖所示:

三種節(jié)點(diǎn)的職責(zé)如下:
- ConfigNode:負(fù)責(zé)保存和管理模型的元信息;負(fù)責(zé)分布式節(jié)點(diǎn)管理。
- DataNode:負(fù)責(zé)接收并解析用戶的 SQL請求;負(fù)責(zé)存儲時間序列數(shù)據(jù);負(fù)責(zé)數(shù)據(jù)的預(yù)處理計算。
- AINode:負(fù)責(zé)模型文件的導(dǎo)入創(chuàng)建以及模型推理。
1. 優(yōu)勢特點(diǎn)
與單獨(dú)構(gòu)建機(jī)器學(xué)習(xí)服務(wù)相比,具有以下優(yōu)勢:
簡單易用:無需使用 Python 或 Java 編程,使用 SQL 語句即可完成機(jī)器學(xué)習(xí)模型管理與推理的完整流程。如創(chuàng)建模型可使用CREATE MODEL語句、使用模型進(jìn)行推理可使用CALL INFERENCE(...)語句等,使用更加簡單便捷。
避免數(shù)據(jù)遷移:使用 IoTDB 原生機(jī)器學(xué)習(xí)可以將存儲在 IoTDB 中的數(shù)據(jù)直接應(yīng)用于機(jī)器學(xué)習(xí)模型的推理,無需將數(shù)據(jù)移動到單獨(dú)的機(jī)器學(xué)習(xí)服務(wù)平臺,從而加速數(shù)據(jù)處理、提高安全性并降低成本。

- 內(nèi)置先進(jìn)算法:支持業(yè)內(nèi)領(lǐng)先機(jī)器學(xué)習(xí)分析算法,覆蓋典型時序分析任務(wù),為時序數(shù)據(jù)庫賦能原生數(shù)據(jù)分析能力。如:
- 時間序列預(yù)測(Time Series Forecasting):從過去時間序列中學(xué)習(xí)變化模式;從而根據(jù)給定過去時間的觀測值,輸出未來序列最可能的預(yù)測。
- 時序異常檢測(Anomaly Detection for Time Series):在給定的時間序列數(shù)據(jù)中檢測和識別異常值,幫助發(fā)現(xiàn)時間序列中的異常行為。
- 時間序列標(biāo)注(Time Series Annotation):為每個數(shù)據(jù)點(diǎn)或特定時間段添加額外的信息或標(biāo)記,例如事件發(fā)生、異常點(diǎn)、趨勢變化等,以便更好地理解和分析數(shù)據(jù)。
2. 基本概念
- 模型(Model):機(jī)器學(xué)習(xí)模型,以時序數(shù)據(jù)作為輸入,輸出分析任務(wù)的結(jié)果或決策。模型是 AINode 的基本管理單元,支持模型的增(注冊)、刪、查、改(微調(diào))、用(推理)。
- 創(chuàng)建(Create): 將外部設(shè)計或訓(xùn)練好的模型文件或算法加載到 AINode 中,由 IoTDB 統(tǒng)一管理與使用。
- 推理(Inference):使用創(chuàng)建的模型在指定時序數(shù)據(jù)上完成該模型適用的時序分析任務(wù)。
- 內(nèi)置能力(Built-in):AINode 自帶常見時序分析場景(例如預(yù)測與異常檢測)的機(jī)器學(xué)習(xí)算法或自研模型。

3. 安裝部署
AINode 的部署可參考文檔 部署指導(dǎo) 章節(jié)。
4. 使用指導(dǎo)
AINode 對時序模型提供了模型創(chuàng)建及刪除功能,內(nèi)置模型無需創(chuàng)建,可直接使用。
4.1 注冊模型
通過指定模型輸入輸出的向量維度,可以注冊訓(xùn)練好的深度學(xué)習(xí)模型,從而用于模型推理。
符合以下內(nèi)容的模型可以注冊到AINode中:
- AINode 目前支持基于 PyTorch 2.4.0 版本訓(xùn)練的模型,需避免使用 2.4.0 版本以上的特性。
- AINode 支持使用 PyTorch JIT 存儲的模型(
model.pt),模型文件需要包含模型的結(jié)構(gòu)和權(quán)重。 - 模型輸入序列可以包含一列或多列,若有多列,需要和模型能力、模型配置文件對應(yīng)。
- 模型的配置參數(shù)必須在
config.yaml配置文件中明確定義。使用模型時,必須嚴(yán)格按照config.yaml配置文件中定義的輸入輸出維度。如果輸入輸出列數(shù)不匹配配置文件,將會導(dǎo)致錯誤。
下方為模型注冊的SQL語法定義。
create model <model_id> using uri <uri>SQL中參數(shù)的具體含義如下:
model_id:模型的全局唯一標(biāo)識,不可重復(fù)。模型名稱具備以下約束:
- 允許出現(xiàn)標(biāo)識符 [ 0-9 a-z A-Z _ ] (字母,數(shù)字,下劃線)
- 長度限制為2-64字符
- 大小寫敏感
uri:模型注冊文件的資源路徑,路徑下應(yīng)包含模型結(jié)構(gòu)及權(quán)重文件 model.pt 文件和模型配置文件 config.yaml
模型結(jié)構(gòu)及權(quán)重文件:模型訓(xùn)練完成后得到的權(quán)重文件,目前支持 pytorch 訓(xùn)練得到的 .pt 文件
模型配置文件:模型注冊時需要提供的與模型結(jié)構(gòu)有關(guān)的參數(shù),其中必須包含模型的輸入輸出維度用于模型推理:
參數(shù)名 參數(shù)描述 示例 input_shape 模型輸入的行列,用于模型推理 [96,2] output_shape 模型輸出的行列,用于模型推理 [48,2] ? 除了模型推理外,還可以指定模型輸入輸出的數(shù)據(jù)類型:
參數(shù)名 參數(shù)描述 示例 input_type 模型輸入的數(shù)據(jù)類型 ['float32','float32'] output_type 模型輸出的數(shù)據(jù)類型 ['float32','float32'] ? 除此之外,可以額外指定備注信息用于在模型管理時進(jìn)行展示
參數(shù)名 參數(shù)描述 示例 attributes 可選,用戶自行設(shè)定的模型備注信息,用于模型展示 'model_type': 'dlinear','kernel_size': '25'
除了本地模型文件的注冊,還可以通過URI來指定遠(yuǎn)程資源路徑來進(jìn)行注冊,使用開源的模型倉庫(例如HuggingFace)。
示例
在當(dāng)前的example文件夾下,包含model.pt和config.yaml文件,model.pt為訓(xùn)練得到,config.yaml的內(nèi)容如下:
configs:
# 必選項
input_shape: [96, 2] # 表示模型接收的數(shù)據(jù)為96行x2列
output_shape: [48, 2] # 表示模型輸出的數(shù)據(jù)為48行x2列
# 可選項 默認(rèn)為全部float32,列數(shù)為shape對應(yīng)的列數(shù)
input_type: ["int64","int64"] #輸入對應(yīng)的數(shù)據(jù)類型,需要與輸入列數(shù)匹配
output_type: ["text","int64"] #輸出對應(yīng)的數(shù)據(jù)類型,需要與輸出列數(shù)匹配
attributes: # 可選項 為用戶自定義的備注信息
'model_type': 'dlinear'
'kernel_size': '25'指定該文件夾作為加載路徑就可以注冊該模型
IoTDB> create model dlinear_example using uri "file://./example"也可以從huggingFace上下載對應(yīng)的模型文件進(jìn)行注冊
IoTDB> create model dlinear_example using uri "https://huggingface.co/google/timesfm-2.0-500m-pytorch"SQL執(zhí)行后會異步進(jìn)行注冊的流程,可以通過模型展示查看模型的注冊狀態(tài)(見模型展示章節(jié)),注冊成功的耗時主要受到模型文件大小的影響。
模型注冊完成后,就可以通過使用正常查詢的方式調(diào)用具體函數(shù),進(jìn)行模型推理。
4.2 查看模型
注冊成功的模型可以通過show models指令查詢模型的具體信息。其SQL定義如下:
show models
show models <model_id>除了直接展示所有模型的信息外,可以指定model id來查看某一具體模型的信息。模型展示的結(jié)果中包含如下信息:
| ModelId | State | Configs | Attributes |
|---|---|---|---|
| 模型唯一標(biāo)識 | 模型注冊狀態(tài)(INACTIVE,LOADING,ACTIVE,TRAINING,FAILED,DROPPING) | InputShape, outputShapeInputTypes, outputTypes | 模型備注信息 |
其中,State用于展示當(dāng)前模型注冊的狀態(tài),包含以下三個階段
- INACTIVE:模型處于不可用狀態(tài)
- LOADING:模型加載中
- ACTIVE:模型處于可用狀態(tài)
- TRAINING:模型處于微調(diào)中狀態(tài)
- FAILED:模型微調(diào)失敗狀態(tài)
- DROPPING:模型刪除中狀態(tài)
示例
IoTDB> show models
+---------------------+--------------------+--------+--------+
| ModelId| ModelType|Category| State|
+---------------------+--------------------+--------+--------+
| arima| Arima|BUILT-IN| ACTIVE|
| holtwinters| HoltWinters|BUILT-IN| ACTIVE|
|exponential_smoothing|ExponentialSmoothing|BUILT-IN| ACTIVE|
| naive_forecaster| NaiveForecaster|BUILT-IN| ACTIVE|
| stl_forecaster| StlForecaster|BUILT-IN| ACTIVE|
| gaussian_hmm| GaussianHmm|BUILT-IN| ACTIVE|
| gmm_hmm| GmmHmm|BUILT-IN| ACTIVE|
| stray| Stray|BUILT-IN| ACTIVE|
| timer_xl| Timer-XL|BUILT-IN| ACTIVE|
| sundial| Timer-Sundial|BUILT-IN| ACTIVE|
+---------------------+--------------------+--------+--------+4.3 刪除模型
對于注冊成功的模型,用戶可以通過SQL進(jìn)行刪除,該操作會刪除所有 AINode 下的相關(guān)模型文件,其SQL如下:
drop model <model_id>需要指定已經(jīng)成功注冊的模型 model_id 來刪除對應(yīng)的模型。由于模型刪除涉及模型數(shù)據(jù)清理,操作不會立即完成,此時模型的狀態(tài)為 DROPPING,該狀態(tài)的模型不能用于模型推理。請注意,該功能不支持刪除內(nèi)置模型。
4.4 使用內(nèi)置模型推理
SQL語法如下:
call inference(<model_id>,inputSql,(<parameterName>=<parameterValue>)*)
window_function:
head(window_size)
tail(window_size)
count(window_size,sliding_step)內(nèi)置模型推理無需注冊流程,通過call關(guān)鍵字,調(diào)用inference函數(shù)就可以使用模型的推理功能,其對應(yīng)的參數(shù)介紹如下:
- model_id: 模型名稱
- parameterName:參數(shù)名
- parameterValue:參數(shù)值
請注意,使用內(nèi)置時序大模型進(jìn)行推理的前提條件是本地存有對應(yīng)模型權(quán)重,目錄為 /IOTDB_AINODE_HOME/data/ainode/models/weights/model_id/。若本地沒有模型權(quán)重,則會自動從 HuggingFace 拉取,請保證本地能直接訪問 HuggingFace。
內(nèi)置模型及參數(shù)說明
目前已內(nèi)置如下機(jī)器學(xué)習(xí)模型,具體參數(shù)說明請參考以下鏈接。
| 模型 | built_in_model_id | 任務(wù)類型 | 參數(shù)說明 |
|---|---|---|---|
| Arima | _Arima | 預(yù)測 | Arima參數(shù)說明 |
| STLForecaster | _STLForecaster | 預(yù)測 | STLForecaster參數(shù)說明 |
| NaiveForecaster | _NaiveForecaster | 預(yù)測 | NaiveForecaster參數(shù)說明 |
| ExponentialSmoothing | _ExponentialSmoothing | 預(yù)測 | ExponentialSmoothing參數(shù)說明 |
| GaussianHMM | _GaussianHMM | 標(biāo)注 | GaussianHMM參數(shù)說明 |
| GMMHMM | _GMMHMM | 標(biāo)注 | GMMHMM參數(shù)說明 |
| Stray | _Stray | 異常檢測 | Stray參數(shù)說明 |
在完成模型的注冊后,通過call關(guān)鍵字,調(diào)用inference函數(shù)就可以使用模型的推理功能,其對應(yīng)的參數(shù)介紹如下:
- model_id: 對應(yīng)一個已經(jīng)注冊的模型
- sql:sql查詢語句,查詢的結(jié)果作為模型的輸入進(jìn)行模型推理。查詢的結(jié)果中行列的維度需要與具體模型config中指定的大小相匹配。(這里的sql不建議使用
SELECT *子句,因?yàn)樵贗oTDB中,*并不會對列進(jìn)行排序,因此列的順序是未定義的,可以使用SELECT s0,s1的方式確保列的順序符合模型輸入的預(yù)期) - window_function: 推理過程中可以使用的窗口函數(shù),目前提供三種類型的窗口函數(shù)用于輔助模型推理:
head(window_size): 獲取數(shù)據(jù)中最前的window_size個點(diǎn)用于模型推理,該窗口可用于數(shù)據(jù)裁剪

tail(window_size):獲取數(shù)據(jù)中最后的window_size個點(diǎn)用于模型推,該窗口可用于數(shù)據(jù)裁剪

count(window_size, sliding_step):基于點(diǎn)數(shù)的滑動窗口,每個窗口的數(shù)據(jù)會分別通過模型進(jìn)行推理,如下圖示例所示,window_size為2的窗口函數(shù)將輸入數(shù)據(jù)集分為三個窗口,每個窗口分別進(jìn)行推理運(yùn)算生成結(jié)果。該窗口可用于連續(xù)推理

說明1: window可以用來解決sql查詢結(jié)果和模型的輸入行數(shù)要求不一致時的問題,對行進(jìn)行裁剪。需要注意的是,當(dāng)列數(shù)不匹配或是行數(shù)直接少于模型需求時,推理無法進(jìn)行,會返回錯誤信息。
說明2: 在深度學(xué)習(xí)應(yīng)用中,經(jīng)常將時間戳衍生特征(數(shù)據(jù)中的時間列)作為生成式任務(wù)的協(xié)變量,一同輸入到模型中以提升模型的效果,但是在模型的輸出結(jié)果中一般不包含時間列。為了保證實(shí)現(xiàn)的通用性,模型推理結(jié)果只對應(yīng)模型的真實(shí)輸出,如果模型不輸出時間列,則結(jié)果中不會包含。
示例
下面是使用深度學(xué)習(xí)模型推理的一個操作示例,針對上面提到的輸入為[96,2],輸出為[48,2]的dlinear預(yù)測模型,我們通過SQL使用其進(jìn)行推理。
IoTDB> select s1,s2 from root.**
+-----------------------------+-------------------+-------------------+
| Time| root.eg.etth.s0| root.eg.etth.s1|
+-----------------------------+-------------------+-------------------+
|1990-01-01T00:00:00.000+08:00| 0.7855| 1.611|
|1990-01-02T00:00:00.000+08:00| 0.7818| 1.61|
|1990-01-03T00:00:00.000+08:00| 0.7867| 1.6293|
|1990-01-04T00:00:00.000+08:00| 0.786| 1.637|
|1990-01-05T00:00:00.000+08:00| 0.7849| 1.653|
|1990-01-06T00:00:00.000+08:00| 0.7866| 1.6537|
|1990-01-07T00:00:00.000+08:00| 0.7886| 1.662|
......
|1990-03-31T00:00:00.000+08:00| 0.7585| 1.678|
|1990-04-01T00:00:00.000+08:00| 0.7587| 1.6763|
|1990-04-02T00:00:00.000+08:00| 0.76| 1.6813|
|1990-04-03T00:00:00.000+08:00| 0.7669| 1.684|
|1990-04-04T00:00:00.000+08:00| 0.7645| 1.677|
|1990-04-05T00:00:00.000+08:00| 0.7625| 1.68|
|1990-04-06T00:00:00.000+08:00| 0.7617| 1.6917|
+-----------------------------+-------------------+-------------------+
Total line number = 96
IoTDB> call inference(dlinear_example,"select s0,s1 from root.**", generateTime=True)
+-----------------------------+--------------------------------------------+-----------------------------+
| Time| _result_0| _result_1|
+-----------------------------+--------------------------------------------+-----------------------------+
|1990-04-06T00:00:00.000+08:00| 0.726302981376648| 1.6549958229064941|
|1990-04-08T00:00:00.000+08:00| 0.7354921698570251| 1.6482787370681763|
|1990-04-10T00:00:00.000+08:00| 0.7238251566886902| 1.6278168201446533|
......
|1990-07-07T00:00:00.000+08:00| 0.7692174911499023| 1.654654049873352|
|1990-07-09T00:00:00.000+08:00| 0.7685555815696716| 1.6625318765640259|
|1990-07-11T00:00:00.000+08:00| 0.7856493592262268| 1.6508299350738525|
+-----------------------------+--------------------------------------------+-----------------------------+
Total line number = 48使用tail/head窗口函數(shù)的示例
當(dāng)數(shù)據(jù)量不定且想要取96行最新數(shù)據(jù)用于推理時,可以使用對應(yīng)的窗口函數(shù)tail。head函數(shù)的用法與其類似,不同點(diǎn)在于其取的是最早的96個點(diǎn)。
IoTDB> select s1,s2 from root.**
+-----------------------------+-------------------+-------------------+
| Time| root.eg.etth.s0| root.eg.etth.s1|
+-----------------------------+-------------------+-------------------+
|1988-01-01T00:00:00.000+08:00| 0.7355| 1.211|
......
|1990-01-01T00:00:00.000+08:00| 0.7855| 1.611|
|1990-01-02T00:00:00.000+08:00| 0.7818| 1.61|
|1990-01-03T00:00:00.000+08:00| 0.7867| 1.6293|
|1990-01-04T00:00:00.000+08:00| 0.786| 1.637|
|1990-01-05T00:00:00.000+08:00| 0.7849| 1.653|
|1990-01-06T00:00:00.000+08:00| 0.7866| 1.6537|
|1990-01-07T00:00:00.000+08:00| 0.7886| 1.662|
......
|1990-03-31T00:00:00.000+08:00| 0.7585| 1.678|
|1990-04-01T00:00:00.000+08:00| 0.7587| 1.6763|
|1990-04-02T00:00:00.000+08:00| 0.76| 1.6813|
|1990-04-03T00:00:00.000+08:00| 0.7669| 1.684|
|1990-04-04T00:00:00.000+08:00| 0.7645| 1.677|
|1990-04-05T00:00:00.000+08:00| 0.7625| 1.68|
|1990-04-06T00:00:00.000+08:00| 0.7617| 1.6917|
+-----------------------------+-------------------+-------------------+
Total line number = 996
IoTDB> call inference(dlinear_example,"select s0,s1 from root.**", generateTime=True, window=tail(96))
+-----------------------------+--------------------------------------------+-----------------------------+
| Time| _result_0| _result_1|
+-----------------------------+--------------------------------------------+-----------------------------+
|1990-04-06T00:00:00.000+08:00| 0.726302981376648| 1.6549958229064941|
|1990-04-08T00:00:00.000+08:00| 0.7354921698570251| 1.6482787370681763|
|1990-04-10T00:00:00.000+08:00| 0.7238251566886902| 1.6278168201446533|
......
|1990-07-07T00:00:00.000+08:00| 0.7692174911499023| 1.654654049873352|
|1990-07-09T00:00:00.000+08:00| 0.7685555815696716| 1.6625318765640259|
|1990-07-11T00:00:00.000+08:00| 0.7856493592262268| 1.6508299350738525|
+-----------------------------+--------------------------------------------+-----------------------------+
Total line number = 48使用count窗口函數(shù)的示例
該窗口主要用于計算式任務(wù),當(dāng)任務(wù)對應(yīng)的模型一次只能處理固定行數(shù)據(jù)而最終想要的確實(shí)多組預(yù)測結(jié)果時,使用該窗口函數(shù)可以使用點(diǎn)數(shù)滑動窗口進(jìn)行連續(xù)推理。假設(shè)我們現(xiàn)在有一個異常檢測模型anomaly_example(input: [24,2], output[1,1]),對每24行數(shù)據(jù)會生成一個0/1的標(biāo)簽,其使用示例如下:
IoTDB> select s1,s2 from root.**
+-----------------------------+-------------------+-------------------+
| Time| root.eg.etth.s0| root.eg.etth.s1|
+-----------------------------+-------------------+-------------------+
|1990-01-01T00:00:00.000+08:00| 0.7855| 1.611|
|1990-01-02T00:00:00.000+08:00| 0.7818| 1.61|
|1990-01-03T00:00:00.000+08:00| 0.7867| 1.6293|
|1990-01-04T00:00:00.000+08:00| 0.786| 1.637|
|1990-01-05T00:00:00.000+08:00| 0.7849| 1.653|
|1990-01-06T00:00:00.000+08:00| 0.7866| 1.6537|
|1990-01-07T00:00:00.000+08:00| 0.7886| 1.662|
......
|1990-03-31T00:00:00.000+08:00| 0.7585| 1.678|
|1990-04-01T00:00:00.000+08:00| 0.7587| 1.6763|
|1990-04-02T00:00:00.000+08:00| 0.76| 1.6813|
|1990-04-03T00:00:00.000+08:00| 0.7669| 1.684|
|1990-04-04T00:00:00.000+08:00| 0.7645| 1.677|
|1990-04-05T00:00:00.000+08:00| 0.7625| 1.68|
|1990-04-06T00:00:00.000+08:00| 0.7617| 1.6917|
+-----------------------------+-------------------+-------------------+
Total line number = 96
IoTDB> call inference(anomaly_example,"select s0,s1 from root.**", generateTime=True, window=count(24,24))
+-----------------------------+-------------------------+
| Time| _result_0|
+-----------------------------+-------------------------+
|1990-04-06T00:00:00.000+08:00| 0|
|1990-04-30T00:00:00.000+08:00| 1|
|1990-05-24T00:00:00.000+08:00| 1|
|1990-06-17T00:00:00.000+08:00| 0|
+-----------------------------+-------------------------+
Total line number = 4其中結(jié)果集中每行的標(biāo)簽對應(yīng)每24行數(shù)據(jù)為一組,輸入該異常檢測模型后的輸出。
4.5 使用內(nèi)置模型微調(diào)
僅 Timer-XL、Timer-Sundial 可以進(jìn)行微調(diào)操作。
SQL語法如下:
create model <model_id> (with hyperparameters
(<parameterName>=<parameterValue>(, <parameterName>=<parameterValue>)*))?
from model <existing_model_id>
on dataset (PATH <prefixPath>([timeRange])?)示例
- 選擇測點(diǎn) root.db.etth.ot 中前 80% 的數(shù)據(jù)作為微調(diào)數(shù)據(jù)集,基于 sundial 創(chuàng)建模型 sundialv2.
IoTDB> CREATE MODEL sundialv2 FROM MODEL sundial ON DATASET (PATH root.db.etth.OT([1467302400000, 1517468400001)))
Msg: The statement is executed successfully.
IoTDB> show models
+---------------------+--------------------+----------+--------+
| ModelId| ModelType| Category| State|
+---------------------+--------------------+----------+--------+
| arima| Arima| BUILT-IN| ACTIVE|
| holtwinters| HoltWinters| BUILT-IN| ACTIVE|
|exponential_smoothing|ExponentialSmoothing| BUILT-IN| ACTIVE|
| naive_forecaster| NaiveForecaster| BUILT-IN| ACTIVE|
| stl_forecaster| StlForecaster| BUILT-IN| ACTIVE|
| gaussian_hmm| GaussianHmm| BUILT-IN| ACTIVE|
| gmm_hmm| GmmHmm| BUILT-IN| ACTIVE|
| stray| Stray| BUILT-IN| ACTIVE|
| sundial| Timer-Sundial| BUILT-IN| ACTIVE|
| timer_xl| Timer-XL| BUILT-IN| ACTIVE|
| sundialv2| Timer-Sundial|FINE-TUNED|TRAINING|
+---------------------+--------------------+----------+--------+- 微調(diào)任務(wù)后臺異步啟動,可在 AINode 進(jìn)程看到 log;微調(diào)完成后,查詢并使用新的模型
IoTDB> show models
+---------------------+--------------------+----------+------+
| ModelId| ModelType| Category| State|
+---------------------+--------------------+----------+------+
| arima| Arima| BUILT-IN|ACTIVE|
| holtwinters| HoltWinters| BUILT-IN|ACTIVE|
|exponential_smoothing|ExponentialSmoothing| BUILT-IN|ACTIVE|
| naive_forecaster| NaiveForecaster| BUILT-IN|ACTIVE|
| stl_forecaster| StlForecaster| BUILT-IN|ACTIVE|
| gaussian_hmm| GaussianHmm| BUILT-IN|ACTIVE|
| gmm_hmm| GmmHmm| BUILT-IN|ACTIVE|
| stray| Stray| BUILT-IN|ACTIVE|
| sundial| Timer-Sundial| BUILT-IN|ACTIVE|
| timer_xl| Timer-XL| BUILT-IN|ACTIVE|
| sundialv2| Timer-Sundial|FINE-TUNED|ACTIVE|
+---------------------+--------------------+----------+------+4.6 時序大模型導(dǎo)入步驟
AINode 目前支持多種時序大模型,部署使用請參考時序大模型
5. 權(quán)限管理
使用AINode相關(guān)的功能時,可以使用IoTDB本身的鑒權(quán)去做一個權(quán)限管理,用戶只有在具備 USE_MODEL 權(quán)限時,才可以使用模型管理的相關(guān)功能。當(dāng)使用推理功能時,用戶需要有訪問輸入模型的SQL對應(yīng)的源序列的權(quán)限。
| 權(quán)限名稱 | 權(quán)限范圍 | 管理員用戶(默認(rèn)ROOT) | 普通用戶 | 路徑相關(guān) |
|---|---|---|---|---|
| USE_MODEL | create model / show models / drop model | √ | √ | x |
| READ_DATA | call inference | √ | √ | √ |
6. 實(shí)際案例
6.1 電力負(fù)載預(yù)測
在部分工業(yè)場景下,會存在預(yù)測電力負(fù)載的需求,預(yù)測結(jié)果可用于優(yōu)化電力供應(yīng)、節(jié)約能源和資源、支持規(guī)劃和擴(kuò)展以及增強(qiáng)電力系統(tǒng)的可靠性。
我們所使用的 ETTh1 的測試集的數(shù)據(jù)為ETTh1。
包含間隔1h采集一次的電力數(shù)據(jù),每條數(shù)據(jù)由負(fù)載和油溫構(gòu)成,分別為:High UseFul Load, High UseLess Load, Middle UseLess Load, Low UseFul Load, Low UseLess Load, Oil Temperature。
在該數(shù)據(jù)集上,IoTDB-ML的模型推理功能可以通過以往高中低三種負(fù)載的數(shù)值和對應(yīng)時間戳油溫的關(guān)系,預(yù)測未來一段時間內(nèi)的油溫,賦能電網(wǎng)變壓器的自動調(diào)控和監(jiān)視。
步驟一:數(shù)據(jù)導(dǎo)入
用戶可以使用tools文件夾中的import-csv.sh 向 IoTDB 中導(dǎo)入 ETT 數(shù)據(jù)集
bash ./import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ../../ETTh1.csv步驟二:模型導(dǎo)入
我們可以在iotdb-cli 中輸入以下SQL從 huggingface 上拉取一個已經(jīng)訓(xùn)練好的模型進(jìn)行注冊,用于后續(xù)的推理。
create model dlinear using uri 'https://huggingface.co/hvlgo/dlinear/tree/main'該模型基于較為輕量化的深度模型DLinear訓(xùn)練而得,能夠以相對快的推理速度盡可能多地捕捉到序列內(nèi)部的變化趨勢和變量間的數(shù)據(jù)變化關(guān)系,相較于其他更深的模型更適用于快速實(shí)時預(yù)測。
步驟三:模型推理
IoTDB> select s0,s1,s2,s3,s4,s5,s6 from root.eg.etth LIMIT 96
+-----------------------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
| Time|root.eg.etth.s0|root.eg.etth.s1|root.eg.etth.s2|root.eg.etth.s3|root.eg.etth.s4|root.eg.etth.s5|root.eg.etth.s6|
+-----------------------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
|2017-10-20T00:00:00.000+08:00| 10.449| 3.885| 8.706| 2.025| 2.041| 0.944| 8.864|
|2017-10-20T01:00:00.000+08:00| 11.119| 3.952| 8.813| 2.31| 2.071| 1.005| 8.442|
|2017-10-20T02:00:00.000+08:00| 9.511| 2.88| 7.533| 1.564| 1.949| 0.883| 8.16|
|2017-10-20T03:00:00.000+08:00| 9.645| 2.21| 7.249| 1.066| 1.828| 0.914| 7.949|
......
|2017-10-23T20:00:00.000+08:00| 8.105| 0.938| 4.371| -0.569| 3.533| 1.279| 9.708|
|2017-10-23T21:00:00.000+08:00| 7.167| 1.206| 4.087| -0.462| 3.107| 1.432| 8.723|
|2017-10-23T22:00:00.000+08:00| 7.1| 1.34| 4.015| -0.32| 2.772| 1.31| 8.864|
|2017-10-23T23:00:00.000+08:00| 9.176| 2.746| 7.107| 1.635| 2.65| 1.097| 9.004|
+-----------------------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
Total line number = 96
IoTDB> call inference(dlinear_example, "select s0,s1,s2,s3,s4,s5,s6 from root.eg.etth", generateTime=True, window=head(96))
+-----------------------------+-----------+----------+----------+------------+---------+----------+----------+
| Time| output0| output1| output2| output3| output4| output5| output6|
+-----------------------------+-----------+----------+----------+------------+---------+----------+----------+
|2017-10-23T23:00:00.000+08:00| 10.319546| 3.1450553| 7.877341| 1.5723765|2.7303758| 1.1362307| 8.867775|
|2017-10-24T01:00:00.000+08:00| 10.443649| 3.3286757| 7.8593454| 1.7675098| 2.560634| 1.1177158| 8.920919|
|2017-10-24T03:00:00.000+08:00| 10.883752| 3.2341104| 8.47036| 1.6116762|2.4874182| 1.1760603| 8.798939|
......
|2017-10-26T19:00:00.000+08:00| 8.0115595| 1.2995274| 6.9900327|-0.098746896| 3.04923| 1.176214| 9.548782|
|2017-10-26T21:00:00.000+08:00| 8.612427| 2.5036244| 5.6790237| 0.66474205|2.8870275| 1.2051733| 9.330128|
|2017-10-26T22:00:00.000+08:00| 10.096699| 3.399722| 6.9909| 1.7478468|2.7642853| 1.1119363| 9.541455|
+-----------------------------+-----------+----------+----------+------------+---------+----------+----------+
Total line number = 48我們將對油溫的預(yù)測的結(jié)果和真實(shí)結(jié)果進(jìn)行對比,可以得到以下的圖像。
圖中10/24 00:00之前的數(shù)據(jù)為輸入模型的過去數(shù)據(jù),10/24 00:00后的藍(lán)色線條為模型給出的油溫預(yù)測結(jié)果,而紅色為數(shù)據(jù)集中實(shí)際的油溫數(shù)據(jù)(用于進(jìn)行對比)。

可以看到,我們使用了過去96個小時(4天)的六個負(fù)載信息和對應(yīng)時間油溫的關(guān)系,基于之前學(xué)習(xí)到的序列間相互關(guān)系對未來48個小時(2天)的油溫這一數(shù)據(jù)的可能變化進(jìn)行了建模,可以看到可視化后預(yù)測曲線與實(shí)際結(jié)果在趨勢上保持了較高程度的一致性。
6.2 功率預(yù)測
變電站需要對電流、電壓、功率等數(shù)據(jù)進(jìn)行電力監(jiān)控,用于檢測潛在的電網(wǎng)問題、識別電力系統(tǒng)中的故障、有效管理電網(wǎng)負(fù)載以及分析電力系統(tǒng)的性能和趨勢等。
我們利用某變電站中的電流、電壓和功率等數(shù)據(jù)構(gòu)成了真實(shí)場景下的數(shù)據(jù)集。該數(shù)據(jù)集包括變電站近四個月時間跨度,每5 - 6s 采集一次的 A相電壓、B相電壓、C相電壓等數(shù)據(jù)。
測試集數(shù)據(jù)內(nèi)容為data。
在該數(shù)據(jù)集上,IoTDB-ML的模型推理功能可以通過以往A相電壓,B相電壓和C相電壓的數(shù)值和對應(yīng)時間戳,預(yù)測未來一段時間內(nèi)的C相電壓,賦能變電站的監(jiān)視管理。
步驟一:數(shù)據(jù)導(dǎo)入
用戶可以使用tools文件夾中的import-csv.sh 導(dǎo)入數(shù)據(jù)集
bash ./import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ../../data.csv步驟二:模型導(dǎo)入
我們可以在iotdb-cli 中選擇內(nèi)置模型或已經(jīng)注冊好的模型用于后續(xù)的推理。
我們采用內(nèi)置模型STLForecaster進(jìn)行預(yù)測,STLForecaster 是一個基于 statsmodels 庫中 STL 實(shí)現(xiàn)的時間序列預(yù)測方法。
步驟三:模型推理
IoTDB> select * from root.eg.voltage limit 96
+-----------------------------+------------------+------------------+------------------+
| Time|root.eg.voltage.s0|root.eg.voltage.s1|root.eg.voltage.s2|
+-----------------------------+------------------+------------------+------------------+
|2023-02-14T20:38:32.000+08:00| 2038.0| 2028.0| 2041.0|
|2023-02-14T20:38:38.000+08:00| 2014.0| 2005.0| 2018.0|
|2023-02-14T20:38:44.000+08:00| 2014.0| 2005.0| 2018.0|
......
|2023-02-14T20:47:52.000+08:00| 2024.0| 2016.0| 2027.0|
|2023-02-14T20:47:57.000+08:00| 2024.0| 2016.0| 2027.0|
|2023-02-14T20:48:03.000+08:00| 2024.0| 2016.0| 2027.0|
+-----------------------------+------------------+------------------+------------------+
Total line number = 96
IoTDB> call inference(_STLForecaster, "select s0,s1,s2 from root.eg.voltage", generateTime=True, window=head(96),predict_length=48)
+-----------------------------+---------+---------+---------+
| Time| output0| output1| output2|
+-----------------------------+---------+---------+---------+
|2023-02-14T20:48:03.000+08:00|2026.3601|2018.2953|2029.4257|
|2023-02-14T20:48:09.000+08:00|2019.1538|2011.4361|2022.0888|
|2023-02-14T20:48:15.000+08:00|2025.5074|2017.4522|2028.5199|
......
|2023-02-14T20:52:15.000+08:00|2022.2336|2015.0290|2025.1023|
|2023-02-14T20:52:21.000+08:00|2015.7241|2008.8975|2018.5085|
|2023-02-14T20:52:27.000+08:00|2022.0777|2014.9136|2024.9396|
|2023-02-14T20:52:33.000+08:00|2015.5682|2008.7821|2018.3458|
+-----------------------------+---------+---------+---------+
Total line number = 48我們將對C相電壓的預(yù)測的結(jié)果和真實(shí)結(jié)果進(jìn)行對比,可以得到以下的圖像。
圖中 02/14 20:48 之前的數(shù)據(jù)為輸入模型的過去數(shù)據(jù), 02/14 20:48 后的藍(lán)色線條為模型給出的C相電壓預(yù)測結(jié)果,而紅色為數(shù)據(jù)集中實(shí)際的C相電壓數(shù)據(jù)(用于進(jìn)行對比)。

可以看到,我們使用了過去10分鐘的電壓的數(shù)據(jù),基于之前學(xué)習(xí)到的序列間相互關(guān)系對未來5分鐘的C相電壓這一數(shù)據(jù)的可能變化進(jìn)行了建模,可以看到可視化后預(yù)測曲線與實(shí)際結(jié)果在趨勢上保持了一定的同步性。
6.3 異常檢測
在民航交通運(yùn)輸業(yè),存在著對乘機(jī)旅客數(shù)量進(jìn)行異常檢測的需求。異常檢測的結(jié)果可用于指導(dǎo)調(diào)整航班的調(diào)度,以使得企業(yè)獲得更大效益。
Airline Passengers一個時間序列數(shù)據(jù)集,該數(shù)據(jù)集記錄了1949年至1960年期間國際航空乘客數(shù)量,間隔一個月進(jìn)行一次采樣。該數(shù)據(jù)集共含一條時間序列。數(shù)據(jù)集為airline。
在該數(shù)據(jù)集上,IoTDB-ML的模型推理功能可以通過捕捉序列的變化規(guī)律以對序列時間點(diǎn)進(jìn)行異常檢測,賦能交通運(yùn)輸業(yè)。
步驟一:數(shù)據(jù)導(dǎo)入
用戶可以使用tools文件夾中的import-csv.sh 導(dǎo)入數(shù)據(jù)集
bash ./import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ../../data.csv步驟二:模型推理
IoTDB內(nèi)置有部分可以直接使用的機(jī)器學(xué)習(xí)算法,使用其中的異常檢測算法進(jìn)行預(yù)測的樣例如下:
IoTDB> select * from root.eg.airline
+-----------------------------+------------------+
| Time|root.eg.airline.s0|
+-----------------------------+------------------+
|1949-01-31T00:00:00.000+08:00| 224.0|
|1949-02-28T00:00:00.000+08:00| 118.0|
|1949-03-31T00:00:00.000+08:00| 132.0|
|1949-04-30T00:00:00.000+08:00| 129.0|
......
|1960-09-30T00:00:00.000+08:00| 508.0|
|1960-10-31T00:00:00.000+08:00| 461.0|
|1960-11-30T00:00:00.000+08:00| 390.0|
|1960-12-31T00:00:00.000+08:00| 432.0|
+-----------------------------+------------------+
Total line number = 144
IoTDB> call inference(_Stray, "select s0 from root.eg.airline", generateTime=True, k=2)
+-----------------------------+-------+
| Time|output0|
+-----------------------------+-------+
|1960-12-31T00:00:00.000+08:00| 0|
|1961-01-31T08:00:00.000+08:00| 0|
|1961-02-28T08:00:00.000+08:00| 0|
|1961-03-31T08:00:00.000+08:00| 0|
......
|1972-06-30T08:00:00.000+08:00| 1|
|1972-07-31T08:00:00.000+08:00| 1|
|1972-08-31T08:00:00.000+08:00| 0|
|1972-09-30T08:00:00.000+08:00| 0|
|1972-10-31T08:00:00.000+08:00| 0|
|1972-11-30T08:00:00.000+08:00| 0|
+-----------------------------+-------+
Total line number = 144我們將檢測為異常的結(jié)果進(jìn)行繪制,可以得到以下圖像。其中藍(lán)色曲線為原時間序列,用紅色點(diǎn)特殊標(biāo)注的時間點(diǎn)為算法檢測為異常的時間點(diǎn)。

可以看到,Stray模型對輸入序列變化進(jìn)行了建模,成功檢測出出現(xiàn)異常的時間點(diǎn)。