深度学习分布式策略优化、显存优化、通信优化、编译优化综述

2023-05-16

综述

因为我个人最近在从事可能是AI领域对性能挑战最大的方向,自动驾驶领域,所以对整个深度学习训练的优化尤为关注,最近一直在学习相关内容,谨以此篇文章做一个总结。

我一直很看好深度学习训练优化这个方向,因为从大的环境上来看,似乎大模型会成为未来的一个趋势,目前以Google、OpenAI、阿里等厂商为代表的一系列头部的AI研究机构,已经把模型尺寸做到十万亿参数级别,明年应该可以达到百万亿参数,总体呈指数倍增长态势。而核心计算芯片的性能,却无法保证指数倍增长。

(上图因为制作时间较久,具体数字可能存在偏差)

所以,未来在人工智能领域所面对的一个主要矛盾就是指数倍增长的算力需求与线性增长的硬件计算能力的矛盾。而深度学习训练优化技术,是解决这样矛盾的一个关键。深度学习训练优化技术,又分为主观和客观性两个方面,有模型开发者的主动选择,用什么样的并行化模式,怎样处理通信算子,也有来自客观的优化,比如框架的编译优化。本文将尝试对常见的优化技术做一个概述。

具体结构如下:

分布式策略优化

前面介绍了在大模型时代,算力往往会成为短板,那么如何解决算力问题,比较好的方案就是并行化计算,或者说是分布式计算。分布式计算有许多种策略组成,常见的分布式策略有数据并行、模型并行、流水并行、算子并行。

1、数据并行[1]

数据并行是比较常见的并行化计算逻辑,是将训练数据做打散和分片,然后每张GPU卡取一部分数据进行计算,每张GPU卡保存着全部的模型信息,通过All Reduce的方式进行梯度的更新,这里涉及到很多通信优化的方案,我们下一部分通信优化模块会介绍。数据并行经常跟模型并行、流水并行等模式一起使用。

开源的一些框架,比如Uber开源的Horovod对数据并行及其它并行方式提供了很好的支持。

2、模型并行(算子拆分)[2]

当一些模型的部分模块计算量明显高于其它模块的时候,会使用到算子并行的策略。举个例子,比如Resnet模型做图像分类,当分类器的类别极大,比如要做几十万类别的区分,那么全连接层会变得特别的大。如下图所示。

分类数为10 W时,ResNet50部分的模型权重大小89.6 MB,全连接层FC(Fully Connected Layer)部分的模型权重大小为781.6 MB,是前者的8.7倍。当采用数据并行进行分布式训练时,在后向阶段(Back Propagation过程),FC部分计算得到梯度后,立刻通过AllReduce进行梯度同步,同时ResNet50部分的梯度会继续进行后向计算。然而由于FC部分同步的梯度过大,当ResNet50部分的梯度计算完成时,FC部分的梯度通常还在通信过程中。因此,FC部分的梯度同步无法良好地与ResNet50的后向计算Overlap,导致整轮迭代过程中的通信占比十分高,性能低下。

针对ResNet50的大规模分类任务,将模型分为两个Stage。将Stage 0的ResNet50部分通过数据并行策略复制N份至不同的卡中,进行数据并行。将Stage 1的FC和Softmax部分通过算子拆分策略分片至不同卡中,进行模型并行。假设共六张卡(GPU0、GPU1、GPU2、GPU3、GPU4及GPU5),将GPU分为两组,分别进行数据并行和算子拆分,如下图所示。

3、流水并行[3]

上面介绍了模型并行,在执行模型并行的过程中极容易出现GPU等待的问题。比如一部分模型还在做梯度更新,而另一部分的模型这一轮已经更新好了。在Bert类模型经常容易出现这样的状况。

比如把Bert模型进行拆分,不同GPU处理模型的不同模块:

模型并行计算过程中会出现闲时等待问题,如下图所示。

