This is an automated email from the ASF dual-hosted git repository.

yongzao pushed a commit to branch cp-ain-to-206
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 97947e2ca76763f1a69e98db5387bf4b2bb0420f
Author: Yongzao <[email protected]>
AuthorDate: Tue Dec 16 13:58:24 2025 +0800

    [AINode] Fix cp errors
---
 iotdb-core/ainode/build_binary.py                  |   8 +-
 iotdb-core/ainode/iotdb/Session.py                 |  33 +--
 iotdb-core/ainode/iotdb/ainode/core/ai_node.py     |  15 +-
 iotdb-core/ainode/iotdb/ainode/core/config.py      |  77 ++++++-
 iotdb-core/ainode/iotdb/ainode/core/constant.py    |  12 +-
 iotdb-core/ainode/iotdb/ainode/core/exception.py   |   5 +-
 .../ainode/iotdb/ainode/core/ingress/iotdb.py      |  22 +-
 iotdb-core/ainode/iotdb/ainode/core/log.py         |   4 +-
 .../iotdb/ainode/core/manager/cluster_manager.py   |   7 +-
 .../iotdb/ainode/core/manager/inference_manager.py | 244 +++++++++------------
 .../iotdb/ainode/core/manager/model_manager.py     |  21 +-
 .../ainode/iotdb/ainode/core/manager/utils.py      |  33 ++-
 .../ainode/core/model/built_in_model_factory.py    |  46 ++--
 .../iotdb/ainode/core/model/model_factory.py       |   8 +-
 .../ainode/iotdb/ainode/core/model/model_info.py   |   2 +-
 .../iotdb/ainode/core/model/model_storage.py       |  16 +-
 .../ainode/core/model/sundial/modeling_sundial.py  |  11 +-
 .../ainode/core/model/timerxl/modeling_timer.py    |   6 +-
 .../ainode/iotdb/ainode/core/model/uri_utils.py    |   6 +-
 iotdb-core/ainode/iotdb/ainode/core/rpc/client.py  |  63 +++++-
 iotdb-core/ainode/iotdb/ainode/core/rpc/handler.py |  79 ++++++-
 iotdb-core/ainode/iotdb/ainode/core/rpc/service.py |  39 +++-
 iotdb-core/ainode/iotdb/ainode/core/rpc/status.py  |   6 +-
 iotdb-core/ainode/iotdb/ainode/core/script.py      |  87 ++------
 iotdb-core/ainode/iotdb/ainode/core/util/cache.py  |   2 +-
 .../ainode/iotdb/ainode/core/util/decorator.py     |  15 ++
 .../ainode/iotdb/sqlalchemy/IoTDBSQLCompiler.py    |   3 +-
 iotdb-core/ainode/iotdb/table_session_pool.py      |   2 +-
 .../ainode/iotdb/template/MeasurementNode.py       |   5 +-
 iotdb-core/ainode/iotdb/template/Template.py       |   2 +-
 .../iotdb/thrift/ainode/IAINodeRPCService-remote   |   6 +-
 .../iotdb/thrift/ainode/IAINodeRPCService.py       |  18 +-
 iotdb-core/ainode/iotdb/thrift/ainode/constants.py |  11 +-
 iotdb-core/ainode/iotdb/thrift/ainode/ttypes.py    |  13 +-
 iotdb-core/ainode/iotdb/thrift/common/constants.py |  11 +-
 iotdb-core/ainode/iotdb/thrift/common/ttypes.py    |  14 +-
 .../thrift/confignode/IConfigNodeRPCService-remote |   6 +-
 .../thrift/confignode/IConfigNodeRPCService.py     |  18 +-
 .../ainode/iotdb/thrift/confignode/constants.py    |  11 +-
 .../ainode/iotdb/thrift/confignode/ttypes.py       |  13 +-
 .../thrift/datanode/IDataNodeRPCService-remote     |   6 +-
 .../iotdb/thrift/datanode/IDataNodeRPCService.py   |  18 +-
 .../thrift/datanode/MPPDataExchangeService-remote  |   6 +-
 .../thrift/datanode/MPPDataExchangeService.py      |  18 +-
 .../ainode/iotdb/thrift/datanode/constants.py      |  11 +-
 iotdb-core/ainode/iotdb/thrift/datanode/ttypes.py  |  13 +-
 .../iotdb/thrift/rpc/IClientRPCService-remote      |   6 +-
 .../ainode/iotdb/thrift/rpc/IClientRPCService.py   |  18 +-
 iotdb-core/ainode/iotdb/thrift/rpc/constants.py    |  11 +-
 iotdb-core/ainode/iotdb/thrift/rpc/ttypes.py       |  13 +-
 .../iotdb/tsfile/utils/read_write_io_utils.py      |   2 +-
 .../ainode/iotdb/tsfile/utils/tsblock_serde.py     |   1 -
 iotdb-core/ainode/iotdb/utils/Field.py             |   8 +-
 iotdb-core/ainode/iotdb/utils/IoTDBConstants.py    |   3 +-
 iotdb-core/ainode/iotdb/utils/NumpyTablet.py       |   4 +-
 iotdb-core/ainode/iotdb/utils/SessionDataSet.py    |   6 +-
 iotdb-core/ainode/iotdb/utils/Tablet.py            |   2 +-
 iotdb-core/ainode/iotdb/utils/iotdb_rpc_dataset.py |   4 +-
 iotdb-core/ainode/pom.xml                          |  14 +-
 iotdb-core/ainode/pyproject.toml                   | 109 ++++-----
 .../InformationSchemaContentSupplierFactory.java   |   1 -
 61 files changed, 789 insertions(+), 485 deletions(-)

diff --git a/iotdb-core/ainode/build_binary.py 
b/iotdb-core/ainode/build_binary.py
index 01b0ef67e8f..6607521e152 100644
--- a/iotdb-core/ainode/build_binary.py
+++ b/iotdb-core/ainode/build_binary.py
@@ -31,7 +31,7 @@ from pathlib import Path
 def get_venv_base_dir():
     """
     Get the base directory for virtual environments outside the project.
-    
+
     Returns:
         Path: Base directory path
         - Linux/macOS: ~/.cache/iotdb-ainode-build/
@@ -51,13 +51,13 @@ def get_venv_base_dir():
 def setup_venv():
     """
     Create virtual environment outside the project directory.
-    
+
     The virtual environment is created in a platform-specific location:
     - Linux/macOS: ~/.cache/iotdb-ainode-build/<project-name>/
     - Windows: %LOCALAPPDATA%\\iotdb-ainode-build\\<project-name>\\
-    
+
     The same venv is reused across multiple builds of the same project.
