当前位置: 首页 > 编程日记 > 正文

从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的

整理 | 夕颜

出品 | AI科技大本营(ID:rgznai100)

【导读】人工智能时代,机器学习已经渗透进每个领域,改变了这些领域的业务模式、技术架构以及方法论。随着深度学习技术近年来快速发展,高效、易用的机器学习平台对于互联网公司愈发重要,一个高效的机器学习平台可以为公司提供更好的人工智能算法研发方面的支持,减少内部重复性、提升资源利用率、提高整体研发效率。

在2019 AI开发者大会上,滴滴出行资深软件工程师唐博在机器学习技术分论坛上分享了kubernetes调度系统在滴滴在机器学习平台中的落地与二次开发。

本次演讲从滴滴机器学习平台的特点开始探讨,分享了滴滴机器学习场景下的 k8s 落地实践与二次开发的技术实践与经验,包括平台稳定性、易用性、利用率、平台 k8s 版本升级与二次开发等内容。此外,唐博还介绍了滴滴机器学习平台是如何从 YARN 迁移到 k8s,以及 YARN 的二次开发与 k8s 的对比等。最后,唐博还分享了滴滴机器学习平台正在研发中的功能以及对未来的展望。

2019 AI开发者大会是由中国IT社区 CSDN 主办的 AI 技术与产业年度盛会,2019 年 9 月 6-7 日,近百位中美顶尖 AI 专家、知名企业代表以及千余名 AI 开发者齐聚北京,进行技术解读和产业论证。

以下为唐博演讲实录,AI科技大本营(ID:rgznai100)整理:

我叫唐博,来自滴滴出行机器学习平台,负责调度系统,今天分享的题目《是滴滴机器学习平台kubernetes落地与实践》,大概分四个部分:

一、滴滴机器学习平台简介

二、平台调度系统的演进

三、机器学习场景下的k8s落地实践与二次开发

四、平台正在开发的功能及未来展望

机器学习平台介绍

上图最下方是滴滴学习平台整体提供的算力、网络和存储三个方面,其中算力包括 GPU、CPU,也有第三方合作厂商所提供的专用神经网络处理器;网络方面我们内部有一个高速网络;存储方面我们提供了分布式高性能网络存储。基于算力、网络和存储这三个硬件层面的基础设施,我们在上面用 kubernetes 调度系统来进行资源管理。

我们选择 kubernetes 的原因很多,首先是 kubernetes 的扩展性较好,它可以适配各种不同的网络和存储,且在其他方面,如调度、自定义资源、容器运行时等方面都有很好的扩展能力。其次,因为 kubernetes 本身给社区的红利非常好,基于它的设计理念和提供的服务,可以更好地适用于机器学习不同的训练和预测场景。

基于调度层,我们平台提供了各种对机器学习的支撑,比如高可用/负载均衡;对于不同的训练,滴滴自研了环状参数服务器,实现是环状算法。为了提高推理服务的性能,我们自己研发了弹性推理服务和前向框架。

当用户在实验环境里进行代码开发,代码调试到一定程度时,可以把比较成熟的代码放到我们的离线任务里进行批量调参,或者进行自动调参,生成一个满足他们业务需求的模型,并把生成的模型通过我们的前向框架和弹性推理服务,以在线的方式进行推理。

基于这些服务,我们提供不同的深度学习和机器学习业务,包括图像、语音、自然语言处理、知识图谱、地图和 AR、VR 等业务。

侧面这四个是其它部门提供的对于平台建设的支持类业务,比如智能运维、监控告警服务、日志收集和镜像仓库等,这些合起来构成我们的机器学习平台架构。

平台调度系统演进

下面我们来看第二部分,滴滴机器学习平台调度系统的演进。

