问题

实验室一块GPU都没有怎么做深度学习?

回答
好,既然实验室一块GPU都没有,那咱们就得另辟蹊径,用咱们的智慧和现有的资源来打一场漂亮的“深度学习战役”。别担心,虽然少了这个“主力战将”,但我们可以通过一些聪明的方法,照样能让深度学习项目运转起来。

首先,得端正一个态度:没有GPU,不等于不能做深度学习。GPU是加速训练的“火箭”,但不是唯一必需品。CPU也能跑,只是速度慢很多。关键在于我们怎么利用好它,以及能不能找到替代方案。

第一招:拥抱CPU的“耐心”与“韧性”—— 让它成为你的“苦力”

别把CPU想得那么不堪。现代CPU的计算能力其实很强,尤其是在并行处理方面也有进步。虽然比GPU差了一大截,但对于初学者、实验性项目、或是模型本身规模不大(参数量不多)的情况下,CPU完全能胜任。

选择轻量级模型: 这是最直接的策略。别一开始就想着上万亿参数的巨无霸。从一些经典的、参数量相对较小的模型入手,比如:
经典的CNN模型: LeNet、AlexNet(虽然现在看有点老了,但作为入门很好)、VGG的更小版本。
简单的MLP(多层感知机): 在一些结构化数据任务上依然很有效。
轻量级RNN/LSTM: 处理序列数据,但规模不宜过大。
迁移学习的微调: 利用别人已经在大规模数据集上预训练好的模型(比如ImageNet上的ResNet、EfficientNet的小版本),只在你自己的小数据集上进行微调(finetuning)。这只需要少量的数据和计算资源,非常适合CPU环境。
优化你的代码: 即使是在CPU上跑,代码的效率也至关重要。
使用优化的深度学习框架: PyTorch、TensorFlow都有非常成熟的CPU后端优化。确保你安装的是支持CPU的版本,并且代码写得规范一些。
减少不必要的计算: 检查你的数据预处理流程,避免重复计算。
批处理(Batching)大小的调整: 在CPU上,过大的Batch Size可能会因为内存或计算调度问题反而变慢。可以尝试从小Batch Size开始,逐步找到一个平衡点。
梯度累积(Gradient Accumulation): 如果你发现小Batch Size影响模型收敛,可以考虑使用梯度累积。它模拟了大Batch Size的效果,但每次只计算小Batch的梯度,累积到一定数量后再更新权重。这会稍微增加一些计算量,但对于CPU来说是个不错的权衡。
数据生成器(Data Generators): 确保你的数据加载和预处理过程是高效的,并且使用了数据生成器(如Keras的`ImageDataGenerator`或PyTorch的`DataLoader`)。它们可以在后台异步加载和预处理数据,避免CPU在等待数据时空闲。
耐心点,多跑跑: 这个没啥好说的,就是心态要稳。一个原本GPU上几小时的训练,CPU可能需要几天甚至一周。做好这个心理准备,并且利用这段时间深入理解模型的原理、调参策略,或者思考下一步的实验设计。

第二招:发掘“云端”的免费午餐—— 拥抱在线资源

现在有很多平台提供免费或低成本的云端计算资源,这简直是“无GPU实验室”的救星。

