1. 概述
在AI芯片领域,当前阶段NVIDIA基本上可以说是处于绝对的垄断地位,除了自身产品确实够强悍之外,最厉害的地方是还能借助CUDA生态令无数的开发者、研究人员都在为他家免费打工,从而将其市值推上3万亿美元。国内AI芯片厂家只要能达到其1%的市值就是300多亿美元即2000多亿人民币,这样作为一家芯片公司相信就已经很成功了,而且当前老美对国内的各种政策利好,在这样的大势下,只要走对路线相信还是能成功的。
国内各家AI芯片厂家苦CUDA久已,要么自个实力足够强大试图重建自家的生态,要么试图全兼容或半兼容CUDA生态,但是实际上效果都不大好,用户抱怨难用的不少,急眼了来一句:“咱们能不能好好学CUDA?”。问题即是机会,国产化Ai芯片生态的构建也是个持久战问题,因此本文对国产化Ai芯片生态做了一些思考,另外存在决定意识,我所讲的都是我一家之言,不一定看的全、看的对。
2. CUDA生态分析
伟人告诉我们做事情之前要先调查研究,如下图所示,我们把CUDA的生态一层层从上往下拆解开来进行分析。
2.1 应用层
首先是应用层,这一层是各种模型应用,是NVIDIA公司外的CUDA生态,是无数深度学习研究人员、开发者用户、客户围绕CUDA自发构建成的生态,这也是CUDA最牢靠最大的护城河,人员无数,这些应用也是离价值最近的最直接的生产力。
下面举例说明一些实际应用场景[2]:
大模型:
- 自然语言处理:如GPT-3、BERT等,用于文本生成、翻译、摘要、情感分析等。
- 图像识别:如ResNet、Inception等,用于图像分类、目标检测、图像分割等。
AIGC:
- 文本生成:自动生成新闻文章、小说、诗歌等。
- 音乐创作:AI作曲家可以创作独特的音乐旋律和和声。
- 艺术创作:AI艺术家可以创作绘画、雕塑等艺术作品。
多模态:
- 视觉问答:结合视觉和语言信息,回答关于图像内容的问题。
- 多模态情感分析:分析文本、语音和面部表情等多个模态的情感状态。
文生图:
- 图像生成:根据文本描述生成相应的图像,如“一个阳光明媚的海滩”。
- 漫画生成:根据剧本自动生成漫画页面。
图生图:
- 风格迁移:将一种艺术风格应用到另一张图片上,如将梵高的画风应用到现代照片上。
- 图像编辑:通过图像到图像的转换,实现图像的自动编辑和美化。
文生视频:
- 视频生成:根据文本描述生成视频内容,如“一个在森林中奔跑的鹿”。
- 视频摘要:自动从长视频中提取关键片段,生成简短的视频摘要。
具体应用举例[2]:
教育:
- 使用AIGC生成个性化学习材料和练习题。
- 利用多模态技术辅助语言学习,通过图像和声音增强记忆。
娱乐:
- 使用文生图技术生成电影海报或游戏角色设计。
- 利用图生图技术进行角色形象的自动设计和风格转换。
医疗:
- 利用大模型进行疾病诊断和预测,辅助医生做出更准确的判断。
- 使用多模态技术结合患者的医疗影像和临床数据进行综合分析。
电商:
- 通过文生图技术生成商品的个性化展示图。
- 使用图生图技术优化商品图片,提升视觉吸引力。
新闻媒体:
- 利用AIGC自动生成新闻报道和文章。
- 使用文生视频技术生成新闻摘要视频,快速传达信息。
广告:
- 利用文生图技术生成广告创意和视觉素材。
- 使用图生图技术优化广告图像,提升广告效果。
这些技术的应用正在不断扩展,未来可能会有更多创新和突破,而且这些应用绝大多数都是基于CUDA的基础设施进行开发的,无数的应用,无数的开发人员构建了NVIDIA CUDA 最牢靠的护城河。
2.2 框架层
这一层是深度学习框架,也是NVIDIA公司之外的CUDA生态,到这层就属于基础设施软件层了,这些工具主要与深度学习的训练、微调与推理框架相关,下面是它们各自的用途和特点[2]:
DeepSpeed: 这是一个由微软推出的深度学习优化库,旨在帮助研究人员和开发人员加速大规模深度学习训练。DeepSpeed 提供了多种优化技术,如模型并行、梯度累积、混合精度训练等;
Megatron-LM: 这是NVIDIA推出的一个用于训练大型语言模型的库。它利用了NVIDIA的GPU和NVLink技术来加速多GPU训练,使得训练非常大的语言模型成为可能;
Flash-Attention: 这是一个用于提高注意力机制效率的库,特别是在Transformer模型中。Flash-Attention 通过优化内存访问和计算流程,显著提高了注意力层的计算速度与性能;
Transformer Engine: 这是一个用于构建和训练Transformer模型的框架,它提供了一套丰富的API来简化模型的构建、训练和部署过程;
Apex: 这是NVIDIA推出的一个PyTorch扩展,它提供了多种用于提升PyTorch性能的工具,包括混合精度训练、分布式训练等;
PyTorch: 这是一个广泛使用的开源机器学习库,特别适合于深度学习和自然语言处理。PyTorch以其易用性、灵活性和动态计算图而闻名;
VLLM: vLLM是一个由加州大学伯克利分校的LMSYS组织开源的大型语言模型(LLM)高速推理框架。它旨在提供快速、易用且成本效益高的LLM服务,特别是在实时场景下,可以显著提升语言模型服务的吞吐量和内存使用效率;
TensorRT-LLM: 这可能是一个结合了NVIDIA的TensorRT优化库和大型语言模型(LLM)的框架。TensorRT是一个深度学习推理引擎,它可以将训练好的模型优化为高效的推理格式,以加速在生产环境中的模型部署。如果TensorRT-LLM存在,它可能是为了在NVIDIA硬件上优化和加速大型语言模型的推理;
Hugging Face: 是一个专注于自然语言处理(NLP)的开源社区和公司,提供了一系列的工具和库,以促进机器学习模型的共享和应用。包括TGI, transformers, accelerate, diffusers, peft等。
除了目前以上这些比较主流的工具之外,而且随着技术的发展,新的工具和库可能会不断出现。这一层构成了NVIDIA CUDA 的框架与开发库护城河。
2.3 CUDA 加速库与编译器层
CUDA加速库以及编译器再加上周边的辅助工具,构建成了整个NVIDIA CUDA Toolkit系统。CUDA Toolkit是NVIDIA自建闭源生态,是一个全面的开发环境,用于创建高性能、GPU加速的程序,以下是CUDA Toolkit的主要特点和功能[2]:
- 开发环境:
- CUDA Toolkit提供了一个完整的开发环境,支持在GPU加速的嵌入式系统、桌面工作站、企业数据中心、云平台和超级计算机上开发、优化和部署应用程序;
- GPU加速库:
- 包括cuDNN(深度学习神经网络库),cuBLAS(基本线性代数子程序的实现)、cuFFT(快速傅里叶变换库)、cuRAND(随机数生成库)、cuSOLVER(线性代数求解库)、cuSPARSE(稀疏矩阵处理库)等,这些库可以显著加速科学计算和数据处理任务;
- 编译器和运行时库:
- 包含NVCC编译器,用于编译CUDA程序,以及运行时库,用于在不同平台上部署应用程序;
- 调试和优化工具:
- 提供了NVIDIA Nsight Compute和NVIDIA Nsight Systems等开发工具,帮助开发者优化和提高应用程序的性能;
- 多GPU配置:
- 内置功能支持在多GPU配置中分布计算,使得应用程序可以从单GPU工作站扩展到拥有数千GPU的云安装;
- 新架构支持:
- CUDA 12引入了对NVIDIA Hopper和Ada Lovelace架构的支持,包括下一代Tensor Cores、Transformer Engine、NVLink Switch、混合精度模式、第二代多实例GPU(MIG)等;
- 异构内存管理(HMM):
- 支持在主机内存和加速器设备之间无缝共享数据,而无需由CUDA分配或管理内存,简化了应用程序的移植和使用外部框架;
- 安全功能:
- 支持Hopper GPU的机密计算(Confidential Computing),提供加密和身份验证功能,保护用户代码和数据;
- 文档和培训:
- 提供详细的技术文档和培训课程,帮助开发者更好地理解和使用CUDA Toolkit。
通过这些功能,CUDA Toolkit为开发者提供了强大的工具和资源,以实现高效的GPU编程和加速计算。CUDA TOOLKIT 构成了NVIDIA GPU基础软件护城河。
2.4 NVIDIA云原生软件栈
NVIDIA Cloud Native Stack 是一套软件集合,用于在 NVIDIA GPU 上运行云原生工作负载。它基于 Ubuntu、Kubernetes、Helm 以及 NVIDIA GPU 和网络运营商构建而成。以下是其主要特点和组件[2]:
平台支持:适用于各种用例和行业的应用开发和部署,包括高性能计算、对话式 AI、推荐系统等 ;
灵活部署:可在裸金属服务器、Kubernetes 或虚拟化环境中运行,支持本地、云端和边缘部署,以最大化利用 GPU 资源并提高应用的便携性和可扩展性 ;
AI 软件套件:NVIDIA AI Enterprise 是一个端到端的云原生 AI 软件套件,助力组织提高运营效率并解决新问题 ;
容器化:NGC 目录托管了经过 NVIDIA 优化的 AI 和数据科学软件容器,简化了部署流程 ;
预训练模型:NGC 目录提供预训练的 GPU 优化模型,适用于多种 AI 任务,可以按原样使用或重新训练 ;
Helm 部署:实现 Kubernetes 集群上的软件部署自动化,NGC 目录提供支持 Kubernetes 的 Helm 部署 ;
NVIDIA GPU Operator:一个由 NVIDIA 驱动的套件,包含容器运行时、设备插件和管理软件;
Ansible Playbooks:提供自动化安装、升级、验证和卸载 NVIDIA Cloud Native Stack 的 Ansible 剧本 ;
监控和存储:支持在 Cloud Native Stack 上部署 Prometheus/Grafana 和 Elastic Logging 栈进行监控,以及 Local Path 和 NFS 存储提供程序 ;
版本控制:Cloud Native Stack 支持生命周期管理,允许用户升级至下一个可用版本 ;
组件矩阵:详细列出了不同版本和发行日期的 Cloud Native Stack 组件,包括操作系统、容器运行时、Kubernetes、Helm、NVIDIA GPU 运营商和网络运营商等 ;
NVIDIA LaunchPad:提供预先配置的环境,以便用户快速开始使用 。
NVIDIA Cloud Native Stack 通过提供这些工具和特性,使得开发者和企业能够更容易地在云原生环境中利用 NVIDIA GPU 的强大计算能力。这一层主要还是K8S生态,工具都是开源的相对来说比较的开放,国内芯片厂家只要老老实实的参考nvidia cloud native stack 进行开发即可。
3.破局策略
3.1 统一认识
国产AI芯片生态上要能破局首先是要统一认识,认识是行动的指导。NVIDIA的CUDA生态链是非常的强大,但是通过以上分析可知真正的强大在应用层有无数的开发人员、研究人员在开发应用在做研究,框架层有很多的厂家在基于CUDA构建基础设施。如果剥离了这些,NVIDIA本身也只是一家普通的AI芯片公司,要破局并非不可能,因此国产AI芯片厂家要达成的认识的第一点是:国产AI芯片生态破局点在于CUDA TOOLKIT,而不是应用层与框架层。
问题即是机会,事物的内部矛盾是事物发展的根本动力。首先是要解放思想承认现实,实事求是的从客观实际出发,即不走速胜论路线也不走完全不可能路线,具体问题具体分析。从以用户为中心出发,而不是以技术为中心出发是国产AI芯片生态破局的根本之道。从用户出发,也是从人性出发,违背人性的技术走不远,既然从人性出发那么就需要考虑以下三不原则:
1)不要让用户学,学CPU编程、学CUDA编程已经学的够多的了,再学真学不动;
2)不要让用户想,无脑使用最好;
3)不要让用户烦,能简单点就简单点最好;
海能够纳百川是因为它足够的低,放低用户的开发、使用门槛,用户自然而然汇聚而来,当做到使用门槛比NVIDIA的 CUDA 门槛还要低时,新的生态自然而然形成。这是国产AI芯片厂家要达成的认识的第二点。
3.2 生态策略
下图是目前国内各AI芯片厂家的生态破局策略图,有完全自建生态的,有魔改框架组件的,有转换框架组件的,有基于开源开发的,下面的章节里我们一层层的解读这些策略。
3.2.1 应用层与框架层
通过第2章的分析可知,应用层与框架层是全世界的无数开发人员、无数研究人员以及无数厂家围绕CUDA TOOLKIT 构建的生态,没有一家厂家甚至国家有能力重构这样的生态,国内想重构这个应用生态的各厂内项目基本上都已经凉凉,自己去提供开发框架试图掌握上层应用生态的也基本半死不活。
对与应用层与框架层的破局策略是不要试图去改变无数开发者,去改变无数研究人员的使用习惯,更不可能让一些厂家转而使用自己的框架,而且人家又不是傻子,在巨大的利益面前,真没几人会愿意替别人做嫁衣,任何试图改变开发者、研究人员、各个应用厂家的行为都是属于主观不符合客观。
那么对于应用层与框架层如何破局应对? 建议是“打不过就加入”,对于存量的应用与框架,直接拉取无需做任何修改或者最多只改几行代码即可使用,遵循“不要让用户想,不要让用户烦,不要让用户学”,这样的三不原则。有些技术人员一听这个可能就会来喊一句:“这怎么可能?” ,其实只要对底层技术抽象的足够好是完全可以做到的。
3.2.2 CUDA TOOLKIT 层
CUDA TOOLKIT 层是被NVIDIA牢牢掌控的一层,这一层看上去是NVIDIA最为强大的护城河,但是恰恰相反,CUDA TOOLKIT 反而是NVIDIA最为薄弱的护城河,集中一家公司的力量在一定条件下就可以完成。对于这一层目前国内AI芯片厂家有以下几个破局路线:
1,完全自建类似CUDA的生态的,构建私有的xxDNN,xxFFT,xxBLAS,xxFFT等,再自我构建开源的框架层,再继续往上构建应用开发层,算法层等,投入巨大但是效果很一般。CUDA之所以能成为生态那是一开始根本就没人看好,也没有对手,属于天时、地利、人和三合一自己长出来的。目前在国内想重建CUDA生态也要看看其他厂家愿不愿意合作,国内各家AI芯片厂都在试图构建自己的生态,对同类生态资源多多少少都有挤占,谁也不想替别人做嫁衣,而且也要面对NVIDIA用户的粘性问题,所以这一条路线基本上没太大希望,具体例子可以参考某500强大厂;
2,魔改开源框架组件的,国内ai芯片厂家走这一类路线的也不少,自己开发类似CUDA toolkit这样的工具,然后魔改开源框架组件以及各种性能加速库。这一策略如果是应用在推理芯片路线,一定程度上还是可以的,推理的复杂度远远低于训练与微调,算子只要前向算子,只要集中力量自我开发一个推理框架再遍历支持几百个模型,在有限的资源下也是没问题的。但是如果客户想用自家的推理框架而不用厂家提供的,那么新的推理框架的适配工作量还是不少的。
魔改开源组件的好处是,往上是基本上可以不动应用层,不改变应用层的用户习惯,往下是内部的各种加速库,编译器甚至芯片都可以自己玩自己的,不太需要考虑协同设计,反正都是内部问题,都能跑的起来保证项目交付。缺点是每一个版本都难以迁移,不同代际芯片的软件栈难以无缝迁移,各种版本不兼容,然后算子库也都需要重写,比如要将flash-attention, deepspeed, transformerEngine,apex, pytorch等这些基础框架在XPU上支持起来,每一代的芯片都有海量的算子要重写,对公司资源的消耗是海量的,人力投入巨大,重复的海量工作严重延误芯片推向市场的时间,所以这一条路线有点像大块头无脑秀肌肉可能适合推理芯片但是真不适合训练芯片。
3,将CUDA源代码无缝翻译为XPU代码,这一路线国内AI芯片厂家也有,看上去是比较难而正确的路线,不改变应用层,也不改变框架层,同过转换与编译工具将框架层里的cuda源代码翻译为XPU代码进而编译出XPU可执行文件。这一条策略做到了“将复杂留给自己将简单留给用户”,对用户最为友好真正做到了遵循“不要让用户想,不要让用户烦,不要让用户学”这样的三不原则。但是缺点是对AI芯片厂家要求较高,需要加速库,编译器,硬件三者协同设计,并且如果本身芯片的演进路线与NVIDIA硬件不同,那么实现与兼容起来会比较的难受。所以建议的策略是先兼容已有的、普遍的、海量存量,再以特殊情况的策略对待增量,增量毕竟对公司的资源消耗会小点,先保证存量可用,快速推向市场抢占先机,再空出资源腾出手解决增量问题,即“先立再破”。这一策略需要顶层统一思想路线,软硬件协同设计。
这一策略具体实现方案举例如下:
1)应用层
应用层尽量做到不改任何代码用户直接拉取即可使用,实在不行最多一句import transfer_to_xpu
。
2)框架层
框架层采用monkey patching 策略完成cuda代码到xpu代码的转换,比如pytorch,megatron_lm, deepspeed, vllm, accelerate, transformers等尽量做到直接拉取即可使用,实在不行即提供transfer_to_xpu接口,供用户 import transfer_to_xpu
完成调用。
3)算子层
算子层可以视情况提供将CUDA源代码直接编译为XPU二进制的编译工具,也可以提供对CUDA算子代码进行关键词替换或宏替换工具。
3)编程模型
遵循SISD, SIMT的编程思想,不要试图改变开发者用户的编程习惯,全面参考CUDA的线程编程模型,内存编程模型,IO编程模型以及异构执行编程模型。
4)编译器层
从人性懒惰出发,遵循SISD, SIMT的编程思想,将SISD, SIMT 代码在编译器层映射为SIMD 代码,从而提升不同代际产品算子的可移植性以及减少算子的编程学习成本。
5)硬件层
软硬件协同设计,启用SIMT+SIMD 架构支持编译器遵循SISD,SIMT的编程思想。
3.2.3 GPU云原生工具
这一层主要是K8S+GPU的生态,而且工具基本上也是开源的,只要遵循“不改变用户使用习惯”的原则,系统梳理全面复制即可完成GPU云原生生态兼容。
4. 小结
“让我痛苦的,必将使我强大!”,“克服自身现有的问题,才是成长最快的方式!”,这两句话用在国产化AI芯片生态兼容上也是合适的。”路虽远行则将至,事虽难做则必成,漫漫长路必见曙光!”,AI芯片关系到国家的竞争力,也与诸位一起共勉。
日拱一卒,功不唐捐,分享是最好的学习,与其跟随不如创新,希望这个知识点对大家有用。另作者能力与认知都有限,”我讲的,可能都是错的“,欢迎大家拍砖留念。
5. 作者简介
常平,为学,闻道,践行。
6. 参考资料
[2] https://kimi.moonshot.cn 生成
7. 版权申明
本文的版权协议为 CC-BY-NC-ND license:https://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh
在遵循署名、非商业使用(以获利为准)以及禁止演绎的前提下可以自由阅读、分享、转发、复制、分发等。