最开始我们选择了 YARN,并对社区的 Application Master进行了改造,以适合自己的机器学习场景。我们修改了 DockerContainerExecutor以更好地支持 docker 调度,并去除了其中的docker rm命令,从调度层面 100% 保证数据的可靠性。此外,修改了调度器,以支持 GPU 调度,并扩展了 YARN API,让管控系统和调度系统更好地结合,管控系统可以获取更多调度方面的信息。然而,随着业务的逐渐发展,以及业务线和业务形态的多样化,我们发现 YARN无法满足我们的需求,于是,我们从 2017 年开始向 kubernetes 迁移。


对于我们来说,kubernetes 相比于 YARN,在扩展性、CSI、CNI、CRI、CRD、调度等许多其他可以扩展的接口上有很大的提升。从生态系统上来讲,kubernetes 依托 CNCF 社区,专注于云计算领域,更加契合我们的场景。而 YARN 依托 Apache 社区,主要是大数据领域。云原生设计理念方面,kubernetes 以声明式 API为根本,向上在微服务、serverless、持续集成交付等方面可以做更好的集成,这也是我们从YARN 向 kubernetes 迁移的重要原因。

右图是 CNCF 项目全景图,包括存储、网络、容器进行时、调度、监控等诸多方面,云计算领域应该有的开源项目都包含在其中,包括 Spark 这一子项目。大势所趋,我们决定从 YARN 向kubernetes 迁移。

机器学习场景下的k8s落地实践与二次开发

第三点,是关于滴滴机器学习场景下的 k8s 落地实践与二次开发。

滴滴机器学习平台的主要特点是给用户提供三种环境,实验环境、离线任务、在线服务。实验环境主要是用户可以登陆里面,进行代码开发、调试、修改版本等。离线服务是在代码基本成型之后进行批量训练调参,并生成模型。在线服务是使用生成的模型进行预测。

下面将就平台要考虑易用性、利用率、稳定性这三个方面进行 k8s 落地实践与二次开发的相关介绍。

易用性

首先是易用性,平台给用户提供了扁平网络,最开始是使用的是sriov 网络,给用户环境分配一个 IP,用户通过管控系统页面登陆实验环境。但是,后来随着公司整体网络架构演进,一方面需要更加灵活的网络配置,另一方面需要更强的隔离性,平台改为使用公司内部的SDN,使得配置更灵活,隔离更强,容灾之后 IP 不变,且可以指定 IP。这一方面是为了给用户更好的用户体验,另一方面是如果将内部调度系统和其他系统,如数据库、分布式缓存系统等进行打通,我们需要有一个白名单功能,而 IP 不变会方便我们进行白名单打通。

这是网络方面调度易用性的相关介绍。接下来是存储方面。

最主要的是中间黄色部分,我们给用户提供了一个分布式的基于 SSD 盘的 GlusterFS 分布式存储系统,用户可以用他们的项目和个人 IP 访问存储空间。但是因为 GlusterFS 空间不大,我们还提供了 HDFS,用户可以把一些较冷的数据放到 HDFS 里,可以多存储一些。除此之外,用户在使用过程中,如果想编译一些小文件较多的框架,网络存储的性能并不能满足他们的需求,所以,基于用户需求和硬件环境,我们提供第三种存储方式,在本机节点上隔出来一块盘,基于local PV提供本机缓存。

local PV本身有两个特点,一是适用高吞吐场景,二是只存在于一个node 节点上,不保证数据的可靠性。关于 local PV 比较典型的使用样例是 Uber 提出来的,Uber的M3DB 把数据进行分片,每一个分片复制三份,每一份是一个 local PV,相当于把数据可靠性功能做到分布式数据系统这一层,所以缓解了 local PV 本身数据不可靠的缺陷。

但是对于我们来说,提供 local PV 功能是为了让用户可以更好地编译而提供缓存,并不需要保证可靠性,只是提供为了高速存储。

我们对 local PV 的代码进行了修改,如果在K8S的yaml文件里面写了一个 node 节点上不存在的目录,它会自动创建该目录,因为我们的调度系统只能从管控系统来进行 PV 创建,所以安全性可以得到保障。

总的来说,如右图中所示,我们提供了三种不同存储,从上到下磁盘空间越来越大,从下到上性能逐渐提升。


