简介: 在软件研发过程中,“代码补全”至关重要,它可以有效的提升开发效率、减少拼写错误和输入代码量。本期《云效说码》分享邀请斑马网络技术专家旭伦分享了《技术红利下的代码补全》,介绍了深度学习革命带来的技术红利,在代码补全业务中对于这些“红利”的应用,以及在阿里云上低成本落地的方法。

在软件研发过程中,“代码补全”至关重要,它可以有效的提升开发效率、减少拼写错误和输入代码量。本期《云效说码》分享邀请斑马网络技术专家旭伦分享了《技术红利下的代码补全》,介绍了深度学习革命带来的技术红利,在代码补全业务中对于这些“红利”的应用,以及在阿里云上低成本落地的方法。
【以下为旭伦分享实录,有删减】

深度学习革命带来的三个技术红利

2012年ImageNet竞赛冠军Hinton和他的学生Alex Krizhevsky设计出AlexNet,从而引领了以深度全连接网络、深度卷积网络、循环网络为代表的第一次深度学习革命,其成果是在图像识别领域人工智能超越人类

深度学习和强化学习结合形成了第二次深度学习革命,其代表事件是:2016年阿尔法围棋(AlphaGo)打败韩国围棋九段棋手李世石;2017年,阿尔法围棋以总比分3比0战胜世界排名第一的中国棋手柯洁。从此,人工智能在围棋上打败人类

预训练模型”的出现和发展带来了第三次深度学习革命,其成果是在自然语音处理方面人工智能战胜人类,目前该技术已经在机器翻译和智能回答机器人领域得到广泛应用。

其中“预训练模型”可能是大家了解最少的,但是跟代码补全最相关,我简要介绍一下,其实目前“各大厂”都在训练自己的预训练模型,大家可以登录“GLUE”网站进行查看,排名几乎每天都在变化,这张截图是阿里巴巴达摩院的“StructBERT”登顶时截取的。

目前,深度学习中的预训练模型已经在很多任务上超越人类,比如CoLA数据集是判断一个句子是不是符合语法规则;SST-2情感分析数据集用于判断一条影评语句是正面还是负面的;MRPC数据集用于判断两条新闻句子描述的是不是同样的意义等。这些通过BERT等预训练模型都可以处理,其最新改进版都可以超越人类标注的值。除此之外,还有GPT2等生成模型,可以实现自动写作功能。

预训练模型与代码补全技术的结合

前面我们提到了“预训练模型”不仅可以判断语句是否符合语法规则,分析影评语句是正面还是负面,甚至可以实现自动写作文。那么“预训练模型”是否可以帮助我们做“代码补全”呢?回答是肯定的。

代码补全的基础理论是:代码大数据理论。“代码大数据”包含了代码和代码元信息,代码元信息,包括注释信息,代码提交时的信息,测试、review时的信息,BUG信息等。这个理论要起作用,需要基于一个公理:基于代码的自然性原理。

虽然语言可以千变万化,但是落实到日常生活中,由于认知的限制和实际的需要,我们日常交流所有的语言是重复性的,有规律的,可预测的。这个统计上的结果,导致了统计机器学习方法在语音识别、机器翻译等领域的巨大成功。于是我们可以假设程序代码也是自然的,因为它们也是人类在工作中创建的,受到硬件的软件的各方面的限制,它们也应该是有其统计规律的。

经过研究证明,代码不但是有自然性的,而且比自然语言的自然性还要好。为此,人们实现了一套基于统计方法的代码补全系统,并成功应用于eclipse IDE中。

有了理论之后,大家迅速将其应用于解决自己手头的问题,代码智能一片繁荣:
2014年代码智能技术被用于代码提示与补全和提升代码可读性;
2015年用于推荐方法名和类名以及语法错误修复;
2016年用于bug修复和源代码总结和查找代码克隆;
2018年被用于预测bug和自动为代码生成注释以及用于反混淆。

代码补全的局限性及解决方案

正在看起来岁月静好的时候,Vincent J. Hellendoorn和Premkumar Devanbu发表了《深度神经网络是建模程序源代码的最佳选择吗?》,认为OOV(Out-of-vocabulary)问题导致深度学习处理程序语言的效果还不如传统机器学习方法。

除此之外,代码补全系统还有3个要求:总是要给出补全结果,速度要跟上程序员打字速度 ,资源占用不能太高。

从程序员的视角看,本地发生的开发与最终提交的开发顺序和上下文环境非常不同,动态集成本地数据的模型比静态模型运行得好得多,针对重复典型模式进行了优化,但可能无法提供新的见解。

为了解决此问题,在实践上,需要实现补全算法,我们需要进行混合模型处理,既要有本地传统算法引擎,也要有远程的算法模型。

从落地方法上,我们采用huggingface的Transformers库,因为其针对多个模型有良好的封装。

在阿里云上低成本落地的方法

如下图所示,这是一张代码补全系统的架构图,除了需要有一个主算法引擎外,我们还需要一个带离线缓存更新的超大规模引擎。为什么要有超大规模引擎?因为前面也提到了,程序员希望代码补全系统可以提供他们不知道内容。这样的结构需要很强的算力,普通的个人笔记本跑不起来。如果要在个人笔记本中实现,就还必须有快速引擎、RNN引擎和注意力引擎。

为了节省成本,我们采用抢占式GPU的方式进行训练。但问题是“抢占式GPU”虽然便宜,但是GPU资源随时可能被别人抢走。“计算”被抢走了,你的“存储”存在哪里呢?这个时候就需要一个本地的存储,我选择的是用“本地NAS”。大家可以简单理解“NAS”就是一个网盘,存储速度很快,但是费用也很高。为了节省预算,我们还需要配一个“本地OSS”,这样我们就构成一个训练服务器集群。

