为您推荐:
精华内容
最热下载
问答
  • 5星
    1.48MB qq_17695025 2021-08-05 22:36:27
  • 5星
    2.7MB weixin_52265084 2020-12-23 14:04:44
  • 5星
    7.2MB qq_17345607 2021-07-15 16:58:46
  • 5星
    4KB qq_40957277 2021-08-02 23:10:33
  • 5星
    75.33MB u010575833 2021-04-27 11:57:42
  • 5星
    99.2MB xiaohua1992 2020-12-23 22:01:39
  • 5星
    866B qq_33064191 2021-08-16 14:35:51
  • 5星
    6.75MB weixin_43796045 2021-05-06 15:26:30
  • 5星
    69.48MB qq_17556735 2021-03-13 22:42:11
  • 5星
    241KB weixin_54707168 2021-06-18 15:22:43
  • 1.58MB weixin_38627104 2020-05-31 11:38:24
  • 1.56MB weixin_38693173 2020-06-23 00:47:14
  • 2011年,公司调我和几个同事去广西,与现场的同事一起撰写部署文档。去之前还感觉领导有点小题大做,写个部署文档至于么?我在公司半天就能写出一版了,还叫这么多人跑到广西写这个,真是崽卖爷田不心疼,公司费用...

    2011年,公司调我和几个同事去广西,与现场的同事一起撰写部署文档。去之前还感觉领导有点小题大做,写个部署文档至于么?我在公司半天就能写出一版了,还叫这么多人跑到广西写这个,真是崽卖爷田不心疼,公司费用随便花。
    到了广西,负责人说了下部署文档的要求:简单明了、傻瓜部署。简单明了指的是文字清楚、不能有歧义、不拽文、精练。傻瓜部署指的是文档要写好每一步的操作,傻瓜拿着这个文档都能部署,不需要有专业的知识。
    部署文档分为平台程序部署、数据库部署、业务开通部署等模块,笔者分到数据库部署这一块。平时我做部署时,对数据库安装有一些疑惑,趁此机会,把数据库版本选择及部署这块也熟悉了一下。首先确认数据库版本,下载版本后一步步安装,并把每一步的截图都放到文章里,即使只是点击下一步即可的截图也放进去。经过十几次部署后,把部署过程中遇到的各种问题,和自己的一些疑问也记录下来,并做说明解答。
    数据库部署完毕后,开始做数据库建立,数据备份导入。日常做数据库割接升级前,一定要做数据库备份,并做备份还原验证,看看备份后的数据是否能成功还原。然后再做数据割接升级。以一次升级割接数据库为例,写明这次割接的范围、变更情况。把割接脚本每行写上注释,及是否需要根据本省情况进行调整。撰写割接升级脚本时,把数据库IP地址、库名等标红。各个省份现场升级时,修改为本地的数据库地址和库名即可。最后写上FAQ,把一些日常工作答疑时,大家常问的一些数据升级问题和解决方案写上。
    最后写数据割接脚本后,如何确认是否迁移升级成功,提炼了几条list清单,按照这几项检查,基本上能够确认本次升级成功。
    文档撰写完毕后,我们几个互相交换了下文档,严格按照他们写的文档一步步操作,看是否能够成功完成升级。然后整合大家提的意见,增加了部分自己认为是常识,未做说明或未写上的事项。
    两周后,部署文档撰写完毕。发给各省,果然收到各省的一致好评。省份同事说,以前做升级割接时,都是先研究下部署文档,然后重新写一版部署文档,过程中还需要请教研发、DBA、技术支持等人员。现在直接按照这份文档进行升级即可。大大减少了省份的工作量,也减少了部署出现问题的几率。
    笔者后面也去了几个省份做升级割接,发现每次升级割接时,按照之前撰写的那版文档,稍作改动,调整成本次的脚本和程序即可完成升级。而且根据文档后面的检查list清单,基本上能够保证99%以上的功能点都能使用。而不是之前升级后,自己随机选取一些页面进行确认,自我感觉没有问题,但第二天客户使用时发现一堆问题。
    笔者后来负责一个群组项目,刚接手时就赶上五六十个省份并发检查测试。省份维护人员对如何部署程序一无所知,全靠总部几个研发测试人员全国奔波升级,大家当时苦不堪言,其中一个人一个月跑了十几个省升级。第二年我就召集各个省份的负责人来京,每个省份分配了几项,总共61项。让他们写自己负责那几项的部署确认,问题检查,疑点剖析等,然后让大家做交叉检查。历时两周完成了这版文档,之后的几年内,检查项也有调整,也出现过几次五六十个省份并发测试检查。但省份再也没有提出部署割接的支持需求。
    很多人对部署文档都存在错误的认识,认为其只是一个简单的文档,随便一个人写写就行。殊不知它是系统上线交付用户使用的关键一环。前期需求调研反复修改确认,研发熬夜熬肝开发等,经历了万里长征到最后胜利在望时,因为部署升级的问题,导致好多功能不能正常使用,给客户留下公司不专业的印象,那该多冤呢。
    部署升级是现场维护人员日常维护的一项重要的指标和工作内容。如果公司总部不把部署文档写好,而靠各个现场根据自己的经验和技术能力去保证割接升级的成功率,维护公司的形象。各个现场的人员水平层次不齐,而且各个现场维护人员做升级割接时,也不能保证自己的思路和想法能够完美覆盖公司的所有检查项。那么升级割接的成功率可想而已,客户对公司的印象也可想而知了。

    展开全文
    weixin_37123068 2019-08-12 10:50:40
  • 18.67MB weixin_38744207 2019-08-29 11:30:16
  • 导语:为什么使用 FPGA,相比 CPU、GPU、ASIC(专用芯片)...编者按:本文系微软亚洲研究院实习生李博杰在知乎上针对“如何评价微软在数据中心使用FPGA代替传统CPU的做法?”问题的回答,雷锋网已获转载授权。

    [转] http://www.leiphone.com/news/201701/3KdGt84qyrnnykBK.html

    导语:为什么使用 FPGA,相比 CPU、GPU、ASIC(专用芯片)有什么特点?

    编者按:本文系微软亚洲研究院实习生李博杰在知乎上针对“如何评价微软在数据中心使用FPGA代替传统CPU的做法?”问题的回答,雷锋网已获转载授权。

    首先,原问题「用 FPGA 代替 CPU」中,这个「代替」的说法不准确。我们并不是不用 CPU 了,而是用 FPGA 加速适合它的计算任务,其他任务仍然在 CPU 上完成,让 FPGA 和 CPU 协同工作

    本回答将涵盖三个问题:

    1. 为什么使用 FPGA,相比 CPU、GPU、ASIC(专用芯片)有什么特点?

    2. 微软的 FPGA 部署在哪里?FPGA 之间、FPGA 与 CPU 之间是如何通信的?

    3. 未来 FPGA 在云计算平台中应充当怎样的角色?仅仅是像 GPU 一样的计算加速卡吗?

    一、为什么使用 FPGA?

    众所周知,通用处理器(CPU)的摩尔定律已入暮年,而机器学习和 Web 服务的规模却在指数级增长。人们使用定制硬件来加速常见的计算任务,然而日新月异的行业又要求这些定制的硬件可被重新编程来执行新类型的计算任务。FPGA (Field Programmable Gate Array) 正是一种硬件可重构的体系结构,常年来被用作专用芯片(ASIC)的小批量替代品,然而近年来在微软、百度等公司的数据中心大规模部署,以同时提供强大的计算能力和足够的灵活性

    如何评价微软在其数据中心大量部署FPGA?

    不同体系结构性能和灵活性的比较。

    FPGA 为什么快?「都是同行衬托得好」。CPU、GPU 都属于冯·诺依曼结构,指令译码执行、共享内存。FPGA 之所以比 CPU 甚至 GPU 能效高,本质上是无指令、无需共享内存的体系结构带来的福利。

    冯氏结构中,由于执行单元(如 CPU 核)可能执行任意指令,就需要有指令存储器、译码器、各种指令的运算器、分支跳转处理逻辑。由于指令流的控制逻辑复杂,不可能有太多条独立的指令流,因此 GPU 使用 SIMD(单指令流多数据流)来让多个执行单元以同样的步调处理不同的数据,CPU 也支持 SIMD 指令。而 FPGA 每个逻辑单元的功能在重编程(烧写)时就已经确定,不需要指令

    冯氏结构中使用内存有两种作用。一是保存状态,二是在执行单元间通信。由于内存是共享的,就需要做访问仲裁;为了利用访问局部性,每个执行单元有一个私有的缓存,这就要维持执行部件间缓存的一致性。对于保存状态的需求,FPGA 中的寄存器和片上内存(BRAM)是属于各自的控制逻辑的,无需不必要的仲裁和缓存。对于通信的需求,FPGA 每个逻辑单元与周围逻辑单元的连接在重编程(烧写)时就已经确定,并不需要通过共享内存来通信。


    说了这么多三千英尺高度的话,FPGA 实际的表现如何呢?我们分别来看计算密集型任务和通信密集型任务。


    计算密集型任务的例子包括矩阵运算、图像处理、机器学习、压缩、非对称加密、Bing 搜索的排序等。这类任务一般是 CPU 把任务卸载(offload)给 FPGA 去执行。对这类任务,目前我们正在用的 Altera(似乎应该叫 Intel 了,我还是习惯叫 Altera……)Stratix V FPGA 的整数乘法运算性能与 20 核的 CPU 基本相当,浮点乘法运算性能与 8 核的 CPU 基本相当,而比 GPU 低一个数量级。我们即将用上的下一代 FPGA,Stratix 10,将配备更多的乘法器和硬件浮点运算部件,从而理论上可达到与现在的顶级 GPU 计算卡旗鼓相当的计算能力。

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 的整数乘法运算能力(估计值,不使用 DSP,根据逻辑资源占用量估计)

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 的浮点乘法运算能力(估计值,float16 用软核,float 32 用硬核)

    在数据中心,FPGA 相比 GPU 的核心优势在于延迟。像 Bing 搜索排序这样的任务,要尽可能快地返回搜索结果,就需要尽可能降低每一步的延迟。如果使用 GPU 来加速,要想充分利用 GPU 的计算能力,batch size 就不能太小,延迟将高达毫秒量级。使用 FPGA 来加速的话,只需要微秒级的 PCIe 延迟(我们现在的 FPGA 是作为一块 PCIe 加速卡)。未来 Intel 推出通过 QPI 连接的 Xeon + FPGA 之后,CPU 和 FPGA 之间的延迟更可以降到 100 纳秒以下,跟访问主存没什么区别了。

    FPGA 为什么比 GPU 的延迟低这么多?这本质上是体系结构的区别。FPGA 同时拥有流水线并行和数据并行,而 GPU 几乎只有数据并行(流水线深度受限)。例如处理一个数据包有 10 个步骤,FPGA 可以搭建一个 10 级流水线,流水线的不同级在处理不同的数据包,每个数据包流经 10 级之后处理完成。每处理完成一个数据包,就能马上输出。而 GPU 的数据并行方法是做 10 个计算单元,每个计算单元也在处理不同的数据包,然而所有的计算单元必须按照统一的步调,做相同的事情(SIMD,Single Instruction Multiple Data)。这就要求 10 个数据包必须一起输入、一起输出,输入输出的延迟增加了。当任务是逐个而非成批到达的时候,流水线并行比数据并行可实现更低的延迟。因此对流式计算的任务,FPGA 比 GPU 天生有延迟方面的优势

    如何评价微软在其数据中心大量部署FPGA?

    计算密集型任务,CPU、GPU、FPGA、ASIC 的数量级比较(以 16 位整数乘法为例,数字仅为数量级的估计)

    ASIC 专用芯片在吞吐量、延迟和功耗三方面都无可指摘,但微软并没有采用,出于两个原因:

    1. 数据中心的计算任务是灵活多变的,而 ASIC 研发成本高、周期长。好不容易大规模部署了一批某种神经网络的加速卡,结果另一种神经网络更火了,钱就白费了。FPGA 只需要几百毫秒就可以更新逻辑功能。FPGA 的灵活性可以保护投资,事实上,微软现在的 FPGA 玩法与最初的设想大不相同


    2. 数据中心是租给不同的租户使用的,如果有的机器上有神经网络加速卡,有的机器上有 Bing 搜索加速卡,有的机器上有网络虚拟化加速卡,任务的调度和服务器的运维会很麻烦。使用 FPGA 可以保持数据中心的同构性

    接下来看通信密集型任务。相比计算密集型任务,通信密集型任务对每个输入数据的处理不甚复杂,基本上简单算算就输出了,这时通信往往会成为瓶颈。对称加密、防火墙、网络虚拟化都是通信密集型的例子。

    如何评价微软在其数据中心大量部署FPGA?

    通信密集型任务,CPU、GPU、FPGA、ASIC 的数量级比较(以 64 字节网络数据包处理为例,数字仅为数量级的估计)

    对通信密集型任务,FPGA 相比 CPU、GPU 的优势就更大了。从吞吐量上讲,FPGA 上的收发器可以直接接上 40 Gbps 甚至 100 Gbps 的网线,以线速处理任意大小的数据包;而 CPU 需要从网卡把数据包收上来才能处理,很多网卡是不能线速处理 64 字节的小数据包的。尽管可以通过插多块网卡来达到高性能,但 CPU 和主板支持的 PCIe 插槽数量往往有限,而且网卡、交换机本身也价格不菲。

    从延迟上讲,网卡把数据包收到 CPU,CPU 再发给网卡,即使使用 DPDK 这样高性能的数据包处理框架,延迟也有 4~5 微秒。更严重的问题是,通用 CPU 的延迟不够稳定。例如当负载较高时,转发延迟可能升到几十微秒甚至更高(如下图所示);现代操作系统中的时钟中断和任务调度也增加了延迟的不确定性。

    如何评价微软在其数据中心大量部署FPGA?

    ClickNP(FPGA)与 Dell S6000 交换机(商用交换机芯片)、Click+DPDK(CPU)和 Linux(CPU)的转发延迟比较,error bar 表示 5% 和 95%。来源:[5]

    虽然 GPU 也可以高性能处理数据包,但 GPU 是没有网口的,意味着需要首先把数据包由网卡收上来,再让 GPU 去做处理。这样吞吐量受到 CPU 和/或网卡的限制。GPU 本身的延迟就更不必说了。

    那么为什么不把这些网络功能做进网卡,或者使用可编程交换机呢?ASIC 的灵活性仍然是硬伤。尽管目前有越来越强大的可编程交换机芯片,比如支持 P4 语言的 Tofino,ASIC 仍然不能做复杂的有状态处理,比如某种自定义的加密算法。

    综上,在数据中心里 FPGA 的主要优势是稳定又极低的延迟,适用于流式的计算密集型任务和通信密集型任务

    二、微软部署 FPGA 的实践

    2016 年 9 月,《连线》(Wired)杂志发表了一篇《微软把未来押注在 FPGA 上》的报道 [3],讲述了 Catapult 项目的前世今生。紧接着,Catapult 项目的老大 Doug Burger 在 Ignite 2016 大会上与微软 CEO Satya Nadella 一起做了 FPGA 加速机器翻译的演示。演示的总计算能力是 103 万 T ops,也就是 1.03 Exa-op,相当于 10 万块顶级 GPU 计算卡。一块 FPGA(加上板上内存和网络接口等)的功耗大约是 30 W,仅增加了整个服务器功耗的十分之一。

    如何评价微软在其数据中心大量部署FPGA?

    Ignite 2016 上的演示:每秒 1 Exa-op (10^18) 的机器翻译运算能力

    微软部署 FPGA 并不是一帆风顺的。对于把 FPGA 部署在哪里这个问题,大致经历了三个阶段:

    1. 专用的 FPGA 集群,里面插满了 FPGA

    2. 每台机器一块 FPGA,采用专用网络连接

    3. 每台机器一块 FPGA,放在网卡和交换机之间,共享服务器网络

    如何评价微软在其数据中心大量部署FPGA?

    微软 FPGA 部署方式的三个阶段,来源:[3]

    第一个阶段是专用集群,里面插满了 FPGA 加速卡,就像是一个 FPGA 组成的超级计算机。下图是最早的 BFB 实验板,一块 PCIe 卡上放了 6 块 FPGA,每台 1U 服务器上又插了 4 块 PCIe 卡。

    如何评价微软在其数据中心大量部署FPGA?
    最早的 BFB 实验板,上面放了 6 块 FPGA。来源:[1]

    可以注意到该公司的名字。在半导体行业,只要批量足够大,芯片的价格都将趋向于沙子的价格。据传闻,正是由于该公司不肯给「沙子的价格」 ,才选择了另一家公司。当然现在数据中心领域用两家公司 FPGA 的都有。只要规模足够大,对 FPGA 价格过高的担心将是不必要的

    如何评价微软在其数据中心大量部署FPGA?

    最早的 BFB 实验板,1U 服务器上插了 4 块 FPGA 卡。来源:[1]

    像超级计算机一样的部署方式,意味着有专门的一个机柜全是上图这种装了 24 块 FPGA 的服务器(下图左)。这种方式有几个问题:

    1. 不同机器的 FPGA 之间无法通信,FPGA 所能处理问题的规模受限于单台服务器上 FPGA 的数量;

    2. 数据中心里的其他机器要把任务集中发到这个机柜,构成了 in-cast,网络延迟很难做到稳定。

    3. FPGA 专用机柜构成了单点故障,只要它一坏,谁都别想加速了;

    4. 装 FPGA 的服务器是定制的,冷却、运维都增加了麻烦。

    如何评价微软在其数据中心大量部署FPGA?

    部署 FPGA 的三种方式,从中心化到分布式。来源:[1]

    一种不那么激进的方式是,在每个机柜一面部署一台装满 FPGA 的服务器(上图中)。这避免了上述问题 (2)(3),但 (1)(4) 仍然没有解决。

    第二个阶段,为了保证数据中心中服务器的同构性(这也是不用 ASIC 的一个重要原因),在每台服务器上插一块 FPGA(上图右),FPGA 之间通过专用网络连接。这也是微软在 ISCA'14 上所发表论文采用的部署方式。


    如何评价微软在其数据中心大量部署FPGA?

    Open Compute Server 在机架中。来源:[1]

    如何评价微软在其数据中心大量部署FPGA?

    Open Compute Server 内景。红框是放 FPGA 的位置。来源:[1]

    如何评价微软在其数据中心大量部署FPGA?

    插入 FPGA 后的 Open Compute Server。来源:[1]

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 与 Open Compute Server 之间的连接与固定。来源:[1]

    FPGA 采用 Stratix V D5,有 172K 个 ALM,2014 个 M20K 片上内存,1590 个 DSP。板上有一个 8GB DDR3-1333 内存,一个 PCIe Gen3 x8 接口,两个 10 Gbps 网络接口。一个机柜之间的 FPGA 采用专用网络连接,一组 10G 网口 8 个一组连成环,另一组 10G 网口 6 个一组连成环,不使用交换机。

    如何评价微软在其数据中心大量部署FPGA?

    机柜中 FPGA 之间的网络连接方式。来源:[1]

    这样一个 1632 台服务器、1632 块 FPGA 的集群,把 Bing 的搜索结果排序整体性能提高到了 2 倍(换言之,节省了一半的服务器)。如下图所示,每 8 块 FPGA 穿成一条链,中间用前面提到的 10 Gbps 专用网线来通信。这 8 块 FPGA 各司其职,有的负责从文档中提取特征(黄色),有的负责计算特征表达式(绿色),有的负责计算文档的得分(红色)。

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 加速 Bing 的搜索排序过程。来源:[1]

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 不仅降低了 Bing 搜索的延迟,还显著提高了延迟的稳定性。来源:[4]

    如何评价微软在其数据中心大量部署FPGA?
    本地和远程的 FPGA 均可以降低搜索延迟,远程 FPGA 的通信延迟相比搜索延迟可忽略。来源:[4]

    FPGA 在 Bing 的部署取得了成功,Catapult 项目继续在公司内扩张。微软内部拥有最多服务器的,就是云计算 Azure 部门了。Azure 部门急需解决的问题是网络和存储虚拟化带来的开销。Azure 把虚拟机卖给客户,需要给虚拟机的网络提供防火墙、负载均衡、隧道、NAT 等网络功能。由于云存储的物理存储跟计算节点是分离的,需要把数据从存储节点通过网络搬运过来,还要进行压缩和加密。

    在 1 Gbps 网络和机械硬盘的时代,网络和存储虚拟化的 CPU 开销不值一提。随着网络和存储速度越来越快,网络上了 40 Gbps,一块 SSD 的吞吐量也能到 1 GB/s,CPU 渐渐变得力不从心了。例如 Hyper-V 虚拟交换机只能处理 25 Gbps 左右的流量,不能达到 40 Gbps 线速,当数据包较小时性能更差;AES-256 加密和 SHA-1 签名,每个 CPU 核只能处理 100 MB/s,只是一块 SSD 吞吐量的十分之一。

    如何评价微软在其数据中心大量部署FPGA?

    网络隧道协议、防火墙处理 40 Gbps 需要的 CPU 核数。来源:[5]

    为了加速网络功能和存储虚拟化,微软把 FPGA 部署在网卡和交换机之间。如下图所示,每个 FPGA 有一个 4 GB DDR3-1333 DRAM,通过两个 PCIe Gen3 x8 接口连接到一个 CPU socket(物理上是 PCIe Gen3 x16 接口,因为 FPGA 没有 x16 的硬核,逻辑上当成两个 x8 的用)。物理网卡(NIC)就是普通的 40 Gbps 网卡,仅用于宿主机与网络之间的通信。

    如何评价微软在其数据中心大量部署FPGA?

    Azure 服务器部署 FPGA 的架构。来源:[6]

    FPGA(SmartNIC)对每个虚拟机虚拟出一块网卡,虚拟机通过 SR-IOV 直接访问这块虚拟网卡。原本在虚拟交换机里面的数据平面功能被移到了 FPGA 里面,虚拟机收发网络数据包均不需要 CPU 参与,也不需要经过物理网卡(NIC)。这样不仅节约了可用于出售的 CPU 资源,还提高了虚拟机的网络性能(25 Gbps),把同数据中心虚拟机之间的网络延迟降低了 10 倍


    如何评价微软在其数据中心大量部署FPGA?

    网络虚拟化的加速架构。来源:[6]

    这就是微软部署 FPGA 的第三代架构,也是目前「每台服务器一块 FPGA」大规模部署所采用的架构。FPGA 复用主机网络的初心是加速网络和存储,更深远的影响则是把 FPGA 之间的网络连接扩展到了整个数据中心的规模,做成真正 cloud-scale 的「超级计算机」。第二代架构里面,FPGA 之间的网络连接局限于同一个机架以内,FPGA 之间专网互联的方式很难扩大规模,通过 CPU 来转发则开销太高。

    第三代架构中,FPGA 之间通过 LTL (Lightweight Transport Layer) 通信。同一机架内延迟在 3 微秒以内;8 微秒以内可达 1000 块 FPGA;20 微秒可达同一数据中心的所有 FPGA。第二代架构尽管 8 台机器以内的延迟更低,但只能通过网络访问 48 块 FPGA。为了支持大范围的 FPGA 间通信,第三代架构中的 LTL 还支持 PFC 流控协议和 DCQCN 拥塞控制协议。

    如何评价微软在其数据中心大量部署FPGA?

    纵轴:LTL 的延迟,横轴:可达的 FPGA 数量。来源:[4]

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 内的逻辑模块关系,其中每个 Role 是用户逻辑(如 DNN 加速、网络功能加速、加密),外面的部分负责各个 Role 之间的通信及 Role 与外设之间的通信。来源:[4]

    如何评价微软在其数据中心大量部署FPGA?

    FPGA 构成的数据中心加速平面,介于网络交换层(TOR、L1、L2)和传统服务器软件(CPU 上运行的软件)之间。来源:[4]

    通过高带宽、低延迟的网络互联的 FPGA 构成了介于网络交换层和传统服务器软件之间的数据中心加速平面。除了每台提供云服务的服务器都需要的网络和存储虚拟化加速,FPGA 上的剩余资源还可以用来加速 Bing 搜索、深度神经网络(DNN)等计算任务。

    对很多类型的应用,随着分布式 FPGA 加速器的规模扩大,其性能提升是超线性的。例如 CNN inference,当只用一块 FPGA 的时候,由于片上内存不足以放下整个模型,需要不断访问 DRAM 中的模型权重,性能瓶颈在 DRAM;如果 FPGA 的数量足够多,每块 FPGA 负责模型中的一层或者一层中的若干个特征,使得模型权重完全载入片上内存,就消除了 DRAM 的性能瓶颈,完全发挥出 FPGA 计算单元的性能。当然,拆得过细也会导致通信开销的增加。把任务拆分到分布式 FPGA 集群的关键在于平衡计算和通信。


    如何评价微软在其数据中心大量部署FPGA?

    从神经网络模型到 HaaS 上的 FPGA。利用模型内的并行性,模型的不同层、不同特征映射到不同 FPGA。来源:[4]

    在 MICRO'16 会议上,微软提出了 Hardware as a Service (HaaS) 的概念,即把硬件作为一种可调度的云服务,使得 FPGA 服务的集中调度、管理和大规模部署成为可能。


    如何评价微软在其数据中心大量部署FPGA?

    Hardware as a Service (HaaS)。来源:[4]

    从第一代装满 FPGA 的专用服务器集群,到第二代通过专网连接的 FPGA 加速卡集群,到目前复用数据中心网络的大规模 FPGA 云,三个思想指导我们的路线:

    1. 硬件和软件不是相互取代的关系,而是合作的关系;

    2. 必须具备灵活性,即用软件定义的能力;

    3. 必须具备可扩放性(scalability)。

    三、FPGA 在云计算中的角色

    最后谈一点我个人对 FPGA 在云计算中角色的思考。作为三年级博士生,我在微软亚洲研究院的研究试图回答两个问题:

    1. FPGA 在云规模的网络互连系统中应当充当怎样的角色?

    2. 如何高效、可扩放地对 FPGA + CPU 的异构系统进行编程?

    我对 FPGA 业界主要的遗憾是,FPGA 在数据中心的主流用法,从除微软外的互联网巨头,到两大 FPGA 厂商,再到学术界,大多是把 FPGA 当作跟 GPU 一样的计算密集型任务的加速卡。然而 FPGA 真的很适合做 GPU 的事情吗?前面讲过,FPGA 和 GPU 最大的区别在于体系结构,FPGA 更适合做需要低延迟的流式处理,GPU 更适合做大批量同构数据的处理

    由于很多人打算把 FPGA 当作计算加速卡来用,两大 FPGA 厂商推出的高层次编程模型也是基于 OpenCL,模仿 GPU 基于共享内存的批处理模式。CPU 要交给 FPGA 做一件事,需要先放进 FPGA 板上的 DRAM,然后告诉 FPGA 开始执行,FPGA 把执行结果放回 DRAM,再通知 CPU 去取回。CPU 和 FPGA 之间本来可以通过 PCIe 高效通信,为什么要到板上的 DRAM 绕一圈?也许是工程实现的问题,我们发现通过 OpenCL 写 DRAM、启动 kernel、读 DRAM 一个来回,需要 1.8 毫秒。而通过 PCIe DMA 来通信,却只要 1~2 微秒。


    如何评价微软在其数据中心大量部署FPGA?

    PCIe I/O channel 与 OpenCL 的性能比较。纵坐标为对数坐标。来源:[5]

    OpenCL 里面多个 kernel 之间的通信就更夸张了,默认的方式也是通过共享内存。本文开篇就讲,FPGA 比 CPU 和 GPU 能效高,体系结构上的根本优势是无指令、无需共享内存。使用共享内存在多个 kernel 之间通信,在顺序通信(FIFO)的情况下是毫无必要的。况且 FPGA 上的 DRAM 一般比 GPU 上的 DRAM 慢很多。

    因此我们提出了 ClickNP 网络编程框架 [5],使用管道(channel)而非共享内存来在执行单元(element/kernel)间、执行单元和主机软件间进行通信。需要共享内存的应用,也可以在管道的基础上实现,毕竟 CSP(Communicating Sequential Process)和共享内存理论上是等价的嘛。ClickNP 目前还是在 OpenCL 基础上的一个框架,受到 C 语言描述硬件的局限性(当然 HLS 比 Verilog 的开发效率确实高多了)。理想的硬件描述语言,大概不会是 C 语言吧。

    如何评价微软在其数据中心大量部署FPGA?

    ClickNP 使用 channel 在 elements 间通信,来源:[5]
    如何评价微软在其数据中心大量部署FPGA?

    ClickNP 使用 channel 在 FPGA 和 CPU 间通信,来源:[5]

    低延迟的流式处理,需要最多的地方就是通信。然而 CPU 由于并行性的限制和操作系统的调度,做通信效率不高,延迟也不稳定。此外,通信就必然涉及到调度和仲裁,CPU 由于单核性能的局限和核间通信的低效,调度、仲裁性能受限,硬件则很适合做这种重复工作。因此我的博士研究把 FPGA 定义为通信的「大管家」,不管是服务器跟服务器之间的通信,虚拟机跟虚拟机之间的通信,进程跟进程之间的通信,CPU 跟存储设备之间的通信,都可以用 FPGA 来加速。

    成也萧何,败也萧何。缺少指令同时是 FPGA 的优势和软肋。每做一点不同的事情,就要占用一定的 FPGA 逻辑资源。如果要做的事情复杂、重复性不强,就会占用大量的逻辑资源,其中的大部分处于闲置状态。这时就不如用冯·诺依曼结构的处理器。数据中心里的很多任务有很强的局部性和重复性:一部分是虚拟化平台需要做的网络和存储,这些都属于通信;另一部分是客户计算任务里的,比如机器学习、加密解密。我们首先把 FPGA 用于它最擅长的通信,日后也许也会像 AWS 那样把 FPGA 作为计算加速卡租给客户。

    不管通信还是机器学习、加密解密,算法都是很复杂的,如果试图用 FPGA 完全取代 CPU,势必会带来 FPGA 逻辑资源极大的浪费,也会提高 FPGA 程序的开发成本。更实用的做法是 FPGA 和 CPU 协同工作,局部性和重复性强的归 FPGA,复杂的归 CPU

    当我们用 FPGA 加速了 Bing 搜索、深度学习等越来越多的服务;当网络虚拟化、存储虚拟化等基础组件的数据平面被 FPGA 把持;当 FPGA 组成的「数据中心加速平面」成为网络和服务器之间的天堑……似乎有种感觉,FPGA 将掌控全局,CPU 上的计算任务反而变得碎片化,受 FPGA 的驱使。以往我们是 CPU 为主,把重复的计算任务卸载(offload)到 FPGA 上;以后会不会变成 FPGA 为主,把复杂的计算任务卸载到 CPU 上呢?随着 Xeon + FPGA 的问世,古老的 SoC 会不会在数据中心焕发新生?

    「跨越内存墙,走向可编程世界」(Across the memory wall and reach a fully programmable world.)

    参考文献
    [1] Large-Scale Reconfigurable Computing in a Microsoft Datacenter https://www.microsoft.com/en-us/research/wp-content/uploads/2014/06/HC26.12.520-Recon-Fabric-Pulnam-Microsoft-Catapult.pdf
    [2] A Reconfigurable Fabric for Accelerating Large-Scale Datacenter Services, ISCA'14 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/Catapult_ISCA_2014.pdf
    [3] Microsoft Has a Whole New Kind of Computer Chip—and It’ll Change Everything
    [4] A Cloud-Scale Acceleration Architecture, MICRO'16 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/10/Cloud-Scale-Acceleration-Architecture.pdf
    [5] ClickNP: Highly Flexible and High-performance Network Processing with Reconfigurable Hardware - Microsoft Research
    [6] Daniel Firestone, SmartNIC: Accelerating Azure's Network with. FPGAs on OCS servers.


    展开全文
    xiangz_csdn 2017-01-05 08:59:41
  • 167KB weixin_38507121 2021-02-25 21:34:03
  • 19.34MB weixin_39840650 2019-07-09 03:19:21
  • 1003KB weixin_38592548 2021-07-07 21:37:35
  • 80KB weixin_38656064 2021-01-19 16:24:31
  • BERT模型从训练到部署全流程 Tag: BERT 训练 部署 缘起 在群里看到许多朋友在使用BERT模型,网上多数文章只提到了模型的训练方法,后面的生产部署及调用...最终完成后可以使用一个网页进行交互,实时地输入的评...

    BERT模型从训练到部署全流程

    Tag: BERT 训练 部署

    缘起

    在群里看到许多朋友在使用BERT模型,网上多数文章只提到了模型的训练方法,后面的生产部署及调用并没有说明。
    这段时间使用BERT模型完成了从数据准备到生产部署的全流程,在这里整理出来,方便大家参考。

    在下面我将以一个“手机评论的情感分类”为例子,简要说明从训练到部署的全部流程。最终完成后可以使用一个网页进行交互,实时地对输入的评论语句进行分类判断。

    基本架构

    基本架构为:

    BERT模型服务端
    API服务端
    应用端
    +-------------------+
    |   应用端(HTML)     | 
    +-------------------+
             ^^
             ||
             VV
    +-------------------+
    |     API服务端      | 
    +-------------------+
             ^^
             ||
             VV
    +-------------------+
    |  BERT模型服务端    | 
    +-------------------+
    

    架构说明:
    BERT模型服务端
    加载模型,进行实时预测的服务;
    使用的是 BERT-BiLSTM-CRF-NER

    API服务端
    调用实时预测服务,为应用提供API接口的服务,用flask编写;

    应用端
    最终的应用端;
    我这里使用一个HTML网页来实现;

    本项目完整源码地址:BERT从训练到部署git源码
    项目博客地址: BERT从训练到部署

    附件:
    本例中训练完成的模型文件.ckpt格式及.pb格式文件,由于比较大,已放到网盘提供下载:

    链接:https://pan.baidu.com/s/1DgVjRK7zicbTlAAkFp7nWw 
    提取码:8iaw 
    

    如果你想跳过前面模型的训练过程,可以直接使用训练好的模型,来完成后面的部署。

    关键节点

    主要包括以下关键节点:

    • 数据准备
    • 模型训练
    • 模型格式转化
    • 服务端部署与启动
    • API服务编写与部署
    • 客户端(网页端的编写与部署)

    数据准备

    这里用的数据是手机的评论,数据比较简单,三个分类: -1,0,1 表示负面,中性与正面情感
    数据格式如下:

    1	手机很好,漂亮时尚,赠品一般
    1	手机很好。包装也很完美,赠品也是收到货后马上就发货了
    1	第一次在第三方买的手机 开始很担心 不过查一下是正品 很满意
    1	很不错 续航好 系统流畅
    1	不知道真假,相信店家吧
    1	快递挺快的,荣耀10手感还是不错的,玩了会王者还不错,就是前后玻璃,
    1	流很快,手机到手感觉很酷,白色适合女士,很惊艳!常好,运行速度快,流畅!
    1	用了一天才来评价,都还可以,很满意
    1	幻影蓝很好看啊,炫彩系列时尚时尚最时尚,速度快,配送运行?做活动优惠买的,开心?
    1	快递速度快,很赞!软件更新到最新版。安装上软胶保护套拿手上不容易滑落。
    0	手机出厂贴膜好薄啊,感觉像塑料膜。其他不能发表
    0	用了一段时间,除了手机续航其它还不错。
    0	做工一般
    1	挺好的,赞一个,手机很好,很喜欢
    0	手机还行,但是手机刚开箱时屏幕和背面有很多指纹痕迹,手机壳跟**在地上磨过似的,好几条印子。要不是看在能把这些痕迹擦掉,和闲退货麻烦,就给退了。就不能规规矩矩做生意么。还有送的都是什么吊东西,运动手环垃圾一比,贴在手机后面的固定手环还**是塑料的渡了一层银色,耳机也和图片描述不符,碎屏险已经注册,不知道怎么样。讲真的,要不就别送或者少送,要不,就规规矩矩的,不然到最后还让人觉得不舒服。其他没什么。
    -1	手机整体还可以,拍照也很清楚,也很流畅支持华为。给一星是因为有缺陷,送的耳机是坏的!评论区好评太多,需要一些差评来提醒下,以后更加注意细节,提升质量。
    0	前天刚买的,  看着还行, 指纹解锁反应不错。
    1	高端大气上档次。
    -1	各位小主,注意啦,耳机是没有的,需要单独买
    0	外观不错,感觉很耗电啊,在使用段时间评价
    1	手机非常好,很好用
    -1	没有发票,图片与实物不一致
    1	习惯在京东采购物品,方便快捷,及时开票进行报销,配送员服务也很周到!就是手机收到时没有电,感觉不大正常
    1	高端大气上档次啊!看电影玩游戏估计很爽!屏幕够大!
    
    

    数据总共8097条,按6:2:2的比例拆分成train.tsv,test.tsv ,dev.tsv三个数据文件

    模型训练

    训练模型就直接使用BERT的分类方法,把原来的run_classifier.py 复制出来并修改为 run_mobile.py。关于训练的代码网上很多,就不展开说明了,主要有以下方法:

    #-----------------------------------------
    #手机评论情感分类数据处理 2019/3/12 
    #labels: -1负面 0中性 1正面
    class SetimentProcessor(DataProcessor):
      def get_train_examples(self, data_dir):
        """See base class."""
        return self._create_examples(
            self._read_tsv(os.path.join(data_dir, "train.tsv")), "train")
    
      def get_dev_examples(self, data_dir):
        """See base class."""
        return self._create_examples(
            self._read_tsv(os.path.join(data_dir, "dev.tsv")), "dev")
    
      def get_test_examples(self, data_dir):
        """See base class."""
        return self._create_examples(
            self._read_tsv(os.path.join(data_dir, "test.tsv")), "test")
    
      def get_labels(self):
        """See base class."""
    
        """
        if not os.path.exists(os.path.join(FLAGS.output_dir, 'label_list.pkl')):
            with codecs.open(os.path.join(FLAGS.output_dir, 'label_list.pkl'), 'wb') as fd:
                pickle.dump(self.labels, fd)
        """
        return ["-1", "0", "1"]
    
      def _create_examples(self, lines, set_type):
        """Creates examples for the training and dev sets."""
        examples = []
        for (i, line) in enumerate(lines):
          if i == 0: 
            continue
          guid = "%s-%s" % (set_type, i)
    
          #debug (by xmxoxo)
          #print("read line: No.%d" % i)
    
          text_a = tokenization.convert_to_unicode(line[1])
          if set_type == "test":
            label = "0"
          else:
            label = tokenization.convert_to_unicode(line[0])
          examples.append(
              InputExample(guid=guid, text_a=text_a, label=label))
        return examples
    #-----------------------------------------
    

    然后添加一个方法:

      processors = {
          "cola": ColaProcessor,
          "mnli": MnliProcessor,
          "mrpc": MrpcProcessor,
          "xnli": XnliProcessor,
          "setiment": SetimentProcessor, #2019/3/27 add by Echo
      }
    

    特别说明,这里有一点要注意,在后期部署的时候,需要一个label2id的字典,所以要在训练的时候就保存起来,在convert_single_example这个方法里增加一段:

      #--- save label2id.pkl ---
      #在这里输出label2id.pkl , add by xmxoxo 2019/2/27
      output_label2id_file = os.path.join(FLAGS.output_dir, "label2id.pkl")
      if not os.path.exists(output_label2id_file):
        with open(output_label2id_file,'wb') as w:
          pickle.dump(label_map,w)
    
      #--- Add end ---
    

    这样训练后就会生成这个文件了。

    使用以下命令训练模型,目录参数请根据各自的情况修改:

    cd /mnt/sda1/transdat/bert-demo/bert/
    export BERT_BASE_DIR=/mnt/sda1/transdat/bert-demo/bert/chinese_L-12_H-768_A-12
    export GLUE_DIR=/mnt/sda1/transdat/bert-demo/bert/data
    export TRAINED_CLASSIFIER=/mnt/sda1/transdat/bert-demo/bert/output
    export EXP_NAME=mobile_0
    
    sudo python run_mobile.py \
      --task_name=setiment \
      --do_train=true \
      --do_eval=true \
      --data_dir=$GLUE_DIR/$EXP_NAME \
      --vocab_file=$BERT_BASE_DIR/vocab.txt \
      --bert_config_file=$BERT_BASE_DIR/bert_config.json \
      --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
      --max_seq_length=128 \
      --train_batch_size=32 \
      --learning_rate=2e-5 \
      --num_train_epochs=5.0 \
      --output_dir=$TRAINED_CLASSIFIER/$EXP_NAME
    

    由于数据比较小,训练是比较快的,训练完成后,可以在输出目录得到模型文件,这里的模型文件格式是.ckpt的。
    训练结果:

    eval_accuracy = 0.861643
    eval_f1 = 0.9536328
    eval_loss = 0.56324786
    eval_precision = 0.9491279
    eval_recall = 0.9581805
    global_step = 759
    loss = 0.5615213
    
    

    【注:很多童鞋说这里的F1计算有问题,其实这个F1是我加上去的,具体的请看源码】

    可以使用以下语句来进行预测:

    sudo python run_mobile.py \
      --task_name=setiment \
      --do_predict=true \
      --data_dir=$GLUE_DIR/$EXP_NAME \
      --vocab_file=$BERT_BASE_DIR/vocab.txt \
      --bert_config_file=$BERT_BASE_DIR/bert_config.json \
      --init_checkpoint=$TRAINED_CLASSIFIER/$EXP_NAME \
      --max_seq_length=128 \
      --output_dir=$TRAINED_CLASSIFIER/$EXP_NAME
    
    

    模型格式转化

    到这里我们已经训练得到了模型,但这个模型是.ckpt的文件格式,文件比较大,并且有三个文件:

    -rw-r--r-- 1 root root 1227239468 Apr 15 17:46 model.ckpt-759.data-00000-of-00001
    -rw-r--r-- 1 root root      22717 Apr 15 17:46 model.ckpt-759.index
    -rw-r--r-- 1 root root    3948381 Apr 15 17:46 model.ckpt-759.meta
    

    可以看到,模板文件非常大,大约有1.17G。
    后面使用的模型服务端,使用的是.pb格式的模型文件,所以需要把生成的ckpt格式模型文件转换成.pb格式的模型文件。
    我这里提供了一个转换工具:freeze_graph.py,使用如下:

    usage: freeze_graph.py [-h] -bert_model_dir BERT_MODEL_DIR -model_dir
                           MODEL_DIR [-model_pb_dir MODEL_PB_DIR]
                           [-max_seq_len MAX_SEQ_LEN] [-num_labels NUM_LABELS]
                           [-verbose]
    

    这里要注意的参数是:

    • model_dir 就是训练好的.ckpt文件所在的目录
    • max_seq_len 要与原来一致;
    • num_labels 是分类标签的个数,本例中是3个
    python freeze_graph.py \
        -bert_model_dir $BERT_BASE_DIR \
        -model_dir $TRAINED_CLASSIFIER/$EXP_NAME \
        -max_seq_len 128 \
        -num_labels 3
    
    

    执行成功后可以看到在model_dir目录会生成一个classification_model.pb 文件。
    转为.pb格式的模型文件,同时也可以缩小模型文件的大小,可以看到转化后的模型文件大约是390M。

    -rw-rw-r-- 1 hexi hexi 409326375 Apr 15 17:58 classification_model.pb
    

    服务端部署与启动

    现在可以安装服务端了,使用的是 bert-base, 来自于项目BERT-BiLSTM-CRF-NER, 服务端只是该项目中的一个部分。
    项目地址:https://github.com/macanv/BERT-BiLSTM-CRF-NER ,感谢Macanv同学提供这么好的项目。

    这里要说明一下,我们经常会看到bert-as-service 这个项目的介绍,它只能加载BERT的预训练模型,输出文本向量化的结果。
    而如果要加载fine-turing后的模型,就要用到 bert-base 了,详请请见:
    基于BERT预训练的中文命名实体识别TensorFlow实现

    下载代码并安装 :

    pip install bert-base==0.0.7 -i https://pypi.python.org/simple
    

    或者

    git clone https://github.com/macanv/BERT-BiLSTM-CRF-NER
    cd BERT-BiLSTM-CRF-NER/
    python3 setup.py install
    

    使用 bert-base 有三种运行模式,分别支持三种模型,使用参数-mode 来指定:

    • NER 序列标注类型,比如命名实体识别;
    • CLASS 分类模型,就是本文中使用的模型
    • BERT 这个就是跟bert-as-service 一样的模式了

    之所以要分成不同的运行模式,是因为不同模型对输入内容的预处理是不同的,命名实体识别NER是要进行序列标注;
    而分类模型只要返回label就可以了。

    安装完后运行服务,同时指定监听 HTTP 8091端口,并使用GPU 1来跑;

    cd /mnt/sda1/transdat/bert-demo/bert/bert_svr
    
    export BERT_BASE_DIR=/mnt/sda1/transdat/bert-demo/bert/chinese_L-12_H-768_A-12
    export TRAINED_CLASSIFIER=/mnt/sda1/transdat/bert-demo/bert/output
    export EXP_NAME=mobile_0
    
    bert-base-serving-start \
        -model_dir $TRAINED_CLASSIFIER/$EXP_NAME \
        -bert_model_dir $BERT_BASE_DIR \
        -model_pb_dir $TRAINED_CLASSIFIER/$EXP_NAME \
        -mode CLASS \
        -max_seq_len 128 \
        -http_port 8091 \
        -port 5575 \
        -port_out 5576 \
        -device_map 1 
    

    注意:port 和 port_out 这两个参数是API调用的端口号,
    默认是5555和5556,如果你准备部署多个模型服务实例,那一定要指定自己的端口号,避免冲突。
    我这里是改为: 5575 和 5576

    如果报错没运行起来,可能是有些模块没装上,都是 bert_base/server/http.py里引用的,装上就好了:

    sudo pip install flask 
    sudo pip install flask_compress
    sudo pip install flask_cors
    sudo pip install flask_json
    

    我这里的配置是2个GTX 1080 Ti,这个时候双卡的优势终于发挥出来了,GPU 1用于预测,GPU 0还可以继续训练模型。

    运行服务后会自动生成很多临时的目录和文件,为了方便管理与启动,可建立一个工作目录,并把启动命令写成一个shell脚本。
    这里创建的是mobile_svr\bertsvr.sh ,这样可以比较方便地设置服务器启动时自动启动服务,另外增加了每次启动时自动清除临时文件

    代码如下:

    #!/bin/bash
    #chkconfig: 2345 80 90
    #description: 启动BERT分类模型 
    
    echo '正在启动 BERT mobile svr...'
    cd /mnt/sda1/transdat/bert-demo/bert/mobile_svr
    sudo rm -rf tmp*
    
    export BERT_BASE_DIR=/mnt/sda1/transdat/bert-demo/bert/chinese_L-12_H-768_A-12
    export TRAINED_CLASSIFIER=/mnt/sda1/transdat/bert-demo/bert/output
    export EXP_NAME=mobile_0
    
    bert-base-serving-start \
        -model_dir $TRAINED_CLASSIFIER/$EXP_NAME \
        -bert_model_dir $BERT_BASE_DIR \
        -model_pb_dir $TRAINED_CLASSIFIER/$EXP_NAME \
        -mode CLASS \
        -max_seq_len 128 \
        -http_port 8091 \
        -port 5575 \
        -port_out 5576 \
        -device_map 1 
    
    

    补充说明一下内存的使用情况:
    BERT在训练时需要加载完整的模型数据,要用的内存是比较多的,差不多要10G,我这里用的是GTX 1080 Ti 11G。
    但在训练完后,按上面的方式部署加载pb模型文件时,就不需要那么大了,上面也可以看到pb模型文件就是390M。
    其实只要你使用的是BERT base 预训练模型,最终的得到的pb文件大小都是差不多的。

    还有同学问到能不能用CPU来部署,我这里没尝试过,但我想肯定是可以的,只是在计算速度上跟GPU会有差别。

    我这里使用GPU 1来实时预测,同时加载了2个BERT模型,截图如下:
    GPU运行截图

    端口测试

    模型服务端部署完成了,可以使用curl命令来测试一下它的运行情况。

    curl -X POST http://192.168.15.111:8091/encode \
      -H 'content-type: application/json' \
      -d '{"id": 111,"texts": ["总的来说,这款手机性价比是特别高的。","槽糕的售后服务!!!店大欺客"], "is_tokenized": false}'
    
    

    执行结果:

    >   -H 'content-type: application/json' \
    >   -d '{"id": 111,"texts": ["总的来说,这款手机性价比是特别高的。","槽糕的售后服务!!!店大欺客"], "is_tokenized": false}'
    {"id":111,"result":[{"pred_label":["1","-1"],"score":[0.9974544644355774,0.9961422085762024]}],"status":200}
    
    

    可以看到对应的两个评论,预测结果一个是1,另一个是-1,计算的速度还是非常很快的。
    通过这种方式来调用还是不太方便,知道了这个通讯方式,我们可以用flask编写一个API服务,
    为所有的应用统一提供服务。

    API服务编写与部署

    为了方便客户端的调用,同时也为了可以对多个语句进行预测,我们用flask编写一个API服务端,使用更简洁的方式来与客户端(应用)来通讯。
    整个API服务端放在独立目录/mobile_apisvr/目录下。

    用flask创建服务端并调用主方法,命令行参数如下:

    def main_cli ():
        pass
        parser = argparse.ArgumentParser(description='API demo server')
        parser.add_argument('-ip', type=str, default="0.0.0.0",
                            help='chinese google bert model serving')
        parser.add_argument('-port', type=int, default=8910,
                            help='listen port,default:8910')
    
        args = parser.parse_args()
    
        flask_server(args)
    
    

    主方法里创建APP对象:

    
        app.run(
            host = args.ip,     #'0.0.0.0',
            port = args.port,   #8910,  
            debug = True 
        )
    
    

    这里的接口简单规划为/api/v0.1/query, 使用POST方法,参数名为’text’,使用JSON返回结果;
    路由配置:

    @app.route('/api/v0.1/query', methods=['POST'])
    

    API服务端的核心方法,是与BERT-Serving进行通讯,需要创建一个客户端BertClient:

    #对句子进行预测识别
    def class_pred(list_text):
        #文本拆分成句子
        #list_text = cut_sent(text)
        print("total setance: %d" % (len(list_text)) )
        with BertClient(ip='192.168.15.111', port=5575, port_out=5576, show_server_config=False, check_version=False, check_length=False,timeout=10000 ,  mode='CLASS') as bc:
            start_t = time.perf_counter()
            rst = bc.encode(list_text)
            print('result:', rst)
            print('time used:{}'.format(time.perf_counter() - start_t))
        #返回结构为:
        # rst: [{'pred_label': ['0', '1', '0'], 'score': [0.9983683228492737, 0.9988993406295776, 0.9997349381446838]}]
        #抽取出标注结果
        pred_label = rst[0]["pred_label"]
        result_txt = [ [pred_label[i],list_text[i] ] for i in range(len(pred_label))]
        return result_txt
    
    

    注意:这里的IP,端口要与服务端的对应。

    运行API 服务端:

    python api_service.py
    

    在代码中的debug设置为True,这样只要更新文件,服务就会自动重新启动,比较方便调试。
    运行截图如下:

    服务运行截图

    到这一步也可以使用curl或者其它工具进行测试,也可以等完成网页客户端后一并调试。
    我这里使用chrome插件 API-debug来进行测试,如下图:
    API测试

    客户端(网页端)

    这里使用一个HTML页面来模拟客户端,在实际项目中可能是具体的应用。
    为了方便演示就把网页模板与API服务端合并在一起了,在网页端使用AJAX来与API服务端通讯。

    创建模板目录templates,使用模板来加载一个HTML,模板文件名为index.html
    在HTML页面里使用AJAX来调用接口,由于是在同一个服务器,同一个端口,地址直接用/api/v0.1/query就可以了,
    在实际项目中,客户应用端与API是分开的,则需要指定接口URL地址,同时还要注意数据安全性。
    代码如下:

    function UrlPOST(txt,myfun){
    	if (txt=="")
    	{
    		return "error parm"; 
    	}
    	var httpurl = "/api/v0.1/query"; 
    	$.ajax({
    			type: "POST",
    			data: "text="+txt,
    			url: httpurl,
    			//async:false,
    			success: function(data)
    			{   
    				myfun(data);
    			}
    	});
    }
    
    

    启动API服务端后,可以使用IP+端口来访问了,这里的地址是http://192.168.15.111:8910/

    运行界面截图如下:
    运行界面截图

    可以看到请求的用时时间为37ms,速度还是很快的,当然这个速度跟硬件配置有关。

    参考资料:

    欢迎批评指正,联系邮箱(xmxoxo@qq.com)

    展开全文
    xmxoxo 2019-04-15 23:38:03
  • 81KB weixin_38724229 2020-10-19 14:55:49
  • 1.25MB weixin_38661852 2021-07-07 09:09:29
  • 注重专业基础学习和实践能力的培养,在校期间不仅做过多个课程设计暑假期间也去过单位实践过,java编程和网站开发具有浓厚的兴趣。 篇二:优秀的程序员自我鉴定 优秀的程序员自我鉴定 以下一篇是一名优秀并且有...

    篇一:程序员简历自我评价

    程序员简历自我评价

    本人勤奋踏实,工作认真负责,自学能力强;性格开朗,容易与人相处,注重团队协作精神,且能承受较大压力。

    注重专业基础学习和实践能力的培养,在校期间不仅做过多个课程设计暑假期间也去过单位实践过,对java编程和网站开发具有浓厚的兴趣。

    篇二:优秀的程序员自我鉴定

    优秀的程序员自我鉴定

    以下一篇是一名优秀并且有工作经验的程序员的自我鉴定范文:

    大家好,我叫xxx。我性格开朗,乐于与人交往,诚实,正直,有教强的上进心,较强的学习能力,在学校团学会的工作使我组织和协调能力得到进一步加强,有较强的社会责任感。

    我的计算机能力: 程序员 语言能力:英语(一般);普通话(标准) 熟悉windows,能够熟练使用word,powerpoint等office软件; 熟悉c,c#,html,xml,了解数据结构©,软件工程学,c,c++,java,ajax。 熟练掌握c#语言。 熟悉开发工具vs、net…; 且利用b/s开发过物业网络管理系统。 在公司从事教育软件的开发。
    我曾经获得物业管理系统
    软件环境:windows系统 开发环境:vs.net XX(c#) sqlXX 项目描述:本系统主要包括前台和后台两部分,前台主要实现了管理员登录、物业管理人员信息、公告信息、住户欠费信息、住户投诉、住户报修、欠费查询等。后台主要对本网站进行管理,主要实现了受理物业信息管理、物业管理、公告管理、基本设置、系统维护等。

    XXXX年-XXXX年 “优秀团员”称号、“三等奖学金”、“校篮球比赛第一名” XX年-XX年被评为“系团总支学生会宣传部部长” 、“校书法大赛第一名”

    XXXX年-XXXX年 “优秀学生干部”、“优秀团干”

    通过以上的自我鉴定,我能更好地了解自己,了解自己在各方面的实力。作为一名有工作经验的计算机程序员,我为自己而感到骄傲。

    篇三:JAVA程序员个人简历范文

    (一)

    个人信息

    姓名:***

    性别:男

    年龄:22

    学历:本科

    专业:计算机

    联系电话:***

    毕业院校:广东XX大学

    主修课程:汇编语言程序设计、C#程序设计、JAVA程序设计、数据库原理、操作系统

    英语水平:通过国家六级考试。有较强的阅读和翻译能力,能进行日常英语对话。

    计算机水平:通过全国计算机等级考试三级网络技术。熟练操作OFFICE办公软件。

    实践与实习

    2012年上学期----与同学共同开发校园网站,完整地学习了网站的建设流程和相关技术。

    个人技能

    1、熟悉网站开发流程,开发文档格式;

    2、熟悉MVC体系结构模式、C/S模式,掌握面向对象的设计开发思想;

    3、熟练掌握JSP、Servlet、JavaBean、Struts、Hibernate等相关建站技术,熟练运用HTML、CSS、XML、JavaScript等页面控制技术;

    4、熟悉UML,了解PowerDesigner等建模工具;

    6、熟练掌握SQL语言,MySQL的设计和构建过程及相关维护,了解Access、MSSQL、Oracle等常用数据库;

    7、熟练运用Eclipse等开发工具,Apache、JBoss等服务器开发平台;

    8、能在WindowsServer、操作系统,上搭建网站平台及进行相关维护,了解RedHat、FreeBSD等Linux操作系统。

    求职意向

    JAVA软件工程师

    个人简介

    热爱编程,有良好的分析问题、解决问题的能力。能

    吃苦耐劳、待人热情、真诚,有较强的适应能力和团队协作精神。

    (二)

    个人资料

    姓名:个人简历

    性别:男

    目前所在: 广州 年 龄: 23

    户口所在: 广西 国 籍: 中国

    婚姻状况: 未婚 民 族: 汉族

    身 高: 160 cm 体 重: 45 kg

    求职意向

    应聘职位: 软件工程师:JAVA软件工程师 工作年限: 2 职 称: 中级

    求职类型: 全职 可到职日期: 随时

    月薪要求: 3500–5000 希望工作地区: 广州,

    工作经历

    广州东方标准信息科技有限公司 起止年月:2008-03 ~ 2010-06

    公司性质: 民营企业 所属行业:计算机/互联网/通信/电子

    担任职位: java程序员

    工作描述: 1.参与需求的挖掘;

    2.负责java程序开发, 测试,维护;

    3.带领实习生进行项目开发,并协助其攻克技术难点;

    4.重构“个人简历范文www.dlqql.com”。

    教育背景

    毕业院校: 广西职业技术学院

    最高学历: 大专 获得学位: 毕业日期: 2008-07 专 业 一: 计算机 专 业 二:

    起始年月 终止年月 学校(机构) 所学专业 获得证书 证书编号

    2007-11 2008-02 新东方IT培训学校 JAVA软件工程师 - -

    语言能力

    外语: 英语 一般 粤语水平: 一般

    其它外语能力:

    国语水平: 优秀

    工作能力及其他专长

    1.具有面向对象思想,扎实的编程功底以及良好的编码习惯;

    2.熟练应用Struts+Hibernate,SSH2框架和MVC三层架构开发模式;

    3.熟练Oracle数据库的操作,能够编写存储过程,熟悉Mysql和SqlServer数据库;

    4.熟练Tomcat服务器的部署及应用;

    5.熟悉版本管理器SVN;

    6.熟练使用Jsp,HTML,JavaScript,Jquery,Ajax,Css等WEB客户端技术;

    7.了解设计模式,代码重构和项目过程管理,能够编写文档。

    自我评价

    我身体健康,性格随和,五官端正,不怕苦不怕累。两年多的程序员生活锻炼了我坚强的意志,缜密的思维,以及强的抗压性;我做事有耐心,并且乐于

    学习新知识,更注重巩固旧知识。作为一名程序员,更重要的品质就是要懂得团队合作,而我恰好拥有团队合作精神,对工作认真负责。

    项目经验

    2010/3–2010/6:综合管理系统

    软件环境:TOMCAT6.0+ MYSQL

    硬件环境:windows

    开发工具:MYECLIPSE5.1

    项目描述:项目团队: 开发人员4人

    开发语言:JAVA

    SCM工具:SVN版本管理器

    项目技术:STRUTS 2+SPRING+HIBERNATE3.0、LOG4J、JQUERY、AJAX

    软件描述:“综合管理系统”专门针对社会各类培训学校、培训中心而开发的一套综合性管理软件,对学校的日常事物进行记录,提高学校管理的工作效率。主要有“权限管理”,“历史记录”,“教务管理”,“学员管理”,“教学管理”,“财务管理”等模块。 责任描述:

    1.带领实习生进行项目开发,从需求挖掘到程序开发;

    2.协助实习生攻克技术难点;

    3.负责“教务管理”,“学员管理”模块的开发;

    2009/12–2010/2: 创业测评系统

    软件环境:TOMCAT6.0+ ORACLE10g

    硬件环境:windows

    开发工具:MYECLIPSE5.1

    项目描述:项目团队: 开发人员4人,经理1人 开发语言:JAVA

    SCM工具:SVN版本管理器

    项目技术:STRUTS+HIBERNATE3.0、JQUERY、AJAX 软件描述:“创业测评系统”是省劳动保障厅主办项目“广东远程职业培训网”的一个子项目;以“广东远程职业培训网”的用户为用户,主要实现“测试”,“统计”,“行业方向管理”,“题库管理”,“测评报告管理”功能。

    责任描述:负责“统计”,“题库管理”模块的程序开发;

    1.“统计”中“自定义”统计功能以存储过程方式实现;

    2.以树形菜单显示题目种类。

    2009/2–2010/6:广东远程职业培训网

    软件环境:TOMCAT6.0+ ORACLE10g

    硬件环境:windows

    开发工具:MYECLIPSE5.1

    项目描述:项目团队: 开发人员6人,经理1人 开发语言:JAVA

    SCM工具:SVN版本管理器

    项目技术:STRUTS+HIBERNATE3.0、IBATIS、JSP、JAVASCRIPT、JQUERY、AJAX

    项目描述:“广东远程职业培训网”是省劳动保障厅主办项目,是一项长期项目;主要有以下功能:

    1.“后台管理系统”,用于管理学员信息,课件信息,三级权限分配,对各地市级的学员进行统计等;

    2.“学习平台”与FLASH进行交互,播放flash课件,提供给学员学习课程;

    3.“CMS新闻发布系统”丰富页面内容。

    我的任务:

    负责“学员管理”,“课件管理”模块的程序开发;重构“统计”、“注册”模块。

    1.“学员管理”实现增删改查,导入导出等功能。

    2.以树形结构显示课件信息,并实现增删改查,停用启用功能。

    3.重构“注册”功能,采用jquery.validator插件进行校

    验,ajax异步获取数据。

    责任描述: 负责“学员管理”,“课件管理”模块的程序开发;重构“统计”、“注册”模块。


    提示:上述信息仅供参考

    篇四:程序员转正自我鉴定

    程序员转正自我鉴定

    年的见习期就要到了,现就本人在这一年里的工作情况先作一整理,并做如下自我鉴定:

    在这一年里,我经历了从学校到企业、从学生到员工、从理论到实践这三个转变,围绕着这三个转变,我始终保持良好的心态,一步步成长。

    我于XXXX年XX月开始到xxx公司工作。在开始几个月的工作和学习当中,在各位领导和同事的指导和关心下,学习专业知识,向前辈请教经验,向同事学习专业技巧,正是在这个过程中,认识到自己不足,也深刻体会到了团队的力量和魅力,并且很快认识并融入这个团队,为我以后的工作树立一个良好的开端.

    在这段工作时间里,我做了一个比较棘手的项目——XXX系统。为什么说棘手呢,因为我以前没有做过这方面的项目,而且我问遍了所有认识的朋友,搜遍了网络也没有找到如何解决的方法,之后我翻书籍,接着搜索网络。功夫不负有心人,终于我找到一个聊天室的小例子,但是功能差的太远,于是我把这个示例一点点的研究,从一点也不懂到后来慢慢看懂,从对AJAX技术一无/fanwen/1600/所知到基本熟练运用。接下来我就开始自己开发,到最后终于把它开发了出来,虽然不是很完美,功能不是很强大,但是它是我辛苦的劳动结晶,我相信以后会把它开发的更强大,更完美。

    通过见习过程,我知道短暂的迷茫和情绪的低谷,有了各位同事的帮助和关心,以及个人的努力,可以让我顺利突破困境,找回自信和充实!

    在此,这就是我试用期的工作情况及心得体会的汇报,希望公司领导能对我的工作态度、工作能力和表现,以正式员工的要求做一个全面考虑,我会以炙热的工作热情继续投入到今后的工作当中,以自己踏实努力的工作,报公司知遇之恩!

    年的见习期就要到了,现就本人在这一年里的工作情况先作一整理,并做如下自我鉴定:

    在这一年里,我经历了从学校到企业、从学生到员工、从理论到实践这三个转变,围绕着这三个转变,我始终保持良好的心态,一步步成长。

    篇五:程序员的自我定位与思考

    程序员要做什么?

    版权所有:不知道

    以下文章都是经典,看不看随你的便,我只希望知识掌握在更多中国人的手里! 中国有很多小朋友,他们18,9岁或21,2岁,通过自学也写了不少代码,他们有的代码写的很漂亮,一些技术细节相当出众,也很有钻研精神,但是他们被一些错误的认识和观点左右,缺乏对系统,对程序的整体理解能力,这些人,一个网上的朋友说得很好,他们实际fans,压根没有资格称为程序员,但是据我所知,不少小网络公司的Cfans,拿着吓人的工资,做着吓人的项目,项目的结局通常也很吓人。

    程序员基本素质: 作一个真正合格的程序员,或者说就是可以真正合格完成一些代码工作的程序员,应该具有的素质。

    1.团队精神和协作能力

    把它作为基本素质,并不是不重要,恰恰相反,这是程序员应该具备的最基本的,也是最重要的安身立命之本。把高水平程序员说成独行侠的都是在呓语,任何个人的力量都是有限的,即便如linus这样的天才,也需要通过组成强大的团队来创造奇迹,那些遍布全球的为linux写核心的高手们,没有协作精神是不可想象的。独行侠可以作一些赚钱的小软件发点小财,但是一旦进入一些大系统的研发团队,进入商业化和产品化的开发任务,缺乏这种素质的人就完全不合格了。

    2.文档习惯

    说高水平程序员从来不写文档的肯定是乳臭未干的毛孩子,良好的文档是正规研发流程中非常重要的环节,作为代码程序员,30%的工作时间写技术文档是很正常的,而作为高级程序员和系统分析员,这个比例还要高很多。缺乏文档,一个软件系统就缺乏生命力,在未来的查错,升级以及模块的复用时就都会遇到极大的麻烦。

    3.规范化,标准化的代码编写习惯

    作为一些外国知名软件公司的规矩,代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同技术人员之间的协作。

    fans叫嚣高水平程序员写的代码旁人从来看不懂,这种叫嚣只能证明他们自己压根不配自称程序员。代码具有良好的可读性,是程序员基本的素质需求。

    再看看整个linux的搭建,没有规范化和标准化的代码习惯,全球的研发协作是绝对不可想象的。

    4.需求理解能力

    程序员需要理解一个模块的需求,很多小朋友写程序往往只关注一个功能需求,他们把性能指标全部归结到硬件,操作系统和开发环境上,而忽视了本身代码的性能考虑,有人曾经放言说写一个广告交换程序很简单,这种人从来不知道在百万甚至千万数量级的访问情况下的性能指标是如何实现的,对于这样的程序员,你给他深蓝那套系统,他也做不出太极链

    的并访能力。性能需求指标中,稳定性,并访支撑能力以及安全性都很重要,作为程序员需要评估该模块在系统运营中所处的环境,将要受到的负荷压力以及各种潜在的危险和恶意攻击的可能性。就这一点,一个成熟的程序员至少需要2到3年的项目研发和跟踪经验才有可能有心得。

    5.复用性,模块化思维能力

    经常可以听到一些程序员有这样的抱怨,写了几年程序,变成了熟练工,每天都是重复写一些没有任何新意的代码,这其实是中国软件人才最大浪费的地方,一些重复性工作变成了熟练程序员的主要工作,而这些,其实是完全可以避免的。

    复用性设计,模块化思维就是要程序员在完成任何一个功能模块或函数的时候,要多想一些,不要局限在完成当前任务的简单思路上,想想看该模块是否可以脱离这个系统存在,是否可以通过简单的修改参数的方式在其他系统和应用环境下直接引用,这样就能极大避免重复性的开发工作,如果一个软件研发单位和工作组能够在每一次研发过程中都考虑到这些问题,那么程序员就不会在重复性的工作中耽误太多时间,就会有更多时间和精力投入到创新的代码工作中去。

    一些好的程序模块代码,即便是70年代写成的,拿到现在放到一些系统里面作为功能模块都能适合的很好,而现在我看到的是,很多小公司软件一升级或改进就动辄全部代码重写,大部分重复性工作无谓的浪费了时间和精力。

    6.测试习惯

    作为一些商业化正规化的开发而言,专职的测试工程师是不可少的,但是并不是说有了专职的测试工程师程序员就可以不进行自测;软件研发作为一项工程而言,一个很重要的特点就是问题发现的越早,解决的代价就越低,程序员在每段代码,每个子模块完成后进行认真的测试,就可以尽量将一些潜在的问题最早的发现和解决,这样对整体系统建设的效率和可靠性就有了最大的保证。

    测试工作实际上需要考虑两方面,一方面是正常调用的测试,也就是看程序是否能在正常调用下完成基本功能,这是最基本的测试职责,可惜在很多公司这成了唯一的测试任务,实际上还差的远那;第二方面就是异常调用的测试,比如高压力负荷下的稳定性测试,用户潜在的异常输入情况下的测试,整体系统局部故障情况下该模块受影响状况的测试,频发的异常请求阻塞资源时的模块稳定测试等等。当然并不是程序员要对自己的每段代码都需要进行这种完整测试,但是程序员必须清醒认识自己的代码任务在整体项目中的地位和各种性能需求,有针对性的进行相关测试并尽早发现和解决问题,当然这需要上面提到需求理解能力。

    7.学习和总结的能力

    程序员是人才很容易被淘汰,很容易落伍的职业,因为一种技术可能仅仅在三两年内具有领先性,程序员如果想安身立命,就必须不断跟进新的技术,学习新的技能。

    善于学习,对于任何职业而言,都是前进所必需的动力,对于程序员,这种要求就更加高了。但是学习也要找对目标,一些小coding有些codingTO就是这样的coding上只是一些Cfans们,他们也津津乐道于他们的学习能力,一会学会了asp,一会儿学会了php,一会儿学会了jsp,他们把这个作为炫耀的资本,盲目的追逐一些肤浅的,表面的东西和名词,做网络程序不懂通讯传输协议,做应用程序不懂中断向量处理,这样的技术人员,不管掌握

    了多少所谓的新语言,永远不会有质的提高。

    善于总结,也是学习能力的一种体现,每次完成一个研发任务,完成一段代码,都应当有目的的跟踪该程序的应用状况和用户反馈,随时总结,找到自己的不足,这样逐步提高,一个程序员才可能成长起来。

    一个不具备成长性的程序员,即便眼前看是个高手,建议也不要选用,因为他落伍的时候马上就到了。具备以上全部素质的人,应当说是够格的程序员了,请注意以上的各种素质都不是由IQ决定的,也不是大学某些课本里可以学习到的,需要的仅仅是程序员对自己工作的认识,是一种意识上的问题。

    那么作为高级程序员,以至于系统分析员,也就是对于一个程序项目的设计者而言,除了应该具备上述全部素质之外,还需要具备以下素质:

    1.需求分析能力

    对于程序员而言,理解需求就可以完成合格的代码但是对于研发项目的组织和管理者,他们不但要理解客户需求,更多时候还要自行制定一些需求,为什么这么说呢?

    一般而言,进行研发任务,也许是客户提出需求,也许是市场和营销部门提出的需求,这时候对于研发部门,他们看到的不是一个完整的需求,通常而言,该需求仅仅是一些功能上的要求,或者更正规些,可能获得一个完整的用户视图;但是这都不够,因为客户由于非技术因素多一些,他们可能很难提出完整和清晰,或者说专业性的性能需求,但是对于项目组织者和规划者,他必须能够清醒认识到这些需求的存在并在完成需求分析报告的时候适当的提出,同时要完整和清晰的体现在设计说明书里面,以便于程序员编码时不会失去这些准则。

    程序设计者必须正确理解用户需求所处的环境,并针对性做出需求的分析,举例而言,同样一个软件通过ASP租用方式发布和通过License方式发布,性能需求可能就是有区别的,前者强调的是更好的支撑能力和稳定性,而后者则可能更强调在各种平台下的普适性和安装使用的简捷性。

    2.项目设计方法和流程处理能力

    程序设计者必须能够掌握不少于两到三种的项目设计方法(比如自顶至下的设计方法,比如快速原型法等等),并能够根据项目需求和资源搭配来选择合适的设计方法进行项目的整体设计。设计方法上选择不当,就会耽误研发周期,浪费研发资源,甚至影响研发效果。 一个程序设计者还需要把很多功夫用在流程图的设计和处理上,他需要做数据流图以确立数据词典;他需要加工逻辑流图以形成整体的系统处理流程。一个流程有问题的系统,就算代码多漂亮,每个模块多精致,也不会成为一个好的系统。当然,做好流程分析并选择好项目设计方法,都需要在需求分析能力上具有足够的把握。

    3.复用设计和模块化分解能力

    这个似乎又是老调重谈,前面基本素质上不是已经说明了这个问题吗?作为一个从事模块任务的程序员,他需要对他所面对的特定功能模块的复用性进行考虑,而作为一个系统分析人员,他要面对的问题复杂的多,需要对整体系统按照一种模块化的分析能力分解为很多可复用的功能模块和函数,并针对每一模块形成一个独立的设计需求。举个例子,好比是汽车生产,最早每辆汽车都是独立安装的,每个部件都是量身定做的,但是后来不一样了,机

    器化大生产了,一个汽车厂开始通过流水线来生产汽车,独立部件开始具有一定的复用性,在后来标准化成为大趋势,不同型号,品牌甚至不同厂商的汽车部件也可以进行方便的换装和升级,这时候,汽车生产的效率达到最大化。软件工程也是同样的道理,一个成熟的软件行业,在一些相关项目和系统中,不同的部件是可以随意换装的,比如微软的许多桌面软件,在很多操作模块(如打开文件,保存文件等等)都是复用的同一套功能模块,而这些接口又通过一些类库提供给了桌面应用程序开发者方便挂接,这就是复用化的模块设计明显的一个佐证。

    将一个大型的,错综复杂的应用系统分解成一些相对独立的,具有高度复用性的,并能仅仅依靠几个参数完成数据联系的模块组合,是作为高级程序员和系统分析员一项最重要的工作,合适的项目设计方法,清晰的流程图,是实现这一目标的重要保证。

    4.整体项目评估能力

    作为系统设计人员,必须能够从全局出发,对项目又整体的清醒认识,比如公司的资源配置是否合理和到位,比如工程进度安排是否能最大化体现效率又不至于无法按期完成。评估项目整体和各个模块的工作量,评估项目所需的资源,评估项目可能遇到的困难,都需要大量的经验积累,换言之,这是一种不断总结的累计才能达到的境界。在西方一些软件系统设计的带头人都是很年长的,比如4,50岁,甚至更老,他们在编码方面已经远远不如年轻人那样活络,但是就项目评估而言,他们几十年的经验积累就是最重要和宝贵的财富。中国缺这么一代程序员,主要还不是缺那种年纪的程序员,而是那种年纪的程序员基本上都是研究单位作出来的,都不是从专业的产品化软件研发作出来的,他们没有能积累那种产品化研发的经验,这也是没有办法的事情。

    5.团队组织管理能力

    完成一个项目工程,需要团队的齐心协力,作为项目设计者或研发的主管人,就应当有能力最大化发挥团队的整体力量,技术管理由于其专业性质,不大同于一般的人事管理,因为这里面设计了一些技术性的指标和因素。

    首先是工作的量化,没有量化就很难做到合适的绩效考核,而程序量化又不是简单的代码行数可以计算的,因此要求技术管理人员需要能真正评估一个模块的复杂性和工作量。 其次是对团队协作模式的调整,一般而言,程序开发的协作通常分为小组进行,小组有主程序员方式的,也有民主方式的,根据程序员之间的能力水平差距,以及根据项目研发的需求,选择合适的组队方式,并能将责权和成员的工作任务紧密结合,这样才能最大发挥组队的效率。

    一个代码水平高的人,未必能成为一个合格的项目研发主管,这方面的能力欠缺往往是容易被忽视的。

    综上可以看到,作为一个主管研发的负责人,一个项目设计者,所需要具备的素质和能力并不是程序代码编写的能力,当然一般情况下,一个程序员通过不断的总结提高达到了这种素质的时候,他所具有的代码编写能力也已经相当不简单了,但是请注意这里面的因果关系,一个高水平的项目设计者通常已经是代码编写相当优秀的人了,但是并不是一个代码相当优秀的程序员就可以胜任项目设计的工作,这里面存在的也不是智商和课本的问题,还是在于一个程序员在积累经验,逐步提升的时候没有意识到应当思考哪方面的东西,没有有意识的就项目的组织和复用设计进行揣摩,没有经常性的文档习惯和总结习惯,不改变这些,我们的合格的项目设计者还是非常欠缺。

    另外,为防止有无聊的人和我较真,补充一点,本文针对目标是作商业化的软件项目和工程,那些科研机构的编程高手,比如算法高手,比如图象处理高手,他们的工作是研究课题而非直接完成商业软件(当然最终间接成为商业产品,比如微软研究院在作的研究课题),因此他们强调的素质可能是另外的东西,这些人(专家),并不能说是程序员,不能用程序员的标准去衡量。

    最后补充一点东西,一个软件项目研发的设计流程是怎样的呢?以通常标准的设计方法为例,(不过笔者喜欢快速原型法)。

    第一个步骤是市场调研

    技术和市场要结合才能体现最大价值。

    第二个步骤是需求分析

    这个阶段需要出三样东西,用户视图,数据词典和用户操作手册。用户视图是该软件用户(包括终端用户和管理用户)所能看到的页面样式,这里面包含了很多操作方面的流程和条件。数据词典是指明数据逻辑关系并加以整理的东东,完成了数据词典,数据库的设计就完成了一半多。用户操作手册是指明了操作流程的说明书。

    注意,用户操作流程和用户视图是由需求决定的,因此应该在软件设计之前完成,完成这些,就为程序研发提供了约束和准绳,很遗憾太多公司都不是这样做的,因果颠倒,顺序不分,开发工作和实际需求往往因此产生隔阂脱节的现象。

    需求分析,除了以上工作,笔者以为作为项目设计者应当完整的做出项目的性能需求说明书,因为往往性能需求只有懂技术的人才可能理解,这就需要技术专家和需求方(客户或公司市场部门)能够有真正的沟通和了解。

    第三个步骤是概要设计

    将系统功能模块初步划分,并给出合理的研发流程和资源要求。作为快速原型设计方法,完成概要设计就可以进入编码阶段了,通常采用这种方法是因为涉及的研发任务属于新领域,技术主管人员一上来无法给出明确的详细设计说明书,但是并不是说详细设计说明书不重要,事实上快速原型法在完成原型代码后,根据评测结果和经验教训的总结,还要重新进行详细设计的步骤。

    第四个步骤是详细设计

    这是考验技术专家设计思维的重要关卡,详细设计说明书应当把具体的模块以最‘干净’的方式(黑箱结构)提供给编码者,使得系统整体模块化达到最大;一份好的详细设计说明书,可以使编码的复杂性减低到最低,实际上,严格的讲详细设计说明书应当把每个函数的每个参数的定义都精精细细的提供出来,从需求分析到概要设计到完成详细设计说明书,一个软件项目就应当说完成了一半了。换言之,一个大型软件系统在完成了一半的时候,其实还没有开始一行代码工作。那些把作软件的程序员简单理解为写代码的,就从根子上犯了错误了。

    第五个步骤是编码

    在规范化的研发流程中,编码工作在整个项目流程里最多不会超过1/2,通常在1/3的时间,所谓磨刀不误砍柴功,设计过程完成的好,编码效率就会极大提高,编码时不同模块之间的进度协调和协作是最需要小心的,也许一个小模块的问题就可能影响了整体进度,让很多程序员因此被迫停下工作等待,这种问题在很多研发过程中都出现过。编码时的相互沟通和应急的解决手段都是相当重要的,对于程序员而言,bug永远存在,你必须永远面对这个问题,大名鼎鼎的微软,可曾有连续三个月不发补丁的时候吗?从来没有!

    第六个步骤是测试

    测试有很多种:按照测试执行方,可以分为内部测试和外部测试;按照测试范围,可以分为模块测试和整体联调;按照测试条件,可以分为正常操作情况测试和异常情况测试;按照测试的输入范围,可以分为全覆盖测试和抽样测试。以上都很好理解,不再解释。

    总之,测试同样是项目研发中一个相当重要的步骤,对于一个大型软件,3个月到1年的外部测试都是正常的,因为永远都会又不可预料的问题存在。

    完成测试后,完成验收并完成最后的一些帮助文档,整体项目才算告一段落,当然日后少不了升级,修补等等工作,只要不是想通过一锤子买卖骗钱,就要不停的跟踪软件的运营状况并持续修补升级,知道这个软件被彻底淘汰为止。

    写这些步骤算不上卖弄什么,因为实话讲我手边是一本《软件工程》,在大学里这是计算机专业的必修课程,但是我知道很多程序员似乎从来都只是热衷于什么《30天精通VC》之类的,他们有些和我一样游击队出身,没有正规学过这个专业,还有一些则早就在混够学分后就把这些真正有用的东西还给了老师。

    fans乱嚷嚷,混淆视听,实际上真正的技术专家很少在网上乱发帖子的,如笔者这样不知天高地厚的,其实实在是算不上什么高手,只不过看不惯这种对技术,对程序员的误解和胡说,只好挺身而出,做拨乱反正之言,也希望那些还fans们能认真想想,走到正途上,毕竟那些聪明的头脑还远远没有发挥应有的价值。沉迷于一些错误人士的coding


    关注我

    喜欢别忘了点赞+关注我

    展开全文
    ssssswsrjhtdj 2021-02-24 11:32:33
  • lys_828 2021-11-13 21:39:56
  • 郑钢 2020-03-18 15:43:47
  • sinat_23971513 2020-12-01 13:49:51
  • 5星
    18.76MB axm2008 2013-05-30 16:00:57
  • 18.51MB axm2008 2013-05-30 08:59:00
  • u014448054 2020-08-31 10:33:03
  • weixin_40691089 2017-12-17 11:44:01
  • CSDN_bang 2021-04-14 00:09:13
  • GitChat 2017-08-30 17:29:14
  • qq_37950254 2019-04-24 09:17:19
  • qq_33932782 2018-03-20 19:09:44
  • KamRoseLee 2018-06-01 10:36:30
  • wexin_37276427 2018-08-12 16:11:34
  • qq_41475747 2020-07-18 19:50:43
  • asmartkiller 2021-01-28 13:00:37

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,776
精华内容 12,310
关键字:

对工作部署的评价