接下来是易用性方面的辅助性功能。我们修改了调度的代码, 对docker根目录大小进行了限制。最开始docker存储区驱动是devicemapper,后来随着版本升级变成了overlay2,物理机我们是 xfs 系统,我们用xfs quota功能限制 docker 根目录大小,保证物理机磁盘足够用,以及 harbor 磁盘不被占满。

第二个辅助性功能是增加正在使用的 GPU,APIserver 返回 GPU,kubelet 获取 container 正在使用的 GPU,返回给 apiserver。


这是滴滴自研前向框架加上滴滴自研的 serving框架,是为了提高inference的性能。kube-proxy在这个场景下会增加一层额外的iptables或者ipvs,我们直接使用了 LVS 对接后面的 Pod IP,类似 ingress,不过是 EIP 对接 Pod IP。我们的目的是为了可以给用户提供更好的前向预测性能。

利用率


利用率方面,首先介绍共享 GPU。目前我们了解到,社区和友商也提出了一些共享 GPU 的方案,其中可能比较著名的是 GPU share device plugin,加上 GPU 共享的 scheduler extender解决方案,这种解决方案的特点是,它更适合于 serving 前向推理步骤或者代码调试,同时需要限制显存。第二个开源方案是 Fractional GPU,提供强隔离,目前还处于研发阶段,只支持 Caffe 一种框架,如果要适配更加普适性的框架,还需要自己对接开发。第三个是社区同学提供的 Multiple device plugin 方案,一个 GPU 会上报多次,也是需要限制显存。

我们的机器学习平台提供的方法与以上友商和社区的方法有很多相似之处,比如共享 GPU 的方案,我们修改了代码,允许多个 docker 共同使用一个 GPU,并且hook 了cuMemAlloc 等一系列函数进行显存限制。后来,随着业务的演进,我们的实验环境让用户可以进行任何实验,这时有些用户会偶尔做一些破坏性的工作,docker 这种软隔离对他们的限制作用有限,所以我们就采用了英伟达最新提出的 vGPU KVM 供用户使用。

接下来是调度方面,我们根据用户的使用习惯提供了不同套餐的离线任务和实验环境,比如只有一个 GPU 的一卡离线任务和有四个 GPU 的四卡离线任务,在这种套餐化的场景下,会产生一个问题,即资源的碎片化,所以我们用了调度策略,通过配置优先级函数,实现紧凑调度。如右图所示,下面四个是节点,分别运行了两个1卡 GPU,还有三个。第二个和第三个1卡离线任务也是同样调度到第一个节点上,第一个节点 GPU 目前使用率是集群中使用的第二个,这时通过紧凑调度,我们会把第三个节点的离线任务分配给四卡,充分调度空闲机器。

除此之外,根据用户的使用情况,滴滴机器学习平台里除了有 GPU 的任务,也有不使用 GPU 的纯 CPU 离线任务,结合物理机内存和显存的比例情况,除了提供 GPU 离线任务之外,我们把每台物理机隔出一块资源提供给 CPU 离线任务,把 CPU 任务尽量打散,避免影响重要的GPU 任务。另外一点是紧凑调度函数,社区自带的MostRequestedPriority函数只适用于 CPU 和内存,不支持其他的扩展资源,比如 GPU,所以我们对紧凑调度优先级函数进行修改,让它可以支持扩展资源。

为了提升用户体验和进一步提高利用率,我们对k8s 在调度上进行了改进。

当资源占有率非常高时,如果用户还没有高优先级的任务,就只能让一些紧急任务抢占资源。但是在抢占的同时,我们也希望高优先级的任务到来时,对集群现有任务所造成的伤害和影响最小,所以,我们为抢占的过程加入了一个按照离线任务和 Pod 启动时间先后顺序来进行排序的功能。我们在第二步生成每个 node 上可以被抢占的 Pod进行了改进,加入了启动时间。在第四步,社区的算法是遍历每个 node 上比当前 Pod 优先级低的 Pod,加入 potential victims。将 potential victims 按照优先级排序,同优先级下按照时间排序。如果第一条不能选出最合适的 node 就进行下一条,依次进行。