因为我们用到的“模型”太大了,如果直接从国外的服务器上下载,速度很慢,可能几天也无法下载一个“模型”。于是,我们再次发挥云计算的优势。我们可以先在香港租用了临时ECS,然后通过“香港OSS”再转移到“本地OSS”中,从而实现下载加速。

以上内容来自旭伦在“云效开发者交流群”中的视频直播分享,有删节,您可以点击这里观看完整视频。

分享实录 | 深度学习技术红利下的代码补全相关推荐

  1. 【三维重建】【深度学习】windows10下NeRF代码Pytorch实现

    [三维重建][深度学习]windows10下NeRF代码Pytorch实现 提示:最近开始在[三维重建]方面进行研究,记录相关知识点,分享学习中遇到的问题已经解决的方法. 文章目录 [三维重建][深度 ...

  2. 深度学习技术驱动下的人工智能时代!

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 大家好,我是文文(微信:sscbg2020),今天给大家分享中国信通院和中国人工智能产业发展联盟联合发布的白皮书 ...

  3. 2021人工智能核心技术产业白皮书:深度学习技术驱动下的人工智能时代!

    省时查报告-专业.及时.全面的行研报告库 省时查方案-专业.及时.全面的营销策划方案库 大家好,我是文文(微信:sscbg2020),今天给大家分享中国信通院和中国人工智能产业发展联盟联合发布的白皮书 ...

  4. 使用机器学习和深度学习技术(使用Python代码)预测股票价格

    Introduction 预测股市将如何表现是最困难的事情之一. 预测中涉及的因素很多 - 物理因素与生理因素,理性行为和非理性行为等有关.所有这些因素共同导致股价波动,很难以高精度预测. 我们可以将 ...

  5. 深度学习技术在脑机接口中的应用

    大家好! Rose给大家分享一下深度学习技术在脑机接口中的应用. 什么是脑机接口? 脑机接口(BCI)是一种系统,可将受试者(人类或动物)的大脑活动模式提取并转换为用于交互式应用程序的消息或命令.脑活 ...

  6. 搜狗深度学习技术在广告推荐领域的应用

    内容来源:2017年4月17日,搜狗移动搜索广告策略研究组负责人舒鹏在七牛云和QCon联合主办的深度学习论坛"深度学习最新进展与实践"上进行<搜狗深度学习技术在广告推荐领域的 ...

  7. dev c++ 代码补全_学习干货——玩转DEV—C++

    DEV-C++使用指南 学习干货 <玩转DEV-C++> Design:常政华  2019 · 10 · 5  - 前言 - 工欲善其事必先利其器,更加了解我们的开发工具有利于提高开发效率 ...

  8. AI改变金融风控,深度学习技术可以将坏账降低35% | 干货

    昨天在风控群内,大家都在讨论平安普惠COO的观点,"在放贷领域,只有0和1的概念,要么借要么不借",有人说,0和1的概念肯定不适用于贷款审批,信贷审批是多维评判的,没有不能贷的客户 ...

  9. 开源大咖齐聚2020启智开发者大会,共探深度学习技术未来趋势

    ​2020年12月2日,"OpenI/O 2020启智开发者大会"在北京国家会议中心召开.大会以"启智筑梦 开源先行"为主题,立足于国际国内开源大环境和发展趋势 ...

最新文章

  1. [SQL基础教程] 1-5 表的删除和更新
  2. 【安装MongoDB】CentOS7 下安装NodeJs+Express+MongoDB+Redis
  3. delphi 数字识别_基于STM32单片机的车牌识别
  4. the pdf expert for android v2.6.0,PDF Expert
  5. MySQL错误1264和1366_Mysql错误1366 - Incorrect integer value解决方法
  6. scss、sass 和 css 的区别
  7. logback log4j log4j2 性能实测
  8. sql 如何把查询得到的结果如何放入一个新表中
  9. postman的参数params如何设置数组和对象参数
  10. 实战MEF(3):只导出类的成员
  11. VS自带反编译DLL工具
  12. Flutter 调用微信SDK,实现微信支付、微信分享、微信登录、打开微信小程序
  13. React路由管理 —— React Router 总结
  14. 前端实现文件在线预览
  15. 【计算机毕业设计】123网上商城系统设计与实现
  16. 微软宣布Azure DNS全面通用
  17. 【深度学习】深度学习和经典统计学是一回事?
  18. JAVA对象 到底是什么?
  19. linux分区表mbr改gtp,免重装系统 手把手教你MBR转GPT分区表
  20. python poisson图像融合制作CSDN博客头像

热门文章

  1. 零基础的跨界自学拿到腾讯Offer的学习资料
  2. mysql事务机制_MySQL系列:事务机制
  3. python的django框架与springboot_Python系统教学|为什么Django框架在Python开发很重要?...
  4. 中科院信工所经验_2020计算机保研经验贴!(北航、北邮、中科院)
  5. 机器手六维坐标怎么定义_工业机器人十万个怎么办-不清楚机器人各坐标系含义怎么办?...
  6. shiny html5代码,javascript – Shiny:如何正确包含Shiny HTML
  7. oracle未找到远程连接,Oracle ORA-02019:未找到远程数据库的连接说明 | 学步园
  8. pyinstaller打包exe在其他机器无法运行_详解pyinstaller selenium python3 chrome打包问题!解决率100%...
  9. SpringCloud-Eureka-ProviderConsumer
  10. [PHP] 安装PHP报错“Primary script unknown”的解决方法