AINode is a native IoTDB node that supports the registration, management, and invocation of time series related models. It includes industry-leading self-developed time series large models, such as the Timer series models developed by Tsinghua University. Models can be invoked using standard SQL statements, enabling millisecond-level real-time inference on time series data, and supporting application scenarios such as time series trend prediction, missing value filling, and anomaly value detection.
The system architecture is shown in the following figure:
The responsibilities of the three nodes are as follows:
Compared to building a machine learning service separately, it has the following advantages:
SELECT * FROM FORECAST (...) statement, making it more simple and convenient.AINode deployment can be referred to the documentation AINode Deployment.
TimechoDB-AINode supports three major functions: model inference, model fine-tuning, and model management (registration, viewing, deletion, loading, unloading, etc.). The following sections will provide detailed explanations.
The AINode table model supports two major inference capabilities: time series prediction and time series classification.
The time series prediction capability provided by the AINode table model includes:
The following sections will detail the syntax definition, parameter descriptions, and usage examples of the prediction inference function.
SELECT * FROM FORECAST( MODEL_ID, TARGETS, -- SQL to get target variables [HISTORY_COVS, -- String, SQL to get historical covariates FUTURE_COVS, -- String, SQL to get future covariates OUTPUT_START_TIME, OUTPUT_LENGTH, OUTPUT_INTERVAL, TIMECOL, PRESERVE_INPUT, AUTO_ADAPT, -- Boolean type, indicating whether adaptive mode is enabled. MODEL_OPTIONS]? )
| Parameter Name | Parameter Type | Parameter Attributes | Description | Required | Notes |
|---|---|---|---|---|---|
| model_id | Scalar parameter | String type | Unique identifier of the prediction model | Yes | |
| targets | Table parameter | SET SEMANTIC | Input data for the target variables to be predicted. IoTDB will automatically sort the data in ascending order of time before passing it to AINode. | Yes | Use SQL to describe the input data with target variables. If the input SQL is invalid, corresponding query errors will be reported. |
| history_covs | Scalar parameter | String type (valid table model query SQL), default: none | Specifies historical data of covariates for this prediction task, which are used to assist in predicting target variables. AINode will not output prediction results for historical covariates. Before passing data to the model, AINode will automatically sort the data in ascending order of time. | No | 1. Query results can only contain FIELD columns; 2. Other: Different models may have specific requirements, and errors will be thrown if not met. |
| future_covs | Scalar parameter | String type (valid table model query SQL), default: none | Specifies future data of some covariates for this prediction task, which are used to assist in predicting target variables. Before passing data to the model, AINode will automatically sort the data in ascending order of time. | No | 1. Can only be specified when history_covs is set; 2. The covariate names involved must be a subset of history_covs; 3. Query results can only contain FIELD columns; 4. Other: Different models may have specific requirements, and errors will be thrown if not met. |
| auto_adapt | Scalar parameter | Boolean type, default value: true | Whether to enable adaptive processing for covariate inference.(Support from V2.0.8.2) | No | When adaptive mode is enabled: 1. If the set of future covariates ( future_covs) is not a subset of the historical covariates (history_covs), any future covariates not present in the historical set will be automatically discarded.2. If the length of any historical covariate does not match the length of the input target variable: a. If shorter, pad zeros at the beginning; b. If longer, discard the earliest data points. 3. If the length of any future covariate does not match the prediction length ( output_length): a. If shorter, pad zeros at the end; b. If longer, discard the most recent data points. |
| output_start_time | Scalar parameter | Timestamp type. Default value: last timestamp of target variable + output_interval | Starting timestamp of output prediction points [i.e., forecast start time] | No | Must be greater than the maximum timestamp of target variable timestamps |
| output_length | Scalar parameter | INT32 type. Default value: 96 | Output window size | No | Must be greater than 0 |
| output_interval | Scalar parameter | Time interval type. Default value: (last timestamp - first timestamp of input data) / n - 1 | Time interval between output prediction points. Supported units: ns, us, ms, s, m, h, d, w | No | Must be greater than 0 |
| timecol | Scalar parameter | String type. Default value: time | Name of time column | No | Must be a TIMESTAMP column existing in targets |
| preserve_input | Scalar parameter | Boolean type. Default value: false | Whether to retain all original rows of target variable input in the output result set | No | |
| model_options | Scalar parameter | String type. Default value: empty string | Key-value pairs related to the model, such as whether to normalize the input. Different key-value pairs are separated by ‘;’. | No |
Notes:
preserve_input=true is specified, an additional is_input column will be added to identify original data rows.OUTPUT_START_TIME (optional) as the starting time point for prediction and divides historical and future data.OUTPUT_INTERVAL (optional, default is the sampling interval of input data) as the output time interval. The timestamp of the Nth row is calculated as: OUTPUT_START_TIME + (N - 1) * OUTPUT_INTERVAL.Example 1: Univariate Prediction
Create database etth and table eg in advance
create database etth; create table eg (hufl FLOAT FIELD, hull FLOAT FIELD, mufl FLOAT FIELD, mull FLOAT FIELD, lufl FLOAT FIELD, lull FLOAT FIELD, ot FLOAT FIELD)
Prepare original data ETTh1-tab.
You can import the raw data using the import-data script. For example:
./tools/import-data.sh -ft csv -sql_dialect table -db etth -table eg -s ~/Desktop/model-compare-html/ETTh1-tab.csv
Use the first 96 rows of data from column ot in table eg to predict its future 1440 rows of data.
IoTDB:etth> select Time, HUFL,HULL,MUFL,MULL,LUFL,LULL,OT from eg LIMIT 1440 +-----------------------------+------+-----+-----+-----+-----+-----+------+ | Time| HUFL| HULL| MUFL| MULL| LUFL| LULL| OT| +-----------------------------+------+-----+-----+-----+-----+-----+------+ |2016-07-01T00:00:00.000+08:00| 5.827|2.009|1.599|0.462|4.203| 1.34|30.531| |2016-07-01T01:00:00.000+08:00| 5.693|2.076|1.492|0.426|4.142|1.371|27.787| |2016-07-01T02:00:00.000+08:00| 5.157|1.741|1.279|0.355|3.777|1.218|27.787| |2016-07-01T03:00:00.000+08:00| 5.09|1.942|1.279|0.391|3.807|1.279|25.044| ...... Total line number = 1440 It costs 0.119s IoTDB:etth> select * from forecast( model_id => 'sundial', targets => (select Time, ot from etth.eg where time >= 2016-08-07T18:00:00.000+08:00 limit 1440) order BY time, output_length => 96 ) +-----------------------------+---------+ | time| ot| +-----------------------------+---------+ |2016-10-06T18:00:00.000+08:00|20.733124| |2016-10-06T19:00:00.000+08:00|20.258146| |2016-10-06T20:00:00.000+08:00|20.022043| |2016-10-06T21:00:00.000+08:00|19.789446| ...... Total line number = 96 It costs 1.615s
Example 2: Covariate Prediction
Create table tab_real (to store original real data) in advance
create table tab_real (target1 DOUBLE FIELD, target2 DOUBLE FIELD, cov1 DOUBLE FIELD, cov2 DOUBLE FIELD, cov3 DOUBLE FIELD);
Prepare original data
-- Insert statement IoTDB:etth> INSERT INTO tab_real (time, target1, target2, cov1, cov2, cov3) VALUES (1, 1.0, 1.0, 1.0, 1.0, 1.0), (2, 2.0, 2.0, 2.0, 2.0, 2.0), (3, 3.0, 3.0, 3.0, 3.0, 3.0), (4, 4.0, 4.0, 4.0, 4.0, 4.0), (5, 5.0, 5.0, 5.0, 5.0, 5.0), (6, 6.0, 6.0, 6.0, 6.0, 6.0), (7, NULL, NULL, NULL, NULL, 7.0), (8, NULL, NULL, NULL, NULL, 8.0); IoTDB:etth> SELECT * FROM tab_real +-----------------------------+-------+-------+----+----+----+ | time|target1|target2|cov1|cov2|cov3| +-----------------------------+-------+-------+----+----+----+ |1970-01-01T08:00:00.001+08:00| 1.0| 1.0| 1.0| 1.0| 1.0| |1970-01-01T08:00:00.002+08:00| 2.0| 2.0| 2.0| 2.0| 2.0| |1970-01-01T08:00:00.003+08:00| 3.0| 3.0| 3.0| 3.0| 3.0| |1970-01-01T08:00:00.004+08:00| 4.0| 4.0| 4.0| 4.0| 4.0| |1970-01-01T08:00:00.005+08:00| 5.0| 5.0| 5.0| 5.0| 5.0| |1970-01-01T08:00:00.006+08:00| 6.0| 6.0| 6.0| 6.0| 6.0| |1970-01-01T08:00:00.007+08:00| null| null|null|null| 7.0| |1970-01-01T08:00:00.008+08:00| null| null|null|null| 8.0| +-----------------------------+-------+-------+----+----+----+
Prediction task 1: Use historical covariates cov1, cov2, and cov3 to assist in predicting target variables target1 and target2.
IoTDB:etth> SELECT * FROM FORECAST ( MODEL_ID => 'chronos2', TARGETS => ( SELECT TIME, target1, target2 FROM etth.tab_real WHERE TIME < 7 ORDER BY TIME DESC LIMIT 6) ORDER BY TIME, HISTORY_COVS => ' SELECT TIME, cov1, cov2, cov3 FROM etth.tab_real WHERE TIME < 7 ORDER BY TIME DESC LIMIT 6', OUTPUT_LENGTH => 2 ) +-----------------------------+-----------------+-----------------+ | time| target1| target2| +-----------------------------+-----------------+-----------------+ |1970-01-01T08:00:00.007+08:00|7.338330268859863|7.338330268859863| |1970-01-01T08:00:00.008+08:00| 8.02529525756836| 8.02529525756836| +-----------------------------+-----------------+-----------------+ Total line number = 2 It costs 0.315s
Prediction task 2: Use historical covariates cov1, cov2 and known covariates cov3 in the same table to assist in predicting target variables target1 and target2.
IoTDB:etth> SELECT * FROM FORECAST ( MODEL_ID => 'chronos2', TARGETS => ( SELECT TIME, target1, target2 FROM etth.tab_real WHERE TIME < 7 ORDER BY TIME DESC LIMIT 6) ORDER BY TIME, HISTORY_COVS => ' SELECT TIME, cov1, cov2, cov3 FROM etth.tab_real WHERE TIME < 7 ORDER BY TIME DESC LIMIT 6', FUTURE_COVS => ' SELECT TIME, cov3 FROM etth.tab_real WHERE TIME >= 7 LIMIT 2', OUTPUT_LENGTH => 2 ) +-----------------------------+-----------------+-----------------+ | time| target1| target2| +-----------------------------+-----------------+-----------------+ |1970-01-01T08:00:00.007+08:00|7.244050025939941|7.244050025939941| |1970-01-01T08:00:00.008+08:00|7.907227516174316|7.907227516174316| +-----------------------------+-----------------+-----------------+ Total line number = 2 It costs 0.291s
Prediction task 3: Use historical covariates cov1, cov2 from different tables and known covariates cov3 to assist in predicting target variables target1 and target2.
create table tab_cov_forecast (cov3 DOUBLE FIELD); -- Insert statement INSERT INTO tab_cov_forecast (time, cov3) VALUES (7, 7.0),(8, 8.0); IoTDB:etth> SELECT * FROM tab_cov_forecast +----+----+ |time|cov3| +----+----+ | 7| 7.0| | 8| 8.0| +----+----+
IoTDB:etth> SELECT * FROM FORECAST ( MODEL_ID => 'chronos2', TARGETS => ( SELECT TIME, target1, target2 FROM etth.tab_real WHERE TIME < 7 ORDER BY TIME DESC LIMIT 6) ORDER BY TIME, HISTORY_COVS => ' SELECT TIME, cov1, cov2, cov3 FROM etth.tab_real WHERE TIME < 7 ORDER BY TIME DESC LIMIT 6', FUTURE_COVS => ' SELECT TIME, cov3 FROM etth.tab_cov_forecast WHERE TIME >= 7 LIMIT 2', OUTPUT_LENGTH => 2 ) +-----------------------------+-----------------+-----------------+ | time| target1| target2| +-----------------------------+-----------------+-----------------+ |1970-01-01T08:00:00.007+08:00|7.244050025939941|7.244050025939941| |1970-01-01T08:00:00.008+08:00|7.907227516174316|7.907227516174316| +-----------------------------+-----------------+-----------------+ Total line number = 2 It costs 0.351s
Time series classification is a critical capability beyond time series prediction, with extensive applications in industrial scenarios. Its typical paradigm is to input the recent sampling values of multiple measuring points, comprehensively judge the overall operating status of the equipment, and output a classification label for the current status. For example, it can be used for operating status classification of new energy battery pack equipment and other scenarios.
The AINode table model supports executing time series classification tasks by calling covariate classification models.
Note: This feature is available starting from version V2.0.9.1.
SELECT * FROM CLASSIFY( MODEL_ID, INPUTS -- SQL to retrieve input variables [TIMECOL, MODEL_OPTIONS]? )
| Parameter Name | Parameter Type | Parameter Attribute | Description | Required | Remarks |
|---|---|---|---|---|---|
| model_id | Scalar Parameter | String | Unique identifier of the model used for classification | Yes | - |
| inputs | Table Parameter | SET SEMANTIC | Input data to be classified. IoTDB will automatically sort the data in ascending chronological order before passing it to AINode. | Yes | Describes the input data to be classified via SQL; corresponding query errors will be thrown if the input SQL is invalid. |
| timecol | Scalar Parameter | String, Default: time | Name of the time column | No | Must be a column of TIMESTAMP type present in the inputs result set; otherwise, an error will be thrown. |
| model_options | Scalar Parameter | String, Default: Empty string | Model-related key-value pairs (e.g., whether input normalization is required). Different key-value pairs are separated by ;. | No | Unsupported parameters for a specific model will be ignored without throwing errors. |
Specifications
Input Data Requirements
Output Result The returned result is a table composed of time series data classification results, and its schema depends on the specific implementation of the model.
Suppose a project has 10 time series variables with an input length of 192. The custom mantis_custom model is used as an example for time series classification inference.
CREATE MODEL mantis_custom USING URI 'file:///path/to/mantis'
For detailed steps to register a custom model, refer to Section 4.3.
IoTDB:etth> SELECT * FROM CLASSIFY ( MODEL_ID => 'mantis_custom', INPUTS => ( SELECT Time, HUFL,HULL,MUFL,MULL,LUFL,LULL,OT,UT,MT,LT FROM eg WHERE TIME < 2016-07-09 00:00:00 ORDER BY TIME DESC LIMIT 192) ORDER BY TIME )
+--------+ |category| +--------+ | 4| +--------+
AINode supports model fine-tuning through SQL.
SQL Syntax
createModelStatement | CREATE MODEL modelId=identifier (WITH HYPERPARAMETERS '(' hparamPair (',' hparamPair)* ')')? FROM MODEL existingModelId=identifier ON DATASET '(' targetData=string ')' ; hparamPair : hparamKey=identifier '=' hyparamValue=primaryExpression ;
Parameter Description
| Name | Description |
|---|---|
| modelId | Unique identifier of the fine-tuned model |
| hparamPair | Hyperparameter key-value pairs used for fine-tuning, currently supports the following: train_epochs: int type, number of fine-tuning epochs iter_per_epoch: int type, number of iterations per epoch learning_rate: double type, learning rate |
| existingModelId | Base model used for fine-tuning |
| targetData | SQL to get the dataset used for fine-tuning |
Example
IoTDB> set sql_dialect=table Msg: The statement is executed successfully. IoTDB> CREATE MODEL sundialv3 FROM MODEL sundial ON DATASET ('SELECT time, ot from etth.eg where 1467302400000 <= time and time < 1517468400001') Msg: The statement is executed successfully. IoTDB> show models +---------------------+---------+-----------+---------+ | ModelId|ModelType| Category| State| +---------------------+---------+-----------+---------+ | arima| sktime| builtin| active| | holtwinters| sktime| builtin| active| |exponential_smoothing| sktime| builtin| active| | naive_forecaster| sktime| builtin| active| | stl_forecaster| sktime| builtin| active| | gaussian_hmm| sktime| builtin| active| | gmm_hmm| sktime| builtin| active| | stray| sktime| builtin| active| | timer_xl| timer| builtin| active| | sundial| sundial| builtin| active| | chronos2| t5| builtin| active| | sundialv2| sundial| fine_tuned| active| | sundialv3| sundial| fine_tuned| training| +---------------------+---------+-----------+---------+
IoTDB> show models +---------------------+---------+-----------+---------+ | ModelId|ModelType| Category| State| +---------------------+---------+-----------+---------+ | arima| sktime| builtin| active| | holtwinters| sktime| builtin| active| |exponential_smoothing| sktime| builtin| active| | naive_forecaster| sktime| builtin| active| | stl_forecaster| sktime| builtin| active| | gaussian_hmm| sktime| builtin| active| | gmm_hmm| sktime| builtin| active| | stray| sktime| builtin| active| | timer_xl| timer| builtin| active| | sundial| sundial| builtin| active| | chronos2| t5| builtin| active| | sundialv2| sundial| fine_tuned| active| | sundialv3| sundial| fine_tuned| active| +---------------------+---------+-----------+---------+
The following Transformers models can be registered to AINode:
AINode currently uses transformers version 4.56.2, so when building the model, avoid inheriting interfaces from lower versions (<4.50);
The model must inherit a pipeline for inference tasks of AINode (currently supports prediction pipeline):
Before V2.0.9.3
class BasicPipeline(ABC): def __init__(self, model_id, **model_kwargs): self.model_info = model_info self.device = model_kwargs.get("device", "cpu") self.model = load_model(model_info, device_map=self.device, **model_kwargs) @abstractmethod def preprocess(self, inputs, **infer_kwargs): """ Preprocess the input data before the inference task starts, including shape validation and numerical conversion. """ pass @abstractmethod def postprocess(self, output, **infer_kwargs): """ Postprocess the output results after the inference task is completed. """ pass class ForecastPipeline(BasicPipeline): def __init__(self, model_info, **model_kwargs): super().__init__(model_info, model_kwargs=model_kwargs) def preprocess(self, inputs: list[dict[str, dict[str, torch.Tensor] | torch.Tensor]], **infer_kwargs): """ Preprocess the input data before passing it to the model for inference, validating the shape and type of the input data. Args: inputs (list[dict]): Input data, a list of dictionaries, each dictionary contains: - 'targets': Tensor with shape (input_length,) or (target_count, input_length). - 'past_covariates': Optional, dictionary of tensors, each tensor with shape (input_length,). - 'future_covariates': Optional, dictionary of tensors, each tensor with shape (input_length,). infer_kwargs (dict, optional): Additional keyword arguments for inference, such as: - `output_length`(int): Used to validate the validity of 'future_covariates' if provided. Raises: ValueError: If the input format is invalid (e.g., missing keys, invalid tensor shapes). Returns: Preprocessed and validated input data that can be directly used for model inference. """ pass def forecast(self, inputs, **infer_kwargs): """ Perform forecasting on the given inputs. Parameters: inputs: Input data for forecasting. The type and structure depend on the specific model implementation. **infer_kwargs: Additional inference parameters, e.g.: - `output_length`(int): The number of time points the model should generate. Returns: Forecast output, the specific form depends on the specific model implementation. """ pass def postprocess(self, outputs: list[torch.Tensor], **infer_kwargs) -> list[torch.Tensor]: """ Postprocess the model outputs after inference, validating the shape of the output data and ensuring it meets the expected dimensions. Args: outputs: Model outputs, a list of 2D tensors, each tensor with shape `[target_count, output_length]`. Raises: InferenceModelInternalException: If the output tensor shape is invalid (e.g., incorrect dimensions). ValueError: If the output format is incorrect. Returns: list[torch.Tensor]: Postprocessed outputs, which will be a list of 2D tensors. """ pass
From V2.0.9.3 onwards
class BasicPipeline(ABC): def __init__(self, model_id, **model_kwargs): self.model_info = model_info self.device = model_kwargs.get("device", "cpu") self.model = load_model(model_info, device_map=self.device, **model_kwargs) @abstractmethod def preprocess(self, inputs, **infer_kwargs): """ Preprocess the input data before the inference task starts, including shape validation and numerical conversion. """ pass @abstractmethod def postprocess(self, output, **infer_kwargs): """ Postprocess the output results after the inference task is completed. """ pass class ForecastPipeline(BasicPipeline): def __init__(self, model_info, **model_kwargs): super().__init__(model_info, model_kwargs=model_kwargs) def _preprocess( self, inputs: list[dict[str, dict[str, torch.Tensor] | torch.Tensor]], **infer_kwargs, ): """ Preprocess the input data before passing it to the model for inference, validating the shape and type of the input data. Args: inputs (list[dict[str, dict[str, torch.Tensor] | torch.Tensor]]): Input data, a list of dictionaries, each dictionary contains: - 'targets': Tensor with shape (input_length,) or (target_count, input_length). - 'past_covariates': Optional, dictionary of tensors, each tensor with shape (input_length,). - 'future_covariates': Optional, dictionary of tensors, each tensor with shape (input_length,). infer_kwargs (dict, optional): Additional keyword arguments for inference, such as: - `output_length`(int): Used to validate the validity of 'future_covariates' if provided. Raises: ValueError: If the input format is invalid (e.g., missing keys, invalid tensor shapes). Returns: Preprocessed and validated input data that can be directly used for model inference. """ pass def forecast(self, inputs, **infer_kwargs): """ Perform forecasting on the given inputs. Parameters: inputs: Input data for forecasting. The type and structure depend on the specific model implementation. **infer_kwargs: Additional inference parameters, e.g.: - `output_length`(int): The number of time points the model should generate. Returns: Forecast output, the specific form depends on the specific model implementation. """ pass def _postprocess(self, outputs, **infer_kwargs) -> list[torch.Tensor]: """ Postprocess the model outputs after inference, validating the shape of the output data and ensuring it meets the expected dimensions. Args: outputs: Model outputs, a list of 2D tensors, each tensor with shape `[target_count, output_length]`. Raises: InferenceModelInternalException: If the output tensor shape is invalid (e.g., incorrect dimensions). ValueError: If the output format is incorrect. Returns: list[torch.Tensor]: Postprocessed outputs, which will be a list of 2D tensors. """ pass
Modify the model configuration file config.json to ensure it contains the following fields:
Before V2.0.9.3
{ "auto_map": { "AutoConfig": "config.Chronos2CoreConfig", // Specify the model Config class "AutoModelForCausalLM": "model.Chronos2Model" // Specify the model class }, "pipeline_cls": "pipeline_chronos2.Chronos2Pipeline", // Specify the inference pipeline for the model "model_type": "custom_t5", // Specify the model type }
auto_map;model_type also serves as a unique non-duplicable identifier. That is, the model type to be registered must not duplicate any existing model types; models created via fine-tuning will inherit the model type of the original model.From V2.0.9.3 onwards
The
model_typeparameter is not required
{ "auto_map": { "AutoConfig": "config.Chronos2CoreConfig", // Specify the model Config class "AutoModelForCausalLM": "model.Chronos2Model" // Specify the model class }, "pipeline_cls": "pipeline_chronos2.Chronos2Pipeline", // Specify the inference pipeline for the model }
auto_map;Ensure the model directory to be registered contains the following files, and the model configuration file name and weight file name are not customizable:
The SQL syntax for registering custom models is as follows:
CREATE MODEL <model_id> USING URI <uri>
Parameter Description:
Registration Example:
Upload a custom Transformers model from a local path, AINode will copy the folder to the user_defined directory.
CREATE MODEL chronos2 USING URI 'file:///path/to/chronos2'
After executing the SQL, the registration process will be asynchronous. The registration status of the model can be viewed by checking the model display (see the “Viewing Models” section). After the model is registered successfully, it can be called using normal query methods for model inference.
Registered models can be queried using the view command.
SHOW MODELS
In addition to displaying all model information directly, you can specify model_id to view the information of a specific model.
SHOW MODELS <model_id> -- Only show specific model
The result of the model display contains the following:
| ModelId | ModelType | Category | State |
|---|---|---|---|
| Model ID | Model Type | Model Category | Model State |
Where, the State model status machine flowchart is as follows:
State machine flow description:
show models command, only system built-in (BUILTIN) models can be viewed.Viewing Example
IoTDB> show models +---------------------+--------------+--------------+-------------+ | ModelId| ModelType| Category| State| +---------------------+--------------+--------------+-------------+ | arima| sktime| builtin| active| | holtwinters| sktime| builtin| active| |exponential_smoothing| sktime| builtin| active| | naive_forecaster| sktime| builtin| active| | stl_forecaster| sktime| builtin| active| | gaussian_hmm| sktime| builtin| active| | gmm_hmm| sktime| builtin| active| | stray| sktime| builtin| active| | custom| | user_defined| active| | timer_xl| timer| builtin| activating| | sundial| sundial| builtin| active| | sundialx_1| sundial| fine_tuned| active| | sundialx_4| sundial| fine_tuned| training| | sundialx_5| sundial| fine_tuned| failed| | chronos2| t5| builtin| inactive| +---------------------+--------------+--------------+-------------+
Built-in Traditional Time Series Models:
| Model Name | Core Concept | Applicable Scenarios | Key Features |
|---|---|---|---|
| ARIMA (Autoregressive Integrated Moving Average) | Combines AR, differencing (I), and MA for stationary or differenced series | Univariate forecasting (stock prices, sales, economics) | 1. For linear trends with weak seasonality2. Requires (p,d,q) tuning3. Sensitive to missing values |
| Holt-Winters (Triple Exponential Smoothing) | Exponential smoothing with level, trend, and seasonal components | Data with clear trend & seasonality (monthly sales, power demand) | 1. Handles additive/multiplicative seasonality2. Weights recent data higher3. Simple implementation |
| Exponential Smoothing | Weighted average of history with exponentially decaying weights | Trending but non-seasonal data (short-term demand) | 1. Few parameters, simple computation2. Suitable for stable/slow-changing series3. Extensible to double/triple smoothing |
| Naive Forecaster | Uses last observation as next prediction (simplest baseline) | Benchmarking or data with no clear pattern | 1. No training needed2. Sensitive to sudden changes3. Seasonal variant uses prior season value |
| STL Forecaster | Decomposes series into trend, seasonal, residual; forecasts components | Complex seasonality/trends (climate, traffic) | 1. Handles non-fixed seasonality2. Robust to outliers3. Components can use other models |
| Gaussian HMM | Hidden states generate observations; each state follows Gaussian distribution | State sequence prediction/classification (speech, finance) | 1. Models temporal state transitions2. Observations independent per state3. Requires state count |
| GMM HMM | Extends Gaussian HMM; each state uses Gaussian Mixture Model | Multi-modal observation scenarios (motion recognition, biosignals) | 1. More flexible than single Gaussian2. Higher complexity3. Requires GMM component count |
| STRAY (Search for Outliers using Random Projection and Adaptive Thresholding) | Uses SVD to detect anomalies in high-dimensional time series | High-dimensional anomaly detection (sensor networks, IT monitoring) | 1. No distribution assumption2. Handles high dimensions3. Sensitive to global anomalies |
Built-in Time Series Large Models:
| Model Name | Core Concept | Applicable Scenarios | Key Features |
|---|---|---|---|
| Timer-XL | Long-context time series large model pretrained on massive industrial data | Complex industrial forecasting requiring ultra-long history (energy, aerospace, transport) | 1. Supports input of tens of thousands of time points2. Covers non-stationary, multivariate, and covariate scenarios3. Pretrained on trillion-scale high-quality industrial IoT data |
| Timer-Sundial | Generative foundation model with “Transformer + TimeFlow” architecture | Zero-shot forecasting requiring uncertainty quantification (finance, supply chain, renewable energy) | 1. Strong zero-shot generalization; supports point & probabilistic forecasting2. Flexible analysis of any prediction distribution statistic3. Innovative flow-matching architecture for efficient non-deterministic sample generation |
| Chronos-2 | Universal time series foundation model based on discrete tokenization | Rapid zero-shot univariate forecasting; scenarios enhanced by covariates (promotions, weather) | 1. Powerful zero-shot probabilistic forecasting2. Unified multi-variable & covariate modeling (strict input requirements): a. Future covariate names ⊆ historical covariate names b. Each historical covariate length = target length c. Each future covariate length = prediction length3. Efficient encoder-only structure balancing performance and speed |
Registered models can be deleted via SQL. AINode removes the corresponding model folder under user_defined. Syntax:
DROP MODEL <model_id>
model_id.DROPPING), during which the model cannot be used for inference.AINode supports two loading strategies:
Details below:
Configuration Parameters
Edit these settings to control persistent loading behavior:
# Ratio of total device memory/VRAM usable by AINode for inference # Datatype: Float ain_inference_memory_usage_ratio=0.4 # Memory overhead ratio per loaded model instance (model_size * this_value) # Datatype: Float ain_inference_extra_memory_ratio=1.2
List Available Devices
SHOW AI_DEVICES
Example:
IoTDB> SHOW AI_DEVICES +-------------+ | DeviceId| +-------------+ | cpu| | 0| | 1| +-------------+
Load Model
Manually load model; system auto-balances instance count based on resources:
LOAD MODEL <existing_model_id> TO DEVICES <device_id>(, <device_id>)*
Parameters:
existing_model_id: Model ID (current version supports timer_xl and sundial only)device_id:cpu: Load into server memorygpu_id: Load into specified GPU(s), e.g., '0,1' for GPUs 0 and 1LOAD MODEL sundial TO DEVICES 'cpu,0,1'
Unload Model
Unload all instances of a model; system reallocates freed resources:
UNLOAD MODEL <existing_model_id> FROM DEVICES <device_id>(, <device_id>)*
Parameters same as LOAD MODEL.
Example:
UNLOAD MODEL sundial FROM DEVICES 'cpu,0,1'
View Loaded Models
SHOW LOADED MODELS SHOW LOADED MODELS <device_id>(, <device_id>)* -- Filter by device
Example (sundial loaded on CPU, GPU 0, GPU 1):
IoTDB> SHOW LOADED MODELS +-------------+--------------+------------------+ | DeviceId| ModelId| Count(instances)| +-------------+--------------+------------------+ | cpu| sundial| 4| | 0| sundial| 6| | 1| sundial| 6| +-------------+--------------+------------------+
DeviceId: Device identifierModelId: Loaded model IDCount(instances): Number of model instances per device (auto-assigned by system)AINode supports multiple large time series models. For deployment details, refer to Time Series Large Model
Use IoTDB's built-in authentication for AINode permissions. Users need USE_MODEL permission to manage models and access input data for inference.
| Permission | Scope | Administrator (default ROOT) | Normal User |
|---|---|---|---|
| USE_MODEL | create model / show models / drop model | √ | √ |
| READ_SCHEMA&READ_DATA | forecast | √ | √ |