《动手做科研》08. 云端上的深度学习

news2024/9/20 12:40:59

地址链接:《动手做科研》08. 云端上的深度学习
欢迎加入我的知识星球,定期分享AI论文干货知识!

导读: 当我们开始开发复杂模型时,尝试在本地计算机上训练模型通常不是一个可行的选择,因为我们本地的显存都比较受限制,而且也不是所有同学所在的实验室都有显卡资源。因此,比较推荐的方法是在线上租服务器来训练

本次教程将学习如何利用AutoDL构建解决方案,具体来说我们将探索和使用容器实例。这些课程将以现场演示/代码演练的形式进行。我们将首先完成 AutoDL 设置,在那里我们将配置并连接到实例,并介绍一些工具,这些工具可以帮助改善开发体验。

下一步将是调整现有代码,以便它可以与 GPU 一起使用,从而大大加快计算过程(例如训练模型)。同时也将讨论几种进一步加快模型训练速度的方法。最后我们将对 CheXzero 代码库进行一些实际操作:把代码添加到我们的实例中,并确保我们可以运行模型训练过程。

本教程目标

  1. 了解如何设置和连接到 AutoDL 容器实例进行深度学习。
  2. 学习如何修改深度学习代码以便在 GPU 上使用。
  3. 获得使用真实代码库运行模型训练过程的实际操作经验。

本教程内容

AutoDL 快速开始

登录网站,先注册
在这里插入图片描述

创建实例

注册后进入控制台,在我的实例菜单下,点击租用新实例

在这里插入图片描述

在租用实例页面:选择计费方式,选择合适的主机,选择要创建实例中的GPU数量,选择镜像(内置了不同的深度学习框架),最后创建即可。
在这里插入图片描述

创建完成后等待开机,今后主要用到的操作入口见截图中
在这里插入图片描述

上传数据

开机后在这个正在运行中的实例上找到快捷工具:JupyterLab,点击打开,在下面的截图中找到上传按钮,即可上传数据。
在这里插入图片描述

终端训练

在打开的JupyterLab页面中打开终端。

在这里插入图片描述

在终端中执行Python命令等完成训练

在这里插入图片描述

转换为使用 GPU

你可以使用以下命令检查远程实例的主机名以及是否加载了GPU:

nvidia-smi

这个命令非常有用,因为它可以显示你的GPU实际上是否被利用,这有助于调试机器学习程序。

环境设置

“conda list env”命令列出了实例上可用的所有conda环境。此时我们将利用我们AMI附带的“pytorch”环境,使用以下命令在终端中激活预装环境:

source activate pytorch

我们使用“source activate”而不是“conda activate”,因为在实例首次连接时需要初始化conda。因此,以下命令产生相同的效果:

conda init
conda activate pytorch
代码设置

我们将使用一些可以在此处找到的入门代码,在VS Code终端上将存储库克隆到实例上。

具体来说,我们将处理main.py文件,该文件训练一个模型。我们想比较在不同情况下运行一个epoch所需的时间。因此,第一步是修改代码以包含计时。我们将导入time,使用time.time()函数来监控每个epoch所需的时间,然后打印结果,这将在主函数内的循环中进行。

for epoch in range(1, args.epochs + 1):
    t0 = time.time()
    train(args, model, train_loader, optimizer, epoch)
    t_diff = time.time() - t0
    print(f"Elapsed time is {t_diff}")
    test_loss, test_acc = test(model, test_loader)
    scheduler.step()
添加 Wandb 日志记录

正如我们在前几讲中所做的那样,我们还将Weights and Biases合并到代码库中,以保持良好的实践。conda环境中尚未包含该库,因此我们必须在终端中键入“conda install wandb”来安装它。

main.py中,我们将导入wandb,使用配置中的训练和测试参数初始化wandb,然后记录相关信息。