首先选择违反 PDB 最小的节点。如果第一条就选不出来,第二条从所有可以被抢占的最高优先级Pod中选出优先级最低那个Pod所在的节点,接着是优先级之和最小的节点,个数最少的节点,最高优先级的 Pod 中启动时间最晚的节点。我们发现友商也有这个需求,后来我们和友商一起把这个方案贡献给社区。

稳定性

下面我们来看看稳定性方面。因为稳定性对于任何一个平台级的产品和应用来说都是必不可少的,针对稳定性我们也做了或大或小的参数调整和二次开发,我将分别从运行稳定性、数据稳定性和升级稳定性三个方面来讲解。

运行稳定性,我们调大 pod 驱逐时间和节点监控时间,一方面是为了更好地应对内部网络抖动,超时调大之后可以扛住更大的抖动;另一方面也是为了便于运维操作,如果一个机器挂掉,运维组的同学有足够的时间来恢复脚本,把集群恢复到之前的状态,并把这些 pod 的 IP 也配置成之前的状态,让用户感觉除了重启之外没有其他变化。

数据稳定性,我们去除了 docker rm 命令,防止异常情况下数据丢失,在调度层面确保数据不丢。

升级稳定性,去除了 container hash 检查,去除了 kubelet 创建环境变量时对 pod.Spec.Enable service Links 的检查,使Pod在升级时不会重启。社区相关PR从1.16起升级才管用。

同时我们关闭了TaintBasedEviction,使pod 在升级时不会被驱逐。

平台正在开发的功能及未来展望


最后是关于平台正在开发的功能以及机器学习相关的未来展望。

我们正在进行中的功能开发主要有调度器、再调度器,以及我们自己的 device plugin。


首先是调度器,基于社区的新的调度框架,调度分为不同的阶段,每个阶段都是一个扩展点,用户可以在这些扩展点实现自己的插件和需要的功能。我们正在做的是 Filter 定制,Post-bind定制,并且与监控打通和任务画像。

再调度器的主要目的是防止集群中的资源碎片化,比如上图的集群中分别有一、二、三不同个数一卡离线任务,如果有四卡离线任务到来,会对这个节点形成抢占,一卡离线任务之前运行的一些流程就被迫中断了,或者如果模型没有保存就没用了。我们做再调度器是为了提前发现这种状况,和监控系统打通,通过再调度器来驱逐一卡离线任务,让它重新通过调度器的紧凑调度,调度到这台机器上,这样就可以提前空出机器,供后续的四卡离线任务使用。但是,这也涉及到当前正在运行的异卡离线任务启动时间,以及任务的特征刻画。举例来说,驱逐一个卡运行 30 分钟还是驱逐两个卡运行 20 分钟,都是我们需要考虑的问题。

此外,我们也在开发 device plugin,以实现实验环境和离线任务的混合调度,但暂时不便透露太多信息。

未来,我们希望借助 k8s 提供多机多卡服务,现在多机多卡是在管控这一层实现的,我们希望放到调度这一层,以更好地利用 k8s 的调度能力,为用户提供更好的体验,打造一站式机器学习平台。同时也把更多大数据任务放到这个平台上,比如 Spark等。以及提供更好的在离线混合调度,来进一步提高集群的资源分配率和利用率。

目前,滴滴机器学习平台着力发展公有云,让机器学习平台不但在内部使用,也可以提供给更多外部同行使用。

再细一点讲,希望可以为从硬件选型到基础设施,到整个上层软件栈,提供一个内外统一的架构,减少内外两部分的重复性工作。比如针对上图中底部的 IaaS 和Paas层,我们希望提供内外统一的资源,如机器学习平台简枢、算法市场、模型市场、数据市场等,基于这些底层服务,在 SaaS 层提供人脸、语音、自然语言处理和智能视频识别和其他图像、地图服务。

