**【摘要】**本文主要阐明如何去设计一个大模型的 IT 基础设施。包括前期评估、整体设计流程、总体集成和测试,重点阐述了整体设计流程的步骤和关键点。
一.前期评估
首先,在开始设计之前,你必须明确自己搭建私有化大模型的目的所在,并对可投入的时间和成本有明确估算,确保在可行性评估上没有明显不通过项。
有些基本常识在设计前,需要再次重申,如下:
1.建设大模型需要三个生产要素, IT 基础设施,算法模型和数据,同时需要相应技术人员。
2.基于 GPU 的算力集群资源不仅贵,还紧缺,这个状况最保守估计在 2023 年底前不会改变,(个人认为在 2024 年上半年前也不会有大变化)。你需要克服困难去筹集 GPU 卡资源 ( 由于显存和通信带宽时延的能力差距,目前最适合大模型训练的仍然是 H100 , 4090 只能承担推理 )
3.前期的数据归集和预处理,以及后期的训练和微调,时间周期通常以月计,整个过程很难在几周内完成,在项目周期评估上要有心理准备。
4.虽然大模型已经表现出了令人惊艳的能力,但私有化大模型通常面向垂直行业应用,最初得到的效果可能会有所不同,和数据质量,行业特点以及项目预期都有关系。
以上基本信息明确无误后,需要再次评估是否具备启动条件,如果以上问题都有好的答案或者解决方法,那么就可以进入设计阶段。
二.整体设计流程
分为三步:筛选模型,规模训练,适配部署
1.以最小规模,快速寻找最合适的模型
现在可用的开源模型已经相当丰富,但针对你的特定应用需求,必然有合适与不合适之分,在这一步,你需要寻找最优模型。如何评价最优?通常来讲,大模型训练的最终结果呈现都是“一个能够进行完成某些任务的辅助工具”, co-pilot 、副驾、数字助理都是非常形象的描述,评价好坏主要是看这个工具的准确度。
查找模型的过程,业界使用了另一个术语“超参数搜索( Hyperparameter Search )”来描述。Lambda 的一份公开资料中有个图画得很形象,我这里借用一下:
所谓超参数是在机器学习过程启动之前就预先设置的参数,典型的超参数有学习率 learning rate ,批次大小 batch_size ,迭代次数 Epoch ,影响模型泛化能力的正则化系数,和神经网络的结构参数层数,神经元数量,卷积核大小等。不同的超参数设定加在一起,基本就确定了具体模型。通常情况下,我们需要做超参数调整优化,选择一组最优超参数,以提高机器学习的性能和效果,得到最优模型。在实践中超参数调整一般使用人工设置调整的范围,然后用机器在超参数范围内进行搜索,这个过程称为超参数搜索。常见的基础超参数搜索方法通常有网络搜索 GridSearch 、随机搜索 RandomizedSearch 或者拉丁超立方采样 Latin hypercube 等,具体细节有很多公开资料介绍,这里不再深入。
超参数本质上是参数的参数,人工介入配置,每次改变调整超参数,模型都要重新训练,然后做相应的验证评估工作,一个轮次周期可能从几个小时到两三天不等。这时候的设置的硬件规模也可以比较小,甚至可以从一台有 GPU 的游戏笔记本电脑起步,只是时间周期可能会长,如果有三台 GPU 服务器,搜索周期一定会大大缩短,毕竟算力决定时间;并且由于资源的保障,也可以考虑每台服务器并行跑不同的模型,这样更快出结果。
2.按需扩大至设计规模,进行训练和微调
找到了最适合的模型之后,那就该“动真格的了”,上规模。至于是扩展到几十台服务还是几万台,一得看设计预期,二得看预算和硬件资源筹集能力。在无视第二点“可能的实际困难情况下,我们看看如何分析需求:
2.1 需求分析
设计构建训练集群的基础设施时,主要是分析算力需求,总算力需求的计算方法可以参考以下公式,并适当考虑余量
训练总算力需求 = 模型的参数量 x 训练数据的 token 数 x 6
其中, 6 这个倍数是 Transformer 架构所决定的,因为每个 token 在模型正向传播时会做一次乘法和一次加法,而反向传播做两次乘法和两次加法,合计总计算次数为 6 。
注:神经网络通常是左边若干个神经元,右边若干个神经元,组成一个完全二分图。假设我们选出其中任意两个:左边的神经元 P 和右边的神经元 N 。
正向传播的时候:
P 把它的输出乘上 P 和 N 之间的权重 w ,发给 N ;乘法 1
N 连了多个神经元 P ,因此要加到一起,这就是 reduce ,需要一次加法。加法 1