前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kaggle免费GPU使用攻略

Kaggle免费GPU使用攻略

作者头像
lyhue1991
发布于 2023-02-23 04:03:56
发布于 2023-02-23 04:03:56
5.1K00
代码可运行
举报
运行总次数:0
代码可运行

公众号后台回复关键词:gpu,获取B站视频演示教程。

一,注册Kaggle

在国内使用邮箱注册kaggle时会遇到一个人机验证的步骤,可以通过翻墙访问外网的方式完成,但比较麻烦。

推荐使用FireFox浏览器,下载Header Editor进行解决,无需翻墙相对简单。

1,下载安装FireFox浏览器

2,添加Header Editor浏览器插件【找到FireFox浏览器的 工具 -> 扩展和主题 —> 搜索 Header Editor -> 添加到FireFox】

3,配置Header Editor插件【找到FireFox右上角Header Editor -> 导出和导入 -> 下载规则中输入如下规则url -> 点击向下箭头加载 】

规则url: https://azurezeng.github.io/static/HE-GoogleRedirect.json

4,在kaggle官网用邮箱正常注册kaggle即可。

kaggle官网:https://www.kaggle.com/

5,此后就可以在任何能联网的地方正常登录kaggle,不再需要Header Editor了

二,设置GPU

1,新建notebook. 【点击kaggle主页面左上角+, 选择notebook】

2,开启GPU开关。【点击展开notebook右上角 |< 设置,设置Accelerator为GPU 】

3,查看GPU信息。【NoteBook中使用 nvidia-smi查看】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!nvidia-smi 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch 
torch.cuda.is_available() 

三,上传数据

1,点击展开notebook右上角 |< 设置,找到 Add Data,可以从Kaggle社区发布的数据集中选择一些想要的数据集。

2,也可以选在代表上传的向上箭头,上传数据集文件作为自定义数据集。建议压缩后上传,传输效率较高。

3,此外,也可以通过把数据放在github项目中,用git clone的方式获取。

4,notebook加载进来数据集后,可以在右边数据文件位置点击获取对应路径。

公众号 算法美食屋 回复关键词:pytorch, 获取本范例所用数据集eat_pytorch_datasets百度云盘下载链接。

四,CPU训练代码

约14s一个Epoch

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch 
from torch import nn
from torch.utils.data import Dataset,DataLoader
from torchvision import transforms as T
from torchvision import datasets 


#======================================================================
# 一,准备数据
#======================================================================

transform_img = T.Compose(
    [T.ToTensor()])

def transform_label(x):
    return torch.tensor(x)

ds_train = datasets.ImageFolder("../input/eat-pytorch-datasets/eat_pytorch_datasets/cifar2/train/",
            transform = transform_img,target_transform = transform_label)
ds_val = datasets.ImageFolder("../input/eat-pytorch-datasets/eat_pytorch_datasets/cifar2/test/",
            transform = transform_img,target_transform = transform_label)
print(ds_train.class_to_idx)

dl_train = DataLoader(ds_train,batch_size = 50,shuffle = True, pin_memory=True, num_workers = 8)
dl_val = DataLoader(ds_val,batch_size = 50,shuffle = False, pin_memory=True, num_workers = 8)


%matplotlib inline
%config InlineBackend.figure_format = 'svg'

#查看部分样本
from matplotlib import pyplot as plt 

plt.figure(figsize=(8,8)) 
for i in range(9):
    img,label = ds_train[i]
    img = img.permute(1,2,0) 
    ax=plt.subplot(3,3,i+1)
    ax.imshow(img.numpy())
    ax.set_title("label = %d"%label.item())
    ax.set_xticks([])
    ax.set_yticks([]) 
plt.show()

# Pytorch的图片默认顺序是 Batch,Channel,Width,Height
for features,labels in dl_train:
    print(features.shape,labels.shape) 
    break
    
    
    

#======================================================================
# 二,定义模型
#======================================================================