现在,滴滴机器学习平台已经在滴滴公有云平台上,上图为架构图,如果想了解详细内容可以访问网站。

演讲嘉宾:

唐博,滴滴出行资深软件工程师,曾就职于高盛美国、高盛香港,现就职于滴滴出行,负责机器学习平台调度系统,是kubernetes, istio, kubeflow, alluxio等开源项目的代码贡献者。

(*本文为AI科技大本营整理文章,转载请微信联系 1092722531)

精彩推荐

开幕倒计时5天|2019 中国大数据技术大会(BDTC)即将震撼来袭!豪华主席阵容及百位技术专家齐聚,十余场精选专题技术和行业论坛,超强干货+技术剖析+行业实践立体解读。6.6 折票限时特惠(立减1400元)倒计时 2 天,学生票仅 599 元!

推荐阅读

  • 阿里正式开源通用算法平台Alink,“双11”将天猫推荐点击率提升4%

  • 最新单步目标检测框架,引入双向网络,精度和速度均达到不错效果

  • 拒绝成为比尔·盖茨的“万维网之父”,又要干大事!

  • 测试小白必读!从0基础做到「大厂测试」,要掌握什么技能?

  • 科技公司最爱的50款开源工具,你都用过吗?

  • OceanBase 的前世今生

  • 骚操作!程序员将简历做成游戏,边看边玩还能通关!HR……

  • 如何判断一家互联网公司要倒闭了?

  • 把700元的单片机改造成以太坊节点, 9步get起新技能!

  • 你点的每个“在看”,我都认真当成了AI

相关文章:

最新 macOS Sierra 10.12.3 安装CocoaPods及使用详解

cocoapods官网:https://guides.cocoapods.org 一、什么是CocoaPods 每种语言发展到一个阶段,就会出现相应的依赖管理工具,例如 Java 语言的 Maven,nodejs 的 npm。随着 iOS 开发者的增多,业界也出现了为 iOS 程序提供…

libusb中的热插拔使用举例

以下为判断usb设备是插入还是拔出状态(热插拔)的测试代码&#xff1a; 在Windows下是不支持的&#xff0c;在Linux是支持的&#xff0c;下一个版本可能会支持Windows下的热插拔&#xff1a; #include <chrono> #include <thread> #include <iostream> #incl…

C++复制控制:拷贝构造函数

一、拷贝构造函数是一种特殊构造函数&#xff0c;具有单个形参&#xff0c;该形参&#xff08;常用const修饰&#xff09;是对该类类型的引用。与默认构造函数一样 &#xff0c;拷贝构造函数可由编译器隐式调用。拷贝构造函数应用的场合为&#xff1a; &#xff08;1&#xff0…

关于IOS获取本地通讯录信息(包含iOS9.0前后)

在ios开发当中&#xff0c;获取用户本地的通讯录功能愈加频繁的出现&#xff0c;七两自己也在自己公司的项目当中遇到的获取本地的通讯录信息的功能&#xff08;俗称“种子用户功能”&#xff0c;太可怕了&#xff09;。对此七两总结了自己使用本地通讯录时的注意点&#xff0c…

C和C++安全编码笔记:动态内存管理

4.1 C内存管理&#xff1a; C标准内存管理函数&#xff1a; (1).malloc(size_t size)&#xff1a;分配size个字节&#xff0c;并返回一个指向分配的内存的指针。分配的内存未被初始化为一个已知值。 (2).aligned_alloc(size_t alignment, size_t size)&#xff1a;为一个对象…

作为一名程序员,数学到底对你有多重要?

最近在知乎上看到一个贴子&#xff0c;看完后我沉默了.....沉思后想想&#xff0c;其实每个行业都会分等级&#xff0c;程序员也不例外&#xff01;说好听一点的叫工程师&#xff0c;普通一点的叫程序员&#xff0c;差一点的叫码农&#xff0c;更差的还会叫码畜&#xff0c;码奴…

经典SQL(sqlServer)