可以看到同一个时间段只有一张卡在做前向或者是后向的训练。流水并行要解决的问题是,当一张卡训练完之后马上通知下一张卡进行训练,让整个计算过程像流水线一样连贯,流水并行在大模型场景会大大提升计算效率,减少GPU的等待时间。

无论是模型并行还是流水并行,这些并行模式通常会混合使用,也就是说混合并行计算。业内有许多开源的框架可以实现上述能力,比如微软开源的DeepSpeed可以提供模型并行和流水并行的能力。DeepSpeed项目地:https://github.com/microsoft/DeepSpeed

通信优化

通信优化有很多方面,比如通信系统优化、通信模式优化和通信内容优化。接下来逐一介绍下这些通信优化领域的基础概念。

1、通信系统优化[5]

通信系统可以分为两个大的类别,一种是Allreduce结构,目前更常用的是Ring-Allreduce。另一种是PS,也就是Parameter Server参数服务器结构。

1.1、PS框架[6]

首先介绍下PS架构,在这种架构下,通常将计算节点分为PS节点和Worker节点两个类型。其中PS节点主要用来存放参数,Worker节点负责计算梯度,Worker计算好的梯度数据传输给PS节点,由PS节点聚合后再反馈给各个Worker进行下一步训练。

但是随着模型逐渐增大,导致每次PS节点和Worker节点需要传输的数据越来越多,PS的通信结构使得PS节点的带宽成为通信瓶颈,并不一定适合于超大规模的分布式深度学习训练,于是便有了下文提到的,Ring Allreduce通信结构。

1.2 、Ring-Allreduce框架[7]

关于Ring-Allreduce,我之前写过相关文章,这里直接引用,Ring-Allreduce主要解决两方面问题。

问题一,每一轮的训练迭代都需要所有卡都将数据同步完做一次Reduce才算结束。如果卡数比较少的情况下,其实影响不大,但是如果并行的卡很多的时候,就涉及到计算快的卡需要去等待计算慢的卡的情况,造成计算资源的浪费。

问题二,每次迭代所有的计算GPU卡多需要针对全部的模型参数跟Reduce卡进行通信,如果参数的数据量大的时候,那么这种通信开销也是非常庞大,而且这种开销会随着卡数的增加而线性增长。

为了解决这样的问题,就引入了一种通信算法Ring Allreduce,通过将GPU卡的通信模式拼接成一个环形,从而减少随着卡数增加而带来的资源消耗,如下图所示:

将GPU卡以环形通信之后,每张卡都有一个左手卡和右手卡,那么具体的模型参数是如何传递的呢,可以看下图:

因为每张卡上面的网络结构是固定的,所以里面的参数结构相同。每次通信的过程中,只将参数send到右手边的卡,然后从左手边的卡receive数据。经过不断地迭代,就会实现整个参数的同步,也就是reduce。形成以下这张图的样式:

通过Ring Allreduce的方式,基本上可以实现当GPU并行卡数的增加,实现计算性能的线性增长。

通过上图不难发现,Ring-Allreduce通信框架在数据并行方面有着是否优异的效果。

2、通信模式

除了通信系统架构,通信模式也对性能有较大影响。通信模式通常分为异步通信和同步通信两种。在PS架构中通常会涉及到通信模式的问题。同步通信是比较低效的一种方案,指的是利用PS节点做参数的存储和Reduce,每次PS会等所有的worker都计算完梯度,才做一次梯度的平均,然后分发给各个worker进行更新。这种模式很容易造成堵塞,当PS和worker的通信阻断了,整个训练就无法进行下去,当然如果增加PS节点来缓解阻断问题,又会增加整个系统的负责度。

异步更新会比同步更新机制更完善,指的是PS节点不必每次都等所有worker计算完再做梯度更新,当PS节点收到worker的梯度更新请求后,立刻进行梯度的下发。当然,异步更新也会引出新的问题需要优化,就是每一轮更新的梯度可能是几轮以前计算出来的,另外如果参数读取未加锁,有可能worker会从ps读取到刚更新一般的参数。

