GPU加速版本

核心计算模块的GPU加速实现

应用场景

FreeAeon-Fractal提供GPU加速版本的核心计算模块,显著提升大图像和多尺度分析的计算速度。主要应用场景包括:

支持的GPU模块

CPU模块GPU模块加速比
FAImageMFS.CFAImageMFSFAImageMFSGPU.CFAImageMFSGPU5-20x
FAImageFD.CFAImageFDFAImageFDGPU.CFAImageFDGPU3-10x
FAImageLAC.CFAImageLACFAImageLACGPU.CFAImageLACGPU5-15x
注意:实际加速比取决于图像大小、GPU型号和参数设置。

系统要求

硬件要求

软件要求

# 安装PyTorch(CUDA版本) pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# 或根据你的CUDA版本选择

# 访问 https://pytorch.org/ 获取安装命令

# 安装FreeAeon-Fractal

pip install FreeAeon-Fractal

验证CUDA可用性

import torch print(f"CUDA available: {torch.cuda.is_available()}") print(f"CUDA version: {torch.version.cuda}") print(f"GPU device: {torch.cuda.get_device_name(0)}")

调用示例

GPU加速的2D多重分形谱

import cv2 import numpy as np from FreeAeonFractal.FAImageMFSGPU import CFAImageMFSGPU

# 读取图像

gray_image = cv2.imread('./images/face.png', cv2.IMREAD_GRAYSCALE)

# 创建GPU版本(单图像默认dtype=torch.float64)

