GPU加速:用cuDF、cuML批量拟合ARIMA遇错,求解决方案
大规模时间序列ARIMA预测的GPU加速问题
数据集示例
ID 2015 2016 2017 2018 2019 2020 2021 2022 1 C1 420 423 481 421 393 419 415 440 2 C2 1325 1262 1376 1370 1484 1421 1287 1400 3 C3 547 541 547 550 570 576 556 587 4 C4 349 349 375 346 374 379 433 376 5 C5 721 714 758 716 833 735 711 731 6 C6 420 423 481 421 393 419 415 440
原pandas实现(小数据量正常运行)
import numpy as np import pandas as pd from statsmodels.tsa.arima.model import ARIMA import warnings # 抑制警告 warnings.filterwarnings("ignore") # 读取CSV文件 testingR = pd.read_csv("final_dataset.csv") # 查看数据集结构 print(testingR.head()) # 拟合ARIMA模型并生成预测的函数 def fit_arima(series): # ARIMA阶数设置 order = (1, 0, 1) model = ARIMA(series, order=order) with warnings.catch_warnings(): warnings.simplefilter("ignore") fit_model = model.fit() # 生成一步预测 forecast_value = fit_model.forecast(steps=1).iloc[0] # 负预测值置0 forecast_value = max(forecast_value, 0) return forecast_value # 对每行时间序列应用预测函数 testingR['Forecast_2023'] = testingR.iloc[:, 1:].apply(fit_arima, axis=1) testingR['Forecast_2023'] = testingR['Forecast_2023'].astype(int) # 保存结果 testingR.to_csv('2023_predict.csv', index=False, encoding='utf-8-sig')
问题说明
上述代码在小数据集上运行正常,但面对1393096行×9列的大规模数据集时,pandas的逐行处理效率极低,无法完成任务。尝试用cuML+cuDF实现GPU加速,但遇到自定义函数编译错误、cuDF不兼容iterrows()等问题。
尝试的cuDF代码(存在问题)
import numpy as np import cudf from cuml.tsa import ARIMA as cumlARIMA import cupy as cp # 读取CSV文件 testingR = cudf.read_csv("final_dataset.csv") # 查看数据集结构 print(testingR.head()) # 拟合ARIMA模型并生成预测的函数 def fit_arima(row): # ARIMA阶数设置 order = (1, 0, 1) # 将行转为CuPy数组 row_cupy = cp.array(row.to_array()) # 初始化cuml ARIMA模型 model = cumlARIMA(order=order) # 拟合模型 model.fit(row_cupy) # 生成一步预测 forecast_value = model.forecast(steps=1).to_array()[0] # 负预测值置0 forecast_value = max(forecast_value, 0) return forecast_value # 对每行应用预测函数 forecast_values = testingR.apply(fit_arima, axis=1) # 添加预测结果到数据集 testingR['Forecast_2023'] = forecast_values.astype(int) # 保存结果 testingR.to_csv('2023_predict.csv', index=False, encoding='utf-8-sig')
解决方案:优化后的GPU加速代码
import cudf from cuml.tsa import ARIMA as cumlARIMA import cupy as cp # 读取大规模数据集 testingR = cudf.read_csv("final_dataset.csv") # 定义批量行处理函数,适配cuDF的apply_rows接口 def fit_arima_batch(rows, cols, out): # 固定ARIMA阶数 order = (1, 0, 1) # 遍历批量中的每一行 for i in range(rows.shape[0]): # 获取当前行的时间序列数据并转为cupy数组 ts_data = cp.array(rows[i, :]) # 初始化并拟合模型 model = cumlARIMA(order=order) model.fit(ts_data) # 生成一步预测并处理负值 forecast_result = model.forecast(steps=1).item() out[i] = max(forecast_result, 0) # 提取时间序列列(排除ID列) time_series_cols = testingR.columns[1:] # 使用apply_rows批量处理行数据,GPU加速效率远高于逐行apply testingR['Forecast_2023'] = testingR[time_series_cols].apply_rows( fit_arima_batch, incols=list(time_series_cols), outcols=dict(Forecast_2023=float), kwargs={} ).astype(int) # 保存预测结果 testingR.to_csv('2023_predict.csv', index=False, encoding='utf-8-sig')
核心优化点
- 替换
apply(axis=1)为apply_rows:cuDF的apply_rows是专为GPU行级批量处理设计的接口,避免了逐行Python函数调用的开销,大幅提升处理速度。 - 批量处理逻辑:在自定义函数中直接遍历批量行,减少数据拷贝和模型初始化的重复开销。
- 保持逻辑一致性:与原pandas代码逻辑完全对齐,确保预测结果一致。
内容的提问来源于stack exchange,提问作者Habor Faker
相关产品推荐
相关产品推荐

