贾扬清开源 AI 框架 Caffe | 开源英雄

【编者按】在开源与人工智能的灿烂星河里,贾扬清的名字都格外地耀眼。因为导师 Trevor Darrell 教授的一句“你是想多花时间写一篇大家估计不是很在意的毕业论文,还是写一个将来大家都会用的框架?”,学生贾扬清一头扎进了创 Caffe 的世界。Caffe 成了贾扬清的代表作,而贾扬清的开源与 AI 征途还将走得更远。
采访 | 刘韧,云算科技董事长、《知识英雄》作者、DoNews 创始人
作者 | 李欣欣 刘韧 周扬 责编 | 唐小引
出品 | 《新程序员》编辑部
2013 年 6 月,伯克利大学。28 岁的贾扬清(见图 1)正在写 Decaf(Caffe 的前身)。3 个月后,贾扬清博士毕业,此刻,他在和伯克利心理学系的 Thomas Griffith 教授合作,研究一个心理学课题──人类在个人成长过程中是如何形成“类别”概念的。研究中,贾扬清用一个概率框架来表达人的行为,但从图像中提取到的人的行为特征较弱,很难推导出完整的结论。

图 1 伯克利时期的贾扬清
一天,贾扬清看到,一篇获得 2012 年 ILSVRC 比赛第一名的论文“Advances in neural information processing systems”,提到深度学习 AlexNet 模型,用 Convolutional Neural Network(卷积神经网络,简称 CNN)技术,击败了其它非神经网络的算法,只用两块 GPU 即可替代此前 Google 1 万 CPU 方案。一台机器顶一万台机器,且错误率从 25%降到 15%。这篇论文,一石击水,震惊行业。此前,神经网络一直不被业内人看好。
贾扬清受到启发,思考着将论文里的 CNN 提取特征技术,运用到他手头的心理学项目研究上。于是,贾扬清找到 Alex Krizhevsky(AlexNet 模型的作者之一),问他是否可以分享 AlexNet 的源代码?Alex 这样回复:抱歉,我开了公司,正在创业,因知识产权问题,无法直接给代码,但你在研究过程中,遇到问题时,可随时问我。
恰在此时,贾扬清得到 NVIDIA 的学术捐赠计划,收到了一块 K20 的 GPU(见图 2),对学生来说,“GPU 是很贵的!”于是,正在写毕业论文的贾扬清,动手攒了一台机器,利用空闲时间,复现 AlexNet 框架,用以提取图像中的特征。

图 2 最早做框架的 GPU
此时的贾扬清每日搭乘地铁,去 Google 公司实习。坐在地铁座位上,贾扬清打开电脑,摊在双腿上,见缝插针地继续写框架。作为 GPU 的初学者,万事开头难,但贾扬清沉迷其中,“写代码可能和玩游戏上瘾差不多。”“我花在编程上的时间从 20%、40%、80%……逐渐递增。”在 Google,贾扬清每天都要喝数杯咖啡,“这样不好”,贾扬清把正写着的框架命名为 Decaf,是想警醒自己,戒咖啡。
此时,贾扬清的任务清单里有:⒈博士毕业论文;⒉心理学研究课题;⒊找工作;⒋复现 AlexNet 框架。比起前三项任务,贾扬清把更多的时间花在了最后一项,写论文的时间被严重挤压。他找导师 Trevor Darrell(计算机科学家、伯克利教授)寻求建议,导师只问了一个问题:“你是想多花时间写一篇大家估计不是很在意的毕业论文呢?还是多花时间写一个将来大家都会用的框架?”
导师的话鼓舞了贾扬清,他把论文搁在了一边,一头扎进 Decaf。“导师总能教会我,分清主次。”
贾扬清写好了脚手架,小规模“跑起来”后,他把 Decaf 放到了伯克利的小组里,让同学们试用,大家都觉得“还挺好用的”。Evan Shelhamer、Jonathan Long、Jeff Donahue、Sergio Guadarrama 和贾扬清一拍即合,决定组成一个“核心小团伙”,在日常科研和工程工作以外,一起开发 Decaf。很快,“小团伙”复现出 AlexNet 模型。
Decaf 需要基于 cuda-convnet 来训练,但是通过 Decaf 验证,深度学习特征能够利用学习范例进行深入实验,大家觉得,干脆二次开发,做成一个完整的深度学习框架,让它成为通用又干净的 AI 框架工具。
因为 GPU 飞快的速度,贾扬清忖思着把 Decaf 改为 Caffe,伯克利小组的同学们更喜欢 Caffe 的叫法。于是,Decaf 更名为 Caffe。两个月后,Caffe 写完了。贾扬清特意跟导师申请了一笔费用,买来一台冰滴式咖啡机,放在研究室。此后,Evan Shelhamer 经常给大家做咖啡喝,这导致本想戒掉咖啡的贾扬清“最终也没能戒掉咖啡”,大家索性把对外接洽咨询工作的邮箱也改为了 caffe-coldpress。

