You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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')

核心优化点

  1. 替换apply(axis=1)为apply_rows:cuDF的apply_rows是专为GPU行级批量处理设计的接口,避免了逐行Python函数调用的开销,大幅提升处理速度。
  2. 批量处理逻辑:在自定义函数中直接遍历批量行,减少数据拷贝和模型初始化的重复开销。
  3. 保持逻辑一致性:与原pandas代码逻辑完全对齐,确保预测结果一致。

内容的提问来源于stack exchange,提问作者Habor Faker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:04:53