AI芯片与SystemVerilog参数化

AI芯片与SystemVerilog参数化

大模型引发技术变革, AI芯片公司面临新挑战

 ChatGPT 在全球范围内掀起了一场技术革命与商业浪潮,AI 市场也迎来了前所未有的机遇与增量。

当前,AI 基础设施的算力、算法呈现新 “摩尔定律”:相同算力下能训练生产更优质的模型,同时最先进的 AI 模型约每几个月算力需求就会扩大一倍。

 根据斯坦福大学和麦肯锡联合发布的《2019 人工智能指数报告》,2012 年之前最先进 AI 模型计算量每两年翻一倍;2012 年之后计算量每 3.4 个月翻一番,从 2012 年到 2020 年 3 月已增长 30 万倍。

伴随着大模型的快速迭代,其对算力的要求也不断提高,而算力的核心就是人工智能芯片。因此,如何在新趋势、新挑战下快速响应客户需求,推出切实可用的软硬件解决方案,成为了摆在国内 AI 芯片企业面前的首要课题。
拥抱变化,聚焦提升产品力
ChatGPT 及大模型技术大会上,昆仑芯科技研发总监王志鹏表示:“作为一家芯片公司,需要对市场的需求和变化非常敏感,才能使硬件产品始终精准匹配主流需求。”
大模型对计算的要求主要体现在三个方面,一是算力,二是互联,三是成本。就大模型而言,昆仑芯科技在产品定义上已经做出布局 —— 相较第一代产品,昆仑芯 2 代 AI 芯片可大幅优化算力、互联和高性能,而在研的下一代产品则将提供更佳的性能体验。
昆仑芯科技成立于 2021 年,前身为百度智能芯片及架构部。在实际业务场景中深耕 AI 加速领域已逾 10 年,专注打造拥有强大通用性、易用性和高性能的通用人工智能芯片。
在持续推进核心技术攻关的同时,昆仑芯科技紧密关注科技前沿,精准匹配市场需求。目前,公司已实现两代通用 AI 芯片的量产及落地应用,在互联网、智慧金融、智慧交通等领域已规模部署数万片。

 昆仑芯在大模型场景的规模落地实践