class Net(nn.Module):
    
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3,out_channels=32,kernel_size = 3)
        self.pool = nn.MaxPool2d(kernel_size = 2,stride = 2)
        self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size = 5)
        self.dropout = nn.Dropout2d(p = 0.1)
        self.adaptive_pool = nn.AdaptiveMaxPool2d((1,1))
        self.flatten = nn.Flatten()
        self.linear1 = nn.Linear(64,32)
        self.relu = nn.ReLU()
        self.linear2 = nn.Linear(32,2)
        
    def forward(self,x):
        x = self.conv1(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = self.pool(x)
        x = self.dropout(x)
        x = self.adaptive_pool(x)
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.relu(x)
        x = self.linear2(x)
        return x 
        
net = Net()
print(net)




#======================================================================
# 三,训练模型(CPU)
#======================================================================


import os,sys,time
import numpy as np
import pandas as pd
import datetime 
from tqdm import tqdm 

import torch
from torch import nn 
from copy import deepcopy
from torchmetrics import Accuracy
#注:多分类使用torchmetrics中的评估指标,二分类使用torchkeras.metrics中的评估指标

def printlog(info):
    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print("\n"+"=========="*8 + "%s"%nowtime)
    print(str(info)+"\n")
    

net = Net()

loss_fn = nn.CrossEntropyLoss()
optimizer= torch.optim.Adam(net.parameters(),lr = 0.01)   
metrics_dict = {"acc":Accuracy()}

epochs = 5 
ckpt_path='checkpoint.pt'

#early_stopping相关设置
monitor="val_acc"
patience=3
mode="max"

history = {}

for epoch in range(1, epochs+1):
    printlog("Epoch {0} / {1}".format(epoch, epochs))

    # 1,train -------------------------------------------------  
    net.train()
    
    total_loss,step = 0,0
    
    loop = tqdm(enumerate(dl_train), total =len(dl_train))
    train_metrics_dict = deepcopy(metrics_dict) 
    
    for i, batch in loop: 
        
        features,labels = batch
        #forward
        preds = net(features)
        loss = loss_fn(preds,labels)
        
        #backward
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
            
        #metrics
        step_metrics = {"train_"+name:metric_fn(preds, labels).item() 
                        for name,metric_fn in train_metrics_dict.items()}
        
        step_log = dict({"train_loss":loss.item()},**step_metrics)

        total_loss += loss.item()
        
        step+=1
        if i!=len(dl_train)-1:
            loop.set_postfix(**step_log)
        else:
            epoch_loss = total_loss/step
            epoch_metrics = {"train_"+name:metric_fn.compute().item() 
                             for name,metric_fn in train_metrics_dict.items()}
            epoch_log = dict({"train_loss":epoch_loss},**epoch_metrics)
            loop.set_postfix(**epoch_log)

            for name,metric_fn in train_metrics_dict.items():
                metric_fn.reset()
                
    for name, metric in epoch_log.items():
        history[name] = history.get(name, []) + [metric]
        

    # 2,validate -------------------------------------------------
    net.eval()
    
    total_loss,step = 0,0
    loop = tqdm(enumerate(dl_val), total =len(dl_val))
    
    val_metrics_dict = deepcopy(metrics_dict) 
    
    with torch.no_grad():
        for i, batch in loop: 

            features,labels = batch
            
            #forward
            preds = net(features)
            loss = loss_fn(preds,labels)

            #metrics
            step_metrics = {"val_"+name:metric_fn(preds, labels).item() 
                            for name,metric_fn in val_metrics_dict.items()}

            step_log = dict({"val_loss":loss.item()},**step_metrics)

            total_loss += loss.item()
            step+=1
            if i!=len(dl_val)-1:
                loop.set_postfix(**step_log)
            else:
                epoch_loss = (total_loss/step)
                epoch_metrics = {"val_"+name:metric_fn.compute().item() 
                                 for name,metric_fn in val_metrics_dict.items()}
                epoch_log = dict({"val_loss":epoch_loss},**epoch_metrics)
                loop.set_postfix(**epoch_log)

                for name,metric_fn in val_metrics_dict.items():
                    metric_fn.reset()
                    
    epoch_log["epoch"] = epoch           
    for name, metric in epoch_log.items():
        history[name] = history.get(name, []) + [metric]

    # 3,early-stopping -------------------------------------------------
    arr_scores = history[monitor]
    best_score_idx = np.argmax(arr_scores) if mode=="max" else np.argmin(arr_scores)
    if best_score_idx==len(arr_scores)-1:
        torch.save(net.state_dict(),ckpt_path)
        print("<<<<<< reach best {0} : {1} >>>>>>".format(monitor,
             arr_scores[best_score_idx]),file=sys.stderr)
    if len(arr_scores)-best_score_idx>patience:
        print("<<<<<< {} without improvement in {} epoch, early stopping >>>>>>".format(
            monitor,patience),file=sys.stderr)
        break 
    net.load_state_dict(torch.load(ckpt_path))
    
dfhistory = pd.DataFrame(history)



五,GPU训练代码

约8s一个Epoch.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import torch 
from torch import nn
from torch.utils.data import Dataset,DataLoader
from torchvision import transforms as T
from torchvision import datasets 


#======================================================================
# 一,准备数据
#======================================================================

transform_img = T.Compose(
    [T.ToTensor()])

def transform_label(x):
    return torch.tensor(x)

ds_train = datasets.ImageFolder("../input/eat-pytorch-datasets/eat_pytorch_datasets/cifar2/train/",
            transform = transform_img,target_transform = transform_label)
ds_val = datasets.ImageFolder("../input/eat-pytorch-datasets/eat_pytorch_datasets/cifar2/test/",
            transform = transform_img,target_transform = transform_label)
print(ds_train.class_to_idx)

dl_train = DataLoader(ds_train,batch_size = 50,shuffle = True, pin_memory=True, num_workers = 8)
dl_val = DataLoader(ds_val,batch_size = 50,shuffle = False, pin_memory=True, num_workers = 8)



%matplotlib inline
%config InlineBackend.figure_format = 'svg'

#查看部分样本
from matplotlib import pyplot as plt 

plt.figure(figsize=(8,8)) 
for i in range(9):
    img,label = ds_train[i]
    img = img.permute(1,2,0) 
    ax=plt.subplot(3,3,i+1)
    ax.imshow(img.numpy())
    ax.set_title("label = %d"%label.item())
    ax.set_xticks([])
    ax.set_yticks([]) 
plt.show()

# Pytorch的图片默认顺序是 Batch,Channel,Width,Height
for features,labels in dl_train:
    print(features.shape,labels.shape) 
    break
    
    
    

#======================================================================
# 二,定义模型
#======================================================================

class Net(nn.Module):
    
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3,out_channels=32,kernel_size = 3)
        self.pool = nn.MaxPool2d(kernel_size = 2,stride = 2)
        self.conv2 = nn.Conv2d(in_channels=32,out_channels=64,kernel_size = 5)
        self.dropout = nn.Dropout2d(p = 0.1)
        self.adaptive_pool = nn.AdaptiveMaxPool2d((1,1))
        self.flatten = nn.Flatten()
        self.linear1 = nn.Linear(64,32)
        self.relu = nn.ReLU()
        self.linear2 = nn.Linear(32,2)
        
    def forward(self,x):
        x = self.conv1(x)
        x = self.pool(x)
        x = self.conv2(x)
        x = self.pool(x)
        x = self.dropout(x)
        x = self.adaptive_pool(x)
        x = self.flatten(x)
        x = self.linear1(x)
        x = self.relu(x)
        x = self.linear2(x)
        return x 
        
