买不起卡…

文章目录

  • 导包
  • 准备训练数据(同单进程)
  • 构造模型(同单进程)
  • 构造训练代码(同单进程)
  • 开始训练(这里设置多进程!)
  • 验证多进程下参数的有效性
  • 完整的代码

导包

import torch.multiprocessing as mp
import torch
import torch.nn as nn
import torch.utils.data as Data

这里使用torch.multiprocessing构造多进程,与python的多进程神似

准备训练数据(同单进程)

这里使用随机数生成训练数据,就不用下载什么数据了

def get_train_data():"""得到训练数据,这里使用随机数生成训练数据,由此导致最终结果并不好"""def get_tensor_from_pd(dataframe_series) -> torch.Tensor:return torch.tensor(data=dataframe_series.values)import numpy as npimport pandas as pdfrom sklearn import preprocessing# 生成训练数据x并做归一化后,构造成dataframe格式,再转换为tensor格式df = pd.DataFrame(data=preprocessing.MinMaxScaler().fit_transform(np.random.randint(0, 10, size=(2000, 300))))y = pd.Series(list(range(2000)))return get_tensor_from_pd(df).float(), get_tensor_from_pd(y).float()

构造模型(同单进程)

这里使用一个LSTM的AutoEncoder,可以换成任何你想要训练的模型哈~,多进程与模型是什么无关

class LstmFcAutoEncoder(nn.Module):def __init__(self, input_layer=300, hidden_layer=100, batch_size=20):super(LstmFcAutoEncoder, self).__init__()self.input_layer = input_layerself.hidden_layer = hidden_layerself.batch_size = batch_sizeself.encoder_lstm = nn.LSTM(self.input_layer, self.hidden_layer, batch_first=True)self.encoder_fc = nn.Linear(self.hidden_layer, self.hidden_layer)self.decoder_lstm = nn.LSTM(self.hidden_layer, self.input_layer, batch_first=True)self.decoder_fc = nn.Linear(self.hidden_layer, self.hidden_layer)self.relu = nn.ReLU()def forward(self, input_x):input_x = input_x.view(len(input_x), 1, -1)# encoderencoder_lstm, (n, c) = self.encoder_lstm(input_x,# shape: (n_layers, batch, hidden_size)(torch.zeros(1, self.batch_size, self.hidden_layer),torch.zeros(1, self.batch_size, self.hidden_layer)))encoder_fc = self.encoder_fc(encoder_lstm)encoder_out = self.relu(encoder_fc)# decoderdecoder_fc = self.relu(self.decoder_fc(encoder_out))decoder_lstm, (n, c) = self.decoder_lstm(decoder_fc,(torch.zeros(1, 20, self.input_layer),torch.zeros(1, 20, self.input_layer)))return decoder_lstm.squeeze()

构造训练代码(同单进程)

由于多个进程之间是隔离的,因此除了模型参数会共享,其余都不共享:损失函数、优化器、迭代次数不共享

def train(model, data_loader, loss_function, optimizer, epochs):for i in range(epochs):for seq, labels in data_loader:optimizer.zero_grad()y_pred = model(seq).squeeze()  # 压缩维度:得到输出,并将维度为1的去除single_loss = loss_function(y_pred, seq)single_loss.backward()optimizer.step()

开始训练(这里设置多进程!)

if __name__ == '__main__':model = LstmFcAutoEncoder()x, y = get_train_data()

