python代码由cpu转成gpu运行

Numba加速Python

参考文件章1:https://blog.youkuaiyun.com/qq_28023365/article/details/87970505
参考文件章2:https://blog.youkuaiyun.com/u014636245/article/details/84404646
看起来是通过Numba模块,通过装饰器@jit实现转换
有一块样例代码:

import numpy as np
from numba import jit
import time


@jit
def sum_jit(arr):
    s_time = time.time()
    m = arr.shape[0]
    result = 0.0
    for i in range(m):
        result += arr[i]
    e_time = time.time()
    return (e_time - s_time)


def sum(arr):
    s_time = time.time()
    m = arr.shape[0]
    result = 0.0
    for i in range(m):
        result += arr[i]
    e_time = time.time()
    return (e_time-s_time)


def main():
    n = int(10.0*1e6)
    array = np.random.random(n)
    t1 = sum_jit(array)
    t2 = sum(array)
    print("Time with JIT:", t1)
    print("Time without JIT:", t2)


if __name__ == '__main__':
    main()

运行后的截图如下:
在这里插入图片描述
运行前面报了一些错,可能是我机器上是集成显卡的缘故吧,后面还要再细看

### 如何将Python代码GPU加速改为在CPU运行 为了使PyTorch代码能够在CPU环境中正常运行,而无需依赖于GPU资源,可以按照以下方法调整代码逻辑: #### 修改模型定义部分 当创建模型实例时,默认情况下它会被分配到CPU设备。但如果之前有显式的`.cuda()`调用,则需要将其替换为`.cpu()`或者完全移除这些特定的设备绑定语句。 ```python mymodule = MyModule() if torch.cuda.is_available(): mymodule = mymodule.cuda() # 如果存在此行则删除或修改成 .cpu() else: mymodule = mymodule.cpu() # 可选操作;实际上默认即处于CPU模式下[^1] ``` #### 数据加载器设置 对于数据集的数据加载过程,也需要确保所有的Tensor对象都是位于CPU上的。这通常涉及到取消任何可能存在的`pin_memory=True`选项以及避免不必要的`.to(device)`转移命令。 ```python data_loader = DataLoader(dataset, batch_size=32, shuffle=True, pin_memory=False) for data in data_loader: inputs, labels = data # 假设原先是这样做的 -> inputs, labels = inputs.to('cuda'), labels.to('cuda') outputs = mymodule(inputs) # 不再指定 device 参数 ``` #### 模型权重保存与加载处理 如果是在已有基于GPU训练完成后的模型基础上切换至仅支持CPU的新场景里执行推理或其他任务的话,那么还需要特别注意模型状态字典(`state_dict`)读取方式的选择。 ```python # 当前路径下的预训练文件可能是针对GPU环境制作出来的 checkpoint_path = './model_checkpoint.pth' device = torch.device('cpu') try: checkpoint = torch.load(checkpoint_path, map_location=device) except RuntimeError as e: raise ValueError(f"Error loading the model on CPU: {e}") new_state_dict = {} prefix_length = len("module.") for key, value in checkpoint['model'].items(): new_key = key[prefix_length:] if key.startswith("module.") else key new_state_dict[new_key] = value mymodule.load_state_dict(new_state_dict) mymodule.eval() ``` 以上脚本片段展示了如何适配由DataParallel封装过的多GPU联合工作产生的额外命名空间问题,并通过简单的字符串切片技术去除多余的前缀标记[^2]。 另外值得注意的是,在某些特殊情形之下,即使硬件条件允许同时利用多个处理器核心来提升单机性能表现,但由于框架内部实现细节等原因可能导致实际效果不如预期理想甚至更差的情况发生[^3]。因此建议开发者们始终密切关注具体应用场景的实际需求状况来进行针对性优化尝试。 最后提醒一点关于开发流程管理方面的小技巧:每当涉及不同平台间迁移调试期间最好重新构建独立虚拟隔离区以便更好地控制变量影响范围从而加快定位解决问题的速度[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值