wandb.init(config={"train_args": train_kwargs, "test_args": test_kwargs})
for epoch in range(1, args.epochs + 1):
    t0 = time.time()
    train(args, model, train_loader, optimizer, epoch)
    t_diff = time.time() - t0
    print(f"Elapsed time is {t_diff}")
    test_loss, test_acc = test(model, test_loader)
    scheduler.step()
    wandb.log({"test_loss": test_loss, "test_acc": test_acc, "time_taken": t_diff}, step=epoch)

我们还需要确保在循环结束时添加一个日志记录结束命令。

wandb.finish()

一旦添加了这个,我们可以运行带有wandb日志记录的代码。此时,你还可以在代码库的开头添加一个登录语句,或提前使用wandb-CLI进行登录。

GPU 调整

如果我们现在运行代码,训练时间会相当慢,在终端中运行 nvidia-smi 可以揭示一些潜在的问题,比如GPU资源利用率不足、内存耗尽或者其他进程正在竞争GPU资源等,通过分析 nvidia-smi 的输出,可以更好地优化你的训练过程,提高效率和性能。

尽管我们的实例拥有GPU,但我们仍然没有使用它们,代码本身必须设置为利用GPU。为此,我们将调整main.py文件中的现有入门代码。

附:如果我们在没有GPU的实例(如t2.micro实例类型)上运行nvidia-smi命令,它会抛出一个错误,第一件事是检查CUDA是否可用。

在解析器和参数创建并配置后,我们将在主函数中执行此检查。如果cuda可用,需要相应地定义设备,设置工作线程数和shuffle值,并更新训练和测试参数。

use_cuda = torch.cuda.is_available()
if use_cuda:
    device = torch.device("cuda")
    cuda_kwargs = {'num_workers': 1, 'shuffle': True}
    train_kwargs.update(cuda_kwargs)
    test_kwargs.update(cuda_kwargs)
else:
    device = torch.device("cpu")

接下来,我们必须将模型和数据(包括训练和测试数据)加载到设备上。这可以通过“.to(device)”函数来完成。我们可以在定义模型时将其移动到设备上。

model = Net().to(device)

在处理训练和测试函数的循环时,可以将训练和测试数据移动到设备上。我们还需要更新函数以接收设备作为输入,并在主函数的循环中调用函数时包含设备。

def train(args, model, train_loader, optimizer, epoch, device):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        ...
def test(model, test_loader, device):
    model.eval()
    test_loss = 0
    correct = 0
    with torch.no_grad():
        for data, target in test_loader:
            data, target = data.to(device), target.to(device)
            ...
def main():
    ...
    for epoch in range(1, args.epochs + 1):
        t0 = time.time()
        train(args, model, train_loader, optimizer, epoch, device)
        t_diff = time.time() - t0
        print(f"Elapsed time is {t_diff}")
        test_loss, test_acc = test(model, test_loader, device)
        scheduler.step()
        wandb.log({"test_loss": test_loss, "test_acc": test_acc, "time_taken": t_diff}, step=epoch)
    ...

现在我们使用了GPU,代码运行速度比以前快得多,每个epoch应该大约需要10秒钟来运行。

提高速度

此时,我们应该思考这个问题:如何使其更快?我们将讨论几种可能的想法。

想法1:更多的GPU

如果我们使用了所有的GPU容量,那么选择一个具有更多GPU的新实例类型可能是有益的。然而,这里并不是这种情况。

想法2:增加批处理大小以使用更多的GPU

也许我们应该尝试将批处理大小从默认的64增加到128。理由是我们只使用了约20%的GPU存储,因此我们可以在每步中使用更多的存储。我们可以通过运行以下命令来尝试这一点:

python main_working.py -batch-size=128

事实证明,这种变化可能不会对训练速度产生显著影响(可能对较小/较慢的GPU实例如P2s产生更大影响)。因为这里的模型非常小,瓶颈不在于模型计算,而在于内存瓶颈,这引出了我们的最后一个想法。

想法3:更改工作线程数

早些时候,当我们建立cuda参数时,我们将工作线程数设置为1,我们可以尝试增加这个数量。