“来自真实场景” 一直是昆仑芯科技最独特的身份标签,也是其规模部署数万片、在行业内 “领跑落地” 的核心优势所在。
王志鹏认为,只有基于真实业务场景中的数据进行端到端优化,才能顺利推进大模型落地。
目前市场上主流的大模型以 Transformer 架构为主,包含 Encoder 和 Decoder。Encoder 主要被应用于各类 NLP 的判别类任务;而 Decoder 更多被应用于翻译、图文生成等场景,最近出圈的 ChatGPT 就是典型代表。
针对大模型,昆仑芯持续打磨部署优化方案,领跑产业落地。昆仑芯已将大模型的 Transformer 相关优化技术沉淀为重要基建,优化后的性能比原有方案提升 5 倍以上,压缩显存 30% 以上。
以文生图大模型为例,昆仑芯已跑通一条端到端优化、规模落地之路。
AI 绘画模型的推理算力及显存需求随图像分辨率增大而指数级增加,同时,图像生成需要循环采样数十次,产业落地动辄需要高昂成本的部署集群,严重阻碍了 AIGC 模型大规模商业化落地。
2022 年第四季度,昆仑芯联合客户,基于飞桨 PaddlePaddle 发起了端到端联合优化项目。在 2-3 周内,项目组快速完成端到端优化,最终实现输入文本后 2 秒出图的优化效果,性能提升近 8 倍。
目前,昆仑芯 AI 加速卡 R200 已在该客户的大模型场景完成规模部署,性能数据全面超越同系列主流推理卡:

  1. 基于昆仑芯 AI 加速卡 R200 高效运算与推理能力,综合优化方案,在 dpm-25steps 算法下,利用昆仑芯 AI 加速卡 R200,生成 1024*1024 图像时的推理速度为 10.89 iters/s,相比同能力的主流推理卡快 20%。
  2. 昆仑芯 AI 加速卡 R200 拥有 32G GDDR6 显存,为大规模参数提供更大的存储容量、更高带宽的内存访问、更稳定的性能,生成更高分辨率的图片,为用户提供高性价比服务。
    与此同时,面向当前市场需求迫切的大模型场景,据悉昆仑芯科技即将推出一款加速器组解决方案。
    该加速器组搭载第二代昆仑芯 AI 芯片,是 AI 基础设施的重要组成部分,为 AI IAAS 平台、 AI PAAS 平台提供坚实算力支撑。该产品可提供更为集约的 AI 算力,具备分布式集群部署能力,支持弹性 RDMA 网络,对比传统网络通信时延降低 2~3 倍。该产品可明显提高并行加速比,训推一体化助力提高资源利用率,极大提升模型开发迭代效率。
    携手上层伙伴共拓 AI 芯生态
    ChatGPT 及大模型技术大会上,与会者提问:在生态建设方面,国内 AI 芯片产业面临的客观情况是什么?
    这也是昆仑芯科技经常被客户提及的现实问题。
    昆仑芯科技在努力进一步扩大生态影响力:首先要深刻理解客户的使用习惯,满足客户需求,踏踏实实把软硬件从产品和技术上做到位。随着产品的规模部署,客户越来越多,生态也就自然而然建立起来了。与此同时,产品也会因此得到更好的打磨,进入良性循环。
    在昆仑芯科技看来,AI 芯片看似是一个硬件,但其本质则是一款软件产品。这也证明了软件栈、生态对于 AI 芯片发展的关键作用。
    目前,昆仑芯已实现对飞桨的原生适配,并完成了 III 级兼容性测试,训练与推理性能可以满足用户的应用需求。从底层 AI 算力组件、AI 服务器,到操作系统,再到昆仑芯 SDK,昆仑芯和飞桨携手完成了一套端到端的 AI 计算系统解决方案,并致力于打造一个全栈式软硬一体的 AI 生态。
    为进一步完善软件生态,昆仑芯已与多款通用处理器、操作系统、主流框架完成端到端适配,实现了软硬件解决方案的技术栈,为客户提供开箱即用的 AI 芯片产品。

     昆仑芯软件栈

    结语
    谈及大模型趋势下 AI 芯片公司面对的变化,王志鹏说道: “必须快速调整心态,并拥抱大模型带来的变化。”
    而这也刚好印证了昆仑芯科技 “突破创新” 的公司文化:面对瞬息万变的外部环境,突破创新是适应行业的唯一方式。
    面对复杂多变的市场环境以及新场景新应用对研发和落地的重重挑战,国内 AI 芯片公司如何出圈?
    集十余年 AI 加速领域的技术积淀,曾任百度智能芯片及架构部首席架构师、现任昆仑芯科技 CEO 欧阳剑认为,“AI 芯片公司应抓住场景和技术创新‘双驱动’模式,驱动架构优化升级与软硬件产品迭代,这是持续保持竞争力的关键。”

SystemVerilog中的类的参数化能干啥

Verilog中,大家已经知道可以使用各种编译命令和parameter等实现参数化的设计,具体使用时只需要通过修改对应的参数,就可以实现在不修改原代码的情况下,使对应的模块适用于不同的应用场合,从而可以提高代码的重用性和对应模块的通用性。在SystemVerilog中除了继续向下通吃Verilog的各种参数化设计方法外,还可以实现类的参数化设计,可以基于相同的模板类通过传递不同的参数实现不同的类,提高了代码的重用性。SystemVerilog中,类的参数化主要是用过两种方式实现的,一种是数值参数化,一种是类型参数化,其通用格式如下:

 下面将通过示例说明类参数化的应用。

1.数值参数化

【示例】 

 【仿真结果】 

 示例中,参数化类carr定义时,指定了参数SIZE,该参数SIZE将用于限定类中属性arr数组的大小,当传入不同的参数时,参数化类carr将形成特定的一个类,其中arr数组的大小也由传递的具体参数决定。示例中分别声明了两个句柄c1和c2,并且在声明时指定了参数类的参数SIZE的值,然后通过这两个句柄分别调用参数类中的方法disp_size,通过仿真结果,此时这两个句柄指向对象中的数组的大小是不一样,分别是句柄声明时传入的参数10和20。那么句柄c1和c2可以互相传递吗?