这里将data构造为DataLoader,当然不构造也可以

    train_loader = Data.DataLoader(dataset=Data.TensorDataset(x, y),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=20,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=3,  # 多进程(multiprocess)来读数据)
    # 常规训练三件套loss_function = nn.MSELoss()  # lossoptimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器epochs = 150

开始多进程的设置:

    # 多进程开始num_processes = 4  # 设置4个进程# NOTE: this is required for the ``fork`` method to workmodel.share_memory()processes = []for rank in range(num_processes):# 4 个进程,每个进程epoch为150,也就是说其实迭代了 4*150 = 600 次 !!!p = mp.Process(target=train, args=(model, train_loader, loss_function, optimizer, epochs))p.start()processes.append(p)for p in processes:p.join()

如果需要尽情压榨cpu的效率,可以修改为:

    from multiprocessing import cpu_countnum_processes = cpu_count()

验证多进程下参数的有效性

  1. 打开控制台看cpu是否多进程(当然是啦)
  2. 验证参数:在调试时打断点(建议打到61行:optimizer.step()),用一个进程迭代几轮,然后看其他每个进程的模型的参数:
    print(model.encoder_fc.state_dict()) # 看model的encoder_fc层的参数
    

完整的代码

import torch.multiprocessing as mpimport torch
import torch.nn as nn
import torch.utils.data as Datadef get_train_data():"""得到训练数据,这里使用随机数生成训练数据,由此导致最终结果并不好"""def get_tensor_from_pd(dataframe_series) -> torch.Tensor:return torch.tensor(data=dataframe_series.values)import numpy as npimport pandas as pdfrom sklearn import preprocessing# 生成训练数据x并做归一化后,构造成dataframe格式,再转换为tensor格式df = pd.DataFrame(data=preprocessing.MinMaxScaler().fit_transform(np.random.randint(0, 10, size=(2000, 300))))y = pd.Series(list(range(2000)))return get_tensor_from_pd(df).float(), get_tensor_from_pd(y).float()class LstmFcAutoEncoder(nn.Module):def __init__(self, input_layer=300, hidden_layer=100, batch_size=20):super(LstmFcAutoEncoder, self).__init__()self.input_layer = input_layerself.hidden_layer = hidden_layerself.batch_size = batch_sizeself.encoder_lstm = nn.LSTM(self.input_layer, self.hidden_layer, batch_first=True)self.encoder_fc = nn.Linear(self.hidden_layer, self.hidden_layer)self.decoder_lstm = nn.LSTM(self.hidden_layer, self.input_layer, batch_first=True)self.decoder_fc = nn.Linear(self.hidden_layer, self.hidden_layer)self.relu = nn.ReLU()def forward(self, input_x):input_x = input_x.view(len(input_x), 1, -1)# encoderencoder_lstm, (n, c) = self.encoder_lstm(input_x,# shape: (n_layers, batch, hidden_size)(torch.zeros(1, self.batch_size, self.hidden_layer),torch.zeros(1, self.batch_size, self.hidden_layer)))encoder_fc = self.encoder_fc(encoder_lstm)encoder_out = self.relu(encoder_fc)# decoderdecoder_fc = self.relu(self.decoder_fc(encoder_out))decoder_lstm, (n, c) = self.decoder_lstm(decoder_fc,(torch.zeros(1, 20, self.input_layer),torch.zeros(1, 20, self.input_layer)))return decoder_lstm.squeeze()def train(model, data_loader, loss_function, optimizer, epochs):for i in range(epochs):for seq, labels in data_loader:optimizer.zero_grad()y_pred = model(seq).squeeze()  # 压缩维度:得到输出,并将维度为1的去除single_loss = loss_function(y_pred, seq)single_loss.backward()optimizer.step()if __name__ == '__main__':model = LstmFcAutoEncoder()x, y = get_train_data()train_loader = Data.DataLoader(dataset=Data.TensorDataset(x, y),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=20,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=3,  # 多进程(multiprocess)来读数据)# 常规训练三件套loss_function = nn.MSELoss()  # lossoptimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器epochs = 150# 多进程开始# from multiprocessing import cpu_count## num_processes = cpu_count()num_processes = 4  # 4个进程# NOTE: this is required for the ``fork`` method to workmodel.share_memory()processes = []for rank in range(num_processes):# 4 个进程,每个进程epoch为150,也就是说其实迭代了 4*150 = 600 次 !!!p = mp.Process(target=train, args=(model, train_loader, loss_function, optimizer, epochs))p.start()processes.append(p)for p in processes:p.join()

pytorch 使用 CPU 多进程多核训练模型相关推荐

  1. 多CPU,多核,多进程,多线程以及进程和线程的简单理解以及区别

    当面临这些问题的时候,有两个关键词无法绕开,那就是并行和并发. 首先,要先了解几个概念: 1.进程是程序的一次执行. 2.进程是资源分配的基本单位. 3.一个进程可以包括多个线程. 4.在单CPU计算 ...

  2. 多CPU 多核CPU | 多进程 多线程 | 并行 并发

    文章目录 区分 多CPU && 多核CPU CPU缓存 并行 && 并发 多CPU && 多核CPU | 多进程 && 多线程 | 并行 ...

  3. CPU,多核,多线程,并发,并行,计算效率

    计算机原理:CPU.并发.并行.多核.多线程.多进程 0.计算机工作流程 0.0 基础概念:计算机组成 0.1 CPU(Central Processing Unit) (1)控制单元 (2)运算单元 ...

  4. 关于 CPU 的多核和超线程技术

    1. 关于 CPU 的多核和超线程技术 CPU 的物理个数由主板上的插槽数量决定,每个 CPU 可以有多核心,每核心可能会有多线程. 多核 CPU 的每核(每核都是一个小芯片),在 OS 看来都是一个 ...

  5. CPU单核多核区别【转载】

    CPU个数.CPU核心数.CPU线程数 我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之 ...

  6. 多线程与单核cpu,多核cpu概念

    1.多线程在单核和多核CPU上的执行效率问题的讨论  a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个执行而已,其实并没有快(反而慢)  多个cpu的话就可以在两个cpu中同时执 ...

  7. 对多线程程序,单核cpu与多核cpu如何工作相关的探讨

    对多线程程序,单核cpu与多核cpu如何工作相关的探讨 我们程序员在编码的时候,涉及到技术方案时,往往会忽略掉代码对性能方面的影响,或者没有足够的敏感度来帮助自己判断自己的技术方案对系统性能造成的影响 ...

  8. 对于多线程程序,单核cpu与多核cpu是怎么工作的

    此文中的大部分资料来自于网络上,我只是觉得把有道理的整理一下,方便以后查阅. 1.多线程在单核和多核CPU上的执行效率问题的讨论 a1: 多线程在单cpu中其实也是顺序执行的,不过系统可以帮你切换那个 ...

  9. 单核CPU与多核CPU工作原理

    单核CPU与多核CPU工作原理 今天要介绍一下单核CPU和单核(超时间轴)CPU以及多核CPU的工作原理 一.单核CPU 起源: CPU的起源是1971年英特尔公司推出,由此正式宣告计算机的诞生,可以 ...

最新文章

  1. 游戏中的对象资源信息管理
  2. antd 怎么用ajax,react+dva+antd接口调用方式
  3. arduino扩展板的使用_如何使用Arduino和React为烧烤构建仪表板
  4. ogg 登录mysql报字符集_mysqldump之字符集问题解决
  5. Java Web-网页基础-HTML-CSS
  6. 我们需要什么样的字段类型?
  7. 笨办法学 Python · 续 第七部分:大作业
  8. practice:在win2008R2上使用(NLB)网络负载均衡
  9. VBF BETA 1.5 发布了
  10. 用QFileDialog::getOpenFileUrls打开本地文件:指定路径
  11. (转)姚期智:呼之欲出的量子计算机,和它漫长的最后一英里(全文)
  12. 百度网盘加速教程(绝对有效)
  13. Android直接回复通知
  14. Win7系统C盘空间太小怎么扩容【系统天地】
  15. 浏览器被hao123劫持
  16. python pip安装pymssql_pip安装pymssql模块时报错“PEP 517”怎样处理
  17. Pthon画皮卡丘源码
  18. 牛客网小白二(2018.4.21)
  19. arcmap 报错 add field failed
  20. 苹果6plus几核处理器_全是回忆!苹果12年进化史:21部iPhone你用过哪一款?

热门文章

  1. promise用法_图解 Promise 实现原理(一)—— 基础实现
  2. UE4 Blueprint编译过程
  3. iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题
  4. 关于UNIX功能测试宏
  5. 1467: C语言实验题――两个数最大
  6. 剧情很有趣:安全专家被骗记
  7. 选择不相交区间(贪心:求不相交区间最多个数)
  8. 组件开发之Asp.net服务器控件Collection[集合]属性的设计时支持--编辑、保存
  9. break和continue区别python_1、Python中break和continue的区别
  10. spark任务shell运行_Spark原理与实战(七)部署模式与运行机制