net = Net()
print(net)




#======================================================================
# 三,训练模型(CPU)
#======================================================================


import os,sys,time
import numpy as np
import pandas as pd
import datetime 
from tqdm import tqdm 

import torch
from torch import nn 
from copy import deepcopy
from torchmetrics import Accuracy
#注:多分类使用torchmetrics中的评估指标,二分类使用torchkeras.metrics中的评估指标

def printlog(info):
    nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print("\n"+"=========="*8 + "%s"%nowtime)
    print(str(info)+"\n")
    

net = Net()

loss_fn = nn.CrossEntropyLoss()
optimizer= torch.optim.Adam(net.parameters(),lr = 0.01)   
metrics_dict = {"acc":Accuracy()}


#------------------------------移动模型到GPU------------------------------
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
net.to(device)
loss_fn.to(device)
for name,fn in metrics_dict.items():
    fn.to(device)
#-------------------------------------------------------------------------


epochs = 5
ckpt_path='checkpoint.pt'

#early_stopping相关设置
monitor="val_acc"
patience=3
mode="max"

history = {}

for epoch in range(1, epochs+1):
    printlog("Epoch {0} / {1}".format(epoch, epochs))

    # 1,train -------------------------------------------------  
    net.train()
    
    total_loss,step = 0,0
    
    loop = tqdm(enumerate(dl_train), total =len(dl_train))
    train_metrics_dict = deepcopy(metrics_dict) 
    
    for i, batch in loop: 
        
        features,labels = batch
        
        #------------------------------移动数据到GPU------------------------------
        features = features.to(device)
        labels = labels.to(device)
        #-------------------------------------------------------------------------
        
        #forward
        preds = net(features)
        loss = loss_fn(preds,labels)
        
        #backward
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
            
        #metrics
        step_metrics = {"train_"+name:metric_fn(preds, labels).item() 
                        for name,metric_fn in train_metrics_dict.items()}
        
        step_log = dict({"train_loss":loss.item()},**step_metrics)

        total_loss += loss.item()
        
        step+=1
        if i!=len(dl_train)-1:
            loop.set_postfix(**step_log)
        else:
            epoch_loss = total_loss/step
            epoch_metrics = {"train_"+name:metric_fn.compute().item() 
                             for name,metric_fn in train_metrics_dict.items()}
            epoch_log = dict({"train_loss":epoch_loss},**epoch_metrics)
            loop.set_postfix(**epoch_log)

            for name,metric_fn in train_metrics_dict.items():
                metric_fn.reset()
                
    for name, metric in epoch_log.items():
        history[name] = history.get(name, []) + [metric]
        

    # 2,validate -------------------------------------------------
    net.eval()
    
    total_loss,step = 0,0
    loop = tqdm(enumerate(dl_val), total =len(dl_val))
    
    val_metrics_dict = deepcopy(metrics_dict) 
    
    with torch.no_grad():
        for i, batch in loop: 

            features,labels = batch
            
            #------------------------------移动数据到GPU------------------------------
            features = features.to(device)
            labels = labels.to(device)
            #-------------------------------------------------------------------------
            
            #forward
            preds = net(features)
            loss = loss_fn(preds,labels)

            #metrics
            step_metrics = {"val_"+name:metric_fn(preds, labels).item() 
                            for name,metric_fn in val_metrics_dict.items()}

            step_log = dict({"val_loss":loss.item()},**step_metrics)

            total_loss += loss.item()
            step+=1
            if i!=len(dl_val)-1:
                loop.set_postfix(**step_log)
            else:
                epoch_loss = (total_loss/step)
                epoch_metrics = {"val_"+name:metric_fn.compute().item() 
                                 for name,metric_fn in val_metrics_dict.items()}
                epoch_log = dict({"val_loss":epoch_loss},**epoch_metrics)
                loop.set_postfix(**epoch_log)

                for name,metric_fn in val_metrics_dict.items():
                    metric_fn.reset()
                    
    epoch_log["epoch"] = epoch           
    for name, metric in epoch_log.items():
        history[name] = history.get(name, []) + [metric]

    # 3,early-stopping -------------------------------------------------
    arr_scores = history[monitor]
    best_score_idx = np.argmax(arr_scores) if mode=="max" else np.argmin(arr_scores)
    if best_score_idx==len(arr_scores)-1:
        torch.save(net.state_dict(),ckpt_path)
        print("<<<<<< reach best {0} : {1} >>>>>>".format(monitor,
             arr_scores[best_score_idx]),file=sys.stderr)
    if len(arr_scores)-best_score_idx>patience:
        print("<<<<<< {} without improvement in {} epoch, early stopping >>>>>>".format(
            monitor,patience),file=sys.stderr)
        break 
    net.load_state_dict(torch.load(ckpt_path))
    