【示例】 

 【仿真结果】 

 通过仿真结果可以看到,c1和c2是不能相互传递的,这主要是因为c1和c2在声明时传递给类carr的参数不同所以c1和c2句柄类型是不同的,即相互之间不能直接进行句柄的传递。由此可以知道,参数化类如果在声明句柄时指定不同的参数值,那么声明的句柄将不属于同一类型。实际使用时,参数化类不止可以将数值进行参数化,还可以将数据类型作为参数进行传递,下面示例说明。

2.类型参数化

【示例】 

 【仿真结果】 

 示例中,类typec在定义时,也使用了参数,但是此时使用的参数是“type”,即类型作为参数,并且该类型参数将决定整个参数类typec中使用该类型参数的所有类型。示例中声明句柄c1时,没有指定参数,因为typec定义时其中的参数指定了默认类型为int,所以此时c1中的类型T采用了默认类型int。c2声明时指定了typec的参数类型为real,则声明c2时,typec类中的T为real,同理c3中的T为bit[3:0]。然后通过句柄调用了方法calc返回不同类型的计算结果。这里需要注意的是,c3中T的类型为bit[3:0],所以调用方法calc返回的结果高位将被截掉,所以仿真最后的结果为“111”,即7(32+23=55,转换成二进制最低3位为“111”)。

3.参数默认值

上例中,c1声明时没有指定参数类型,就可以声明句柄,那么是不是所有的参数类都可以在声明句柄时不指定参数值或者参数类型呢?大家请看下例。

【示例】 

 【仿真结果】 

 示例中,参数类typec在定义时,虽然指定了类型参数,但是此时该类型参数并没有指定默认值,所以此时如果声明c1句柄时没有指定参数类型,那么typec中的类型T将会成为“游魂野鬼”,所以此时仿真器在编译析构时就会善意输出上述报错信息。所以,如果使用了参数类,并且参数有默认值,那么在声明句柄时不指定参数时,那么该参数将会使用默认值,如果在声明句柄时指定了参数,那么该参数类将会使用声明句柄时指定的参数。

4.父类子类都参数化

除了上述一些相对比较简单的类参数化模型之外,在实际使用时,经常会遇到父类子类都参数化的情况,汇总如下表所示。

 【示例】 

 【仿真结果】 

 示例中,类typed拓展自typec,并且在typed定义时指定了该来的类型参数为real,同时指定了typed父类typec的类型参数为int。示例中第15行声明了句柄c,在第18行创建对象,并且句柄c指向该对象。第19行给子类中的属性val2赋值为1.234,因为val2类型为real,所以此时赋给val2中的值仍为1.234.第20行通过句柄c访问typec中属性val1,并且给val1赋值为4.321,但是因为typed在定义时给父类typec的类型参数指定的类型为int,所以此时val1的类型为int,所以val1中的值是4而不是赋给其的4.321。第21行调用typed中方法calc同时传递给val3的值为3.111,因为val3的类型为real(由ST决定),所以赋给val3的值仍为3.111。最终val1中的值为4,val2中的值为1.234,val3中的值为3.111,三者之和为仿真结果中显示的8.345。

通过上述示例,可以看到在使用参数化类时,用户可以定义一个模板类,通过传递不同的参数使模板类定制化,从而可以有效提高代码的复用性,同时在使用时大家也需要注意以下几点:

l给模板类传递不同的参数,那么形成的类虽然使用的模板相同,但是属于不同的类,是不能直接进行句柄传递;

l模板类的参数如果指定了默认值,那么在声明句柄时如果不指定参数,那么模板类的中的参数将使用默认值;

l模板类的参数如果没有指定默认值,那么在声明句柄时必须给参数指定默认值;

l用户在使用参数类时,建议先从非参数化类的定义开始,之后再经过调试抽象将非参数化类“提纯”到参数化类;

 

 

参考文献链接

https://mp.weixin.qq.com/s/WcmjosE-_YOz5J2nHa8sYQ

https://mp.weixin.qq.com/s/9R7bhuSTmHLdtq4Nj72G8w

posted @ 2023-05-01 04:54  吴建明wujianming  阅读(163)  评论(0编辑  收藏  举报