-    
+
     Returns:
         Path: Path to the virtual environment directory
     """
diff --git a/iotdb-core/ainode/iotdb/Session.py 
b/iotdb-core/ainode/iotdb/Session.py
index 3f44bd41584..155c0ebe87b 100644
--- a/iotdb-core/ainode/iotdb/Session.py
+++ b/iotdb-core/ainode/iotdb/Session.py
@@ -18,46 +18,48 @@
 
 import logging
 import random
-import sys
 import struct
+import sys
 import warnings
+
 from thrift.protocol import TBinaryProtocol, TCompactProtocol
 from thrift.transport import TSocket, TTransport
 from tzlocal import get_localzone_name
 
 from iotdb.utils.SessionDataSet import SessionDataSet
+
 from .template.Template import Template
 from .template.TemplateQueryType import TemplateQueryType
 from .thrift.common.ttypes import TEndPoint
 from .thrift.rpc.IClientRPCService import (
     Client,
-    TSCreateTimeseriesReq,
+    TSAppendSchemaTemplateReq,
+    TSCloseSessionReq,
     TSCreateAlignedTimeseriesReq,
+    TSCreateMultiTimeseriesReq,
+    TSCreateSchemaTemplateReq,
+    TSCreateTimeseriesReq,
+    TSDropSchemaTemplateReq,
+    TSExecuteStatementReq,
     TSInsertRecordReq,
+    TSInsertRecordsOfOneDeviceReq,
+    TSInsertRecordsReq,
     TSInsertStringRecordReq,
     TSInsertTabletReq,
-    TSExecuteStatementReq,
-    TSOpenSessionReq,
-    TSCreateMultiTimeseriesReq,
-    TSCloseSessionReq,
     TSInsertTabletsReq,
-    TSInsertRecordsReq,
-    TSInsertRecordsOfOneDeviceReq,
-    TSCreateSchemaTemplateReq,
-    TSDropSchemaTemplateReq,
-    TSAppendSchemaTemplateReq,
+    TSOpenSessionReq,
     TSPruneSchemaTemplateReq,
+    TSQueryTemplateReq,
     TSSetSchemaTemplateReq,
     TSUnsetSchemaTemplateReq,
-    TSQueryTemplateReq,
 )
 from .thrift.rpc.ttypes import (
     TSDeleteDataReq,
+    TSInsertStringRecordsOfOneDeviceReq,
+    TSLastDataQueryReq,
     TSProtocolVersion,
-    TSSetTimeZoneReq,
     TSRawDataQueryReq,
-    TSLastDataQueryReq,
-    TSInsertStringRecordsOfOneDeviceReq,
+    TSSetTimeZoneReq,
 )
 from .tsfile.utils.date_utils import parse_date_to_int
 from .utils import rpc_utils
@@ -245,6 +247,7 @@ class Session(object):
     def __get_transport(self, endpoint):
         if self.__use_ssl:
             import ssl
+
             from thrift.transport import TSSLSocket
 
             if sys.version_info >= (3, 10):
diff --git a/iotdb-core/ainode/iotdb/ainode/core/ai_node.py 
b/iotdb-core/ainode/iotdb/ainode/core/ai_node.py
index 13ff1f485d4..438faf1e1c0 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/ai_node.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/ai_node.py
@@ -23,18 +23,19 @@ from datetime import datetime
 import psutil
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.constant import AINODE_SYSTEM_FILE_NAME
-from ainode.core.log import Logger
-from ainode.core.rpc.client import ClientManager
-from ainode.core.rpc.handler import AINodeRPCServiceHandler
-from ainode.core.rpc.service import AINodeRPCService
-from ainode.thrift.common.ttypes import (
+from iotdb.ainode.core.constant import AINODE_SYSTEM_FILE_NAME
+from iotdb.ainode.core.exception import MissingConfigError
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.rpc.client import ClientManager
+from iotdb.ainode.core.rpc.handler import AINodeRPCServiceHandler
+from iotdb.ainode.core.rpc.service import AINodeRPCService
+from iotdb.thrift.common.ttypes import (
     TAINodeConfiguration,
     TAINodeLocation,
     TEndPoint,
     TNodeResource,
 )
-from ainode.thrift.confignode.ttypes import TNodeVersionInfo
+from iotdb.thrift.confignode.ttypes import TNodeVersionInfo
 
 logger = Logger()
 
diff --git a/iotdb-core/ainode/iotdb/ainode/core/config.py 
b/iotdb-core/ainode/iotdb/ainode/core/config.py
index 43b6ce7ccda..f5021ca2c41 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/config.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/config.py
@@ -17,8 +17,9 @@
 #
 import os
 import re
+import threading
 
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     AINODE_BUILD_INFO,
     AINODE_BUILTIN_MODELS_DIR,
     AINODE_CLUSTER_INGRESS_ADDRESS,
@@ -47,9 +48,9 @@ from ainode.core.constant import (
     AINODE_VERSION_INFO,
 )
 from iotdb.ainode.core.exception import BadNodeUrlError
-from ainode.core.log import Logger
-from ainode.core.util.decorator import singleton
-from ainode.thrift.common.ttypes import TEndPoint
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.util.decorator import singleton
+from iotdb.thrift.common.ttypes import TEndPoint
 
 logger = Logger()
 
@@ -101,15 +102,37 @@ class AINodeConfig(object):
         # Whether to enable compression for thrift
         self._ain_thrift_compression_enabled = 
AINODE_THRIFT_COMPRESSION_ENABLED
 
+        # use for ssl
+        self._ain_cluster_ingress_ssl_enabled = False
+        self._ain_internal_ssl_enabled = False
+        self._ain_thrift_ssl_cert_file = None
+        self._ain_thrift_ssl_key_file = None
+
         # Cache number of model storage to avoid repeated loading
         self._ain_model_storage_cache_size = 30
 
+        # activation
+        self._ain_activated = threading.Event()
+
     def get_cluster_name(self) -> str:
         return self._cluster_name
 
     def set_cluster_name(self, cluster_name: str) -> None:
         self._cluster_name = cluster_name
 
+    def is_activated(self) -> bool:
+        return self._ain_activated.is_set()
+
+    def set_activated(self, is_activated: bool) -> None:
+        if is_activated:
+            if not self._ain_activated.is_set():
+                logger.info("TimechoDB-AINode is activated.")
+            self._ain_activated.set()
+        else:
+            if self._ain_activated.is_set():
+                logger.info("TimechoDB-AINode is deactivated.")
+            self._ain_activated.clear()
+
     def get_version_info(self) -> str:
         return self._version_info
 
@@ -218,6 +241,32 @@ class AINodeConfig(object):
     ) -> None:
         self._ain_thrift_compression_enabled = ain_thrift_compression_enabled
 
+    def get_ain_cluster_ingress_ssl_enabled(self) -> bool:
+        return self._ain_cluster_ingress_ssl_enabled
+
+    def set_ain_cluster_ingress_ssl_enabled(
+        self, ain_cluster_ingress_ssl_enabled: int
+    ) -> None:
+        self._ain_cluster_ingress_ssl_enabled = ain_cluster_ingress_ssl_enabled
+
+    def get_ain_internal_ssl_enabled(self) -> bool:
+        return self._ain_internal_ssl_enabled
+
+    def set_ain_internal_ssl_enabled(self, ain_internal_ssl_enabled: int) -> 
None:
+        self._ain_internal_ssl_enabled = ain_internal_ssl_enabled
+
+    def get_ain_thrift_ssl_cert_file(self) -> str:
+        return self._ain_thrift_ssl_cert_file
+
+    def set_ain_thrift_ssl_cert_file(self, ain_thrift_ssl_cert_file: str) -> 
None:
+        self._ain_thrift_ssl_cert_file = ain_thrift_ssl_cert_file
+
+    def get_ain_thrift_ssl_key_file(self) -> str:
+        return self._ain_thrift_ssl_key_file
+
+    def set_ain_thrift_ssl_key_file(self, ain_thrift_ssl_key_file: str) -> 
None:
+        self._ain_thrift_ssl_key_file = ain_thrift_ssl_key_file
+
     def get_ain_model_storage_cache_size(self) -> int:
         return self._ain_model_storage_cache_size
 
@@ -358,6 +407,26 @@ class AINodeDescriptor(object):
                     int(file_configs["ain_thrift_compression_enabled"])
                 )
 
+            if "ain_cluster_ingress_ssl_enabled" in config_keys:
+                self._config.set_ain_cluster_ingress_ssl_enabled(
+                    int(file_configs["ain_cluster_ingress_ssl_enabled"])
+                )
+
+            if "ain_internal_ssl_enabled" in config_keys:
+                self._config.set_ain_internal_ssl_enabled(
+                    int(file_configs["ain_internal_ssl_enabled"])
+                )
+
+            if "ain_thrift_ssl_cert_file" in config_keys:
+                self._config.set_ain_thrift_ssl_cert_file(
+                    file_configs["ain_thrift_ssl_cert_file"]
+                )
+
+            if "ain_thrift_ssl_key_file" in config_keys:
+                self._config.set_ain_thrift_ssl_key_file(
+                    file_configs["ain_thrift_ssl_key_file"]
+                )
+
             if "ain_logs_dir" in config_keys:
                 log_dir = file_configs["ain_logs_dir"]
                 self._config.set_ain_logs_dir(log_dir)
diff --git a/iotdb-core/ainode/iotdb/ainode/core/constant.py 
b/iotdb-core/ainode/iotdb/ainode/core/constant.py
index fd8f10177a9..e6b213d6a5d 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/constant.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/constant.py
@@ -15,13 +15,14 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+
 import logging
 import os
 from enum import Enum
 from typing import List
 
 from iotdb.ainode.core.model.model_enums import BuiltInModelType
-from ainode.thrift.common.ttypes import TEndPoint
+from iotdb.thrift.common.ttypes import TEndPoint
 
 IOTDB_AINODE_HOME = os.getenv("IOTDB_AINODE_HOME", "")
 AINODE_VERSION_INFO = "UNKNOWN"
@@ -40,7 +41,7 @@ AINODE_RPC_PORT = 10810
 AINODE_CLUSTER_INGRESS_ADDRESS = "127.0.0.1"
 AINODE_CLUSTER_INGRESS_PORT = 6667
 AINODE_CLUSTER_INGRESS_USERNAME = "root"
-AINODE_CLUSTER_INGRESS_PASSWORD = "root"
+AINODE_CLUSTER_INGRESS_PASSWORD = "TimechoDB@2021"
 AINODE_CLUSTER_INGRESS_TIME_ZONE = "UTC+8"
 
 # RPC config
@@ -76,6 +77,9 @@ DEFAULT_LOG_LEVEL = logging.INFO
 INFERENCE_LOG_FILE_NAME_PREFIX_TEMPLATE = (
     "log_inference_rank_{}_"  # example: log_inference_rank_0_all.log
 )
+TRAINING_LOG_FILE_NAME_PREFIX_TEMPLATE = (
+    "log_training_rank_{}_"  # example: log_training_rank_0_all.log
+)
 
 # AINode model management
 MODEL_WEIGHTS_FILE_IN_SAFETENSORS = "model.safetensors"
@@ -96,6 +100,10 @@ class TSStatusCode(Enum):
     INVALID_INFERENCE_CONFIG = 1512
     INFERENCE_INTERNAL_ERROR = 1520
 
+    # Training status codes
+    INVALID_TRAINING_CONFIG = 1550
+    TRAINING_INTERNAL_ERROR = 1551
+
     def get_status_code(self) -> int:
         return self.value
 
diff --git a/iotdb-core/ainode/iotdb/ainode/core/exception.py 
b/iotdb-core/ainode/iotdb/ainode/core/exception.py
index f00900e8d01..bc89cdc3066 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/exception.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/exception.py
@@ -17,7 +17,10 @@
 #
 import re
 
-from ainode.core.constant import MODEL_CONFIG_FILE_IN_YAML, 
MODEL_WEIGHTS_FILE_IN_PT
+from iotdb.ainode.core.constant import (
+    MODEL_CONFIG_FILE_IN_YAML,
+    MODEL_WEIGHTS_FILE_IN_PT,
+)
 
 
 class _BaseError(Exception):
diff --git a/iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.py 
b/iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.py
index 792d64b2980..13c56ca9d2d 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/ingress/iotdb.py
@@ -17,17 +17,17 @@
 #
 import numpy as np
 import torch
+from torch.utils.data import Dataset
+
+from iotdb.ainode.core.config import AINodeDescriptor
+from iotdb.ainode.core.ingress.dataset import BasicDatabaseForecastDataset
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.util.cache import MemoryLRUCache
+from iotdb.ainode.core.util.decorator import singleton
 from iotdb.Session import Session
 from iotdb.table_session import TableSession, TableSessionConfig
 from iotdb.utils.Field import Field
 from iotdb.utils.IoTDBConstants import TSDataType
-from torch.utils.data import Dataset
-
-from iotdb.ainode.core.config import AINodeDescriptor
-from iotdb.ainode.core.ingress import BasicDatabaseForecastDataset
-from ainode.core.log import Logger
-from ainode.core.util.cache import MemoryLRUCache
-from ainode.core.util.decorator import singleton
 
 logger = Logger()
 
@@ -91,6 +91,10 @@ class IoTDBTreeModelDataset(BasicDatabaseForecastDataset):
             user=username,
             password=password,
             zone_id=time_zone,
+            use_ssl=AINodeDescriptor()
+            .get_config()
+            .get_ain_cluster_ingress_ssl_enabled(),
+            
ca_certs=AINodeDescriptor().get_config().get_ain_thrift_ssl_cert_file(),
         )
         self.session.open(False)
         self.use_rate = use_rate
@@ -269,6 +273,10 @@ class IoTDBTableModelDataset(BasicDatabaseForecastDataset):
             username=username,
             password=password,
             time_zone=time_zone,
+            use_ssl=AINodeDescriptor()
+            .get_config()
+            .get_ain_cluster_ingress_ssl_enabled(),
+            
ca_certs=AINodeDescriptor().get_config().get_ain_thrift_ssl_cert_file(),
         )
         self.session = TableSession(table_session_config)
         self.use_rate = use_rate
diff --git a/iotdb-core/ainode/iotdb/ainode/core/log.py 
b/iotdb-core/ainode/iotdb/ainode/core/log.py
index 947fe820c30..fd121b26349 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/log.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/log.py
@@ -26,14 +26,14 @@ import sys
 import threading
 from logging.handlers import TimedRotatingFileHandler
 
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     AINODE_LOG_DIR,
     AINODE_LOG_FILE_LEVELS,
     AINODE_LOG_FILE_NAME_PREFIX,
     DEFAULT_LOG_LEVEL,
     LOG_FILE_TYPE,
 )
-from ainode.core.util.decorator import singleton
+from iotdb.ainode.core.util.decorator import singleton
 
 
 class BaseLogger:
diff --git a/iotdb-core/ainode/iotdb/ainode/core/manager/cluster_manager.py 
b/iotdb-core/ainode/iotdb/ainode/core/manager/cluster_manager.py
index b7d65f47dc1..8b8731cb92f 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/manager/cluster_manager.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/manager/cluster_manager.py
@@ -17,8 +17,8 @@
 #
 import psutil
 
-from ainode.thrift.ainode.ttypes import TAIHeartbeatReq, TAIHeartbeatResp
-from ainode.thrift.common.ttypes import TLoadSample
+from iotdb.thrift.ainode.ttypes import TAIHeartbeatReq, TAIHeartbeatResp
+from iotdb.thrift.common.ttypes import TLoadSample
 
 
 class ClusterManager:
@@ -42,5 +42,6 @@ class ClusterManager:
             )
         else:
             return TAIHeartbeatResp(
-                heartbeatTimestamp=req.heartbeatTimestamp, status="Running"
+                heartbeatTimestamp=req.heartbeatTimestamp,
+                status="Running",
             )
diff --git a/iotdb-core/ainode/iotdb/ainode/core/manager/inference_manager.py 
b/iotdb-core/ainode/iotdb/ainode/core/manager/inference_manager.py
index 65f4abacfca..a67d576b0ec 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/manager/inference_manager.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/manager/inference_manager.py
@@ -15,54 +15,58 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+
 import threading
 import time
 from abc import ABC, abstractmethod
-from typing import Dict, List
+from typing import Dict
 
 import pandas as pd
 import torch
 import torch.multiprocessing as mp
-from iotdb.tsfile.utils.tsblock_serde import deserialize
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.constant import TSStatusCode
+from iotdb.ainode.core.constant import TSStatusCode
 from iotdb.ainode.core.exception import (
     InferenceModelInternalError,
     InvalidWindowArgumentError,
     NumericalRangeException,
     runtime_error_extractor,
 )
-from ainode.core.inference.inference_request import (
+from iotdb.ainode.core.inference.inference_request import (
     InferenceRequest,
     InferenceRequestProxy,
 )
-from iotdb.ainode.core.inference.inference_request_pool import 
InferenceRequestPool
-from iotdb.ainode.core.inference.strategy import (
+from iotdb.ainode.core.inference.pool_controller import PoolController
+from iotdb.ainode.core.inference.strategy.timer_sundial_inference_pipeline 
import (
     TimerSundialInferencePipeline,
 )
-from iotdb.ainode.core.inference.strategy import (
+from iotdb.ainode.core.inference.strategy.timerxl_inference_pipeline import (
     TimerXLInferencePipeline,
 )
-from ainode.core.inference.utils import generate_req_id
-from ainode.core.log import Logger
-from ainode.core.manager.model_manager import ModelManager
-from ainode.core.manager.utils import (
-    _estimate_pool_size,
-    _measure_model_memory,
-)
-from ainode.core.model.sundial.configuration_sundial import SundialConfig
-from ainode.core.model.sundial.modeling_sundial import SundialForPrediction
-from ainode.core.model.timerxl.configuration_timer import TimerConfig
+from iotdb.ainode.core.inference.utils import generate_req_id
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.manager.model_manager import ModelManager
+from iotdb.ainode.core.model.model_enums import BuiltInModelType
+from iotdb.ainode.core.model.sundial.configuration_sundial import SundialConfig
+from iotdb.ainode.core.model.sundial.modeling_sundial import 
SundialForPrediction
+from iotdb.ainode.core.model.timerxl.configuration_timer import TimerConfig
 from iotdb.ainode.core.model.timerxl.modeling_timer import TimerForPrediction
-from ainode.core.rpc.status import get_status
+from iotdb.ainode.core.rpc.status import get_status
+from iotdb.ainode.core.util.gpu_mapping import get_available_devices
 from iotdb.ainode.core.util.serde import convert_to_binary
-from ainode.thrift.ainode.ttypes import (
+from iotdb.thrift.ainode.ttypes import (
     TForecastReq,
     TForecastResp,
     TInferenceReq,
     TInferenceResp,
+    TLoadModelReq,
+    TShowLoadedModelsReq,
+    TShowLoadedModelsResp,
+    TUnloadModelReq,
 )
+from iotdb.thrift.common.ttypes import TSStatus
+from iotdb.tsfile.utils.tsblock_serde import deserialize
 
 logger = Logger()
 
@@ -145,95 +149,79 @@ class RegisteredStrategy(InferenceStrategy):
 
 
 class InferenceManager:
-    ACCELERATE_MODEL_ID = ["sundial", "timer_xl"]
-    DEFAULT_DEVICE = "cpu"
-    # DEFAULT_DEVICE = torch.device("cuda" if torch.cuda.is_available() else 
"cpu")
     WAITING_INTERVAL_IN_MS = (
         
AINodeDescriptor().get_config().get_ain_inference_batch_interval_in_ms()
     )  # How often to check for requests in the result queue
 
     def __init__(self):
         self._model_manager = ModelManager()
+        self._model_mem_usage_map: Dict[str, int] = (
+            {}
+        )  # store model memory usage for each model
         self._result_queue = mp.Queue()
         self._result_wrapper_map = {}
         self._result_wrapper_lock = threading.RLock()
-        # structure: {model_id: [(InferenceRequestPool, request_queue), ...]}
-        self._request_pool_map: Dict[str, List[(InferenceRequestPool, 
mp.Queue)]] = {}
+
         self._stop_event = mp.Event()
         self._result_handler_thread = threading.Thread(
             target=self._handle_results, daemon=True
         )
         self._result_handler_thread.start()
-        self._model_mem_usage_map: Dict[str, int] = (
-            {}
-        )  # store model memory usage for each model
-        # self._preload_model_benchmarks()
-
-    def _preload_model_benchmarks(self):
-        if "cuda" in str(self.DEFAULT_DEVICE):
-            for model_id in self.ACCELERATE_MODEL_ID:
-                mem_usage = _measure_model_memory(self.DEFAULT_DEVICE, 
model_id)
-                self._model_mem_usage_map[model_id] = mem_usage
-                logger.info(
-                    f"[Inference] Preloaded benchmark for {model_id}, 
mem_usage={mem_usage/1024**2:.2f} MB"
-                )
-        else:
-            logger.warning(
-                f"[Inference] Skipped preloading benchmarks for 
{self.DEFAULT_DEVICE}, only supports CUDA currently"
+        self._pool_controller = PoolController(self._result_queue)
+
+    def load_model(self, req: TLoadModelReq) -> TSStatus:
+        devices_to_be_processed = []
+        devices_not_to_be_processed = []
+        for device_id in req.deviceIdList:
+            if self._pool_controller.has_request_pools(
+                model_id=req.existingModelId, device_id=device_id
+            ):
+                devices_not_to_be_processed.append(device_id)
+            else:
+                devices_to_be_processed.append(device_id)
+        if len(devices_to_be_processed) > 0:
+            self._pool_controller.load_model(
+                model_id=req.existingModelId, 
device_id_list=devices_to_be_processed
             )
-
-    def _first_pool_init(self, model_id: str):
-        if model_id == "sundial":
-            config = SundialConfig()
-        elif model_id == "timer_xl":
-            config = TimerConfig()
-        first_queue = mp.Queue()
-        ready_event = mp.Event()
-        first_pool = InferenceRequestPool(
-            pool_id=0,
-            model_id=model_id,
-            config=config,
-            request_queue=first_queue,
-            result_queue=self._result_queue,
-            ready_event=ready_event,
+        logger.info(
+            f"[Inference] Start loading model [{req.existingModelId}] to 
devices [{devices_to_be_processed}], skipped devices 
[{devices_not_to_be_processed}] cause they have already loaded this model."
+        )
+        return TSStatus(
+            code=TSStatusCode.SUCCESS_STATUS.value,
+            message='Successfully submitted load model task, please use "SHOW 
LOADED MODELS" to check progress.',
         )
-        first_pool.start()
-        if not ready_event.wait(timeout=30):
-            logger.error(
-                f"[Inference][Device-{self.DEFAULT_DEVICE}][Pool-0] First pool 
failed to be ready in time"
-            )
-        else:
-            self._request_pool_map[model_id] = [(first_pool, first_queue)]
-            logger.info(
-                f"[Inference][Device-{self.DEFAULT_DEVICE}][Pool-0] 
Initialized inference request pool for model {model_id}"
-            )
 
-    def _expand_pools(self, model_id, start_idx, count):
-        for idx in range(count):
-            queue = mp.Queue()
-            if model_id == "sundial":
-                config = SundialConfig()
-            elif model_id == "timer_xl":
-                config = TimerConfig()
-            pool = InferenceRequestPool(
-                pool_id=start_idx + idx,
-                model_id=model_id,
-                config=config,
-                request_queue=queue,
-                result_queue=self._result_queue,
-                ready_event=mp.Event(),
-            )
-            pool.start()
-            if not pool.ready_event.wait(timeout=30):
-                logger.error(
-                    
f"[Inference][Device-{self.DEFAULT_DEVICE}][Pool-{start_idx + idx}] Pool failed 
to be ready in time"
-                )
-                continue
+    def unload_model(self, req: TUnloadModelReq) -> TSStatus:
+        devices_to_be_processed = []
+        devices_not_to_be_processed = []
+        for device_id in req.deviceIdList:
+            if self._pool_controller.has_request_pools(
+                model_id=req.modelId, device_id=device_id
+            ):
+                devices_to_be_processed.append(device_id)
             else:
-                self._request_pool_map[model_id].append((pool, queue))
-                logger.info(
-                    
f"[Inference][Device-{self.DEFAULT_DEVICE}][Pool-{pool.pool_id}] New inference 
request pool started for model {model_id}"
-                )
+                devices_not_to_be_processed.append(device_id)
+        if len(devices_to_be_processed) > 0:
+            self._pool_controller.unload_model(
+                model_id=req.modelId, device_id_list=req.deviceIdList
+            )
+        logger.info(
+            f"[Inference] Start unloading model [{req.modelId}] from devices 
[{devices_to_be_processed}], skipped devices [{devices_not_to_be_processed}] 
cause they haven't loaded this model."
+        )
+        return TSStatus(
+            code=TSStatusCode.SUCCESS_STATUS.value,
+            message='Successfully submitted unload model task, please use 
"SHOW LOADED MODELS" to check progress.',
+        )
+
+    def show_loaded_models(self, req: TShowLoadedModelsReq) -> 
TShowLoadedModelsResp:
+        return TShowLoadedModelsResp(
+            status=get_status(TSStatusCode.SUCCESS_STATUS),
+            deviceLoadedModelsMap=self._pool_controller.show_loaded_models(
+                req.deviceIdList
+                if len(req.deviceIdList) > 0
+                else get_available_devices()
+            ),
+        )
 
     def _handle_results(self):
         while not self._stop_event.is_set():
@@ -246,12 +234,29 @@ class InferenceManager:
                     infer_req.get_final_output()
                 )
 
+    def _process_request(self, req):
+        req_id = req.req_id
+        infer_proxy = InferenceRequestProxy(req_id)
+        with self._result_wrapper_lock:
+            self._result_wrapper_map[req_id] = infer_proxy
+        try:
+            # dispatch request to the pool
+            self._pool_controller.add_request(req, infer_proxy)
+            outputs = infer_proxy.wait_for_result()
+            return outputs
+        except Exception as e:
+            logger.error(e)
+            raise InferenceModelInternalError(str(e))
+        finally:
+            with self._result_wrapper_lock:
+                del self._result_wrapper_map[req_id]
+
     def _get_strategy(self, model_id, model):
         if isinstance(model, TimerForPrediction):
             return TimerXLStrategy(model)
         if isinstance(model, SundialForPrediction):
             return SundialStrategy(model)
-        if 
self._model_manager.model_storage._is_built_in_or_fine_tuned(model_id):
+        if 
self._model_manager.model_storage.is_built_in_or_fine_tuned(model_id):
             return BuiltInStrategy(model)
         return RegisteredStrategy(model)
 
@@ -284,26 +289,8 @@ class InferenceManager:
                     predict_length,
                 )
 
-            if model_id in self.ACCELERATE_MODEL_ID and "cuda" in str(
-                self.DEFAULT_DEVICE
-            ):
-                # lazy initialization for first request
-                if model_id not in self._request_pool_map:
-                    pool_num = _estimate_pool_size(self.DEFAULT_DEVICE, 
model_id)
-                    if pool_num <= 0:
-                        raise InferenceModelInternalError(
-                            f"Not enough memory to run model {model_id}."
-                        )
-                    # initialize the first pool
-                    self._first_pool_init(model_id)
-                    # start a background thread to expand pools
-                    expand_thread = threading.Thread(
-                        target=self._expand_pools,
-                        args=(model_id, 1, pool_num - 1),
-                        daemon=True,
-                    )
-                    expand_thread.start()
-                # TODO: Logic in this branch shall handle all LTSM inferences
+            if self._pool_controller.has_request_pools(model_id):
+                # use request pool to accelerate inference when the model 
instance is already loaded.
                 # TODO: TSBlock -> Tensor codes should be unified
                 data = full_data[1][0]
                 if data.dtype.byteorder not in ("=", "|"):
@@ -311,30 +298,24 @@ class InferenceManager:
                     data = np_data.view(np_data.dtype.newbyteorder())
                 # the inputs should be on CPU before passing to the inference 
request
                 inputs = torch.tensor(data).unsqueeze(0).float().to("cpu")
-                if model_id == "sundial":
+                model_type = 
self._model_manager.get_model_info(model_id).model_type
+                if model_type == BuiltInModelType.SUNDIAL.value:
                     inference_pipeline = 
TimerSundialInferencePipeline(SundialConfig())
-                elif model_id == "timer_xl":
+                elif model_type == BuiltInModelType.TIMER_XL.value:
                     inference_pipeline = 
TimerXLInferencePipeline(TimerConfig())
+                else:
+                    raise InferenceModelInternalError(
+                        f"Unsupported model_id: {model_id}"
+                    )
                 infer_req = InferenceRequest(
                     req_id=generate_req_id(),
+                    model_id=model_id,
                     inputs=inputs,
                     inference_pipeline=inference_pipeline,
                     max_new_tokens=predict_length,
                 )
-                infer_proxy = InferenceRequestProxy(infer_req.req_id)
-                with self._result_wrapper_lock:
-                    self._result_wrapper_map[infer_req.req_id] = infer_proxy
-                pool_idx = hash(infer_req.req_id) % len(
-                    self._request_pool_map[model_id]
-                )
-                self._request_pool_map[model_id][pool_idx][1].put(infer_req)
-                logger.debug(
-                    
f"[Inference][Device-{self.DEFAULT_DEVICE}][Pool-{pool_idx}][ID-{infer_req.req_id}]
 Request is queued for inference"
-                )
-                outputs = infer_proxy.wait_for_completion()
+                outputs = self._process_request(infer_req)
                 outputs = convert_to_binary(pd.DataFrame(outputs[0]))
-                with self._result_wrapper_lock:
-                    del self._result_wrapper_map[infer_req.req_id]
             else:
                 # load model
                 accel = str(inference_attrs.get("acceleration", "")).lower() 
== "true"
@@ -385,16 +366,9 @@ class InferenceManager:
             single_output=False,
         )
 
-    def shutdown(self):
+    def stop(self):
         self._stop_event.set()
-        for model_id, pools in self._request_pool_map.items():
-            for requestPool, requestQueue in pools:
-                requestPool.stop()
-                while not requestQueue.empty():
-                    requestQueue.get_nowait()
-                requestQueue.close()
-            for requestPool, _ in pools:
-                requestPool.join(timeout=10)
+        self._pool_controller.stop()
         while not self._result_queue.empty():
             self._result_queue.get_nowait()
         self._result_queue.close()
diff --git a/iotdb-core/ainode/iotdb/ainode/core/manager/model_manager.py 
b/iotdb-core/ainode/iotdb/ainode/core/manager/model_manager.py
index 086ab69a465..d84bca77c84 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/manager/model_manager.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/manager/model_manager.py
@@ -20,25 +20,22 @@ from typing import Callable, Dict
 from torch import nn
 from yaml import YAMLError
 
-from ainode.core.constant import TSStatusCode
-from iotdb.ainode.core.exception import (
-    BadConfigValueError,
-    InvalidUriError,
-)
-from ainode.core.log import Logger
+from iotdb.ainode.core.constant import TSStatusCode
+from iotdb.ainode.core.exception import BadConfigValueError, InvalidUriError
+from iotdb.ainode.core.log import Logger
 from iotdb.ainode.core.model.model_enums import BuiltInModelType, ModelStates
-from ainode.core.model.model_info import ModelInfo
-from ainode.core.model.model_storage import ModelStorage
-from ainode.core.rpc.status import get_status
-from ainode.core.util.decorator import singleton
-from ainode.thrift.ainode.ttypes import (
+from iotdb.ainode.core.model.model_info import ModelInfo
+from iotdb.ainode.core.model.model_storage import ModelStorage
+from iotdb.ainode.core.rpc.status import get_status
+from iotdb.ainode.core.util.decorator import singleton
+from iotdb.thrift.ainode.ttypes import (
     TDeleteModelReq,
     TRegisterModelReq,
     TRegisterModelResp,
     TShowModelsReq,
     TShowModelsResp,
 )
-from ainode.thrift.common.ttypes import TSStatus
+from iotdb.thrift.common.ttypes import TSStatus
 
 logger = Logger()
 
diff --git a/iotdb-core/ainode/iotdb/ainode/core/manager/utils.py 
b/iotdb-core/ainode/iotdb/ainode/core/manager/utils.py
index 65106e08e08..0264e27331a 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/manager/utils.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/manager/utils.py
@@ -22,9 +22,10 @@ import psutil
 import torch
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.log import Logger
-from ainode.core.manager.model_manager import ModelManager
-from ainode.core.model.model_info import BUILT_IN_LTSM_MAP
+from iotdb.ainode.core.exception import ModelNotExistError
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.manager.model_manager import ModelManager
+from iotdb.ainode.core.model.model_info import BUILT_IN_LTSM_MAP
 
 logger = Logger()
 
@@ -39,7 +40,7 @@ INFERENCE_EXTRA_MEMORY_RATIO = (
 )  # the overhead ratio for inference, used to estimate the pool size
 
 
-def _measure_model_memory(device: torch.device, model_id: str) -> int:
+def measure_model_memory(device: torch.device, model_id: str) -> int:
     # TODO: support CPU in the future
     # TODO: we can estimate the memory usage by running a dummy inference
     torch.cuda.empty_cache()
@@ -62,7 +63,7 @@ def _measure_model_memory(device: torch.device, model_id: 
str) -> int:
     return final
 
 
-def _evaluate_system_resources(device: torch.device) -> dict:
+def evaluate_system_resources(device: torch.device) -> dict:
     if torch.cuda.is_available():
         free_mem, total_mem = torch.cuda.mem_get_info()
         logger.info(
@@ -70,7 +71,6 @@ def _evaluate_system_resources(device: torch.device) -> dict:
         )
         return {"device": "cuda", "free_mem": free_mem, "total_mem": total_mem}
     else:
-        # TODO: test cpu in the future
         free_mem = psutil.virtual_memory().available
         total_mem = psutil.virtual_memory().total
         logger.info(
@@ -79,21 +79,20 @@ def _evaluate_system_resources(device: torch.device) -> 
dict:
         return {"device": "cpu", "free_mem": free_mem, "total_mem": total_mem}
 
 
-def _estimate_pool_size(device: torch.device, model_id: str) -> int:
+def estimate_pool_size(device: torch.device, model_id: str) -> int:
     model_info = BUILT_IN_LTSM_MAP.get(model_id, None)
-    if model_info is None:
-        logger.error(f"[Inference][Device-{device}] Model {model_id} not 
found")
-        return 0
-
-    model_type = model_info.model_type
-    if model_type not in MODEL_MEM_USAGE_MAP:
-        logger.error(f"[Inference][Device-{device}] Model {model_id} not 
supported now")
-        return 0
+    if model_info is None or model_info.model_type not in MODEL_MEM_USAGE_MAP:
+        logger.error(
+            f"[Inference] Cannot estimate inference pool size on device: 
{device}, because model: {model_id} is not supported."
+        )
+        raise ModelNotExistError(model_id)
 
-    system_res = _evaluate_system_resources(device)
+    system_res = evaluate_system_resources(device)
     free_mem = system_res["free_mem"]
 
-    mem_usage = MODEL_MEM_USAGE_MAP[model_type] * INFERENCE_EXTRA_MEMORY_RATIO
+    mem_usage = (
+        MODEL_MEM_USAGE_MAP[model_info.model_type] * 
INFERENCE_EXTRA_MEMORY_RATIO
+    )
     size = int((free_mem * INFERENCE_MEMORY_USAGE_RATIO) // mem_usage)
     if size <= 0:
         logger.error(
diff --git 
a/iotdb-core/ainode/iotdb/ainode/core/model/built_in_model_factory.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/built_in_model_factory.py
index a95af34990b..3b55142350b 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/built_in_model_factory.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/built_in_model_factory.py
@@ -30,7 +30,7 @@ from sktime.forecasting.naive import NaiveForecaster
 from sktime.forecasting.trend import STLForecaster
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     MODEL_CONFIG_FILE_IN_JSON,
     MODEL_WEIGHTS_FILE_IN_SAFETENSORS,
     AttributeName,
@@ -43,21 +43,21 @@ from iotdb.ainode.core.exception import (
     StringRangeException,
     WrongAttributeTypeError,
 )
-from ainode.core.log import Logger
+from iotdb.ainode.core.log import Logger
 from iotdb.ainode.core.model.model_enums import BuiltInModelType
-from ainode.core.model.model_info import TIMER_REPO_ID
-from ainode.core.model.sundial import modeling_sundial
+from iotdb.ainode.core.model.model_info import TIMER_REPO_ID
+from iotdb.ainode.core.model.sundial import modeling_sundial
 from iotdb.ainode.core.model.timerxl import modeling_timer
 
 logger = Logger()
 
 
-def _download_file_from_hf_if_necessary(
-    file_path: str, local_dir: str, repo_id: str
-) -> bool:
-    if not os.path.exists(file_path):
+def _download_file_from_hf_if_necessary(local_dir: str, repo_id: str) -> bool:
+    weights_path = os.path.join(local_dir, MODEL_WEIGHTS_FILE_IN_SAFETENSORS)
+    config_path = os.path.join(local_dir, MODEL_CONFIG_FILE_IN_JSON)
+    if not os.path.exists(weights_path):
         logger.info(
-            f"Model file not found at {file_path}, downloading from 
HuggingFace..."
+            f"Model weights file not found at {weights_path}, downloading from 
HuggingFace..."
         )
         try:
             hf_hub_download(
@@ -65,9 +65,27 @@ def _download_file_from_hf_if_necessary(
                 filename=MODEL_WEIGHTS_FILE_IN_SAFETENSORS,
                 local_dir=local_dir,
             )
-            logger.info(f"Got file to {file_path}")
+            logger.info(f"Got file to {weights_path}")
         except Exception as e:
-            logger.error(f"Failed to download model file to {local_dir} due to 
{e}")
+            logger.error(
+                f"Failed to download model weights file to {local_dir} due to 
{e}"
+            )
+            return False
+    if not os.path.exists(config_path):
+        logger.info(
+            f"Model config file not found at {config_path}, downloading from 
HuggingFace..."
+        )
+        try:
+            hf_hub_download(
+                repo_id=repo_id,
+                filename=MODEL_CONFIG_FILE_IN_JSON,
+                local_dir=local_dir,
+            )
+            logger.info(f"Got file to {config_path}")
+        except Exception as e:
+            logger.error(
+                f"Failed to download model config file to {local_dir} due to 
{e}"
+            )
             return False
     return True
 
@@ -82,11 +100,7 @@ def download_built_in_ltsm_from_hf_if_necessary(
         bool: True if the model is existed or downloaded successfully, False 
otherwise.
     """
     repo_id = TIMER_REPO_ID[model_type]
