码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • GPU性能优化与模型训练概览


    GPU性能优化与模型训练概览

    安装所需库

    为监控GPU内存使用,我们使用nvidia-ml-py3库。首先安装必要的库:

    pip install transformers datasets accelerate nvidia-ml-py3
    
    • 1

    模拟数据创建

    创建范围在100到30000之间的随机token ID和二进制标签。为分类器准备512个序列,每个序列长度为512,并存储为PyTorch格式的数据集:

    import numpy as np
    from datasets import Dataset
    
    seq_len, dataset_size = 512, 512
    dummy_data = {
        "input_ids": np.random.randint(100, 30000, (dataset_size, seq_len)),
        "labels": np.random.randint(0, 1, (dataset_size)),
    }
    ds = Dataset.from_dict(dummy_data)
    ds.set_format("pt")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    GPU使用情况摘要

    定义两个帮助函数来打印GPU使用情况及训练摘要:

    from pynvml import *
    
    def print_gpu_utilization():
        nvmlInit()
        handle = nvmlDeviceGetHandleByIndex(0)
        info = nvmlDeviceGetMemoryInfo(handle)
        print(f"GPU memory occupied: {info.used//1024**2} MB.")
    
    def print_summary(result):
        print(f"Time: {result.metrics['train_runtime']:.2f}")
        print(f"Samples/second: {result.metrics['train_samples_per_second']:.2f}")
        print_gpu_utilization()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    模型加载与训练开销

    加载BERT模型,并监测其权重占用的GPU内存:

    from transformers import AutoModelForSequenceClassification
    
    model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-large-uncased").to("cuda")
    print_gpu_utilization()
    
    • 1
    • 2
    • 3
    • 4

    训练前的准备

    设置训练参数,以批大小为4进行训练,并监测内存占用情况:

    from transformers import TrainingArguments, Trainer, logging
    
    logging.set_verbosity_error()
    default_args = {
        "output_dir": "tmp", 
        "evaluation_strategy": "steps",
        "num_train_epochs": 1,
        "log_level": "error",
        "report_to": "none",
    }
    training_args = TrainingArguments(per_device_train_batch_size=4, **default_args)
    trainer = Trainer(model=model, args=training_args, train_dataset=ds)
    result = trainer.train()
    print_summary(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    训练示例显示即使是较小的批大小也几乎填满了GPU内存。

    模型运算与内存分析

    转换器架构主要包括三类运算:

    • 张量收缩:最计算密集型。
    • 统计归一化:计算强度中等。
    • 逐元素操作:计算强度最低。

    模型在训练时占用的内存远超其权重占用量。其中包含:

    • 模型权重
    • 优化器状态
    • 梯度
    • 正向激活
    • 临时缓冲区
    • 特殊功能性内存

    混合精度模型权重和激活量所需的总内存约为模型参数数量18字节,不含优化器状态和梯度的推理模式则约为6字节加上激活内存。

    性能瓶颈与优化策略

    了解模型运算和内存需求对分析性能瓶颈十分关键。可以参考相关文档,学习单GPU上高效训练的方法和工具。

  • 相关阅读:
    OpenResty中如何实现,按QPS、时间范围、来源IP进行限流
    Java开发之高并发必备篇(五)——线程安全操作之synchronized
    JDBC-环境搭建及简单介绍和使用
    ES6 - 扩展运算符与Object.assign对象拷贝与合并
    论文阅读 (63):Get To The Point: Summarization with Pointer-Generator Networks
    针对图像分类的数据增强方法,离线增强,适合分类,无标签增强
    猿创征文 | 国产数据库TiDB架构特性
    学校介绍静态HTML网页设计作品 DIV布局学校官网模板代码 DW大学网站制作成品下载 HTML5期末大作业
    SELinux零知识学习十七、SELinux策略语言之类型强制(2)
    axios 拦截器实现原理
  • 原文地址:https://blog.csdn.net/XianxinMao/article/details/136709372
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号