Skip to content

Commit e2322e9

Browse files
authored
[AINode] Remove Chronos2 DataLoader pin_memory option (#17822)
1 parent c818b28 commit e2322e9

3 files changed

Lines changed: 91 additions & 12 deletions

File tree

integration-test/src/test/java/org/apache/iotdb/ainode/it/AINodeSharedClusterIT.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import java.util.Set;
5151
import java.util.concurrent.TimeUnit;
5252

53+
import static org.apache.iotdb.ainode.utils.AINodeTestUtils.BUILTIN_LTSM_MAP;
5354
import static org.apache.iotdb.ainode.utils.AINodeTestUtils.BUILTIN_MODEL_MAP;
5455
import static org.apache.iotdb.ainode.utils.AINodeTestUtils.checkHeader;
5556
import static org.apache.iotdb.ainode.utils.AINodeTestUtils.checkModelNotOnSpecifiedDevice;
@@ -90,6 +91,10 @@ public class AINodeSharedClusterIT {
9091
"CALL INFERENCE(%s, \"SELECT s%d FROM root.AI LIMIT 256\")";
9192
private static final int DEFAULT_INPUT_LENGTH = 256;
9293
private static final int DEFAULT_OUTPUT_LENGTH = 48;
94+
private static final int LOADED_MODEL_SMOKE_INPUT_LENGTH = 96;
95+
private static final int LOADED_MODEL_SMOKE_OUTPUT_LENGTH = 1;
96+
private static final List<String> LTSM_LOAD_DEVICE_COMBINATIONS =
97+
Arrays.asList("cpu", "0", "cpu,0");
9398

9499
private static final String FORECAST_TABLE_FUNCTION_SQL_TEMPLATE =
95100
"SELECT * FROM FORECAST("
@@ -438,6 +443,84 @@ public static void forecastTableFunctionErrorTest(
438443

439444
// ========== Concurrent forecast tests ==========
440445

446+
@Test
447+
public void largeTimeSeriesModelLoadInferenceAndForecastTest()
448+
throws SQLException, InterruptedException {
449+
try (Connection treeConnection = EnvFactory.getEnv().getConnection(BaseEnv.TREE_SQL_DIALECT);
450+
Statement treeStatement = treeConnection.createStatement();
451+
Connection tableConnection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
452+
Statement tableStatement = tableConnection.createStatement()) {
453+
for (FakeModelInfo modelInfo : BUILTIN_LTSM_MAP.values()) {
454+
for (String devices : LTSM_LOAD_DEVICE_COMBINATIONS) {
455+
loadRunAndUnloadModelOnDevices(
456+
treeStatement, tableStatement, modelInfo.getModelId(), devices);
457+
}
458+
}
459+
}
460+
}
461+
462+
private void loadRunAndUnloadModelOnDevices(
463+
Statement treeStatement, Statement tableStatement, String modelId, String devices)
464+
throws SQLException, InterruptedException {
465+
boolean loadSubmitted = false;
466+
try {
467+
treeStatement.execute(String.format("LOAD MODEL %s TO DEVICES '%s'", modelId, devices));
468+
loadSubmitted = true;
469+
checkModelOnSpecifiedDevice(treeStatement, modelId, devices);
470+
assertLoadedModelCallInferenceSucceeds(treeStatement, modelId);
471+
assertLoadedModelForecastSucceeds(tableStatement, modelId);
472+
} finally {
473+
if (loadSubmitted) {
474+
treeStatement.execute(String.format("UNLOAD MODEL %s FROM DEVICES '%s'", modelId, devices));
475+
checkModelNotOnSpecifiedDevice(treeStatement, modelId, devices);
476+
}
477+
}
478+
}
479+
480+
private void assertLoadedModelCallInferenceSucceeds(Statement statement, String modelId)
481+
throws SQLException {
482+
String callInferenceSQL =
483+
String.format(
484+
CALL_INFERENCE_SQL_TEMPLATE,
485+
modelId,
486+
0,
487+
LOADED_MODEL_SMOKE_INPUT_LENGTH,
488+
LOADED_MODEL_SMOKE_OUTPUT_LENGTH);
489+
try (ResultSet resultSet = statement.executeQuery(callInferenceSQL)) {
490+
ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
491+
checkHeader(resultSetMetaData, "Time,output");
492+
Assert.assertEquals(Types.DOUBLE, resultSetMetaData.getColumnType(2));
493+
int count = 0;
494+
while (resultSet.next()) {
495+
resultSet.getDouble("output");
496+
count++;
497+
}
498+
Assert.assertEquals(LOADED_MODEL_SMOKE_OUTPUT_LENGTH, count);
499+
}
500+
}
501+
502+
private void assertLoadedModelForecastSucceeds(Statement statement, String modelId)
503+
throws SQLException {
504+
String forecastTableFunctionSQL =
505+
String.format(
506+
FORECAST_TABLE_FUNCTION_SQL_TEMPLATE,
507+
modelId,
508+
0,
509+
5760,
510+
LOADED_MODEL_SMOKE_INPUT_LENGTH,
511+
5760,
512+
LOADED_MODEL_SMOKE_OUTPUT_LENGTH,
513+
1,
514+
"time");
515+
try (ResultSet resultSet = statement.executeQuery(forecastTableFunctionSQL)) {
516+
int count = 0;
517+
while (resultSet.next()) {
518+
count++;
519+
}
520+
Assert.assertEquals(LOADED_MODEL_SMOKE_OUTPUT_LENGTH, count);
521+
}
522+
}
523+
441524
@Test
442525
public void concurrentForecastTest() throws SQLException, InterruptedException {
443526
for (FakeModelInfo modelInfo : CONCURRENT_FORECAST_MODELS) {

iotdb-core/ainode/iotdb/ainode/core/inference/request_scheduler/basic_request_scheduler.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
# under the License.
1717
#
1818

19-
import os
20-
2119
import psutil
2220
import torch
2321

@@ -53,23 +51,22 @@ def __init__(
5351

5452
def memory_is_available(self):
5553
if "cuda" in self.device.type:
56-
used = torch.cuda.memory_allocated(self.device)
57-
reserved = torch.cuda.memory_reserved(self.device)
54+
available, total = torch.cuda.mem_get_info(self.device)
5855
elif "cpu" in self.device.type:
59-
process = psutil.Process(os.getpid())
60-
used = process.memory_info().rss
61-
reserved = used
56+
memory = psutil.virtual_memory()
57+
available = memory.available
58+
total = memory.total
6259
else:
63-
used = 0
64-
reserved = 0
6560
logger.warning(
6661
f"[Inference] Unsupported device type: {self.device.type}. Memory checks will not be performed."
6762
)
63+
return True
6864
logger.debug(
6965
f"[Inference][Device-{self.device}][Pool-{self.pool_id}] "
70-
f"Memory used: {used/1024**2:.2f} MB, Max memory: {self.max_memory_bytes/1024**2:.2f} MB"
66+
f"Memory available: {available/1024**2:.2f} MB, Total memory: {total/1024**2:.2f} MB, "
67+
f"Required free memory: {self.max_memory_bytes/1024**2:.2f} MB"
7168
)
72-
return used < self.max_memory_bytes
69+
return available > self.max_memory_bytes
7370

7471
def schedule_activate(self) -> list:
7572
requests = []

iotdb-core/ainode/iotdb/ainode/core/model/chronos2/pipeline_chronos2.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ def forecast(self, inputs, **infer_kwargs) -> list[torch.Tensor]:
309309
test_loader = DataLoader(
310310
test_dataset,
311311
batch_size=None,
312-
pin_memory=True,
313312
shuffle=False,
314313
drop_last=False,
315314
)

0 commit comments

Comments
 (0)