3、通信内容优化[8][9]

以上介绍的都是通信的架构和模式,那么通信管道的内容也是有优化空间的。比如稠密通信可以做信道合并,稀疏通信可以数据存储和格式转换的优化。

通常做深度学习训练的时候,使用的数据都是TFrecord类型,protobuf格式的文件,或者是hdf5、pickle,这种文件都是行存,每次读取数据都需要获取全量字段。但是很多场景,可能每次读取只需要一个字段的数据,这样列存的数据IO模式就比较高效,自动驾驶就是这样的场景。举个例子区分行存和列存,

以下是行存数据结构:

下图是列存的数据结构:

列存允许用户在训练过程中加载列子集,从而节约通信信道的带宽。列存通常会使用Parquet格式,uber开源了一个工作叫做Petastorm ,可以在TensorFlow、Pytorch等框架支持Parquet数据格式。

地址:https://github.com/uber/petastorm

显存优化

首先分析下GPU中占用显存的元素有哪些,神经网络占据显存的部分主要是模型自身的参数以及模型的输出[10]。从模型角度分析,只有有参数的层才会占用显存,比如卷积、全连接、Embedding,那些没有参数的层其实不占用显存,比如激活、池化、dropout。从模型输出角度分析,基本上batch-size越大,显存占用越大。总结下,降低显存的占用的方案是降低batch-size,或者减少全连接层这种参数较多的神经网络结构。

另外在系统工程层面也有显存优化的方案,可以分为分时复用和合并共享两种模式。

1、分时复用[11]

从工程层面,如果能让GPU的显存一直100%的被占用,其实是最大限度地利用了GPU的显存资源。分时复用的原理是将GPU的显存实现某种层面的资源隔离,利用Schedule的能力,将任务合理的分配到不同时间段内。

2、合并共享[11]

合并共享是指多个任务合并成一个上下文,因此可以共享GPU资源,同时发送kernel到GPU上,也共同使用显存。NV提供了这样的一套能力,叫做MPS(CUDA_Multi_Process_Service),感兴趣通信可以看下文章的引用信息和NV的官方文档:Multi-Process Service

整体上MPS的内存合并共享机制架构图如下:

编译优化

框架的编译优化是比较底层的一种优化手段,传统的编译器优化依赖于工程师手动的去优化算子,那么计算框架的编译优化希望通过一种偏自动化的方式去实现算子在各种硬件设备层面的编译优化。为什么要做框架的编译优化[12],核心问题是人的精力是有限的,不可能基于无数可被优化的算子做人肉的优化。

编译器将深度学习框架描述的模型在各种硬件平台上生成有效的代码实现,其完成的模型定义到特定代码实现的转换将针对模型规范和硬件体系结构高度优化。目前主流的编译器对于环境的支持情况如下:

在论文”The Deep Learning Compiler: A Comprehensive Survey“中,还给出了深度学习编译器的整体架构,如下图所示:

在编译器中可以分为三个主要部分[14],前端计算图和后端以及IR(Intermediate Representation)。通常IR是程序的抽象,用于程序优化。具体地说,DL模型在DL编译器中被转换成多级IR,其中高层IR驻留在前端,而底层IR驻留在后端。编译器前端基于高层IR,负责与硬件无关的转换和优化。基于底层IR,编译器后端负责特定于硬件的优化、代码生成和编译。

整个优化分为前端图级别的优化以及后端优化,接下来分别介绍下这两个优化方向。

1、前端图优化

前端图优化总体上是通过输入的神经网络图结构,找到其中可以优化的模块并重新构造图。图优化可以分为节点优化、块优化、数据优化。

其中节点优化是消除不必要的节点,比如A是零元张量,B是常数张量,A+B的计算就可以替换成B,这样就减少了图的复杂度。块优化可以实现一些运算符层面的简化,比如A*B+A*C是三次计算,(B+C)*A就变成了两次计算,这样就通过一些算子的融合机制实现了计算的精简。数据全局优化,是通过全图链路精简计算复杂度,比如一个数值A已经计算过,那么接下来就不用重复计算,直接使用。

