只需 4 个简单步骤即可为您的 ML 系统充电

news2024/11/25 11:57:18

使用 DALL 生成的图像。D-R型

 一、说明

        这篇文章将带您了解我通过 4 个简单步骤优化任何 ML 系统以进行闪电般快速的训练和推理的过程。

        想象一下:你终于被安排在一个很酷的新ML项目中,你正在训练你的经纪人计算一张照片中有多少只热狗,它的成功可能会让你的公司赚几十美元!

        你会得到最新的热门对象检测模型,在你最喜欢的框架中实现,这个框架有很多GitHub明星,运行一些玩具示例,一个小时左右后,它就会像大学第三年复读的破产学生一样挑选出热狗,生活很好。

        接下来的步骤是显而易见的,我们希望将其扩展到一些更难的问题,这意味着更多的数据,更大的模型,当然还有更长的训练时间。现在,您看到的是几天的培训,而不是几个小时。不过没关系,你已经忽略了团队的其他成员 3 周了,可能应该花一天时间处理积压的代码审查和已经积累起来的被动攻击性电子邮件。

        一天后,你对你留给同事MR的有见地和绝对必要的吹毛求疵感到满意,结果发现在15个小时的训练后,你的表现一落千丈(因果报应很快)。

        接下来的日子变成了试验、测试和实验的旋风,每个潜在的想法都需要一天以上的时间才能运行。这些很快就会开始累积数百美元的计算成本,所有这些都导致了一个大问题:我们如何才能让它更快、更便宜?

        欢迎来到 ML 优化的情绪过山车!这里有一个简单的 4 步过程,可以扭转局面:

  1. 基准
  2. 简化
  3. 优化
  4. 重复

        这是一个迭代过程,在继续下一个步骤之前,你会重复很多次,所以它不是一个 4 步系统,而更像是一个工具箱,但 4 步听起来更好。

二、 基准

“测量两次,切割一次”——有人明智

        您应该始终做的第一件事(也可能是第二件事)是分析您的系统。这可以很简单,比如只计时运行特定代码块所需的时间,也可以像执行完整的配置文件跟踪一样复杂。重要的是您有足够的信息来识别系统中的瓶颈。我根据我们所处的阶段进行多个基准测试,通常将其分为 2 种类型:高级基准测试和低级别基准测试。

2.1 高水平

        这就是你将在每周的“我们有多?”会议上向你的老板展示的东西,并希望这些指标成为每次运行的一部分。这些将使您对系统运行的性能有一个高层次的了解。

        每秒批次数 — 我们处理每个批次的速度有多快?这应该尽可能高

        每秒步数 — (特定于 RL)我们在环境中生成数据的速度应该尽可能高。步骤时间和训练批次之间存在一些复杂的相互作用,我不会在这里讨论。

        GPU 利用率 — 训练期间使用了多少 GPU?这应该始终接近 100%,如果不是,那么您有可以优化的空闲时间。

        CPU 利用率 — 训练期间使用了多少 CPU?同样,这应该尽可能接近 100%。

        FLOPS — 每秒浮点运算次数,可让您了解使用整个硬件的效率。

2.2 低电平

        使用上述指标,您可以开始更深入地了解瓶颈可能在哪里。一旦你有了这些,你就要开始查看更细粒度的指标和分析。

        时间剖析 — 这是运行的最简单且通常最有用的实验。像 cprofiler 这样的分析工具可用于鸟瞰整个每个组件的时序,也可以查看特定组件的时序。

        内存分析 — 优化工具箱的另一个主要功能。大型系统需要大量内存,因此我们必须确保不会浪费任何内存!像memory-profiler这样的工具将帮助你缩小系统占用RAM的范围。

        模型分析 — 像 Tensorboard 这样的工具附带了出色的分析工具,用于查看模型中哪些因素正在消耗您的性能。

        网络分析 — 网络负载是造成系统瓶颈的常见罪魁祸首。有像 wireshark 这样的工具可以帮助您分析这一点,但老实说,我从不使用它。相反,我更喜欢对我的组件进行时间分析,并测量它在我的组件中花费的总时间,然后隔离来自网络 I/O 本身的时间。

        请务必查看这篇来自 RealPython 的 Python 分析的精彩文章,了解更多信息!