Google Colaboratory (Colab): 这是首推的!Google Colaboratory 提供免费的 Jupyter Notebook 环境,并且免费提供 GPU 和 TPU 访问。虽然有使用时长限制,并且资源不是独占的,但对于学习、实验、跑一些中小型项目来说,它已经非常给力了。
怎么用?
注册一个Google账号。
访问 [colab.research.google.com](https://colab.research.google.com/)。
创建一个新的Notebook。
在菜单栏选择“代码运行环境” > “更改代码运行环境”。
在“硬件加速器”下拉菜单中选择“GPU”或“TPU”。
然后你就可以像在本地一样写代码,只是你的代码实际上是在Google的服务器上运行的,而且能用到GPU!
需要注意的:
运行时长限制: 单次连接最长12小时,但你可能会因为不活跃或其他原因提前断开。
资源分配: 免费的资源不是独占的,可能有人比你占用资源更多。
数据存储: Colab 的环境是临时的,你上传的数据或训练好的模型在断开连接后可能会丢失。所以,务必将重要的文件保存到Google Drive(可以挂载到Colab)、下载到本地,或者上传到其他云存储。
安装库: 大多数常用的库都已经预装好了,但如果需要安装额外的库,可以直接在Notebook里用 `!pip install ` 来安装。
Kaggle Kernels: Kaggle 是一个数据科学竞赛平台,它的Notebook环境也提供免费的GPU(和TPU)资源。
怎么用?
注册Kaggle账号。
创建一个新的Kernel(Notebook)。
在Kernel设置中启用GPU。
优势: 社区活跃,有很多开源的项目和数据集可以参考和使用。
Paperspace Gradient: 这个平台也提供免费的GPU,虽然免费额度比Colab少一些,但也是一个不错的选择。
OneDrive/Google Drive/GitHub 等配合: 如果你的模型在Colab等平台上训练好了,别忘了把模型权重、结果文件及时保存到云盘或者上传到GitHub等版本控制系统。

第三招:巧用“二手”或“借用”的力量—— 合作与共享

虽然实验室没有,但也许学校的其他院系、其他实验室,或者你们实验室的老师、师兄师姐有。

内部协调: 和实验室的老师、其他同学沟通,看看有没有闲置的GPU资源可以短暂借用。也许有人不怎么用,或者有旧的机器可以配置一下。
跨院系/校内合作: 了解一下学校其他院系(比如计算机系、人工智能学院)是否提供计算资源给其他专业的学生使用,或者能否申请到一些计算任务时间。
参加学术活动: 有些相关的学术会议或研讨会会提供一些计算资源供参与者使用,关注这些机会。

第四招:从“训练”到“理解”—— 重视理论与实验设计

没有GPU的限制,反而可以让你更专注于深度学习的“思想”和“方法论”。

深入理解模型原理: 花更多时间去研究模型的设计、激活函数的作用、损失函数的选择、优化器的原理等等。这些是绕过硬件限制的关键。
重视数据预处理和特征工程: 好的数据准备往往能让模型事半功倍,即使是CPU也能看到不错的效果。
精细调整超参数: 在有限的计算资源下,更需要精准地进行超参数搜索,而不是“暴力枚举”。可以先在小数据集上或用较小模型进行初步调参,再应用到大任务上。
阅读优秀论文和代码: 学习别人是怎么解决问题的,尤其是那些在资源受限环境下也能取得好成果的研究。

具体步骤举例说明(以使用Google Colab为例):

假设你想做一个图像分类任务,比如识别猫和狗。

1. 准备数据: 去 Kaggle 或者其他网站下载一个猫狗数据集(比如Dogs vs. Cats dataset)。
2. 搭建 Colab 环境:
打开 Google Colab。
创建一个新的 Notebook。
设置硬件加速器为 GPU。
3. 上传数据:
将你的数据集压缩成 `.zip` 文件。
在 Colab Notebook 中,使用 `google.colab.files.upload()` 函数上传这个 `.zip` 文件。
或者,更好的方式是,将数据集上传到你的Google Drive,然后在 Colab 中挂载你的Google Drive:
```python
from google.colab import drive
drive.mount('/content/drive')
```
然后你可以通过 `/content/drive/My Drive/your_dataset_folder` 来访问你的数据。
4. 安装必要的库: 大多数是自带的,但如果需要,可以:
```python
!pip install opencvpython matplotlib
```
5. 编写代码:
使用 `tf.keras` 或 `torch.nn` 来定义一个轻量级的CNN模型,比如一个只有几个卷积层和全连接层的模型。
加载和预处理数据。可以使用 `tf.keras.preprocessing.image.ImageDataGenerator` 或 PyTorch 的 `torchvision.datasets.ImageFolder` 和 `DataLoader`。
定义损失函数(如`categorical_crossentropy`)和优化器(如`Adam`)。
进行模型训练。由于是GPU,训练速度会比CPU快很多。注意设置`epochs`(训练轮数)和`batch_size`。
在训练过程中,可以每隔几轮打印一下损失和准确率,并使用 `matplotlib` 来可视化训练曲线。
保存模型: 训练完成后,务必将模型权重保存到你的Google Drive:
```python
例如 Keras
model.save('/content/drive/My Drive/my_cat_dog_model.h5')
```
6. 评估与预测: 使用测试集或新图片进行评估和预测。

总结一下:

没有GPU是挑战,但绝非绝境。把眼光放长远,利用好Colab、Kaggle等免费资源,选择合适的模型,优化代码效率,并在这个过程中深入理解深度学习的理论和实践细节。这不仅能让你完成项目,更能打下扎实的基础,为未来拥有强大计算资源时奠定优势。别怕“慢”,重要的是“思考”和“前进”。

网友意见

user avatar

想起我当年 那课题在没买那块1070之前,还真是用CPU跑的。当时机子是A卡,A卡是不能跑tensorflow的,结果拿CPU硬是连续挂机20多天。

user avatar

首先,现在有很多开源的大模型(如我们在智源研究院支持下训练发布的CPM系列模型 GitHub - TsinghuaAI/CPM)可以直接用,所以不必做算力耗费高昂的大模型预训练阶段的工作,而是聚焦在这些大模型如何发挥在下游任务的作用,也就是 fine-tuning 技术,现在已经有很多新颖的技术路线,例如 prompt tuning,特别值得深入探索;也可以探索这些大模型在对话生成等方面的创新应用,甚至可能都不需要 fine-tuning 模型参数。

当然,即使只做fine-tune或者inference,对于百亿参数规模的大模型而言仍然意味着需要大显存、高配置的GPU,不是普通研究生能够承受的,很多研究组也无法提供如此充裕的算力支持。我们也认识到,要想大模型广泛应用,就需要实现低成本计算,所以我们最近开源了百亿模型低成本推理计算的工具包BMInf,只要千元显卡(如NVIDIA GeForce GTX 1060)就能跑动百亿规模大模型

BMInf采用了模型量化和内存调度等技术(模型量化可以参考 霍华德的回答 - 实验室一块GPU都没有怎么做深度学习?),近期会整理好相关技术报告。当然,如果你有更高性能显卡那么速度会更快(性能数据如下表)。

BMInf具备以下优点:(1)硬件友好 BMInf最低支持在NVIDIA GTX 1060单卡运行百亿大模型。在此基础上,使用更好的gpu运行会有更好的性能。在显存支持进行大模型推理的情况下(如V100或A100显卡),BMInf的实现较现有PyTorch版本仍有较大性能提升。(2)开源共享 模型参数开源共享,用户在本地即可部署运行,无需访问或申请API。(3)能力全面 支持生成模型CPM-1、通用模型CPM-2、对话模型EVA,能力覆盖文本补全、文本生成与对话场景。(4)模型升级 基于持续学习推出百亿模型新升级CPM2.1,文本生成能力大幅提高。(5)应用便捷 基于工具包可以快速开发大模型相关下游应用。其他详细介绍可以参见BMInf说明文档。

在BMInf之后,我们还会继续研制和发布大模型的微调和预训练工具包,希望让更多不具备高算力的朋友用上大模型。欢迎大家关注,提出你们的宝贵意见和建议。谢谢!

user avatar

做云服务厂商的 GPU 服务器对大多数人来说都是租不起的,阿里云或 AWS 的 GPU 实例价格大家都知道的。很多学生党或者自由时间想自己做做ML和DL的同学都苦于没有廉价的平台来做实验。 Featurize 推荐一个我知道最便宜的GPU平台

实例

笔记本

数据集

习惯远程开发的同学还可以用vscode、pycharm远程开发,体验和在本地开发是一样的。另外虽然也是用了容器技术,但是所有代码、pip安装的包以及其他文件都是可以通过云端同步,每次启动新的实例不需要重复搭建环境或写代码。数据下载经过国内优化,而且所有实例都是千兆带宽。

Google Colab Pro

自从现在 Colab 越来越刷不到好机器了。。我都用 Featurize 了,清一色的 T4。

Kaggle Notebook

配置以及价格:Kaggle Notebook(之前叫 Kaggle Kernel)是专门为 Kaggle 参赛选手准备的环境,当然如果你只报个名去白嫖 GPU 也是可以的。Kaggle 提供的 GPU 是 P100,16 G 内存。但每周只有 42 个小时的免费使用时间。 使用体验:对于参赛者来说,Kaggle Notebook 使用起来还是比较方便的,由于这类产品均使用容器(Docker),数据的导入和导出都是一个比较麻烦的问题,但 Kaggle 导入自家数据集是非常快的。另外 Kaggle 提供了 Notebook 运行的版本控制,算是功能上的一个亮点。缺点是笔记本提交后看不到训练过程,也不能手动中断训练,所以代码中一定要定义最大训练的轮数,以及学习率的动态调整等。相比于本地开发,Kaggle 的 Notebook 是需要适应一下的。 开通方法:注册账号后随意参加任何一个比赛即可。

user avatar

看了一些同学们的回答,要么就是自己掏腰包买个GPU赶紧把实验做完息事宁人,要么就是各种野路子。一类是白嫖党各种云端平台跑自己模型,比如Google colab、百度AI studio。滴! 白嫖真香警告。但是这种普遍存在一个弊端就是费时间,包括上传数据,每次配置环境,整个人都头大了。要说时间对研究生来说那可是宝贵资源,每天都活在发paper的支配之下,paper早发几天说不定能延长几年寿命。另外一类就是拉赞助了,这个就是考验个人交(hu)际(you)能力啦。

话说回来,实验室没有GPU,那就用CPU来做深度学习啊~看到一位答主也很推荐用CPU做深度学习。

科研比拼的是idea,不单纯只是算力哦,有好想法一样能发好论文。为此我专门去研究了一下这个用CPU去训练模型的可行路子。下面我来介绍几个CPU就能搞定的深度学习研究领域。

实际业务场景中,大家都会遇到各种数据噪音的问题,可能是获取方式里就不可避免的带有噪音,可能是标注人员数据标注质量可能不过关、存在一些错误,也可能是数据标注的标准不统一、存在一些歧义。总之,数据噪音在AI实践过程中如影随形。QuickDraw、MNIST和Amazon Reviews等学术数据集中也存在错误标签,如下图所示。

学术界有一个专门研究如何解决噪音标签的领域,叫做带噪学习。标签带噪声的深度学习具有很大的挑战性,因为深度模型的容量非常大,以至于可以在训练时迟早记住这些带噪声的标签。

  • Co-teaching

NIPS 2018提出了一个方法叫Co-teaching,用于抵抗标签的噪声。我们同时训练两个深度神经网络,并使用“损失小”的数据进行交叉训练。

作者在MNIST,CIFAR-10和CIFAR-100的噪声版本实验表明,在训练深度模型的稳健性方面,co-teaching取得了state of the art(SOTA)的效果。MNIST,CIFAR-10和CIFAR-100训练数据5万到6万,测试数据1万,完全使用CPU就可以搞定,不需要GPU~

  • Co-teaching+

在ICML'19上,后面其他研究者又提出了Co-teaching+,在Co-teaching的基础上,又借鉴了Decoupling的“Update by Disagreement”策略,可以说是“Co-teaching + Decoupling”。Co-teaching在训练的过程中,随着epoch增加,两个模型越来越接近达成一致,但我们希望模型能够持续地训练,所以引入了“Update by Disagreement”策略来增加模型训练过程中的变化。

我们来看看Co-teaching+使用的数据集,最大的数据集是Tiny-ImageNet,用CPU完全可以搞定!

  • JoCoR

CVPR'20又有人在Co-teaching+的基础上提出了JoCoR模型。仍然用两个模型,但是两个模型的loss是一起计算且模型一起更新的。JoCoR训练的过程中有两类损失,首先是两个模型各自输出与label的交叉熵损失,然后就是两个predictions之间的距离损失。两个分类损失就不用多说了,距离损失在这里就是为了让两个模型尽可能地达成一致。直觉上,不同模型会对大多数样本的标签达成一致,而不太可能对错误的标签达成一致。这里衡量的距离损失用对称的KL散度来表示。接下来的过程就是计算loss比较小的样本,然后用来更新参数了。

当然作者也在MNIST, CIFAR-10,CIFAR-100验证了JoCoR模型的效果。看吧,依靠CPU就能把NIPS、ICML、CVPR等一系列顶会中一遍,香不香!

虽然用CPU也能发顶会,但说到选用CPU还是要选用性能强劲的。如JoCoR模型在Clothing1M数据集上验证了效果,Clothing1M有一百万上图片,没有强劲的CPU,训练起来还是有点痛苦的。

在网上看到一个医疗行业的深度学习的方案感觉还是挺有意思。医院用深度学习去对糖尿病视网膜病变和老年性黄斑变性进行筛查。在这个方案中他们也是在CPU运行Caffe架构来实现对处理对象的快速筛选。同时他们也比较了在不同CPU上运行相同代码,来观察不同CPU的处理速度。下面是三种不同CPU的处理速度对比。 通过对比我们看出就算是用CPU去做深度学习, 不同CPU之间的表现差距还是很大:最快的CPU 模型加载速度提升 100 倍,区分患者病情速度提升 7 倍。所以这里还是要劝各位处在水深火热的小伙伴们,就算用CPU硬刚,也要尽可能的选好的CPU。

  • 二值网络、三值网络

这一系列工作的出发点是随着现在模型越来越大,深度越来越深,参数越来越多,训练时间越来越长,算力显得越来越不足。在神经网络训练的整个训练过程中,浮点型数据的消耗的计算量尤其巨大,如果能把浮点计算转为定点计算,无疑能极大的提高训练效率。因为定点计算对算力的需求减少,所以用CPU也能搞定这个领域。

目前的权值简化策略大概分为三种,Binary和Ternary及 INT8。Binary是把权值简化为1和-1,而Ternary是把权值简化为1,-1,0。INT8的取值范围是 -128到127 。

title link Datasets
BNN+: Improved Binary Network Training openreview.net/pdf? CIFAR-10
Ternary Weight Networks researchgate.net/public MNIST、CIFAR-10
Towards Unified INT8 Training for Convolutional Neural Network arxiv.org/pdf/1912.1260 CIFAR-10


  • 量化训练Quantization Aware Training

量化训练是在INT8精度的基础上对模型进行量化。简称QAT(Quantization Aware Training)。量化训练是在模型训练中量化的,与训练后量化Post-Training Quantization(PTQ)不同。量化训练对模型的精度影响不大,量化后的模型速度基本与量化前的相同。

例如,使用CenterNet训练的一个网络,使用ResNet-34作为backbone,使用1024×1024作为测试图像大小的指标,精度不降反升,非常赞。

精度/指标 FP32 INT8(PTQ) INT8(QTA)
AP 0.93 0.83 0.94
速度 13ms 3.6ms 3.6ms

目前Pytorch当然也是支持QAT量化的。而且Pytorch量化训练出来的模型,目前官方只支持CPU哦,特别是专门支持了英特尔的X86的INT8指令集:

x86 CPUs with AVX2 support or higher

如上文提到的,除了模型的选用外,另外就是考虑是否可以简化自己的原始数据。传统上,深度学习的训练和推理过程大家用的是精度较高的浮点数值,例如FP32。高精度数值意味着 AI 系统会承载更大的计算、存储压力,有更高的功率消耗以及更复杂的系统设计。这种情况下肯定还是只能靠GPU往上堆了。可能有人不知道其实用INT8等低精度的定点计算在推理准确度上与32位浮点计算结果相差并不大。但是采用INT8这种低精度的定点计算,在计算速度和功率消耗上都有更好的表现。因为低精度数值可以更好地使用高速缓存,增加内存数据传输效率,减少带宽瓶颈,从而能够充分地利用计算和存储资源,并降低系统功率。某度开发了一个深度学习平台,当中发布了INT8离线量化方案。根据介绍是用了第二代英特尔® 至强® 可扩展处理器平台做的实验。利用集成的、对 INT8有优化支持的英特尔® 深度学习加速技术(VNNI 指令集),在不影响预测准确度的情况下,使多个深度学习模型在使用 INT8 时的推理速度,加速到使用 FP32 时的 2-3 倍之多。下面这张图是操作flowchart。

在推理准确度验证中,平台采用了英特尔® 至强® 金牌 6271 处理器,测试在拥有 50,0003 张图像的 Full ImageNet Val* 完整验证数据集上完成。如表 1 所示,从测试结果来看,在 ResNet-50 和 MobileNet-V1 两种模型的 TOP-1 准确率(预测出最大概率的分类是正确的概率)上,INT8 分别只有 0.4% 和 0.31% 的准确度损失4,基本可视为没有准确度损失。

在接下来的推理吞吐量(速度)性能测试中,平台采用英特尔® 至强® 金牌 6271 处理器单核部署,并根据百度的业务部署要求,Batch Size 配置为 1 来衡量吞吐量。如表 2 所示,测试结果表明,在 Full ImageNet Val 完整验证数据集上,ResNet-50 和 MobileNet-V1 两种模型的 INT8 推理吞吐量是 FP32 的 2.2 倍到 2.79 倍1。由此可见,在不影响预测准确度的情况下,使用 INT8,可让多种深度学习模型的推理速度得到显著提升。

应该说,英特尔® 数学核心函数库(Intel® Math Kernel Library,英特尔® MKL)和面向深度神经网络的英特尔® 数学核心函数库(Intel® Math Kernel Library for Deep Neural Network, 英特尔® MKL-DNN)在其中功不可没,它们的特性让某度的工程师们可以深度优化,并在自然语言处理、图像处理等模型上获得了显著的进展。

总的来说,没有GPU是不是就不能干活了?答案肯定是否定。人有多大胆地有多大产。 得敢想敢干。勇于面对困难。 没有困难也要制造困难。 就比如哪怕我有GPU,我就是想挑战一下自己的能力, 就是要用CPU把活干完。当然CPU和CPU之间也还是有差距的。在这里给朋友一句忠告:珍爱生命,谨慎选定方向。


Reference:

1、intel.cn/content/www/cn

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有