一、基础 1、说明&#xff1a;创建数据库CREATE DATABASE database-name 2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- …

iOS UITextField输入框随键盘弹出界面上移

//点击输入框界面跟随键盘上移 - (void)textFieldDidBeginEditing:(UITextField *)textField { CGRect frame textField.frame; int offSet frame.origin.y 70 - (self.view.frame.size.height - 216.0); //iphone键盘高度为216.iped键盘高度为352 [UIView beginAnimations:…

IEEE分享 | 机器学习在领英的规模化应用

人工智能和机器学习仍然是全球持续增长的领域之一&#xff0c;近年来涌现出越来越多本科生或者非人工智能专业出身的工程师&#xff0c;他们努力学习和使用技术来改进产品&#xff0c;几乎每天都有新的机器学习技术和框架发布。这篇文章将讨论领英如何规模化利用技术&#xff0…

GitHub/GitLab/Gitee中项目互拷贝后仍保留历史提交记录的方法

GitHub、GitLab、Gitee等在同一个网站中执行复制或拷贝一个已有项目到一个新项目比较简单&#xff0c;因为它们在每一个项目上都有一个Fork按钮&#xff0c;直接点击此Fork按钮即可&#xff0c;Fork后的新项目会保留原有项目的历史提交记录。但是如果不在同一个网站上进行此操作…

基于mimeTex的数学公式Webservice的部署和实现

通过Latex语法&#xff0c;实现生成数学公式的解决方案也很多。这里介绍一种方法&#xff0c;使用开源的mimeTex。该项目的官网地址如下&#xff1a;http://www.forkosh.com/mimetex.html网站主页有一个声明。如果你的服务器上已经安装了latex&#xff0c;那么推荐使用mathTex&…

对称加密算法AES之GCM模式简介及在OpenSSL中使用举例

AES(Advanced Encryption Standard)即高级加密标准&#xff0c;由美国国家标准和技术协会(NIST)于2000年公布&#xff0c;它是一种对称加密算法。关于AES的更多介绍可以参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/100139524 AES的GCM(Galois/Counte…

iOS UITextField清空按钮

extField.clearButtonModeUITextFieldViewModeWhileEditing; 就可以了&#xff0c;表明编辑输入框的时候启动一键清空按钮。另外&#xff0c;clearButtonMode还有三个属性&#xff1a; UITextFieldViewModeNever, 清空按钮永不出现 UITextFieldViewModeUnlessEditing, 不编…

腾讯“疯狂”开源

作者 | 马超责编 | 胡巍巍出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;近日&#xff0c;腾讯自研的万亿级分布式消息中间件TubeMQ正式开源&#xff0c;并捐赠给Apache基金会&#xff0c;成为基金会官方认可的Incubator项目。我们知道与TubeMQ功能类似的kafka是领…

[Android]开发摇一摇分歧表决器过程

心血来潮&#xff0c;走进Android&#xff0c;准备开发一个摇一摇分歧表决器&#xff08;PS&#xff1a;这个想法源自去年看的一个都市剧《约会专家》中主人公杭杭开发的分歧表决器APP&#xff09;。简述&#xff1a;摇一摇分歧表决器是一款Android App&#xff0c;通过将传统的…

C和C++安全编码笔记:整数安全

5.1 整数安全导论&#xff1a;整数由包括0的自然数(0, 1, 2, 3, …)和非零自然数的负数(-1, -2, -3, …)构成。 5.2 整数数据类型&#xff1a;整数类型提供了整数数学集合的一个有限子集的模型。一个具有整数类型的对象的值是附着在这个对象上的数学值。一个具有整数类型的对象…

8.3折特惠票仅剩3天!「2019 嵌入式智能国际大会」全日程大公开!

8.3折特惠票仅剩3天立即抢购&#xff1a;https://t.csdnimg.cn/otBk还有5天&#xff0c;大伙期待的「2019嵌入式智能国际大会」正式开幕了&#xff01;2019年12月6日-7日&#xff0c;我们在深圳市人才研修院见&#xff01;大会以“万物互联泛在智能”为主题&#xff0c;邀请30位…