三、简化

在分析中确定需要优化的区域后,请对其进行简化。剪掉除该部分以外的其他所有内容。不断将系统缩小到更小的部件,直到达到瓶颈。不要害怕在简化时进行分析,这将确保你在迭代时朝着正确的方向前进。不断重复此操作,直到找到瓶颈。

3.1 技巧

  • 将其他组件替换为仅提供预期数据的存根和模拟函数。
  • 使用函数或虚拟计算模拟繁重的函数。sleep
  • 使用虚拟数据来消除数据生成和处理的开销。
  • 在迁移到分布式系统之前,从系统的本地单进程版本开始。
  • 在一台机器上模拟多个节点和参与者,以消除网络开销。
  • 找到系统每个部分的理论最大性能。如果系统中除此组件外的所有其他瓶颈都消失了,那么我们的预期性能如何?
  • 再次剖析!每次简化系统时,请重新运行分析。

3.2 问题

        一旦我们解决了瓶颈问题,我们就要回答一些关键问题

        该组件的理论最大性能是多少?

        如果我们已经充分隔离了瓶颈组件,那么我们应该能够回答这个问题。

        我们离最大还有多远?

        这种最优性差距将告诉我们我们的系统是如何优化的。现在,一旦我们将组件引入系统,可能会有其他硬约束,这很好,但至少要意识到差距是什么,这一点至关重要。

        是否存在更深层次的瓶颈?

总是问自己这个问题,也许问题比你最初想象的要深,在这种情况下,我们重复基准测试和简化的过程。

四、优化

        好的,假设我们已经确定了最大的瓶颈,现在我们进入有趣的部分,我们如何改进事情?我们通常应该考虑 3 个方面来寻找可能的改进

  1. 计算
  2. 通信
  3. 记忆

4.1 计算

为了减少计算瓶颈,我们需要考虑尽可能高效地使用我们正在使用的数据和算法。这显然是特定于项目的,可以做很多事情,但让我们看看一些好的经验法则。

并行化 — 确保并行执行尽可能多的工作。这是设计系统时的第一个重大胜利,可以极大地影响性能。看看矢量化、批处理、多线程和多处理等方法。

缓存 — 尽可能预计算和重用计算。许多算法可以利用重用预先计算的值,并为每个训练步骤保存关键计算。

卸载——我们都知道 Python 并不以速度着称。幸运的是,我们可以将关键计算卸载到C/C++等较低级别的语言。

硬件扩展 — 这是一种逃避,但当所有其他方法都失败时,我们总是可以投入更多的计算机来解决问题!

4.2 通信

任何有经验的工程师都会告诉你,沟通是交付成功项目的关键,这当然是指我们系统内的沟通(上帝保佑我们不得不与同事交谈)。一些好的经验法则是:

无空闲时间 — 必须始终使用所有可用的硬件,否则性能提升将一事无成。这通常是由于整个系统的通信的复杂性和开销。

保持本地 — 在迁移到分布式系统之前,尽可能长时间地将所有内容保留在一台计算机上。这样可以使系统保持简单,并避免分布式系统的通信开销。

异步>同步 — 确定可以异步完成的任何操作,这将有助于在移动数据的同时保持工作正常进行,从而减轻通信成本。

避免移动数据 — 将数据从 CPU 移动到 GPU 或从一个进程移动到另一个进程的成本很高!尽可能少地执行此操作,或者通过异步执行来减少此操作的影响。

4.3 记忆

最后但并非最不重要的一点是内存。上面提到的许多方面都有助于缓解瓶颈,但如果您没有可用的内存,这可能是不可能的!让我们看一些需要考虑的事项。

