如何在英特尔显卡上使用NeuralForecast和 PyTorch Lightning(XPU / torch.xpu)?
PyTorch通过 torch.xpu 支持英特尔GPU,但PyTorch Lightning目前还没有内置的XPU加速支持。
因为NeuralForecast在内部使用Lightning,这也阻碍了它在原生XPU上的运行。
我想要一个最小可用的解决方案,适用于:
- PyTorch Lightning
Trainer - Nixtla NeuralForecast
- native
torch.xpu - 一块英特尔GPU / 单个XPU设备
- 不使用IPEX
现在最小、最干净的可行变通方案是什么?
解决方案
对于单个英特尔GPU / 单个XPU设备,一个实际可行的变通方法是使用一个小型的自定义PyTorch Lightning XPU策略,并将该策略作为一个实例传入。
参考仓库:
https://github.com/MarekOzana/lightning-neuralforecast-xpu
最快的路径:从仓库中复制 xpu_lightning.py 并把它与脚本放在同一目录旁边:
https://github.com/MarekOzana/lightning-neuralforecast-xpu/blob/main/xpu_lightning.py
然后从该文件导入 SingleXPUStrategy,并将 SingleXPUStrategy(device_index=0) 传给Lightning或 NeuralForecast。
如果你想要完整的可运行示例,而不是逐个文件手动拷贝,同一仓库也包括 minimal_lightning_xpu.py 和 minimal_neuralforecast_xpu.py。
关键思路是:
- 使用原生
torch.xpu - 将
SingleXPUStrategy(device_index=0)作为一个实例传入 - 不要使用
accelerator="xpu" - 不使用IPEX
最小化的Lightning用法:
import pytorch_lightning as L
from xpu_lightning import SingleXPUStrategy
trainer = L.Trainer(
strategy=SingleXPUStrategy(device_index=0),
devices=1,
)
最小化的NeuralForecast用法:
from neuralforecast import NeuralForecast
from neuralforecast.models import NHITS
from xpu_lightning import SingleXPUStrategy
model = NHITS(
h=12,
input_size=24,
max_steps=20,
strategy=SingleXPUStrategy(device_index=0),
devices=1,
)
nf = NeuralForecast(models=[model], freq="1d")
nf.fit(df)
这是可行的原因在于PyTorch Lightning将 accelerator="xpu" 视为字符串拒绝,但它确实接受一个已就绪的包含已使用 torch.device("xpu", device_index) 的策略实例。
我在Windows 11和 Ubuntu 25.10上,使用 torch==2.11.0+xpu、pytorch-lightning==2.6.1 和 neuralforecast==3.1.6 进行了测试。
注释:
- 临时性变通方案,直到官方对Lightning XPU的支持出现
- 仅支持单设备XPU
- NeuralForecast之所以在这里可用,是因为它将相同的Lightning策略/设备设置转发给底层的Trainer
GPU available: False, used: False仍然可以预期- 训练中的快速自检:
torch.xpu.get_device_name(0)和trainer.strategy.root_device == torch.device("xpu", 0)
我之所以发布这段内容,是因为我想让NeuralForecast在我的英特尔Arc Pro B50上运行。我猜测同样在寻找可用的Lightning / NeuralForecast XPU设置的其他人也会遇到同样的空白。我希望它能帮助那些现在在原生XPU上受阻的人。