2、后端优化

后端优化包含指定硬件优化、自动调优技术以及内核库优化。指定硬件优化指的是将底层IR转化为LLVM IR,利用LLVM基础结构生存适配CPU或者GPU的代码,提高逻辑执行效率,这个过程叫做Codegen。

自动调优技术指的是合理设定每个计算单元在硬件层面的参数,因为每个计算都需要设定共享内存、寄存器大小等参数。利用自动调优技术,建立Cost model,可以自动判定参数,提升计算效率。

优化内核库技术指的是把数据自动转换成适配英特尔的DNNL(以前是MKL-DNN)、NVIDIA的cuDNN和AMD的MLOpen的数据结构和格式,使得代码可以直接使用到这些底层的优化内核库。

3、MLIR[15]

最后介绍下什么是MLIR,前面说了IR是计算逻辑在编译层面的一种抽象表示。深度学习在编译过程中,需要将high-level的IR转换成low-level的IR去适配不同硬件环境。如下图:

这种做法就造成了系统的复杂性,MLIR希望提供一种框架标准,使得不同IR可以模块化,并且统一标准去适配各种硬件条件,从而减少系统复杂性。

总结

本文是我个人在学习深度学习优化技术过程中的一个总结,覆盖了分布式策略、显存、通信、编译各个维度的优化基础概念,这些概念的学习来自于下方引用部分的小伙伴的分享,感谢大家。有不准确的地方望大家指正,我会修改。整个深度学习优化内容负责,种类繁多,后续需要不断学习和进步。

引用:

[1]分布式计算策略:PAI视频内容

[2]算子拆分:大规模分类的分布式训练(算子拆分) - 机器学习PAI - 阿里云

[3]流水并行:BertLarge分布式训练(流水并行) - 机器学习PAI - 阿里云

[4]DeepSpeed:https://github.com/microsoft/DeepSpeed

[5]PS&RingAllReduce[深度学习] 分布式模式介绍(一)_小墨鱼的专栏-CSDN博客

[6]PS:https://zhuanlan.zhihu.com/p/50116885

[7]Ring-Allreduce:ring allreduce和tree allreduce的具体区别是什么? - 知乎

[8]通信内容:分布式深度学习训练中的通信优化有哪些主流的研究方向? - 知乎

[9]Parquet:https://zhuanlan.zhihu.com/p/45364584

[10]显存优化:科普帖:深度学习中GPU和显存分析 - 知乎

[11]分时复用、共享复用:It - 收藏夹 - 知乎

[12]编译器的必要性:深度学习编译技术的现状和未来 - 知乎

[13]编译器概述:https://zhuanlan.zhihu.com/p/139552817

[14]The Deep Learning Compiler: A Comprehensive Survey翻译:翻译《The Deep Learning Compiler: A Comprehensive Survey》综述翻译 - 简书