数据类型 — 保持这些类型尽可能小,有助于降低通信和内存成本,并且使用现代加速器,它还将减少计算。

缓存 — 与减少计算类似,智能缓存可以帮助您节省内存。但是,请确保缓存数据的使用频率足以证明缓存的合理性。

预分配 — 这不是我们在 Python 中习惯的东西,但严格预分配内存意味着你确切地知道你需要多少内存,降低碎片的风险,如果你能够写入共享内存,你将减少进程之间的通信!

垃圾回收 — 幸运的是,python 为我们处理了大部分问题,但重要的是要确保你不会在不需要它们的情况下将大值保留在范围内,或者更糟的是,具有可能导致内存泄漏的循环依赖关系。

懒惰 — 仅在必要时计算表达式。在 Python 中,您可以使用生成器表达式而不是列表推导式来执行可以延迟计算的操作。

五、重复

        那么,我们什么时候完成呢?嗯,这真的取决于你的项目,要求是什么,以及你日益减少的理智最终需要多长时间才能被打破!

        当您消除瓶颈时,您将获得用于优化系统的时间和精力的回报递减。当你经历这个过程时,你需要决定什么时候足够好。请记住,速度是达到目的的手段,不要陷入为了优化而优化的陷阱。如果它不会对用户产生影响,那么可能是时候继续前进了。

六、结论

        构建大规模的ML系统是很困难的。这就像玩一个扭曲的“沃尔多在哪里”与黑暗之魂交叉的游戏。如果你设法找到了问题,你必须多次尝试才能解决它,你最终会把大部分时间都花在被踢屁股上,问自己“我为什么要在周五晚上做这件事?拥有一个简单而有原则的方法可以帮助你度过最后的 Boss 战,并品尝那些甜蜜、甜蜜的理论最大 FLOP。

多纳尔·伯恩

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

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

相关文章

任正非说:人家问我:“你怎么一天到晚游手好闲?”我说我是管长江的堤坝的。

你好!这是华研荟【任正非说】系列的第26篇文章,让我们聆听任正非先生的真知灼见,学习华为的管理思想和管理理念。 一、我们不是靠人来领导这个公司,我们用规则的确定性来对付结果的不确定。人家问我:“你怎么一天到晚游…

NEWSTART2022 web week1

01HTTP flag{f1cb35f5-05de-4559-8f99-28e1f11df403} 02Head?Header! 或者xxf头:localhost 03我真的会谢 这个题目比之前有意思多了 可知是vim缓存,利用vim缓存知识: 使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除。vim异常…

亚马逊云科技:让生成式AI真正走向普惠

伴随着ChatGPT的横空出世,生成式AI(Artificial Intelligence Generated Content,也称AIGC)大潮也以锐不可当之势席卷全球。从各行各业的商业领袖,到千千万万的程序员和开发者,都在思考如何借助生成式AI技术…

Leetcode刷题详解——两两交换链表中的节点

1. 题目链接:24. 两两交换链表中的节点 2. 题目描述: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 …

vue自定义组件:中线分割拖动盘

在GitHub上可以找到类似的组件,比如4年前发布的vue2版本的 Vue Split Pane, 但是我还是自己写了一个类似的: 组件效果: 特点: 不是照抄别人的。同时支持vue2、vue3(组件内部使用选项式API风格&#xff09…

【JavaScript保姆级教程】switch分支与while循环

文章目录 前言一、Switch分支1.1 switch基本结构1.2 break语句1.3 default标签1.4 下面是几个Switch分支的示例代码:示例1: 根据星期数输出对应的中文星期名称示例2: 根据用户输入的颜色选择执行不同的操作 二、While循环:2.1 while循环基本格式2.2 cont…

学习性能测试线路图

性能测试学习线路图(建议) 1、概览 纵向划分3颗子树:vugen,controller,monitor。优先学习vugen脚本开发以及调试。 横向划分为2层:基础知识以及高级应用。 2、基础知识 2.1、Loadrunner工具使用 2.1.1、建议学习路径 Vugen开发脚本(函数使用&#x…

2.2 - 网络协议 - IP协议,IP地址划分,报文格式,数据分片,抓包实战

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 IP协议 1、IP地址划分2、IP协议报文格式3、IP协议数…

Git(七).git 文件夹瘦身,GitLab 永久删除文件

目录 一、问题背景二、问题复现2.1 新建项目2.2 上传大文件2.3 上传结果 三、解决方案3.1 GitLab备份与还原1)备份2)还原 3.2 删除方式一:git filter-repo 命令【推荐】1)安装2)删除本地仓库文件3)重新关联…