图 3 贾扬清最早用来开发 Caffe 的电脑主机
贾扬清面临一个难题:该用哪种方式公布 Caffe?是像 Alex Krizhevsky 一样成立创业公司,商业化运作?还是作为程序库,纯粹支持科研?还是开源?贾扬清举棋不定,而其他 Caffe 开发者的意见也各有倾向,莫衷一是。
贾扬清有心开源 Caffe。他想到过去几个月,若是有一个公开的深度学习框架,能获取代码和算法的细节,自己就不必再浪费精力复现。而且,“当学生时,我内心深处就有‘做出一个东西,放到开源上’的愿望”,“我在伯克利所用到的代码,绝大多数都是开源的”,“只有把市场做大,大家才可能都有蛋糕吃”,“开源,并不会抹灭个人的技术能力”,“反正,买咖啡喝,我还是买得起的!夫复何求呢。”
该如何让大家同意呢?“这可比写 Caffe 难多了”。贾扬清决定,挨个找核心开发的同学们谈。有的同学好谈,有的则难辩,贾扬清急了,脱口说出气话“这是我写的框架,所以我应该有决定权!”的时候也有,前后谈了 7 天,最后,所幸同学们都同意 Caffe 开源。
2013 年 12 月,Caffe 放到 GitHub 上,正式开源。得知消息的 Alex Krizhevsky 也很开心。贾扬清的导师建议把伯克利大学写在 Caffe 的说明上,贾扬清也很乐意,“Caffe 以伯克利大学的名义开源,大家很骄傲,觉得为母校争光了。”
在 Google 实习时,贾扬清拿到了 Google 的正式 Offer,只等毕业后入职。不再想找工作的贾扬清完全放飞,索性毕业论文也不写了,最初研究的心理学课题,也不了了之。
Caffe 开始吸引用户和开发人员,借由 Caffe 光环,贾扬清结识了许多业内人士。两个月后,贾扬清意外收到英伟达公司的邮件,英伟达提出,将为伯克利研究所提供计算的资源,派工程师和贾扬清他们一起做框架优化,提升 Caffe 的应用稳定性。贾扬清同意合作,他看中英伟达在系统侧的优势。接下来的一年,汲取各方的力量的 Caffe,走在加速发展的路上。
Google 工作之余,贾扬清继续和伯克利的同事们一起维护 Caffe。贾扬清开始重新设计 Caffe 的一些结构,使它更模块化,更能适配各种环境下部署。有开源社区经验的 Evan Shelhamer 主导和各方进行合作;Jeff Donahue 帮助 Pinterest 建立了一个深度学习系统;Jonathan Long 给 Caffe 提供了包括 Python 接口在内的诸多新特性……在社区建设上,由 GitHub 和 caffe-users 邮件组一起组成了松散、自由的组织,依靠 Caffe 的使用者们自发管理。
做 Caffe,贾扬清经历了从 0~1 的完整项目经验积累,“Caffe 应该算是我第一个 C++ 的项目。”整体上“对我的锻炼很大,从组团开发、到如何推广、如何获取反馈、如何改进流程,我亲历了每个环节。”离开伯克利的第二年 5 月,贾扬清才终于完成了博士毕业论文。
小镇青年上清华
1984 年,贾扬清生在绍兴上虞县。父母都是中学语文老师。1 岁时,贾扬清最爱听故事,妈妈常拿着图画书给他讲故事。3 岁时,贾扬清已识两三百个字,常常捧着一本书,读得入迷。5 岁,父母带他去新华书店,贾扬清挑了《安徒生童话》,妈妈惊讶地问:书里的字,你能看懂吗?贾扬清点了点头。
贾扬清一家人住在校园,安宁平静,生活规律。6 点,父母起床,去守早自习,贾扬清也跟着起来了。小学六年级,贾扬清从父母所在的学校插班到上虞市中心学校,新环境,贾扬清感到好奇之余也有点自卑感,他更加努力学习,想通过成绩来证明自己。中考,贾扬清以上虞区第三名的成绩考进春晖中学。
初二,流行学计算机,尽管学校有机房,贾扬清父母还是花 7000 多元,给他买了台奔腾Ⅱ。贾扬清凭感觉在机器上捣鼓,试装各种软件、玩扫雷游戏……有一次,贾扬清去同学家玩,看到同学用鼠标在计算机屏幕上的图形界面上点来点去,并向他演示自己在学编程,贾扬清觉得好玩。回家后,他摸索着用 BASIC 写出一个小程序──在方框里输入一个年份数字,屏幕上显示出年份所对应的生肖。
计算机让贾扬清觉得“可以创造出一个新东西。”“很开心。”但贾扬清听父母话,为高考的目标,仍把精力放在学习上。初中,语文老师教同学们写文学评论,贾扬清把《论<西厢记>里诗歌的描写和艺术》当选题,老师很诧异,跟贾扬清的妈妈说:让孩子看《西厢记》是否太早了?妈妈则说“看吧,没关系。”父母教语文,贾扬清家里文学类书多,他常随意从父母的书架上抽出一本书,翻看。拿下一本钱钟书的《谈艺录》,翻了翻,当然“看不懂,又放了回去。”贾扬清看《西方文学史》《荷马史诗》,感觉“外面的世界和我生活的小城是不一样的。”贾扬清看《十四行诗》发现,西方的诗歌讲究韵脚,类似中国古代诗歌平仄。“居然可以相互印证,很有意思……”贾扬清一直对文学感兴趣,但他选了理科。“比起文科,理科可以靠自己的努力,走得更远一点。”又或许,受当时人人都说“学好数理化,走遍天下都不怕”的大环境影响。
高中,贾扬清拿到了全国物理和化学竞赛两个一等奖,英语也获得了综合能力二等奖。数学不突出,父母给他买了“洪恩在线”光盘,大量刷题。“不会做的题,也会买一整本练习题来做,直到熟悉运用为止。”贾扬清数学成绩逐渐好起来,获得了全国数学联赛二等奖。
2002 年,高考,物理试卷的最后一题,贾扬清失误了,痛失 27 分!结果,考了 686 分。贾扬清心之所向是清华计算机系,在跟清华招生办老师讨论后,稳妥起见,第一志愿上,填写了“清华大学自动化系”。当贾扬清打开通知书,看到封面写着“清华是你一生的骄傲”这句话时,很开心。
开启人工智能研究
清华图书馆早上 8 点开门,7 点多,贾扬清已和几位要好的同学站在门前排队等待自习。班里 27 个同学,贾扬清成绩很快又排到了前几名。本科四年,除了学习,贾扬清的生活还是学习。课余,贾扬清把微积分当作研究课题,做《吉米多维奇数学分析习题集》。
清华信息学院由自动化系、计算机系和电子系组成,三个系所学基础科目相同,计算机系偏理论和软件。“自动化系本质上就干两件事——烧锅炉和开电梯。烧锅炉,要让温度迅速升高,到达一定高温后,要让温度维持稳定,这就是控制理论要解决的问题。开电梯也同理。”
⼤三,贾扬清选修了张长⽔教授的《模式识别和智能系统》课,贾扬清忽然意识到,人工智能最让他着迷的是——从固有经验里突破出去,为可能性去探路。“这就有事儿可以干了!”而且“人工智能的算法,我们只能说以多少正确率、大概去做某些东西的识别,很多问题既无知也无解。”贾扬清对“机器学习”产生了浓厚的兴趣。“让机器自动帮人做事,把人从低级、重复的劳动中解放出来,是一件有趣、有意义的事。”论⽂阅读课,贾扬清找到《科学》杂志(Science),朗读了 Geoffrey Hinton 的《基于神经网络的数据降维》(Reducing the Dimensionality of Data with Neural Networks)文章。课后,贾扬清找“神经⽹络”相关的资料,自学,他去了解“玻尔兹曼机”等概念……尽管当时,在人工智能领域,“神经⽹络”处在低潮期。
毕业前夕,贾扬清凭兴趣做了一个课程设计——在交通拥挤的情况下识别单辆汽车。若能识别出有多少辆单辆汽车,便能判定当前路段的拥堵情况。贾扬清和同学们站在四环路上的每一个天桥上,用相机拍了许多经过桥下车辆的照片,手工在照片上做标识。“当时还没深度学习,我用了计算机视觉的经典方法,看识别车辆能到什么程度。”“我觉得这个问题好玩,有挑战,就去探索,也不是上来就能解决掉,若是已经有一个正确方法,就没意思了。”
2006 年 7 月,“好学生”贾扬清本科毕业,免试升入本校读硕士研究生。贾扬清跟随张长⽔教授,攻读模式识别和智能系统专业,正式走上人工智能研究之路。
一人独讲 5 篇国际论文
2008 年 7 月,芝加哥,计算机国际学术会议。天气炎热,穿短袖的贾扬清,被会议厅巨冷的空调吹得瑟瑟发抖。贾扬清心里也忐忑不安,他要反复上台,用英文讲 5 篇国际论文,其中 4 篇都是他陌生的领域,而台下都是来自世界各地的专业人士。
实验室 5 位同学论文入围,但只有贾扬清拿到了美国签证。无奈之下,贾扬清只好“依葫芦画瓢”代讲。导师鼓励他:“你放心,讲得烂,别人都不会记得,你没那么重要。放心讲就行了。”“搞砸了,人家记不住你;搞好了,人家会说,这个人还不错哦!” 学术会议上,欧美同行乐于主动展示自己的风气,对贾扬清冲击很大。国内实验室,大家普遍闷头做自己的科研,欧美人则非常希望自己的科研让更多人看见,他们主动找人攀谈,在讲台旁边支起易拉宝,努力宣传自己的项目。他们讲起自己正做的事,便眉飞色舞,眼里放光,浑身洋溢着自豪感。贾扬清被深深感染。“我学会了跟别人沟通自己做科研背后的想法。当时,我们普遍欠缺这种能力。”
2009 年夏天,25 岁的贾扬清从清华研究生毕业,一口气申请了十几所国外大学的博士生,其中加州大学伯克利分校计算机系提供全奖,学校在加州也甚合贾扬清的心意。那时,人工智能的研究处于摸索场景应用的初级阶段,语音识别、机器翻译、物体识别……就业方向局限在算法领域,从事数据科学家、数据挖掘等工作,还未单独成为招聘门类。
Google 实习
伯克利研讨会上,一位大厂同行主动找到贾扬清说:“我们很喜欢 Caffe。代码里,居然有单元测试!很多时候,搞科研的人写出来的代码真是没法看啊,但你们写的还不错!”这得益于贾扬清在 Google 实习,学写代码时养成了好习惯。
每年的 5 月下旬到 8 月,伯克利放暑假,学生们为培养工业实践经验,多数都会去大厂实习。2011 年,夏天,贾扬清在 NEC 实验室实习,第⼀次接触到稀疏编码(Sparse Coding),贾扬清做了⼀个⾃动学习每个特征的感知域算法,在 CIFAR 数据集上获得了当时最好的准确率。
博士二年级暑假,Google 邀请贾扬清到公司面试,随即便留下实习。Google 的实习,分产品工程和研究院两个方向。贾扬清在研究院,导师是华人韩玫(现任平安科技硅谷研究院院长)。贾扬清做图像识别和视觉图像上视频理解的研究,和图像搜索的团队一起,做精准识别模型,致力提升识别的正确率。后来,他所参与的工作,被集成到 Google Photos 的个人相册里。
置身 Google,贾扬清感受到,几万名工程师分布式协同工作的极致高效。Google 的工程实践流程体系健全,写代码的过程用规范固定下来:要求写程序时,要把单元测试方式写到旁边,方便他人修改后测试;要求用标准的格式写文档。短时间内,贾扬清写代码的能力,被迅速提升。“这一方面,得益于我从众多开源软件中学习;另一方面,我觉得好奇心是衡量学习的普世标准。看到好的代码,自己动手试一试,多写几次,不断改进。”“每个人都有好奇心,就像儿童敢吃任何东西,是因为儿童没有吃的经验,尝试吃新东西的边际收益大,世界真美味的欢乐大于偶尔吃到泥巴的苦。”“上了年纪,可借鉴的经验数据越来越多,就需要用哲学代替经济学,用信仰强行将自己置于探索行动中,而非总是科学理性地在经验中深度学习,选优。”
在 Google 实习,贾扬清“一边学东西,一边改善生活”。Google 食堂饭菜丰盛,有款名为“十磅”的甜点小蛋糕,寓意在 Google 待上一年,体重会涨 10 斤!贾扬清用 Google 的实习工资,换了一辆新车。在 Google 养成的良好工作习惯留痕在 Caffe 的代码里。
2013 年,贾扬清从伯克利毕业,获计算机博士学位。
从 TensorFlow 到 PyTorch
贾扬清到西班牙开会,患重感冒,深夜去药店买药,不懂西班牙语,打开 Google 翻译的照相机翻译,顺着货架一排排扫描过去,居然找到了布洛芬。
紧急情况下,用自己开发的功能,解决了问题,“感觉很奇妙”。Google 收购而来的 OCR 算法本来较简单,无法识别复杂的字体和文字,在云上识别,速度慢,贾扬清和作者一起,第一次将深度学习 OCR 模型做到了手机上。
2013 年,贾扬清入职 Google Brain(2023 年 4 月,Google Brain 与 DeepMind 合并为 Google DeepMind),两年后,贾扬清成为 TensorFlow 的创始团队一员。“TensorFlow 第⼀代框架的作者大多还在 Google,二代框架做得深入又完备。被 Google 的产品广泛采用。”TensorFlow 被 Google 公司开源,一度成为 GitHub 上 Star 数超高的项目。在 Google,贾扬清找到了个人的”比较“优势。“我先从 AI 的科研开始,和科学家们有共同语言;做工程,工程师们觉得我写代码不错。”“我能够让两边沟通协作。”
2016 年,贾扬清加入 Facebook 公司(现 Meta)。Facebook 需要搭建一个支持广告、Feed、搜索推荐、图像识别、自然语言处理、混合现实等所有产品的 AI 底座平台。贾扬清的 4 人团队,小而高效。在 Caffe 的基础上,开发 Caffe2。Caffe2 发布时,“增强现实和虚拟现实”突然流行,Caffe2 仅用了 2 个月的时间就嵌入了手机端。扎克伯格非常开心,亲自发了条动态,官宣了艺术家风格转换功能(见图 3)。这是深度学习⽹络首次在超过 10 亿台手机应用。