[15]MLIR说明:https://zhuanlan.zhihu.com/p/101879367

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习分布式策略优化、显存优化、通信优化、编译优化综述 的相关文章

  • Linux MTD架构下的nand flash驱动详解

    转载自 xff1a http blog csdn net wang zheng kai article details 18988521 有了前面的基础 xff08 Nandflash详解 xff1a https blog csdn net
  • 激光打印机工作原理(网上摘录)

    导读 xff1a 在本文中 xff0c 我们将揭开激光打印机背后的秘密 xff0c 追踪将计算机屏幕上的字符变为纸上的打印字母的神奇过程 当谜底揭开之后 xff0c 您便会明白 xff0c 其实激光打印过程基于一些很简单的科学原理 xff0
  • 女生适合学习Java吗?

    在这个信息爆炸的时代 xff0c 互联网行业成为了高薪的代名词 xff0c Java 技术因其具有卓越的通用性 高效性 平台移植性和安全性 xff0c 广泛应用于PC 数据中心 游戏控制台 科学超级计算机 移动电话和互联网 xff0c 作为
  • STM32 UART串口环形缓冲区的实现思路和代码

    同名微信公众号 固件工人 同步发布的文章 xff0c 欢迎同时关注 xff0c 及时获取最新文章 1 1 环形缓冲区的实现思路 单片机程序开发一般都会用到UART串口通信 xff0c 通过通信来实现上位机和单片机程序的数据交互 通信中为了实
  • 从零开始学习Linux(一)关闭虚拟机系统

    关闭系统 xff0c 需要输入如下命令 poweroff 然而 xff0c 你只能得到如下反馈 bash poweroff command not found 此项错误是因为poweroff命令是一个系统管理命令 执行此项命令需要高级使用者
  • AndroidQ SystemUI之power键灭屏锁屏流程

    本篇接着分析锁屏相关流程 xff0c 通常我们点击power键会灭屏 xff0c 灭屏时就会加载锁屏 xff0c 以便用户能在下次亮屏时第一时间看到锁屏 xff0c 我们就来看看点击power键灭屏锁屏的流程 Android的事件分发流程大
  • 用Word2007查找和替换功能批量设置图片位置

    Word2007的 查找和替换 功能并不仅仅可以对文字进行批量的查找替换 xff0c 还有很多神奇的功能 xff0c 比如对插入的 图片位置进行批量的查找和调整等等 今天我们就来试试Word2007的 查找和替换 功能在文字替换外的应用 x
  • Windows命令行删除文件和文件夹

    1 rd 命令帮助 删除文件夹 xff08 空 xff09 rd S 文件夹路径 2 rmdir Q S 目录 删除文件夹 xff08 非空 xff09 S 除目录本身外 xff0c 还将删除指定目录下的所有子目录 Q 安静模式 xff0c
  • 01 | 使用Gradle构建多模块项目

    系列文章目录 01 使用Gradle构建多模块项目 02 架构师必备 DDD领域驱动设计之落地实践 03 异常处理实践 抛异常 43 错误码 从今天开始 xff0c 我将从无到有的搭建一套基于 SpringBoot 的开发脚手架 xff0c
  • 干了三年java外包,我转AI了....

    谈及到程序员外包这件事 xff0c 我想我是比较有发言权的一个 xff0c 即使我现在已经从一个外包公司的JAVA开发转行做人工智能算法 我是2018年毕业的 xff0c 一毕业找的第一份工作就是一家外包公司 xff0c 主要做的是承接甲方
  • 人工智能的算法有哪些?AI常用算法

    人工智能 xff08 AI xff09 是一个非常广泛的领域 xff0c 其中包含许多不同的算法和技术 以下是一些常见的人工智能算法 xff1a 人工智能的算法有哪些 xff1f 机器学习 xff08 Machine Learning xf
  • Ftpsclient上传文件到ftp时storeFile总是返回false(522 data connections must be encrypted)

    使用java中org apache commons net ftp的FTPSClient将文件上传服务器时 xff0c 调用storeFile总是返回false 及时打印fClient getReplyCode 和fClient getRe
  • Android官方架构组件:Lifecycle详解&原理分析

    概述 在过去的谷歌IO大会上 xff0c Google官方向我们推出了 Android Architecture Components 其中谈到Android组件处理生命周期的问题 xff0c 向我们介绍了 Handling Lifecyc
  • 线程池原理——生产者/消费者

    import java util ArrayList import java util List import java util concurrent BlockingQueue import java util concurrent L
  • Java并发编程实战~生产者-消费者模式

    前面我们在 Worker Thread 模式 中讲到 xff0c Worker Thread 模式类比的是工厂里车间工人的工作模式 但其实在现实世界 xff0c 工厂里还有一种流水线的工作模式 xff0c 类比到编程领域 xff0c 就是生
  • REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案

    一 前言 在我们日常的开发中 xff0c 无不都是使用数据库来进行数据的存储 xff0c 由于一般的系统任务中通常不会存在高并发的情况 xff0c 所以这样看起来并没有什么问题 xff0c 可是一旦涉及大数据量的需求 xff0c 比如一些商
  • 一段日子的结束, 也是一段日子的开始

    一个朋友说的 xff0c 一段日子的结束 xff0c 也是另一段日子的开始 也正是我现在的状态 xff0c 我结束了一段往事 xff0c 也因此开始了一段日子 xff0c 曾经的曾经已离我远去 昨天和好朋友聊天到很晚 xff0c 谈了很多
  • 岁月静好

    不是说马年会马上转运的 xff0c 是不是蛇年的时候前半年太幸福了 xff0c 用了太多的好人品 xff0c 各种奖学金 xff0c 各种申请中标 xff0c 各种荣誉 xff0c 然后我要还了 小猴子说我开始会依赖人了 xff0c 哈哈
  • Android视图绑定ViewBinding的使用

    1 ViewBinding概述 使用ViewBinding的目的是轻松地编写可与视图交互的代码 将view和代码绑定在一起有多种方法 xff1a xff08 1 xff09 findViewById xff1a 编译不安全 xff0c 出现
  • Archlinux安装xfce4桌面

    Archlinux安装xfce4桌面 安装桌面环境 pacman S xorg 安装xfce4桌面 pacman S xfce4 安装LightDM显示管理器 pacman S lightdm lightdm gtk greeter Lig