-    weights_path = os.path.join(local_dir, MODEL_WEIGHTS_FILE_IN_SAFETENSORS)
-    if not _download_file_from_hf_if_necessary(weights_path, local_dir, 
repo_id):
-        return False
-    config_path = os.path.join(local_dir, MODEL_CONFIG_FILE_IN_JSON)
-    if not _download_file_from_hf_if_necessary(config_path, local_dir, 
repo_id):
+    if not _download_file_from_hf_if_necessary(local_dir, repo_id):
         return False
     return True
 
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/model_factory.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/model_factory.py
index c90222108ad..26d863156f3 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/model_factory.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/model_factory.py
@@ -22,20 +22,20 @@ from urllib.parse import urljoin
 
 import yaml
 
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     MODEL_CONFIG_FILE_IN_YAML,
     MODEL_WEIGHTS_FILE_IN_PT,
 )
 from iotdb.ainode.core.exception import BadConfigValueError, InvalidUriError
-from ainode.core.log import Logger
+from iotdb.ainode.core.log import Logger
 from iotdb.ainode.core.model.model_enums import ModelFileType
-from ainode.core.model.uri_utils import (
+from iotdb.ainode.core.model.uri_utils import (
     UriType,
     download_file,
     download_snapshot_from_hf,
 )
 from iotdb.ainode.core.util.serde import get_data_type_byte_from_str
-from ainode.thrift.ainode.ttypes import TConfigs
+from iotdb.thrift.ainode.ttypes import TConfigs
 
 logger = Logger()
 
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/model_info.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/model_info.py
index 7cf15e68225..167bfd76640 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/model_info.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/model_info.py
@@ -18,7 +18,7 @@
 import glob
 import os
 
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     MODEL_CONFIG_FILE_IN_JSON,
     MODEL_CONFIG_FILE_IN_YAML,
     MODEL_WEIGHTS_FILE_IN_PT,
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/model_storage.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/model_storage.py
index 1f23c57ff64..e346f569102 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/model_storage.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/model_storage.py
@@ -27,7 +27,7 @@ import torch
 from torch import nn
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     MODEL_CONFIG_FILE_IN_JSON,
     MODEL_WEIGHTS_FILE_IN_PT,
     TSStatusCode,
@@ -37,8 +37,8 @@ from iotdb.ainode.core.exception import (
     ModelNotExistError,
     UnsupportedError,
 )
-from ainode.core.log import Logger
-from ainode.core.model.built_in_model_factory import (
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.model.built_in_model_factory import (
     download_built_in_ltsm_from_hf_if_necessary,
     fetch_built_in_model,
 )
@@ -49,17 +49,17 @@ from iotdb.ainode.core.model.model_enums import (
     ModelStates,
 )
 from iotdb.ainode.core.model.model_factory import fetch_model_by_uri
-from ainode.core.model.model_info import (
+from iotdb.ainode.core.model.model_info import (
     BUILT_IN_LTSM_MAP,
     BUILT_IN_MACHINE_LEARNING_MODEL_MAP,
     ModelInfo,
     get_built_in_model_type,
     get_model_file_type,
 )
-from ainode.core.model.uri_utils import get_model_register_strategy
-from ainode.core.util.lock import ModelLockPool
-from ainode.thrift.ainode.ttypes import TShowModelsReq, TShowModelsResp
-from ainode.thrift.common.ttypes import TSStatus
+from iotdb.ainode.core.model.uri_utils import get_model_register_strategy
+from iotdb.ainode.core.util.lock import ModelLockPool
+from iotdb.thrift.ainode.ttypes import TShowModelsReq, TShowModelsResp
+from iotdb.thrift.common.ttypes import TSStatus
 
 logger = Logger()
 
diff --git 
a/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py
index 6a2402952db..27ca3f1564e 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/sundial/modeling_sundial.py
@@ -29,9 +29,9 @@ from transformers.modeling_outputs import (
     MoeModelOutputWithPast,
 )
 
-from ainode.core.log import Logger
-from ainode.core.model.sundial.configuration_sundial import SundialConfig
-from ainode.core.model.sundial.flow_loss import FlowLoss
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.model.sundial.configuration_sundial import SundialConfig
+from iotdb.ainode.core.model.sundial.flow_loss import FlowLoss
 from iotdb.ainode.core.model.sundial.ts_generation_mixin import 
TSGenerationMixin
 
 logger = Logger()
@@ -554,7 +554,10 @@ class SundialForPrediction(SundialPreTrainedModel, 
TSGenerationMixin):
             loss_masks = loss_masks.reshape(bsz * L).repeat(
                 self.config.diffusion_batch_mul
             )
-            mask_y = mask_y.repeat(L * self.config.diffusion_batch_mul, 1)
+            if mask_y is not None:
+                mask_y = mask_y.repeat(L * self.config.diffusion_batch_mul, 1)
+            else:
+                mask_y = None
 
             loss = self.flow_loss(shift_labels, hidden_states, loss_masks, 
mask_y)
         else:
diff --git 
a/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py
index 8dfddd335b7..4d6d288d4d3 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/timerxl/modeling_timer.py
@@ -29,9 +29,9 @@ from transformers.modeling_outputs import (
     MoeModelOutputWithPast,
 )
 
-from ainode.core.log import Logger
-from ainode.core.model.timerxl.configuration_timer import TimerConfig
-from ainode.core.model.timerxl.ts_generation_mixin import TSGenerationMixin
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.model.timerxl.configuration_timer import TimerConfig
+from iotdb.ainode.core.model.timerxl.ts_generation_mixin import 
TSGenerationMixin
 
 logger = Logger()
 
diff --git a/iotdb-core/ainode/iotdb/ainode/core/model/uri_utils.py 
b/iotdb-core/ainode/iotdb/ainode/core/model/uri_utils.py
index 59f03057e85..b2e759e00ce 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/model/uri_utils.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/model/uri_utils.py
@@ -23,15 +23,15 @@ from huggingface_hub import snapshot_download
 from requests import Session
 from requests.adapters import HTTPAdapter
 
-from ainode.core.constant import (
+from iotdb.ainode.core.constant import (
     DEFAULT_CHUNK_SIZE,
     DEFAULT_RECONNECT_TIMEOUT,
     DEFAULT_RECONNECT_TIMES,
 )
 from iotdb.ainode.core.exception import UnsupportedError
-from ainode.core.log import Logger
+from iotdb.ainode.core.log import Logger
 from iotdb.ainode.core.model.model_enums import ModelFileType
-from ainode.core.model.model_info import get_model_file_type
+from iotdb.ainode.core.model.model_info import get_model_file_type
 
 HTTP_PREFIX = "http://";
 HTTPS_PREFIX = "https://";
diff --git a/iotdb-core/ainode/iotdb/ainode/core/rpc/client.py 
b/iotdb-core/ainode/iotdb/ainode/core/rpc/client.py
index dc9d84de9ae..0c44ea5d423 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/rpc/client.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/rpc/client.py
@@ -19,25 +19,26 @@ import time
 
 from thrift.protocol import TBinaryProtocol, TCompactProtocol
 from thrift.Thrift import TException
-from thrift.transport import TSocket, TTransport
+from thrift.transport import TSocket, TSSLSocket, TTransport
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.constant import TSStatusCode
-from ainode.core.log import Logger
-from ainode.core.rpc.status import verify_success
-from ainode.core.util.decorator import singleton
-from ainode.thrift.common.ttypes import (
+from iotdb.ainode.core.constant import TSStatusCode
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.rpc.status import verify_success
+from iotdb.ainode.core.util.decorator import singleton
+from iotdb.thrift.common.ttypes import (
     TAINodeConfiguration,
     TAINodeLocation,
     TEndPoint,
     TSStatus,
 )
-from ainode.thrift.confignode import IConfigNodeRPCService
-from ainode.thrift.confignode.ttypes import (
+from iotdb.thrift.confignode import IConfigNodeRPCService
+from iotdb.thrift.confignode.ttypes import (
     TAINodeRegisterReq,
     TAINodeRemoveReq,
     TAINodeRestartReq,
     TNodeVersionInfo,
+    TSystemConfigurationResp,
     TUpdateModelInfoReq,
 )
 
@@ -109,9 +110,31 @@ class ConfigNodeClient(object):
         raise TException(self._MSG_RECONNECTION_FAIL)
 
     def _connect(self, target_config_node: TEndPoint) -> None:
-        transport = TTransport.TFramedTransport(
-            TSocket.TSocket(target_config_node.ip, target_config_node.port)
-        )
+        if AINodeDescriptor().get_config().get_ain_internal_ssl_enabled():
+            import ssl
+            import sys
+
+            if sys.version_info >= (3, 10):
+                context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
+            else:
+                context = ssl.SSLContext(ssl.PROTOCOL_TLS)
+                context.verify_mode = ssl.CERT_REQUIRED
+            context.check_hostname = False
+            context.load_verify_locations(
+                
cafile=AINodeDescriptor().get_config().get_ain_thrift_ssl_cert_file()
+            )
+            context.load_cert_chain(
+                
certfile=AINodeDescriptor().get_config().get_ain_thrift_ssl_cert_file(),
+                
keyfile=AINodeDescriptor().get_config().get_ain_thrift_ssl_key_file(),
+            )
+            socket = TSSLSocket.TSSLSocket(
+                host=target_config_node.ip,
+                port=target_config_node.port,
+                ssl_context=context,
+            )
+        else:
+            socket = TSocket.TSocket(target_config_node.ip, 
target_config_node.port)
+        transport = TTransport.TFramedTransport(socket)
         if not transport.isOpen():
             try:
                 transport.open()
@@ -149,6 +172,24 @@ class ConfigNodeClient(object):
             return True
         return False
 
+    def getSystemConfiguration(self) -> TSystemConfigurationResp:
+        for _ in range(0, self._RETRY_NUM):
+            try:
+                resp = self._client.getSystemConfiguration()
+                if not self._update_config_node_leader(resp.status):
+                    verify_success(
+                        resp.status,
+                        "An error occurs when calling 
getSystemConfiguration()",
+                    )
+                    return resp
+            except TTransport.TException:
+                logger.warning(
+                    "Failed to connect to ConfigNode {} from AINode when 
executing getSystemConfiguration()",
+                    self._config_leader,
+                )
+                self._config_leader = None
+            self._wait_and_reconnect()
+
     def node_register(
         self,
         cluster_name: str,
diff --git a/iotdb-core/ainode/iotdb/ainode/core/rpc/handler.py 
b/iotdb-core/ainode/iotdb/ainode/core/rpc/handler.py
index eaad313903d..58e8d9bd0b1 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/rpc/handler.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/rpc/handler.py
@@ -15,31 +15,54 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-from ainode.core.constant import TSStatusCode
-from ainode.core.log import Logger
-from ainode.core.manager.cluster_manager import ClusterManager
-from ainode.core.manager.inference_manager import InferenceManager
-from ainode.core.manager.model_manager import ModelManager
-from ainode.core.rpc.status import get_status
-from ainode.thrift.ainode import IAINodeRPCService
-from ainode.thrift.ainode.ttypes import (
+
+from iotdb.ainode.core.config import AINodeDescriptor
+from iotdb.ainode.core.constant import TSStatusCode
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.manager.cluster_manager import ClusterManager
+from iotdb.ainode.core.manager.inference_manager import InferenceManager
+from iotdb.ainode.core.manager.model_manager import ModelManager
+from iotdb.ainode.core.model.model_info import ModelCategory, ModelInfo, 
ModelStates
+from iotdb.ainode.core.rpc.status import get_status
+from iotdb.ainode.core.util.gpu_mapping import get_available_devices
+from iotdb.thrift.ainode import IAINodeRPCService
+from iotdb.thrift.ainode.ttypes import (
     TAIHeartbeatReq,
     TAIHeartbeatResp,
     TDeleteModelReq,
     TForecastReq,
     TInferenceReq,
     TInferenceResp,
+    TLoadModelReq,
     TRegisterModelReq,
     TRegisterModelResp,
+    TShowAIDevicesResp,
+    TShowLoadedModelsReq,
+    TShowLoadedModelsResp,
     TShowModelsReq,
     TShowModelsResp,
     TTrainingReq,
+    TUnloadModelReq,
 )
-from ainode.thrift.common.ttypes import TSStatus
+from iotdb.thrift.common.ttypes import TSStatus
 
 logger = Logger()
 
 
+def _ensure_device_id_is_available(device_id_list: list[str]) -> TSStatus:
+    """
+    Ensure that the device IDs in the provided list are available.
+    """
+    available_devices = get_available_devices()
+    for device_id in device_id_list:
+        if device_id not in available_devices:
+            return TSStatus(
+                code=TSStatusCode.INVALID_URI_ERROR.value,
+                message=f"Device ID [{device_id}] is not available. You can 
use 'SHOW AI_DEVICES' to retrieve the available devices.",
+            )
+    return TSStatus(code=TSStatusCode.SUCCESS_STATUS.value)
+
+
 class AINodeRPCServiceHandler(IAINodeRPCService.Iface):
     def __init__(self, ainode):
         self._ainode = ainode
@@ -57,6 +80,24 @@ class AINodeRPCServiceHandler(IAINodeRPCService.Iface):
     def registerModel(self, req: TRegisterModelReq) -> TRegisterModelResp:
         return self._model_manager.register_model(req)
 
+    def loadModel(self, req: TLoadModelReq) -> TSStatus:
+        status = 
self._ensure_model_is_built_in_or_fine_tuned(req.existingModelId)
+        if status.code != TSStatusCode.SUCCESS_STATUS.value:
+            return status
+        status = _ensure_device_id_is_available(req.deviceIdList)
+        if status.code != TSStatusCode.SUCCESS_STATUS.value:
+            return status
+        return self._inference_manager.load_model(req)
+
+    def unloadModel(self, req: TUnloadModelReq) -> TSStatus:
+        status = self._ensure_model_is_built_in_or_fine_tuned(req.modelId)
+        if status.code != TSStatusCode.SUCCESS_STATUS.value:
+            return status
+        status = _ensure_device_id_is_available(req.deviceIdList)
+        if status.code != TSStatusCode.SUCCESS_STATUS.value:
+            return status
+        return self._inference_manager.unload_model(req)
+
     def deleteModel(self, req: TDeleteModelReq) -> TSStatus:
         return self._model_manager.delete_model(req)
 
@@ -72,5 +113,25 @@ class AINodeRPCServiceHandler(IAINodeRPCService.Iface):
     def showModels(self, req: TShowModelsReq) -> TShowModelsResp:
         return self._model_manager.show_models(req)
 
+    def showLoadedModels(self, req: TShowLoadedModelsReq) -> 
TShowLoadedModelsResp:
+        status = _ensure_device_id_is_available(req.deviceIdList)
+        if status.code != TSStatusCode.SUCCESS_STATUS.value:
+            return TShowLoadedModelsResp(status=status, 
deviceLoadedModelsMap={})
+        return self._inference_manager.show_loaded_models(req)
+
+    def showAIDevices(self) -> TShowAIDevicesResp:
+        return TShowAIDevicesResp(
+            status=TSStatus(code=TSStatusCode.SUCCESS_STATUS.value),
+            deviceIdList=get_available_devices(),
+        )
+
     def createTrainingTask(self, req: TTrainingReq) -> TSStatus:
         pass
+
+    def _ensure_model_is_built_in_or_fine_tuned(self, model_id: str) -> 
TSStatus:
+        if not self._model_manager.is_built_in_or_fine_tuned(model_id):
+            return TSStatus(
+                code=TSStatusCode.MODEL_NOT_FOUND_ERROR.value,
+                message=f"Model [{model_id}] is not a built-in or fine-tuned 
model. You can use 'SHOW MODELS' to retrieve the available models.",
+            )
+        return TSStatus(code=TSStatusCode.SUCCESS_STATUS.value)
diff --git a/iotdb-core/ainode/iotdb/ainode/core/rpc/service.py 
b/iotdb-core/ainode/iotdb/ainode/core/rpc/service.py
index 2282ae237d8..fc93a0cce7d 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/rpc/service.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/rpc/service.py
@@ -19,12 +19,12 @@ import threading
 
 from thrift.protocol import TBinaryProtocol, TCompactProtocol
 from thrift.server import TServer
-from thrift.transport import TSocket, TTransport
+from thrift.transport import TSocket, TSSLSocket, TTransport
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.log import Logger
-from ainode.core.rpc.handler import AINodeRPCServiceHandler
-from ainode.thrift.ainode import IAINodeRPCService
+from iotdb.ainode.core.log import Logger
+from iotdb.ainode.core.rpc.handler import AINodeRPCServiceHandler
+from iotdb.thrift.ainode import IAINodeRPCService
 
 logger = Logger()
 
@@ -73,10 +73,33 @@ class AINodeRPCService(threading.Thread):
         self._stop_event = threading.Event()
         self._handler = handler
         processor = IAINodeRPCService.Processor(handler=self._handler)
-        transport = TSocket.TServerSocket(
-            host=AINodeDescriptor().get_config().get_ain_rpc_address(),
-            port=AINodeDescriptor().get_config().get_ain_rpc_port(),
-        )
+        if AINodeDescriptor().get_config().get_ain_internal_ssl_enabled():
+            import ssl
+            import sys
+
+            if sys.version_info >= (3, 10):
+                context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
+            else:
+                context = ssl.SSLContext(ssl.PROTOCOL_TLS)
+                context.verify_mode = ssl.CERT_REQUIRED
+            context.check_hostname = False
+            context.load_verify_locations(
+                
cafile=AINodeDescriptor().get_config().get_ain_thrift_ssl_cert_file()
+            )
+            context.load_cert_chain(
+                
certfile=AINodeDescriptor().get_config().get_ain_thrift_ssl_cert_file(),
+                
keyfile=AINodeDescriptor().get_config().get_ain_thrift_ssl_key_file(),
+            )
+            transport = TSSLSocket.TSSLServerSocket(
+                host=AINodeDescriptor().get_config().get_ain_rpc_address(),
+                port=AINodeDescriptor().get_config().get_ain_rpc_port(),
+                ssl_context=context,
+            )
+        else:
+            transport = TSocket.TServerSocket(
+                host=AINodeDescriptor().get_config().get_ain_rpc_address(),
+                port=AINodeDescriptor().get_config().get_ain_rpc_port(),
+            )
         transport_factory = TTransport.TFramedTransportFactory()
         if 
AINodeDescriptor().get_config().get_ain_thrift_compression_enabled():
             protocol_factory = TCompactProtocol.TCompactProtocolFactory()
diff --git a/iotdb-core/ainode/iotdb/ainode/core/rpc/status.py 
b/iotdb-core/ainode/iotdb/ainode/core/rpc/status.py
index 37368b0068b..e2bacb53106 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/rpc/status.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/rpc/status.py
@@ -16,9 +16,9 @@
 # under the License.
 #
 
-from ainode.core.constant import TSStatusCode
-from ainode.core.log import Logger
-from ainode.thrift.common.ttypes import TSStatus
+from iotdb.ainode.core.constant import TSStatusCode
+from iotdb.ainode.core.log import Logger
+from iotdb.thrift.common.ttypes import TSStatus
 
 
 def get_status(status_code: TSStatusCode, message: str = None) -> TSStatus:
diff --git a/iotdb-core/ainode/iotdb/ainode/core/script.py 
b/iotdb-core/ainode/iotdb/ainode/core/script.py
index dd3efa11ac8..6e244e43ab6 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/script.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/script.py
@@ -15,71 +15,27 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-import os
-import shutil
+import multiprocessing
 import sys
 
 import torch.multiprocessing as mp
 
 from iotdb.ainode.core.ai_node import AINode
-from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.constant import TSStatusCode
-from iotdb.ainode.core.exception import MissingConfigError
-from ainode.core.log import Logger
-from ainode.core.rpc.client import ClientManager
-from ainode.thrift.common.ttypes import (
-    TAINodeLocation,
-    TEndPoint,
-)
+from iotdb.ainode.core.log import Logger
 
 logger = Logger()
 
 
-def remove_ainode(arguments):
-    # Delete the current node
-    if len(arguments) == 2:
-        target_ainode_id = AINodeDescriptor().get_config().get_ainode_id()
-        target_rpc_address = 
AINodeDescriptor().get_config().get_ain_rpc_address()
-        target_rpc_port = AINodeDescriptor().get_config().get_ain_rpc_port()
-
-    # Delete the node with a given id
-    elif len(arguments) == 3:
-        target_ainode_id = int(arguments[2])
-        ainode_configuration_map = (
-            ClientManager()
-            .borrow_config_node_client()
-            .get_ainode_configuration(target_ainode_id)
-        )
-
-        end_point = 
ainode_configuration_map[target_ainode_id].location.internalEndPoint
-        target_rpc_address = end_point.ip
-        target_rpc_port = end_point.port
-
-        if not end_point:
-            raise MissingConfigError(
-                "NodeId: {} not found in cluster ".format(target_ainode_id)
-            )
-
-        logger.info("Got target AINode id: {}".format(target_ainode_id))
-
-    else:
-        raise MissingConfigError("Invalid command")
-
-    location = TAINodeLocation(
-        target_ainode_id, TEndPoint(target_rpc_address, target_rpc_port)
-    )
-    status = ClientManager().borrow_config_node_client().node_remove(location)
-
-    if status.code == TSStatusCode.SUCCESS_STATUS.get_status_code():
-        logger.info("IoTDB-AINode has successfully removed.")
-        if 
os.path.exists(AINodeDescriptor().get_config().get_ain_models_dir()):
-            shutil.rmtree(AINodeDescriptor().get_config().get_ain_models_dir())
-
-
 def main():
+    # Handle PyInstaller: filter out Python arguments that might be passed to 
subprocesses
+    # These arguments are not needed in frozen executables and cause warnings
+    # Note: This filtering should happen AFTER freeze_support() has handled 
child processes
+    if getattr(sys, "frozen", False):
+        python_args_to_filter = ["-I", "-B", "-S", "-E", "-O", "-OO"]
+        sys.argv = [arg for arg in sys.argv if arg not in 
python_args_to_filter]
+
+    logger.info(f"Starting IoTDB-AINode process with sys argv {sys.argv}.")
     arguments = sys.argv
-    # load config
-    AINodeDescriptor()
     if len(arguments) == 1:
         logger.info("Command line argument must be specified.")
         return
@@ -88,23 +44,26 @@ def main():
         try:
             mp.set_start_method("spawn", force=True)
             logger.info(f"Current multiprocess start method: 
{mp.get_start_method()}")
-            logger.info("IoTDB-AINode is starting...")
+            logger.info("IoTDB AINode is starting...")
             ai_node = AINode()
             ai_node.start()
         except Exception as e:
-            logger.error("Start AINode failed, because of: {}".format(e))
-            sys.exit(1)
-    # TODO: remove the following function, and add a destroy script
-    elif command == "remove":
-        try:
-            logger.info("Removing AINode...")
-            remove_ainode(arguments)
-        except Exception as e:
-            logger.error("Remove AINode failed, because of: {}".format(e))
+            logger.error("Start IoTDB AINode failed, because of: {}".format(e))
             sys.exit(1)
     else:
         logger.warning("Unknown argument: {}.".format(command))
 
 
 if __name__ == "__main__":
+    # PyInstaller multiprocessing support
+    # freeze_support() is essential for PyInstaller frozen executables on all 
platforms
+    # It detects if the current process is a multiprocessing child process
+    # If it is, it executes the child process target function and exits
+    # If it's not, it returns immediately and continues with main() execution
+    # This prevents child processes from executing the main application logic
+    if getattr(sys, "frozen", False):
+        # Call freeze_support() for both standard multiprocessing and 
torch.multiprocessing
+        multiprocessing.freeze_support()
+        mp.freeze_support()
+
     main()
diff --git a/iotdb-core/ainode/iotdb/ainode/core/util/cache.py 
b/iotdb-core/ainode/iotdb/ainode/core/util/cache.py
index 40e2b8d5771..122873df67b 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/util/cache.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/util/cache.py
@@ -19,7 +19,7 @@ import sys
 from collections import OrderedDict
 
 from iotdb.ainode.core.config import AINodeDescriptor
-from ainode.core.util.decorator import singleton
+from iotdb.ainode.core.util.decorator import singleton
 
 
 def _estimate_size_in_byte(obj):
diff --git a/iotdb-core/ainode/iotdb/ainode/core/util/decorator.py 
b/iotdb-core/ainode/iotdb/ainode/core/util/decorator.py
index 33b9f4835ac..5a84c3d6bb2 100644
--- a/iotdb-core/ainode/iotdb/ainode/core/util/decorator.py
+++ b/iotdb-core/ainode/iotdb/ainode/core/util/decorator.py
@@ -15,6 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 #
+from functools import wraps
+
+
 def singleton(cls):
     instances = {}
 
@@ -24,3 +27,15 @@ def singleton(cls):
         return instances[cls]
 
     return get_instance
+
+
+def synchronized(lock):
+    def decorator(func):
+        @wraps(func)
+        def wrapper(*args, **kwargs):
+            with lock:
+                return func(*args, **kwargs)
+
+        return wrapper
+
+    return decorator
diff --git a/iotdb-core/ainode/iotdb/sqlalchemy/IoTDBSQLCompiler.py 
b/iotdb-core/ainode/iotdb/sqlalchemy/IoTDBSQLCompiler.py
index 008a314e683..94e650ba66c 100644
--- a/iotdb-core/ainode/iotdb/sqlalchemy/IoTDBSQLCompiler.py
+++ b/iotdb-core/ainode/iotdb/sqlalchemy/IoTDBSQLCompiler.py
@@ -16,9 +16,8 @@
 # under the License.
 #
 
-from sqlalchemy.sql.compiler import SQLCompiler
-from sqlalchemy.sql.compiler import OPERATORS
 from sqlalchemy.sql import operators
+from sqlalchemy.sql.compiler import OPERATORS, SQLCompiler
 
 
 class IoTDBSQLCompiler(SQLCompiler):
diff --git a/iotdb-core/ainode/iotdb/table_session_pool.py 
b/iotdb-core/ainode/iotdb/table_session_pool.py
index f44df3f249b..bd5a84be5c7 100644
--- a/iotdb-core/ainode/iotdb/table_session_pool.py
+++ b/iotdb-core/ainode/iotdb/table_session_pool.py
@@ -16,7 +16,7 @@
 # under the License.
 #
 from iotdb.Session import Session
-from iotdb.SessionPool import SessionPool, PoolConfig
+from iotdb.SessionPool import PoolConfig, SessionPool
 from iotdb.table_session import TableSession
 
 
diff --git a/iotdb-core/ainode/iotdb/template/MeasurementNode.py 
b/iotdb-core/ainode/iotdb/template/MeasurementNode.py
index 06cd7c6957e..865e17bdda9 100644
--- a/iotdb-core/ainode/iotdb/template/MeasurementNode.py
+++ b/iotdb-core/ainode/iotdb/template/MeasurementNode.py
@@ -17,9 +17,10 @@
 #
 import warnings
 
-from iotdb.utils.IoTDBConstants import TSDataType, TSEncoding, Compressor
-from .TemplateNode import TemplateNode
+from iotdb.utils.IoTDBConstants import Compressor, TSDataType, TSEncoding
+
 from ..tsfile.utils.read_write_io_utils import ReadWriteUtils
+from .TemplateNode import TemplateNode
 
 warnings.simplefilter("always", DeprecationWarning)
 
diff --git a/iotdb-core/ainode/iotdb/template/Template.py 
b/iotdb-core/ainode/iotdb/template/Template.py
index 98a6082f148..99c97515424 100644
--- a/iotdb-core/ainode/iotdb/template/Template.py
+++ b/iotdb-core/ainode/iotdb/template/Template.py
@@ -19,10 +19,10 @@
 import struct
 import warnings
 
-from .TemplateNode import TemplateNode
 from ..tsfile.common.constant.tsfile_constant import TsFileConstant
 from ..tsfile.utils.pair import Pair
 from ..tsfile.utils.read_write_io_utils import ReadWriteUtils
+from .TemplateNode import TemplateNode
 
 warnings.simplefilter("always", DeprecationWarning)
 
diff --git a/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService-remote 
b/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService-remote
index 082e8f84511..4b17e2f82dc 100755
--- a/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService-remote
+++ b/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService-remote
@@ -7,14 +7,16 @@
 #  options string: py
 #
 
-import sys
 import pprint
+import sys
+
 if sys.version_info[0] > 2:
     from urllib.parse import urlparse
 else:
     from urlparse import urlparse
-from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+
 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+from thrift.transport import THttpClient, TSocket, TSSLSocket, TTransport
 
 from iotdb.thrift.ainode import IAINodeRPCService
 from iotdb.thrift.ainode.ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService.py 
b/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService.py
index 7db6b3bee65..f2231800d4d 100644
--- a/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService.py
+++ b/iotdb-core/ainode/iotdb/thrift/ainode/IAINodeRPCService.py
@@ -6,15 +6,23 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import logging
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TProcessor,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
-import logging
 from .ttypes import *
-from thrift.Thrift import TProcessor
-from thrift.transport import TTransport
+
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/ainode/constants.py 
b/iotdb-core/ainode/iotdb/thrift/ainode/constants.py
index 69c181ade38..be9fb9f77b3 100644
--- a/iotdb-core/ainode/iotdb/thrift/ainode/constants.py
+++ b/iotdb-core/ainode/iotdb/thrift/ainode/constants.py
@@ -6,9 +6,16 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
 from thrift.TRecursive import fix_spec
 
-import sys
 from .ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/ainode/ttypes.py 
b/iotdb-core/ainode/iotdb/thrift/ainode/ttypes.py
index a016b467de1..b1ad583cd64 100644
--- a/iotdb-core/ainode/iotdb/thrift/ainode/ttypes.py
+++ b/iotdb-core/ainode/iotdb/thrift/ainode/ttypes.py
@@ -6,14 +6,21 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
 import iotdb.thrift.common.ttypes
 
-from thrift.transport import TTransport
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/common/constants.py 
b/iotdb-core/ainode/iotdb/thrift/common/constants.py
index 69c181ade38..be9fb9f77b3 100644
--- a/iotdb-core/ainode/iotdb/thrift/common/constants.py
+++ b/iotdb-core/ainode/iotdb/thrift/common/constants.py
@@ -6,9 +6,16 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
 from thrift.TRecursive import fix_spec
 
-import sys
 from .ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/common/ttypes.py 
b/iotdb-core/ainode/iotdb/thrift/common/ttypes.py
index 29d58f4dd4b..b55c864d2a0 100644
--- a/iotdb-core/ainode/iotdb/thrift/common/ttypes.py
+++ b/iotdb-core/ainode/iotdb/thrift/common/ttypes.py
@@ -6,13 +6,19 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
-from thrift.protocol.TProtocol import TProtocolException
-from thrift.TRecursive import fix_spec
-
 import sys
 
+from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
 from thrift.transport import TTransport
+from thrift.TRecursive import fix_spec
+
 all_structs = []
 
 
diff --git 
a/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService-remote 
b/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService-remote
index 014d1635657..74b5a660ecf 100755
--- a/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService-remote
+++ b/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService-remote
@@ -7,14 +7,16 @@
 #  options string: py
 #
 
-import sys
 import pprint
+import sys
+
 if sys.version_info[0] > 2:
     from urllib.parse import urlparse
 else:
     from urlparse import urlparse
-from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+
 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+from thrift.transport import THttpClient, TSocket, TSSLSocket, TTransport
 
 from iotdb.thrift.confignode import IConfigNodeRPCService
 from iotdb.thrift.confignode.ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService.py 
b/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService.py
index 439190815c4..a445bbe647a 100644
--- a/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService.py
+++ b/iotdb-core/ainode/iotdb/thrift/confignode/IConfigNodeRPCService.py
@@ -6,15 +6,23 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import logging
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TProcessor,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
-import logging
 from .ttypes import *
-from thrift.Thrift import TProcessor
-from thrift.transport import TTransport
+
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/confignode/constants.py 
b/iotdb-core/ainode/iotdb/thrift/confignode/constants.py
index 69c181ade38..be9fb9f77b3 100644
--- a/iotdb-core/ainode/iotdb/thrift/confignode/constants.py
+++ b/iotdb-core/ainode/iotdb/thrift/confignode/constants.py
@@ -6,9 +6,16 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
 from thrift.TRecursive import fix_spec
 
-import sys
 from .ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/confignode/ttypes.py 
b/iotdb-core/ainode/iotdb/thrift/confignode/ttypes.py
index 9a8d9c4b4e4..e5197c428a6 100644
--- a/iotdb-core/ainode/iotdb/thrift/confignode/ttypes.py
+++ b/iotdb-core/ainode/iotdb/thrift/confignode/ttypes.py
@@ -6,14 +6,21 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
 import iotdb.thrift.common.ttypes
 
-from thrift.transport import TTransport
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService-remote 
b/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService-remote
index c37821f4d78..7381e55e0ea 100755
--- a/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService-remote
+++ b/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService-remote
@@ -7,14 +7,16 @@
 #  options string: py
 #
 
-import sys
 import pprint
+import sys
+
 if sys.version_info[0] > 2:
     from urllib.parse import urlparse
 else:
     from urlparse import urlparse
-from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+
 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+from thrift.transport import THttpClient, TSocket, TSSLSocket, TTransport
 
 from iotdb.thrift.datanode import IDataNodeRPCService
 from iotdb.thrift.datanode.ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService.py 
b/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService.py
index ca3c29ddd8f..09782524fe1 100644
--- a/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService.py
+++ b/iotdb-core/ainode/iotdb/thrift/datanode/IDataNodeRPCService.py
@@ -6,15 +6,23 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import logging
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TProcessor,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
-import logging
 from .ttypes import *
-from thrift.Thrift import TProcessor
-from thrift.transport import TTransport
+
 all_structs = []
 
 
diff --git 
a/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService-remote 
b/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService-remote
index b1fbd493625..3fd163e7830 100755
--- a/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService-remote
+++ b/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService-remote
@@ -7,14 +7,16 @@
 #  options string: py
 #
 
-import sys
 import pprint
+import sys
+
 if sys.version_info[0] > 2:
     from urllib.parse import urlparse
 else:
     from urlparse import urlparse
-from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+
 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+from thrift.transport import THttpClient, TSocket, TSSLSocket, TTransport
 
 from iotdb.thrift.datanode import MPPDataExchangeService
 from iotdb.thrift.datanode.ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService.py 
b/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService.py
index ce970090b32..cd0248990b9 100644
--- a/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService.py
+++ b/iotdb-core/ainode/iotdb/thrift/datanode/MPPDataExchangeService.py
@@ -6,15 +6,23 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import logging
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TProcessor,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
-import logging
 from .ttypes import *
-from thrift.Thrift import TProcessor
-from thrift.transport import TTransport
+
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/datanode/constants.py 
b/iotdb-core/ainode/iotdb/thrift/datanode/constants.py
index 69c181ade38..be9fb9f77b3 100644
--- a/iotdb-core/ainode/iotdb/thrift/datanode/constants.py
+++ b/iotdb-core/ainode/iotdb/thrift/datanode/constants.py
@@ -6,9 +6,16 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
 from thrift.TRecursive import fix_spec
 
-import sys
 from .ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/datanode/ttypes.py 
b/iotdb-core/ainode/iotdb/thrift/datanode/ttypes.py
index b1d99ce48e3..53217e2d534 100644
--- a/iotdb-core/ainode/iotdb/thrift/datanode/ttypes.py
+++ b/iotdb-core/ainode/iotdb/thrift/datanode/ttypes.py
@@ -6,15 +6,22 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
 import iotdb.thrift.common.ttypes
 import iotdb.thrift.rpc.ttypes
 
-from thrift.transport import TTransport
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService-remote 
b/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService-remote
index 45126506e6f..8ea0655ce88 100755
--- a/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService-remote
+++ b/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService-remote
@@ -7,14 +7,16 @@
 #  options string: py
 #
 
-import sys
 import pprint
+import sys
+
 if sys.version_info[0] > 2:
     from urllib.parse import urlparse
 else:
     from urlparse import urlparse
-from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
+
 from thrift.protocol.TBinaryProtocol import TBinaryProtocol
+from thrift.transport import THttpClient, TSocket, TSSLSocket, TTransport
 
 from iotdb.thrift.rpc import IClientRPCService
 from iotdb.thrift.rpc.ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService.py 
b/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService.py
index 647d46a7995..f80b2e33219 100644
--- a/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService.py
+++ b/iotdb-core/ainode/iotdb/thrift/rpc/IClientRPCService.py
@@ -6,15 +6,23 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import logging
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TProcessor,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
-import logging
 from .ttypes import *
-from thrift.Thrift import TProcessor
-from thrift.transport import TTransport
+
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/thrift/rpc/constants.py 
b/iotdb-core/ainode/iotdb/thrift/rpc/constants.py
index 69c181ade38..be9fb9f77b3 100644
--- a/iotdb-core/ainode/iotdb/thrift/rpc/constants.py
+++ b/iotdb-core/ainode/iotdb/thrift/rpc/constants.py
@@ -6,9 +6,16 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
 from thrift.TRecursive import fix_spec
 
-import sys
 from .ttypes import *
diff --git a/iotdb-core/ainode/iotdb/thrift/rpc/ttypes.py 
b/iotdb-core/ainode/iotdb/thrift/rpc/ttypes.py
index 66ae893696f..df3767c6fdd 100644
--- a/iotdb-core/ainode/iotdb/thrift/rpc/ttypes.py
+++ b/iotdb-core/ainode/iotdb/thrift/rpc/ttypes.py
@@ -6,14 +6,21 @@
 #  options string: py
 #
 
-from thrift.Thrift import TType, TMessageType, TFrozenDict, TException, 
TApplicationException
+import sys
+
 from thrift.protocol.TProtocol import TProtocolException
+from thrift.Thrift import (
+    TApplicationException,
+    TException,
+    TFrozenDict,
+    TMessageType,
+    TType,
+)
+from thrift.transport import TTransport
 from thrift.TRecursive import fix_spec
 
-import sys
 import iotdb.thrift.common.ttypes
 
-from thrift.transport import TTransport
 all_structs = []
 
 
diff --git a/iotdb-core/ainode/iotdb/tsfile/utils/read_write_io_utils.py 
b/iotdb-core/ainode/iotdb/tsfile/utils/read_write_io_utils.py
index f6a5c02f235..11782a55807 100644
--- a/iotdb-core/ainode/iotdb/tsfile/utils/read_write_io_utils.py
+++ b/iotdb-core/ainode/iotdb/tsfile/utils/read_write_io_utils.py
@@ -16,7 +16,7 @@
 # under the License.
 #
 
-from iotdb.utils.IoTDBConstants import TSDataType, TSEncoding, Compressor
+from iotdb.utils.IoTDBConstants import Compressor, TSDataType, TSEncoding
 
 
 class ReadWriteUtils:
diff --git a/iotdb-core/ainode/iotdb/tsfile/utils/tsblock_serde.py 
b/iotdb-core/ainode/iotdb/tsfile/utils/tsblock_serde.py
index 854be120ffb..40801f96ad7 100644
--- a/iotdb-core/ainode/iotdb/tsfile/utils/tsblock_serde.py
+++ b/iotdb-core/ainode/iotdb/tsfile/utils/tsblock_serde.py
@@ -18,7 +18,6 @@
 
 import numpy as np
 
-
 # Serialized tsBlock:
 #    
+-------------+---------------+---------+------------+-----------+----------+
 #    | val col cnt | val col types | pos cnt | encodings  | time col  | val 
col  |
diff --git a/iotdb-core/ainode/iotdb/utils/Field.py 
b/iotdb-core/ainode/iotdb/utils/Field.py
index d9a0ee77776..6f2d9123e52 100644
--- a/iotdb-core/ainode/iotdb/utils/Field.py
+++ b/iotdb-core/ainode/iotdb/utils/Field.py
@@ -16,12 +16,14 @@
 # under the License.
 #
 
+import numpy as np
+import pandas as pd
+
+from iotdb.tsfile.utils.date_utils import parse_int_to_date
+
 # for package
 from iotdb.utils.IoTDBConstants import TSDataType
-from iotdb.tsfile.utils.date_utils import parse_int_to_date
 from iotdb.utils.rpc_utils import convert_to_timestamp, isoformat
-import numpy as np
-import pandas as pd
 
 
 class Field(object):
diff --git a/iotdb-core/ainode/iotdb/utils/IoTDBConstants.py 
b/iotdb-core/ainode/iotdb/utils/IoTDBConstants.py
index 4b9082b5353..e51172e0962 100644
--- a/iotdb-core/ainode/iotdb/utils/IoTDBConstants.py
+++ b/iotdb-core/ainode/iotdb/utils/IoTDBConstants.py
@@ -16,7 +16,8 @@
 # under the License.
 #
 from datetime import date
-from enum import unique, IntEnum
+from enum import IntEnum, unique
+
 import numpy as np
 
 
diff --git a/iotdb-core/ainode/iotdb/utils/NumpyTablet.py 
b/iotdb-core/ainode/iotdb/utils/NumpyTablet.py
index 9a0860d3a43..65b76ffe4aa 100644
--- a/iotdb-core/ainode/iotdb/utils/NumpyTablet.py
+++ b/iotdb-core/ainode/iotdb/utils/NumpyTablet.py
@@ -17,14 +17,14 @@
 #
 
 import struct
+from typing import List
 
 import numpy as np
 from numpy import ndarray
-from typing import List
 
 from iotdb.tsfile.utils.date_utils import parse_date_to_int
-from iotdb.utils.IoTDBConstants import TSDataType
 from iotdb.utils.BitMap import BitMap
+from iotdb.utils.IoTDBConstants import TSDataType
 from iotdb.utils.Tablet import ColumnType
 
 
diff --git a/iotdb-core/ainode/iotdb/utils/SessionDataSet.py 
b/iotdb-core/ainode/iotdb/utils/SessionDataSet.py
index b079ee28c1a..2139e94b9a8 100644
--- a/iotdb-core/ainode/iotdb/utils/SessionDataSet.py
+++ b/iotdb-core/ainode/iotdb/utils/SessionDataSet.py
@@ -17,15 +17,15 @@
 #
 import logging
 
+import pandas as pd
+
 from iotdb.utils.Field import Field
+from iotdb.utils.iotdb_rpc_dataset import IoTDBRpcDataSet
 
 # for package
 from iotdb.utils.IoTDBConstants import TSDataType
-from iotdb.utils.iotdb_rpc_dataset import IoTDBRpcDataSet
 from iotdb.utils.RowRecord import RowRecord
 
-import pandas as pd
-
 logger = logging.getLogger("IoTDB")
 
 
diff --git a/iotdb-core/ainode/iotdb/utils/Tablet.py 
b/iotdb-core/ainode/iotdb/utils/Tablet.py
index 9b241723fe5..ce2b2c2a5ae 100644
--- a/iotdb-core/ainode/iotdb/utils/Tablet.py
+++ b/iotdb-core/ainode/iotdb/utils/Tablet.py
@@ -17,7 +17,7 @@
 #
 
 import struct
-from enum import unique, IntEnum
+from enum import IntEnum, unique
 from typing import List, Union
 
 from iotdb.tsfile.utils.date_utils import parse_date_to_int
diff --git a/iotdb-core/ainode/iotdb/utils/iotdb_rpc_dataset.py 
b/iotdb-core/ainode/iotdb/utils/iotdb_rpc_dataset.py
index dc771368669..cc35c429b3c 100644
--- a/iotdb-core/ainode/iotdb/utils/iotdb_rpc_dataset.py
+++ b/iotdb-core/ainode/iotdb/utils/iotdb_rpc_dataset.py
@@ -23,12 +23,12 @@ import numpy as np
 import pandas as pd
 from thrift.transport import TTransport
 
-from iotdb.thrift.rpc.IClientRPCService import TSFetchResultsReq, 
TSCloseOperationReq
+from iotdb.thrift.rpc.IClientRPCService import TSCloseOperationReq, 
TSFetchResultsReq
 from iotdb.tsfile.utils.date_utils import parse_int_to_date
 from iotdb.tsfile.utils.tsblock_serde import deserialize
 from iotdb.utils.exception import IoTDBConnectionException
 from iotdb.utils.IoTDBConstants import TSDataType
-from iotdb.utils.rpc_utils import verify_success, convert_to_timestamp
+from iotdb.utils.rpc_utils import convert_to_timestamp, verify_success
 
 logger = logging.getLogger("IoTDB")
 TIMESTAMP_STR = "Time"
diff --git a/iotdb-core/ainode/pom.xml b/iotdb-core/ainode/pom.xml
index c59c719c747..e9353db65a3 100644
--- a/iotdb-core/ainode/pom.xml
+++ b/iotdb-core/ainode/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.iotdb</groupId>
         <artifactId>iotdb-core</artifactId>
-        <version>2.0.6-SNAPSHOT</version>
+        <version>2.0.6</version>
     </parent>
     <artifactId>iotdb-ainode</artifactId>
     <name>IoTDB: Core: AINode</name>
@@ -33,31 +33,31 @@
         <dependency>
             <groupId>org.apache.iotdb</groupId>
             <artifactId>iotdb-thrift</artifactId>
-            <version>2.0.6-SNAPSHOT</version>
+            <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.iotdb</groupId>
             <artifactId>iotdb-thrift-confignode</artifactId>
-            <version>2.0.6-SNAPSHOT</version>
+            <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.iotdb</groupId>
             <artifactId>iotdb-thrift-commons</artifactId>
-            <version>2.0.6-SNAPSHOT</version>
+            <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.iotdb</groupId>
             <artifactId>iotdb-thrift-ainode</artifactId>
-            <version>2.0.6-SNAPSHOT</version>
+            <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.iotdb</groupId>
             <artifactId>iotdb-python-api</artifactId>
-            <version>2.0.6-SNAPSHOT</version>
+            <version>2.0.6</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
@@ -73,7 +73,7 @@
                             <directory>dist</directory>
                         </fileset>
                         <fileset>
-                            <directory>ainode</directory>
+                            <directory>iotdb</directory>
                             <includes>
                                 <include>ainode/conf/</include>
                                 <include>dbapi/</include>
diff --git a/iotdb-core/ainode/pyproject.toml b/iotdb-core/ainode/pyproject.toml
index 54aacf08768..151eeebb757 100644
--- a/iotdb-core/ainode/pyproject.toml
+++ b/iotdb-core/ainode/pyproject.toml
@@ -21,7 +21,7 @@ build-backend = "poetry.core.masonry.api"
 
 [tool.poetry]
 name = "apache-iotdb-ainode"
-version = "2.0.6.dev"
+version = "2.0.6"
 description = "Apache IoTDB AINode"
 readme = "README.md"
 authors = ["Apache Software Foundation <[email protected]>"]
@@ -34,45 +34,49 @@ classifiers = [
     "Topic :: Software Development :: Libraries :: Python Modules",
 ]
 include = [
-    {path = "iotdb/*", format = "wheel"},
-    {path = "iotdb/dbapi/*", format = "wheel"},
-    {path = "iotdb/sqlalchemy/*", format = "wheel"},
-    {path = "iotdb/template/*", format = "wheel"},
-    {path = "iotdb/thrift/*", format = "wheel"},
-    {path = "iotdb/thrift/ainode/*", format = "wheel"},
-    {path = "iotdb/thrift/common/*", format = "wheel"},
-    {path = "iotdb/thrift/confignode/*", format = "wheel"},
-    {path = "iotdb/thrift/datanode/*", format = "wheel"},
-    {path = "iotdb/thrift/rpc/*", format = "wheel"},
-    {path = "iotdb/tsfile/*", format = "wheel"},
-    {path = "iotdb/tsfile/common/*", format = "wheel"},
-    {path = "iotdb/tsfile/common/constant/*", format = "wheel"},
-    {path = "iotdb/tsfile/utils/*", format = "wheel"},
-    {path = "iotdb/utils/*", format = "wheel"},
+    { path = "iotdb/Session.py", format = "wheel" },
+    { path = "iotdb/SessionPool.py", format = "wheel" },
+    { path = "iotdb/table_session.py", format = "wheel" },
+    { path = "iotdb/table_session_pool.py", format = "wheel" },
+    { path = "iotdb/dbapi/*", format = "wheel" },
+    { path = "iotdb/sqlalchemy/*", format = "wheel" },
+    { path = "iotdb/template/*", format = "wheel" },
+    { path = "iotdb/thrift/*", format = "wheel" },
+    { path = "iotdb/thrift/ainode/*", format = "wheel" },
+    { path = "iotdb/thrift/common/*", format = "wheel" },
+    { path = "iotdb/thrift/confignode/*", format = "wheel" },
+    { path = "iotdb/thrift/datanode/*", format = "wheel" },
+    { path = "iotdb/thrift/rpc/*", format = "wheel" },
+    { path = "iotdb/tsfile/*", format = "wheel" },
+    { path = "iotdb/tsfile/common/*", format = "wheel" },
+    { path = "iotdb/tsfile/common/constant/*", format = "wheel" },
+    { path = "iotdb/tsfile/utils/*", format = "wheel" },
+    { path = "iotdb/utils/*", format = "wheel" },
+    { path = "iotdb/__init__.py", format = "wheel" },
+    { path = "iotdb/ainode/__init__.py", format = "wheel" },
+    { path = "iotdb/ainode/conf/*", format = "wheel" },
 ]
+
 packages = [
-    { include = "ainode" }
+    { include = "iotdb/ainode/core" }
 ]
 
-[tool.poetry.dependencies]
-python = ">=3.11,<=3.13.5"
-
-# Core scientific stack
-numpy = [
-    { version = "^2.3.2", python = ">=3.10" },
-    { version = "^1.26.4", python = ">=3.9,<3.10" }
+exclude = [
+    "**/__pycache__/**",
+    "**/*.pyc", "**/*.pyo",
+    "**/.DS_Store",
+    "**/*.log", "**/*.log.gz",
+    "venv/**", ".venv/**", "*/.venv/**",
+    "iotdb/ainode/core/data/**",
+    "iotdb/ainode/core/logs/**",
+    "iotdb/**/.cache/**",
+    "iotdb/**/download/**",
+    "iotdb/**/logs/**",
+    "iotdb/**/log-*.log*"
 ]
-scipy = [
-    { version = "^1.12.0", python = ">=3.10" },
-    { version = "^1.11.4", python = ">=3.9,<3.10" }
-]
-pandas = "^2.3.2"
-scikit-learn = [
-    { version = "^1.7.1", python = ">=3.10" },
-    { version = "^1.5.2", python = ">=3.9,<3.10" }
-]
-statsmodels = "^0.14.5"
-sktime = "0.38.5"
+
+[tool.poetry.dependencies]
+python = ">=3.11.0,<3.14.0"
 
 # ---- DL / HF stack ----
 torch = ">=2.7.0"
@@ -83,32 +87,33 @@ huggingface_hub = "^0.34.4"
 safetensors = "^0.6.2"
 einops = "^0.8.1"
 
+# ---- Core scientific stack ----
+numpy = "^2.3.2"
+scipy = "^1.12.0"
+pandas = "^2.3.2"
+scikit-learn = "^1.7.1"
+statsmodels = "^0.14.5"
+sktime = "0.38.5"
+
 # ---- Optimizers / utils ----
 optuna = "^4.4.0"
 psutil = "^7.0.0"
 requests = "^2.32.5"
 dynaconf = "^3.2.11"
 thrift = ">=0.14.0"
-dynaconf = "^3.1.11"
-requests = "^2.31.0"
-optuna = "^3.2.0"
-psutil = "^5.9.5"
-sktime = "0.38.4"
-scikit-learn = "^1.4"
-statsmodels = "^0.14"
-hmmlearn = "^0.3.0"
-einops = "^0.8.1"
-safetensors = "^0.5.1"
-huggingface_hub = "^0.30.1"
-tokenizers = ">=0.19"
-hf_xet = ">=1.1.7"
+tzlocal = "^5.3.1"
+
+# ---- HF acceleration ----
+hf_xet = ">=1.1.9"
+
+# ---- Tooling ----
+pyinstaller = "6.16.0"
 black = "25.1.0"
 isort = "6.0.1"
-transformers = "==4.40.1"
-torchmetrics = ">=1.2.0"
 
 [tool.poetry.scripts]
-ainode = "ainode.core.script:main"
+ainode = "iotdb.ainode.core.script:main"
 
 [tool.isort]
-profile = "black"
\ No newline at end of file
+profile = "black"
+skip = ["build", "dist", "target"]
\ No newline at end of file
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
index 3f5ee055649..3b09a568836 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/InformationSchemaContentSupplierFactory.java
@@ -27,7 +27,6 @@ import org.apache.iotdb.common.rpc.thrift.TConfigNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
 import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
 import org.apache.iotdb.common.rpc.thrift.TEndPoint;
-import org.apache.iotdb.commons.audit.UserEntity;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
 import org.apache.iotdb.commons.exception.auth.AccessDeniedException;

Reply via email to