模型训练遇到数据量太大而导致内存不够问题?今天教你一招

这篇具有很好参考价值的文章主要介绍了模型训练遇到数据量太大而导致内存不够问题?今天教你一招。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在比赛和工作中,我们经常会遇到数据量太大而导致内存不够的问题。这里可以细分为两种情况:

  • 情况1:数据太大,无法加载到内存;

  • 情况2:加载数据但训练时内存不够;

针对情况1可以考虑使用Spark或者Dask来逐步完成计算。对于情况2,则需要考虑从模型的角度入手。

本文将介绍在sklearn中支持迭代训练的模型,然后展示相关的代码案例。喜欢本文记得收藏、点赞。

模块划分

sklearn中的多个模块都支持迭代进行训练 & 拟合,如果按照模块进行划分汇总如下:

# 线性模型
sklearn.linear_model.LogisticRegression
sklearn.linear_model.LogisticRegressionCV
sklearn.linear_model.PassiveAggressiveClassifier
sklearn.linear_model.PassiveAggressiveRegressor
sklearn.linear_model.Perceptron
sklearn.linear_model.SGDClassifier
sklearn.linear_model.SGDOneClassSVM
sklearn.linear_model.SGDRegressor

# 贝叶斯模型
sklearn.naive_bayes.BernoulliNB
sklearn.naive_bayes.CategoricalNB
sklearn.naive_bayes.ComplementNB
sklearn.naive_bayes.GaussianNB
sklearn.naive_bayes.MultinomialNB

# SVM模型
sklearn.svm.LinearSVC

# 神经网络
sklearn.neural_network.BernoulliRBM
sklearn.neural_network.MLPClassifier
sklearn.neural_network.MLPRegressor

# 多分类 & 多输出模型
sklearn.multiclass.OneVsOneClassifier
sklearn.multiclass.OneVsRestClassifier
sklearn.multioutput.MultiOutputClassifier
sklearn.multioutput.MultiOutputRegressor

# 特征提取 & 特征筛选
sklearn.feature_extraction.text.HashingVectorizer
sklearn.feature_selection.SelectFromModel

# 数据预处理
sklearn.preprocessing.MaxAbsScaler
sklearn.preprocessing.MinMaxScaler
sklearn.preprocessing.StandardScaler

这里支持的模块有什么共同点呢?主要是他们都支持partial_fit方法,也就是多次训练的过程。

更多的介绍可以参考:https://scikit-learn.org/stable/search.html?q=partial_fit

分类案例

首先我们构建一个样例数据集,并将数据转换为多批量的形式,这里批量可以自定义,可以写在循环内部,也可以提前对数据维度进行转换。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import SGDClassifier

# 产生数据集
X, Y = datasets.make_classification(n_samples=32000, n_features=30, n_informative=20, n_classes=2)
# 划分测试集
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, train_size=0.9, random_state=123)

# 将数据集组织成批量的形式
X_train, X_test = X_train.reshape(-1,32,30), X_test.reshape(-1,32,30)
Y_train, Y_test = Y_train.reshape(-1,32), Y_test.reshape(-1,32)

# 加载模型
classifier = SGDClassifier(random_state=123)
# 迭代训练,epoch维度
epochs = 10
for k in range(epochs):
    # 迭代训练,batch维度
    for i in range(X_train.shape[0]):
        X_batch, Y_batch = X_train[i], Y_train[i]
        classifier.partial_fit(X_batch, Y_batch, classes=list(range(2)))

聚类案例

与分类案例类似,我们首先需要构建一个聚类数据集,然后转换维度。

from sklearn.cluster import MiniBatchKMeans

# 加载模型
clustering_algo = MiniBatchKMeans(n_clusters=5, random_state=123)
# 迭代训练,epoch维度
epochs = 10
for k in range(epochs):
    # 迭代训练,batch维度
    for i in range(X_train.shape[0]):
        X_batch, Y_batch = X_train[i], Y_train[i]
        clustering_algo.partial_fit(X_batch, Y_batch)

预处理案例

与分类案例类似,我们首先需要构建一个预处理数据集,然后转换维度。

from sklearn.preprocessing import StandardScaler

# 加载预处理方法
scaler = StandardScaler()
# 迭代,epoch维度
for i in range(X_train.shape[0]):
    # 迭代,batch维度
    X_batch, Y_batch = X_train[i], Y_train[i]
    scaler.partial_fit(X_batch, Y_batch)

降维案例

与分类案例类似,我们首先需要构建一个待降维数据集,然后转换维度。

from sklearn.decomposition import IncrementalPCA

# 加载降维方法
pca = IncrementalPCA(n_components=20)
# 迭代,epoch维度
for i in range(X_train.shape[0]):
    # 迭代,batch维度
    X_batch, Y_batch = X_train[i], Y_train[i]
    pca.partial_fit(X_batch, Y_batch) ## Partially fitting data in batches

使用总结

sklearn中不少模块支持迭代训练和处理,特点是这些模块包含partial_fit方法。

在使用过程中需要考虑处理数据集为多批次的过程,需要考虑批大小和批个数,同时也需要考虑对最终精度的影响。