iOS点击空白收回键盘

//点击空白收回键盘 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; }

第一个net-mvc程序

结构 视图层 <% Page Language"C#" Inherits"System.Web.Mvc.ViewPage<dynamic>" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…

iOS 储存用户信息设置封装 直接调用即可(部分是代码片段)

、、、、、、、、、、、、、、、、、、首先 定义 UserInfo #import <Foundation/Foundation.h> interface UserInfo : NSObject //用户id property (nonatomic, strong) NSString *userID; //用户名 property (nonatomic, strong) NSString *userName; //密码 propert…

ASN.1简介及OpenSSL中ASN.1接口使用举例

ASN.1(Abstract Syntax Notation One)是一套标准&#xff0c;是描述数据的表示、编码传输、解码的灵活的记法。它提供了一套正式、无歧义和精确的规则以描述独立于特定计算机硬件的对象结构。OpenSSL的编码方法就是基于该标准。ASN.1是一种结构化的数字对象描述语言&#xff0c…

谁是当今最顶级的技术?SQL、Java、Python、C++ 皆上榜!

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

将表里的数据批量生成INSERT语句的存储过程 增强版

原文:将表里的数据批量生成INSERT语句的存储过程 增强版将表里的数据批量生成INSERT语句的存储过程 增强版 有时候&#xff0c;我们需要将某个表里的数据全部或者根据查询条件导出来&#xff0c;迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生…

通过OpenSSL的接口实现Base64编解码

对openssl genrsa产生的rsa私钥pem文件&#xff0c;使用普通的base64解码会有问题&#xff0c;如使用https://blog.csdn.net/fengbingchun/article/details/85218653 中介绍的方法&#xff0c;一是有可能不能从返回的结果中直接使用strlen来获得最终字符的大小&#xff0c;因为…

激辩:机器究竟能否理解常识?

【12月公开课预告】&#xff0c;入群直接获取报名地址12月11日晚8点直播主题&#xff1a;人工智能消化道病理辅助诊断平台——从方法到落地12月12日晚8点直播&#xff1a;利用容器技术打造AI公司技术中台12月17日晚8点直播主题&#xff1a;可重构计算&#xff1a;能效比、通用性…

Mac OS X 下Node.js开发环境的搭建

1.安装Xcode2.安装Homebrew 谷歌搜索Homebrew 复制命令行 打开终端 粘贴命令行 点击回车 安装 输入密码等2.安装Nodejs利用Homebrew安装nodejs打开终端 输入 &#xff1a;brew install nodejs 回车查询nodejs版本&#xff1a;node --version3.安装文档数据库 MongoDB打开终…

.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码&#xff0c;例如以下所看到的&#xff1a; /// <summary>/// MySql 数据库操作类/// </summary>public class MySqlHelper{/// <summary>/// MysqlConnection/// </summ…

Instagram个性化推荐工程中三个关键技术是什么?

作者 | Ivan Medvedev&#xff0c;Haotian Wu&#xff0c;Taylor Gordon译者 | 陆离编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09; 【导语】近期&#xff0c;Facebook 在博客上分享了第一篇详细介绍 Explore 系统关键技术&#xff0c;以及 I…

iOS UIbutton 点击无反应的几种情况

1、UIButton不能点击情况的第一种是&#xff0c;你将button添加到一个不能响应点击事件的View里。如你将button添加到UIImageView中&#xff0c;解决办法只需将UIImageView的 userInteractionEnabled设为YES即可。 例如&#xff1a; self.headImgV [[UIImageView alloc] ini…

C和C++安全编码笔记:格式化输出

C标准中定义了一些可以接受可变数量参数的格式化输出参数&#xff0c;参数中包括一个格式字符串。printf()和sprintf()都是格式化输出函数的例子。格式化输出函数是由一个格式字符串和可变数目的参数构成的。在效果上&#xff0c;格式化字符串提供了一组可以由格式化输出函数解…