MFS = CFAImageMFSGPU( gray_image, q_list=np.linspace(-5, 5, 26), device='cuda', dtype=None # 自动:单图像float64,批处理float32 )

# 计算(GPU加速)

df_mass, df_fit, df_spec = MFS.get_mfs()

# 可视化

MFS.plot(df_mass, df_fit, df_spec)

GPU加速的分形维度

from FreeAeonFractal.FAImageFDGPU import CFAImageFDGPU from FreeAeonFractal.FAImage import CFAImage

# 图像预处理

gray_image = cv2.imread('./images/fractal.png', cv2.IMREAD_GRAYSCALE) bin_image, _ = CFAImage.otsu_binarize(gray_image)

# GPU加速计算

fd_gpu = CFAImageFDGPU(bin_image, device='cuda') fd_bc = fd_gpu.get_bc_fd() fd_dbc = fd_gpu.get_dbc_fd()

# 注意:GPU版本的p_value为None(不计算)

print(f"BC (GPU): {fd_bc['fd']:.4f}") print(f"DBC (GPU): {fd_dbc['fd']:.4f}")

GPU加速的空隙度分析

from FreeAeonFractal.FAImageLACGPU import CFAImageLACGPU

# 创建GPU版本的空隙度分析对象

lacunarity_gpu = CFAImageLACGPU( gray_image, max_scales=100, device='cuda' )

# 计算(GPU加速)

lac_result = lacunarity_gpu.get_lacunarity() fit_result = lacunarity_gpu.fit_lacunarity(lac_result)

# 可视化

lacunarity_gpu.plot(lac_result, fit_result)

使用别名简化代码

# 在代码开头使用别名,后续代码无需修改 from FreeAeonFractal.FAImageMFSGPU import CFAImageMFSGPU as CFAImageMFS from FreeAeonFractal.FAImageFDGPU import CFAImageFDGPU as CFAImageFD

# 后续代码与CPU版本完全相同

MFS = CFAImageMFS(image, q_list=np.linspace(-5, 5, 26)) df_mass, df_fit, df_spec = MFS.get_mfs()

GPU版本特有参数

1. CFAImageMFSGPU

额外参数:

- 'cuda': 使用GPU(默认) - 'cpu': 使用CPU - 'cuda:0', 'cuda:1': 指定GPU编号 示例
MFS = CFAImageMFSGPU( image, device='cuda:0', # 使用第一块GPU dtype=torch.float32, # 使用单精度 q_chunk=10, # 每次处理10个q值 )

2. CFAImageFDGPU

额外参数:

注意:GPU结果中 p_value 字段为 None(不计算)。使用 torch.quantile 进行99百分位归一化,回归使用手动OLS(不依赖SciPy)。 示例
fd_calc = CFAImageFDGPU( image, device='cuda' )

3. CFAImageLACGPU

额外参数:

注意:GPU批处理模式要求所有图像形状相同。

性能对比

测试环境

性能数据

任务CPU时间GPU时间加速比
2D多重分形谱 (q=51)45s4s11.3x
分形维度 BC8s2s4.0x
分形维度 DBC25s3s8.3x
空隙度分析35s4s8.8x

优化建议

1. 选择合适的数据类型

# 对于一般分析,float32足够且更快 MFS = CFAImageMFSGPU(image, dtype=torch.float32)

# 对于高精度要求,使用float64

MFS = CFAImageMFSGPU(image, dtype=torch.float64)

2. 批量处理多个图像

import glob

image_files = glob.glob('./images/*.png')

for img_file in image_files: image = cv2.imread(img_file, cv2.IMREAD_GRAYSCALE)

# 使用GPU加速

mfs = CFAImageMFSGPU(image, device='cuda') df_mass, df_fit, df_spec = mfs.get_mfs()

# 保存结果

df_spec.to_csv(f'{img_file}_mfs.csv')

3. 显存管理

import torch

# 清理GPU缓存

torch.cuda.empty_cache()

# 检查显存使用

print(f"Allocated: {torch.cuda.memory_allocated() / 1e9:.2f} GB") print(f"Reserved: {torch.cuda.memory_reserved() / 1e9:.2f} GB")

4. 自动设备选择

# 自动选择可用设备 device = 'cuda' if torch.cuda.is_available() else 'cpu' print(f"Using device: {device}")

MFS = CFAImageMFSGPU(image, device=device)

CPU vs GPU 使用场景

使用CPU版本:

使用GPU版本:

迁移指南

从CPU迁移到GPU

只需修改导入语句:

CPU版本
from FreeAeonFractal.FAImageMFS import CFAImageMFS from FreeAeonFractal.FAImageFD import CFAImageFD from FreeAeonFractal.FAImageLAC import CFAImageLAC

# ... 其余代码不变

GPU版本
from FreeAeonFractal.FAImageMFSGPU import CFAImageMFSGPU as CFAImageMFS from FreeAeonFractal.FAImageFDGPU import CFAImageFDGPU as CFAImageFD from FreeAeonFractal.FAImageLACGPU import CFAImageLACGPU as CFAImageLAC

# ... 其余代码完全相同!

条件导入(智能切换)

import torch

# 根据GPU可用性自动选择

if torch.cuda.is_available(): from FreeAeonFractal.FAImageMFSGPU import CFAImageMFSGPU as CFAImageMFS print("使用GPU加速") else: from FreeAeonFractal.FAImageMFS import CFAImageMFS print("使用CPU")

# 后续代码无需修改

MFS = CFAImageMFS(image, q_list=np.linspace(-5, 5, 26)) df_mass, df_fit, df_spec = MFS.get_mfs()

GPU版本类说明

1. CFAImageMFSGPU

继承自: CFAImageMFS的GPU实现 新增参数 核心优化

2. CFAImageFDGPU

继承自: CFAImageFD的GPU实现 新增参数 核心优化

3. CFAImageLACGPU

继承自: CFAImageLAC的GPU实现 新增参数 核心优化

常见问题

Q: GPU版本报错 "CUDA out of memory"?

A: 1. 减小图像尺寸 2. 使用 dtype=torch.float32 3. 减少 max_scales 参数 4. 减小 q_chunkimg_chunk 5. 清理GPU缓存:torch.cuda.empty_cache()

Q: GPU版本比CPU还慢?

A: 小图像或少量计算时,GPU初始化开销可能超过计算时间。建议图像 ≥512x512 时使用GPU。

Q: 如何在多GPU环境选择GPU?

A: 使用 device='cuda:0'device='cuda:1' 指定GPU编号。

Q: GPU版本结果与CPU版本不同?

A: 微小差异是正常的(浮点运算顺序不同)。使用 dtype=torch.float64 可提高一致性。

Q: 没有NVIDIA GPU怎么办?

A: 1. 使用CPU版本 2. 设置 device='cpu'(GPU版本会回退到CPU) 3. 考虑使用云GPU服务(Google Colab, AWS等)

最佳实践

1. 开发阶段:使用CPU版本快速测试

2. 生产环境:使用GPU版本处理大批量数据 3. 参数调优:在CPU上测试参数,在GPU上运行 4. 精度选择:单图像使用float64保证精度,批处理使用float32提升吞吐量 5. 显存监控:定期检查显存使用情况 6. 错误处理:捕获CUDA异常,优雅降级到CPU

参考资源