图的广度优先遍历的单源路径、无权图的最短路径问题、BFS性质附Java代码

目录 使用BFS求解单源路径问题 BFS重要性质 无权图的最短路径问题 使用BFS求解单源路径问题 import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.Queue;public class SingleSourcePath {private Graph G;private i…

Greenplum管理和监控工具-gpcc-web介绍

Greenplum管理和监控工具-gpcc-web介绍 1. gpcc-web简介 ​ gpcc(Greenplum Command Center)的Web用户界面是一个强大的工具,它可以帮助用户管理Greenplum数据库集群,提高效率,优化性能,并确保数据的安全…

安防监控项目---Cortex-A9和zigbee传感器数据上传至网页

文章目录 前言一、A9平台数据的采集与上传二、共享内存上传数据到CGI三、设备代码总结 前言 书接上期,我们大概来梳理一下,已经完成的需求有哪些了,从html下发指令控制Cortex-A9平台硬件,其中主要实现的有控制LED,蜂鸣器&#xf…

AI大模型时代网络安全攻防对抗升级,瑞数信息变革“下一代应用与数据安全”

AI与大模型技术加速普及,安全领域也在以创新视角聚焦下一代应用安全WAAP变革,拓展新一代数据安全领域。近日瑞数信息重磅发布了瑞数全新API扫描器、API安全审计、数据安全检测与应急响应系统及分布式数据库备份系统四大新品。此次发布在延续瑞数信息Bot自…

【中国知名企业高管团队】系列55:奇瑞汽车

昨天华研荟介绍了吉利集团的现状,创始人李书福先生的故事,以及吉利集团的现任高管团队。我们了解到现在的吉利集团品牌多元化,吉利汽车只是其中的一个品牌和产业集团,整个吉利集团有十余个汽车品牌,还有多个网约车品牌…

力扣第416题 *** 分割等和子集 c++ 新题 动态规划 中的 01背包问题

题目 416. 分割等和子集 中等 相关标签 数组 动态规划 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释…

qt 系列(二)---qt designer通过设置控件样式表进行背景颜色设置

1. 前言 一般Layouts不可以进行改变样式表,当我们想修改背景样式表,同时又不改变其他控件的颜色时,可以选择List View 控件改变背景颜色。 2. 设置背景 (1)配置 .qrc 文件 新建mypicture.qrc文件,记事本打…

【刷题宝典NO.0】

目录 素数的判定 打印素数 打印水仙花数 百钱买百坤 输出闰年 逆序打印一个整数的每一位 输出乘法口诀表 数字9出现的次数 二进制1的个数 输出一个整数的偶数位和奇数位的二进制序列 求两个整数的最大公约数 求两个整数的最小公倍数 小乐乐与欧几里得 小…

C#,数值计算——积分方程与逆理论Quad_matrix的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { public class Quad_matrix : UniVarRealMultiValueFun { private int n { get; set; } private double x { get; set; } public Quad_matrix(double[,] a) { this.n a…

适用于 Linux 的 WPF:Avalonia

许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开…

精品Python空巢老人志愿服务平台慈善捐赠活动报名

《[含文档PPT源码等]精品基于Python的空巢老人志愿服务平台》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功! 软件开发环境及开发工具: 开发语言:python 使用框架:Django 前端技术&#…