与使用全量数据的处理相比,使用迭代训练和处理在效果和精度上可能会稍差,但可以在内存有限的情况下使用。文章来源地址https://www.toymoban.com/news/detail-444572.html

到了这里,关于模型训练遇到数据量太大而导致内存不够问题?今天教你一招的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • pytorch 训练过程内存泄露/显存泄露debug记录:dataloader和dataset导致的泄露

    微调 mask-rcnn 代码,用的是 torchvision.models.detection.maskrcnn_resnet50_fpn 代码,根据该代码的注释,输入应该是: images, targets=None (List[Tensor], Optional[List[Dict[str, Tensor]]]) - Tuple[Dict[str, Tensor], List[Dict[str, Tensor]]] 所以我写的 dataset 是这样的: 大概思路是: 先把所有的标注信息读入内存

    2024年02月14日
    浏览(38)
  • git克隆仓库太大导致报错失败

    公司git仓库非常大导致clone不下来(https),每次临近结束的时候就会报错: 后更换为ssh方式也clone失败,后来实在没办法,就想着能否用一个分支clone一个分支。这么做的优点是只clone一个分支,速度快。缺点是,不能切换分支,要使用某个分支的时候,只能按照这个方法重新把

    2024年02月12日
    浏览(35)
  • 解决时间差太大导致Windows无法同步时间

    按微软文档进入注册表修改: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeConfig MaxPosPhaseCorrection和MaxNegPhaseCorrection为:0xffffffff (8个F) 但是发现W32TimeConfig里面是空的,而且无法创建 查看config目录权限,发现权限丢失,重新继承权限后修改成功。 另外设置同步时间间隔

    2024年02月16日
    浏览(59)
  • 现有的通用模型中融入少量中文数据没有太大意义&少量的数据就能影响整个大模型

    相关链接:只修改一个关键参数,就会毁了整个百亿参数大模型? | 新程序员-CSDN博客 现象 1:mBERT 模型的跨语言迁移 现象 2:大语言模型同样存在显著的语言对齐 现象 3:知识与语言分离 现象 4:语义和词形对齐 现象 5:少量的数据就能影响整个大模型 现象 6:大语言模型

    2024年02月20日
    浏览(32)
  • 训练模型时 遇到速度过慢时的深思 & 速度提升 (From GPU & CPU)

    torch.nn.DataParallel 在使用多GPU的时候, 使用os.environ[‘CUDA_VISIBLE_DEVICES’]来限制使用的GPU个数 例如我要使用第0和第3编号的GPU, 那么只需要在程序中设置: Note: 这个参数的设定要保证在模型加载到gpu上之前, 一般在程序开始的时候就设定好这个参数 之后, 将模型加载到多GPU上面 如

    2024年01月24日
    浏览(33)
  • 省显存(内存?)的大语言模型(LLMs)训练/微调/推理方法

    即使 RTX 3090 有着 24GB 的 RAM,使用一块 RTX 3090 依然无法 fp32 精度训练最小号的 LLaMA-6B。 估算模型所需的RAM 首先,需要了解如何根据参数量估计模型大致所需的 RAM,这在实践中有很重要的参考意义。需要通过估算设置 batch_size,设置模型精度,选择微调方法和参数分布方法等

    2024年02月09日
    浏览(35)
  • yolov8训练自己的数据集遇到的问题

    **方法一:**根据本地模型配置文件.yaml可以设置nc 但是,这里无法用到预训练模型.pt模型文件,预训练模型的权重参数是在大数据集上训练得到的,泛化性能可能比较好,所以,下载了官方的分类模型yolov8n-cls.pt(这里实际上经过验证可以通过其它方法利用yaml方法加载预训练

    2023年04月26日
    浏览(46)
  • mybatis批量插入数据导致系统OOM,微服务内存爆了

    今天我们来说说工作中遇到的一个真实案例,由于使用mybatis的批量插入功能,导致系统内存溢出OOM(Out Of Memory), \\\"java.lang.OutOfMemoryError: Java heap space\\\"的报错,导致服务出现短暂的服务不可用,大概一两分钟不可用。这其实是个非常危险的故障,可能在高峰期导致整个系统瘫

    2024年02月01日
    浏览(41)
  • 案例15-ArrayList线程不安全,共用全局变量导致数据错乱问题,占用内存情况

    存入redis的值,可能会出现错误的情况。如果出现错误,接口将会报错。 多个方法一起修改一个 公共变量 的值,造成数据混乱,导致存入redis中的key值错误 还有每次登陆都会重现创建一个对象,放到公共变量中,遇到并发,对象会被大量地创建, 上一个对象会失去引用,等

    2024年02月02日
    浏览(37)
  • PyTorch读取数据集全部进内存,使网络的训练速度提高10倍以上!!!

    正常情况下,torch读取数据的时候是Batch Size小批量读取。 首先找到所有数据集的路径保持到一个变量中,之后需要读取哪个数据的时候,就根据这个变量中的路径索引去读取。因为硬件的限制,从硬盘中读取数据到显存中所花的时间要远远大于从内存中读取数据到显存中。因

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包