图 3 扎克伯格亲自官宣艺术家风格转换的功能
就在贾扬清做 Caffe2 的同时,纽约的 Facebook 人工智能研究院主导的 PyTorch 获得成功。2018 年,在贾扬清的主导下,Caffe2 的后端、PyTorch 的前端、ONNX 的标准合成⼀个完整的框架,命名为 PyTorch1.0。“如果说 TensorFlow 像一个庞大又复杂的联合收割机,PyTorch 则更像是一辆灵活又便捷的单车。”
问答实录
刘韧:机器翻译靠什么突破?
贾扬清:以往,机器翻译依赖建立语法规则实现,但两种语言间的句法差异巨大,很难用手写的方式,穷尽定义语法规则。现在,用神经网络,再借助互联网收集数据,训练神经网络,逐步优化、提升其精准度。
刘韧:规则方式和神经网络方式,不同在哪?
贾扬清:程序员写规则,就会陷入到无尽的规则中,进入规则沼泽,例外之外还有例外,是一个无穷尽的问题。用神经网络,用模糊的方式模糊地解决问题,再通过数据训练逐步提高预测准确率。
刘韧:深度学习和强化深度学习有什么不同?
贾扬清:强化深度学习意思是,如何把将来获得的收益或惩罚回归到现在。
刘韧:人工智能会在哪个方向上和人争工作?
贾扬清:简单重复的人类劳动被替换是个好事,人解放出来的时间,可以想更多的可能性。达芬奇有幅非常著名的画叫《岩间圣母》(Virgin of the Rocks),圣母的主体是达芬奇画的,背景的花草石头是达芬奇的助手画的,达芬奇也需要助手。今天很多画家,他画主体,再找助手把背景填上去。他也可以让 AI 来填背景。就像达·芬奇的助手一样,AI 能提升画家的效率。
刘韧:中美的技术差距体现在哪方面?
贾扬清:好奇心。我们最优秀的人才在追求执行力,解决具体问题。欧美人更喜欢搞新东西。不得不承认,美国人已经解决温饱很长时间,因此他们玩得更多,玩得多,总能玩出一些新东西。我们在很多方面要追,这事急不来。
关于《开源英雄》
《开源英雄》是由 CSDN 创始人&董事长、极客帮创投创始合伙人蒋涛发起,中国著名 IT 记者、DoNews 创始人刘韧领衔,CSDN、《新程序员》联合出品的专访栏目。通过开源开放的 CSDN 写作班,深入访谈全球顶尖开源人物,为广大开发者传递更多、更高质量的信息,透过他们的人生及成长寻找共鸣、共舞开源世界。
自栏目推出至今,我们专访了 Vue 作者尤雨溪、LVS 创始人章文嵩、Linux 内核守护者吴峰光、中国 Linux 第一人宫敏、小米开源奠基者崔宝秋、Caffe 作者贾扬清,如果你有想让我们报道的开源人物,欢迎在 GitCode 上提交 Issues 或 PR。
地址:https://gitcode.net/programmer_editor/Open-Source-Heroes
推荐阅读:

相关文章:
贾扬清开源 AI 框架 Caffe | 开源英雄
【编者按】在开源与人工智能的灿烂星河里,贾扬清的名字都格外地耀眼。因为导师 Trevor Darrell 教授的一句“你是想多花时间写一篇大家估计不是很在意的毕业论文,还是写一个将来大家都会用的框架?”,学生贾扬清一头扎进了创 Caffe…...
【objectarx.net】使用公式自动更新表格项的内容
使用公式自动更新表格项的内容...
CSS 移动端 1px(线条/边框) 不同机型上显示粗细不同,解决办法
由于不同的手机有不同的像素密度导致的。如果移动显示屏的分辨率始终是普通屏幕的2倍,1px的边框在devicePixelRatio2的移动显示屏下会显示成2px,所以在高清瓶下看着1px总是感觉变胖了 <!DOCTYPE html> <html lang"en"> <head&g…...
vue3使用vuex的示例(模块化功能)
目录 1. store/index.ts 2. main.ts 3. App.vue调用 4. 如果删除moduleA的namespaced属性, 保留moduleB的namespaced:true 5. 则App.vue修改为: 1. store/index.ts 注意: 需要使用时带上模块名称的namespaced必须为true, 不写或者为false时调用时不需要写模块名称(获取st…...
Vatee万腾的科技决策力奇迹:Vatee科技决策力的独特之选
在金融投资的复杂领域中,Vatee万腾以其独特的科技决策力创造了一场真正的奇迹。这不仅是一种引领投资者走向成功的选择,更是一种开启新时代的科技决策奇迹。 Vatee的科技决策力背后蕴藏着强大的智慧和创新。通过大数据分析、智能算法的运用,V…...
ai技术是怎么换脸的,实现原理是什么,有那些软件
人工智能(AI)在近年来的迅猛发展中,带来了许多令人惊叹的技术创新,其中之一就是人工智能换脸技术。这项技术通过深度学习和图像处理的手段,使得用户可以将自己的面孔替换成其他人物,引发了广泛的讨论和应用…...
在IDEA中使用maven项目总结
一 什么是maven Maven本身也是Java写的,他是一款服务于Java平台的自动化构建工具 Maven是一个项目管理工具,旨在简化软件项目的构建、依赖管理和项目信息管理。它使用基于项目对象模型(Project Object Model,POM)的…...
oracle备份一个表需要做的操作
在 Oracle 中备份一个表可以通过以下步骤完成,包括备份表结构(DDL)和备份表数据(DML): 备份表结构(DDL): 使用 CREATE TABLE AS SELECT: 创建一个新表&#…...
C 语言 switch 语句
C 语言 switch 语句 在本教程中,您将通过一个示例学习在C语言编程中创建switch语句。 switch语句使我们可以执行许多代替方案中的一个代码块。 虽然您可以使用if…else…if阶梯执行相同的操作。但是,switch语句的语法更容易读写。 switch … case的语…...
架构师:构建高可用服务治理Consul集群与Kong网关管理
1、简述 在微服务架构中,高可用性和服务治理是非常重要的方面。Consul作为一个开源的服务发现和配置工具,可以帮助我们实现高可用服务治理。Kong是一个用于管理 API 网关的工具,它可以提供强大的流量控制和安全功能。本文将介绍如何构建一个高可用的Consul集群,并结合Kong…...
elemenui的Upload上传整合成数组对象
1. 普通直接上传 <el-upload action"" :before-upload"doBeforeUpload"><el-button type"success" size"mini">导入</el-button></el-upload> methods:{doBeforeUpload(file) {let reader new FileReader(…...
莫桑比克市场开发攻略,收藏一篇就够了
中国与莫桑比克之间的经贸关系源远流长,两国之间的贸易和投资合作呈现出快速增长的趋势。莫桑比克是农业国,生产以及生活资料依赖进口,市场潜力还是非常不错的,今天就给大家分享一下。文章略长,大家点赞收藏关注慢慢看…...
go语言学习
1、示例代码: imgName : g.Cfg().MustGet(ctx, "migrate.img-arm-rbd").String() 在给定的代码行中,g.Cfg() 是一个函数调用,它返回一个配置对象。MustGet(ctx, "migrate.img-arm-rbd") 则是在这个配置对象上调用的方法…...
安哥拉市场开发攻略,收藏一篇就够了
安哥拉是非洲南部的一个国家,中国是安哥拉最大的贸易伙伴,安哥拉是中国在非洲的第二大贸易伙伴,中国人在安哥拉也是非常受欢迎的,虽然安哥拉经济比较落后,但是市场潜力还是非常不错的。今天就来给大家分享一下安哥拉的…...
第六章 :Spring Boot web开发常用注解(一)
第六章 :Spring Boot web开发常用注解(一) 前言 本章节知识重点:作者结合自身开发经验,以及觉察到的一个现象:Springboot注解全面理解和掌握的并不多,对注解进行了全面总结,共分两个…...
Unity DOTS系列之System中如何使用SystemAPI.Query迭代数据
最近DOTS发布了正式的版本, 我们来分享一下System中如何基于SystemAPI.Query来迭代World中的数据,方便大家上手学习掌握Unity DOTS开发。 SystemAPI.Query的使用 System有两种,一种是Unmanaged 的ISystem,一种是managed 的SystemBase,这两种System都可…...
【objectarx.net】创建渐变填充
net.gradientHatch(创建渐变填充)...
【软考】信息安全基本要素
目录 一、机密性二、完整性三、可用性四、可控性五、可审查性六、可鉴别性七、不可抵赖性八、可靠性 一、机密性 1.保证信息不泄露给未经授权的进程或实体,只供授权者使用 二、完整性 1.信息只能被得到允许的人修改,并且能够被判别该信息是否已被篡改过…...
[C++ ]:7.内存管理+模板引入。
内存管理模板引入 一.内存管理:1.内存区域划分图:2.区域划分实例:3.C 内存管理方式:newdelete4.自定义类型的new和delete:一.简单类:二.日期类:三.栈类:四.队列类(栈实现…...
【计算机网络】HTTPS
文章目录 前言为什么会出现 HTTPSHTTPS 是如何进行加密的1. 对称加密非对称加密中间人攻击3. 引入证书 前言 前面我们学习了应用层中使用比较常见的 HTTP 协议,但是呢?在实际的使用中,浏览器和服务器之间的通信其实很少使用到 HTTPÿ…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