dfhistory = pd.DataFrame(history)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法美食屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
30分钟吃掉DQN算法
表格型方法存储的状态数量有限,当面对围棋或机器人控制这类有数不清的状态的环境时,表格型方法在存储和查找效率上都受局限,DQN的提出解决了这一局限,使用神经网络来近似替代Q表格。
lyhue1991
2023/09/05
2950
30分钟吃掉DQN算法
深度学习里面有没有支持Multi-GPU-DDP模式的pytorch模型训练代码模版?
一般pytorch需要用户自定义训练循环,可以说有1000个pytorch用户就有1000种训练代码风格。
lyhue1991
2023/02/23
7080
深度学习里面有没有支持Multi-GPU-DDP模式的pytorch模型训练代码模版?
Q-learning解决悬崖问题
Q-learning是一个经典的强化学习算法,是一种基于价值(Value-based)的算法,通过维护和更新一个价值表格(Q表格)进行学习和预测。
lyhue1991
2023/09/05
3870
Q-learning解决悬崖问题
炼丹5至7倍速,使用Mac M1 芯片加速pytorch完全指南
2022年5月,PyTorch官方宣布已正式支持在M1芯片版本的Mac上进行模型加速。官方对比数据显示,和CPU相比,M1上炼丹速度平均可加速7倍。
lyhue1991
2023/02/23
16.4K2
炼丹5至7倍速,使用Mac M1 芯片加速pytorch完全指南
YOLOv8 训练自己的数据集
本范例我们使用 ultralytics中的YOLOv8目标检测模型训练自己的数据集,从而能够检测气球。
lyhue1991
2023/09/05
3.4K1
YOLOv8 训练自己的数据集
使用GPU训练模型
Pytorch没有官方的高阶API。一般通过nn.Module来构建模型并编写自定义训练循环。
lyhue1991
2020/07/22
3K0
用BERT做命名实体识别任务
本质上NER是一个token classification任务, 需要把文本中的每一个token做一个分类。
lyhue1991
2023/09/05
7830
用BERT做命名实体识别任务
Qwen7b微调保姆级教程
前方干货预警:这可能是你能够找到的,最容易理解,最容易跑通的,适用于各种开源LLM模型的,同时支持多轮和单轮对话数据集的大模型高效微调范例。
lyhue1991
2023/09/17
2.2K0
Qwen7b微调保姆级教程
训练模型的3种方法
Pytorch没有官方的高阶API。一般通过nn.Module来构建模型并编写自定义训练循环。
lyhue1991
2020/07/20
1.7K0
训练模型的3种方法
使用BERT进行文本分类
准备数据阶段主要需要用到的是datasets.Dataset 和transformers.AutoTokenizer。
lyhue1991
2023/09/05
7420
使用BERT进行文本分类
Transformer深入浅出
我们从零开始用pytorch搭建Transformer模型(中文可以翻译成变形金刚)。
lyhue1991
2023/09/05
1.1K0
Transformer深入浅出
深度学习里面,请问有写train函数的模板吗?
一般pytorch需要用户自定义训练循环,可以说有1000个pytorch用户就有1000种训练代码风格。 从实用角度讲,一个优秀的训练循环应当具备以下特点。
lyhue1991
2023/02/23
1.2K0
深度学习里面,请问有写train函数的模板吗?
30分钟吃掉CRNN-CTC验证码识别
项目参考:https://github.com/ypwhs/captcha_break
lyhue1991
2023/09/05
3520
30分钟吃掉CRNN-CTC验证码识别
速度为单GPU1.6倍,kaggle双GPU(ddp模式)加速pytorch攻略
accelerate 是huggingface开源的一个方便将pytorch模型迁移到 GPU/multi-GPUs/TPU/fp16 模式下训练的小巧工具。
lyhue1991
2023/02/23
2.6K0
速度为单GPU1.6倍,kaggle双GPU(ddp模式)加速pytorch攻略
30分钟吃掉wandb模型训练可视化
公众号算法美食屋后台回复关键词:wandb,获取本教程 notebook源码 和 B站视频演示。
lyhue1991
2023/02/23
3.7K0
30分钟吃掉wandb模型训练可视化
图片数据建模流程范例
我们在实践中通常会遇到的数据类型包括结构化数据,图片数据,文本数据,时间序列数据。
lyhue1991
2020/07/20
1.7K0
图片数据建模流程范例
60分钟吃掉FM算法
参考文章:张俊林《FFM及DeepFFM模型在推荐系统的探索》https://zhuanlan.zhihu.com/p/67795161
lyhue1991
2022/09/01
6680
60分钟吃掉FM算法
60分钟吃掉三杀模型FiBiNET
新浪微博广告推荐技术团队2019年发布的CTR预估模型FiBiNET同时巧妙地运用了以上3种技巧,是神经网络结构设计的教科书级的范例。
lyhue1991
2022/09/01
1.4K0
60分钟吃掉三杀模型FiBiNET
30分钟吃掉wandb可视化自动调参
(1)低代码:只需配置一个sweep.yaml配置文件,或者定义一个配置dict,几乎不用编写调参相关代码。
lyhue1991
2023/02/23
9490
30分钟吃掉wandb可视化自动调参
结构化数据建模流程范例
我们在实践中通常会遇到的数据类型包括结构化数据,图片数据,文本数据,时间序列数据。
lyhue1991
2020/07/20
2.6K0
结构化数据建模流程范例
推荐阅读
相关推荐
30分钟吃掉DQN算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验