如果我们将工作线程数设置得过高,如100可能无法工作。相反,我们应该尝试为此实例推荐的最佳数量,即16。

增加工作线程数的理由是,更多的工作线程将帮助你更快地加载数据,即在GPU完成一个小批次的前向和后向传递后,工作线程已经准备好下一个批次,而不是在上一个批次完全完成后才开始加载数据。

我们可以看到,这对数据加载器有影响,因为工作线程数作为参数传递给它。

事实证明,这种变化在缩小内存瓶颈和减少训练时间方面是有效的。此外,还可以通过多线程训练过程来优化数据加载。

跑一个实际的代码库

现在我们将过渡到处理一个代码库CDLab,我们的目标是让run_train.py文件成功运行。我们可以继续使用之前的实例,但我们将有一个新的环境代码库等。

练习:

将这个代码库参考这个具体的教程 [(HowToRunCDLab.md](github上的附带文件

在租的服务器上跑通训练和测试流程。

跑一个实际的代码库

现在我们将过渡到处理一个代码库CDLab,我们的目标是让run_train.py文件成功运行。我们可以继续使用之前的实例,但我们将有一个新的环境代码库等。

练习:

将这个代码库参考这个具体的教程 [(HowToRunCDLab.md](github上的附带文件

在租的服务器上跑通训练和测试流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1965398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

streamlit安装成功

文章目录 安装streamlit方法1:联网在线安装方法2:离线安装(无网络)安装streamlit 方法1:联网在线安装 在Anaconda的工作环境(或其他虚拟环境或真是环境,均可以)中,安装streamlit: pip install streamlit安装成功后如下图所示: 然后我们测试一下streamlit是否安装…

一文看懂什么是架构

对程序员来说,架构是一个常见词汇。如果想成为一名架构师,对架构概念的理解必须清晰。否则,在制定架构方案时,肯定会漏洞百出,问题频发,这将对你的面试、晋升和团队领导产生负面影响。 我们看下维基百科关…

地方坐标系CAD如何转成标准的国家2000

0序: 现在基本全国范围内都在逐步的应用国家2000了。不分设计院可能由于项目等原因,还在使用地方坐标系,这些地方坐标系的数据很难和标准地图进行叠加。 有些软件提供了4参数的方法来接入地方坐标系的CAD。但不是所有的软件,平台…

用manim创建坐标系

用manim创建坐标系 1.Axes._update_default_configs()的使用 构造函数: static _update_default_configs(default_configs, passed_configs) manim 是一个用于创建数学动画的 Python 库。static _update_default_configs(default_configs, passed_configs) 是 man…

每日一题 ~乘积最大子数组

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/maximum-product-subarray/description/ 题目分析 题目要求找出给定整…

车载A2B芯片AD2428 IIC功能介绍

车载A2B芯片AD2428 IIC功能介绍 一,功能描述二,架构概念2.1 I2C接口2.2 I2C时钟拉伸2.3 收发器I2C接口2.4 收发器I2C访问延迟 一,功能描述 A2B收发器在节点之间的距离上连接多通道I2S(IC间声音)同步脉冲编码调制&…

Realize LIVE 2024 | 庭田科技参与2024西门子用户大会

7月24日至25日,西门子“2024大中华区Realize LIVE用户大会”在上海盛大开幕。作为西门子在工业软件领域的年度盛会,此次大会不仅是一场科技的盛宴,更是一次探索工业未来、推动行业数智化转型的深度对话。大会以“让数字转型立现真章”为主题&…

Sonar-Scanner: 静态代码分析的利器

Sonar-Scanner: 静态代码分析的利器 懂得享受生活的过程,人生才会更有乐趣。每个人都会遇到一些陷阱,每个人都有过去,有的甚至是失败的往事。过去的错误和耻辱只能说明过去,真正能代表人一生的,是他现在和将来的作为。…

EmoBench:评估大模型的情感智能

人工智能咨询培训老师叶梓 转载标明出处 情感智能是识别、理解和管理自己和他人的情感的能力,对于塑造人际关系、改善决策和影响整体福祉至关重要。尽管情感智能系统被认为具有相似的好处,但现有研究主要集中于情绪识别,忽视了情绪调节和通过…

传知代码-上下位关系自动检测方法(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。 在自然语言处理中,上下位关系(Is-a Relations…

单链表的应用(附代码)

链表 链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。其实链表可以想象为小火车,链表比顺序表具有更好的灵活性,只需要通过指针的改变就可以实现增删查改。 这是逻辑思维下链表的样…

使用TensorRT对YOLOv8模型进行加速推理

这里使用GitHub上shouxieai的 infer框架 对YOLOv8模型进行加速推理,操作过程如下所示: 1.配置环境,依赖项,包括: (1).CUDA: 11.8 (2).cuDNN: 8.7.0 (3).TensorRT: 8.5.3.1 (4).ONNX: 1.16.0 (5).OpenCV: 4.10.0 2.clon…

redis:Linux安装redis,redis常用的数据类型及相关命令

1. 什么是NoSQL nosql[not only sql]不仅仅是sql。所有非关系型数据库的统称。除去关系型数据库之外的都是非关系数据库。 1.1为什么使用NoSQL ​ NoSQL数据库相较于传统关系型数据库具有灵活性、可扩展性和高性能等优势,适合处理非结构化和半结构化数据&#xff0c…

服务运营|摘要:INFORMS 近期收益管理(Revenue Management )相关文章

编者按: 本期涵盖了INFORMS与收益管理相关的文章及其基本信息。 Title: Online Learning for Constrained Assortment Optimization Under Markov Chain Choice Model 基于马尔可夫链选择模型的约束下选品优化的在线学习 Link: https://pubsonline.informs.org/do…

召唤生命,阻止轻生——《生命门外》

本书的目的,就是阻止自杀!拉回那些深陷在这样的思维当中正在挣扎犹豫的人,提醒他们珍爱生命,让更多的人,尤其是年轻人从执迷不悟的犹豫徘徊中幡然醒悟,回归正常的生活。 网络上抱孩子跳桥轻生的母亲&#…

Linux中gdb调试器的使用

Linux调试器:gdb gdb简介基本使用和常见的指令断点相关运行相关命令 gdb简介 我们都知道一个程序一般有两个版本分别是debug,和release版本,后者就是发布给用户的版本,而前者就是我们程序员用来调试用的版本。 他们有什么区别呢&…

Docker搭建Mysql主从复制,最新,最详细

Docker搭建Mysql主从复制,最新,最详细 这次搭建Mysql主从复制的时候,遇到不少问题,所以本次重新记录一下,使用Docker搭建一主三从的Mysql 一、Docker-Compose创建4个Mysql容器 1.1 创建对应的映射文件夹和对应的配置…

GitLab的安装步骤与代码拉取上传操作

一、GitLab的安装 详情见如下博客链接:gitlab安装 二、GitLab配置ssh key (1)打开Git Bash终端生成SSH和添加步骤 1、全局配置git用户名 git config --global user.name "xxx"注意:xxx为你自己gitlab的名字 2、全局…

JavaScript递归菜单栏

HTML就一个div大框架 <div class"treemenu"></div> 重中之重的JavaScript部分他来啦&#xff01; 注释也很清楚哟家人们&#xff01; let data; let arr []; let cons;let xhr new XMLHttpRequest(); // 设置请求方式和请求地址 xhr.open(get, ./js…

Linux上如何分析进程内存分配,优化进程内存占用大小

云计算场景下,服务器上内存宝贵,只有尽可能让服务器上服务进程占用更少的内存,方才可以提供更多的内存给虚拟机,卖给云客户。 虚拟化三大件:libvirt、qemu、kvm内存开销不小,可以优化占用更少的内存。如何找到进程内存开销的地方直观重要,以qemu为例说明。 一、查看进…