随机推荐

  • 线程池 allowCoreThreadTimeOut 小知识

    关于线程池 xff1a allowCoreThreadTimeOut true 的小知识点 1 背景 检查别人程序发现堆内存2G xff0c 但是常驻内存res到3 2G了 xff0c 经过一系列操作发现线程特别多 1000 43 当然有重
  • 解决用Hexo和GitHub搭建博客时hexo d命令报错问题

    这两天学着使用hexo和github page搭建个人博客 到使用hexo deploy自动部署到github page的时候出现了错误 xff1a FATAL bash dev tty No such device span class
  • 书房再次升级啦~~

    国庆长假 xff0c 在家里面一顿折腾 xff0c 墙全部重新粉刷 xff0c 书房 卧室 客厅三种不同颜色 书房的颜色是当时在装饰城的展厅里面偷偷扣的墙皮 xff0c 在多乐士店色卡里面对出来的 xff0c 哈哈 ps 这篇日志的照片是用
  • android 抓取LOG的几种命令

    通常调试时候需要抓取log信息 xff0c 下面几种通过ADB命令来抓取log的方法 xff1a USB连接上手机 xff0c 手机需要其他操作 xff1b 然后运行ADB工具 xff1b 输入不同的命令即可抓取对应的LOG信息 抓取rad
  • 基于K近邻法的手写数字图像识别

    数字图像处理课程论文 题目 xff1a 数字图像识别 摘要 模式识别 PatternRecognition 是一项借助计算机 xff0c 就人类对外部世界某一特定环境中的客体 过程和现象的识别功能 xff08 包括视觉 听觉 触觉 判断等
  • Android apk图片资源目录存放规则(drawable和mipmap的区别)

    mipmap mdpi 48 48 mipmap hdpi 72 72 mipmap xhdpi 96 96 mipmap xxhdpi 144 144 mipmap xxxhdpi 192 192 drawable ldpi xff1a
  • 动态代理实现AOP

    阅读目录 代理静态代理动态代理动态代理的应用场景AOPAOP实例1AOP实例2 回到顶部 代理 代理顾名思义 xff1a 代为处理 不是对目标对象的直接操作 xff0c 而是通过代理对目标对象进行包装 xff0c 此时可以在目标对象的基础上
  • 使用linux系统提供的信号量集和共享内存实现生产者和消费者问题

    使用linux系统提供的信号量集和共享内存实现生产者和消费者问题 实验目的 了解和熟悉linux系统下的信号量集和共享内存 实验任务 使用linux系统提供的信号量集和共享内存实现生产者和消费者问题 实验要求 1 写两个程序 xff0c 一
  • XML学习准备(HTML、CSS、JavaScript)

    1 学习前的准备html 1 每个网站开发人员都有必要了解以下几方面的知识 xff1a 万维网如何工作 HTML 语言 如何使用层叠样式表 CSS JavaScript 编程 XML 标准 服务器脚本技术 使用 SQL 来管理数据 2 HT
  • 如何判断系统是32位的还是64位的?

    1 最简单的一种方法 xff1a xff08 1 xff09 XP系统 右击 我的电脑 34 属性 34 xff0c 如果是32为系统 xff0c 则显示 Microsoft Windows XP Professional xff0c 即不
  • No embedded stylesheet instruction for file:奇怪的错误

    今天在看Spring的一些东西 xff0c 刚开始看 xff0c 编写了一个HelloWorld xff0c 中间除了不少错误 xff0c 但是都排除了 xff1b 但是 xff0c 最后的一个错误实在是摸不着头脑 xff1a 21 11
  • 修改Windows的默认文件查看方式

    Windows文件夹中查看文件的方式有 xff1a 缩略图 xff0c 平铺 xff0c 列表 xff0c 图标 xff0c 详细信息 xff0c 默认方式为平铺 那么如何修改成其它的默认方式呢 xff1a 进入一个文件夹 xff0c 选择
  • windows右键添加cmd

    1 运行regedit打开注册表 2 在注册表 HKEY CLASSES ROOT Directory shell分支下新建一项命名为 CommandPrompt xff0c 修改右侧窗口中的 默认 键 值为 命令提示符 xff08 你想要
  • 如何查看端口被哪个程序占用

    假如我们需要确定谁占用了我们的3306端口 1 Windows平台 在windows命令行窗口下执行 xff1a C gt netstat aon findstr 34 3306 34 TCP 127 0 0 1 9050 0 0 0 0
  • 写个心得

    唉 xff0c 菜鸟就是悲哀啊 刚刚花了将近一个小时来学习for命令 xff0c 以前一看这么复杂 xff0c 就不想学了 xff0c 总想着虽然复杂 xff0c 但也是简单的 xff0c 将来用的时候 xff0c 查查就知道了 就这样 x
  • 视图绑定功能

    文章目录 前言 以下为Kotlin语言环境在android官方文档中 视图绑定可以用于替代findViewById 并且 当启用视图绑定之后 系统会为项目中的每个XML文件生成一个绑定类 绑定类的实例包含其布局中的所有具有ID的直接引用 一
  • Android 一键分享功能

    之前在做项目时遇到这么个需求 xff0c 就是用户点击Menu或者一个按钮可以把文字分享到各大微博例如新浪微博 腾讯 人人 开心 校内等 现在我给大家演示一下 xff08 一 xff09 先建一个工程文件ShareDemo xff08 二
  • 怎么根据Comparable方法中的compareTo方法的返回值的正负 判断升序 还是 降序?

    public int compareTo Student o return this age o age 比较年龄 年龄的升序 应该理解成return 1 this age o age 计算机没有所谓的正序和逆序 xff0c 他只管大还是小
  • 自动驾驶技术-环境感知篇:V2X技术的介绍

    V2X技术概述 在前面的几篇文章分别介绍了自动驾驶在环境感知领域的相关技术点 xff0c 主要介绍了如何通过雷达配合视觉技术实现车辆自身的智能 其实在环境感知方面 xff0c 除了利用车辆自身的智能 xff0c 还可以借助外部环境实现信息的
  • 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

    综述 因为我个人最近在从事可能是AI领域对性能挑战最大的方向 xff0c 自动驾驶领域 xff0c 所以对整个深度学习训练的优化尤为关注 xff0c 最近一直在学习相关内容 xff0c 谨以此篇文章做一个总结 我一直很看好深度学习训练优化这