ChatGPT出现后,惊人的效果完全颠覆了业界人员包括笔者的认知,抛开其模型细节层面的因素,已公开的训练方法,需要巨量的数据和计算资源,门槛非常高。本文基于公开资料,希望以量化方式分多篇介绍ChatGPT的分析结论,本文为存储占用分析篇。ChatGPT模型结构为Transformer,Transformer模型运行时存储可以分成两部分,其一是模型参数,这部分规模是固定的,其二是中间激活,这部分和batch size、sequence length有线性关系,下面对两者分别分析。
ChatGPT出现后,惊人的效果完全颠覆了业界人员包括笔者的认知,抛开其模型细节层面的因素,已公开的训练方法,需要巨量的数据和计算资源,门槛非常高。本文基于公开资料,希望以量化方式分多篇介绍ChatGPT的分析结论,本文为模型参数分析篇。
在文章[TensorFlow Candidate Sampling](https://www.tensorflow.org/extras/candidate_sampling.pdf)中,很多地方直接使用了$u(x;\,\theta)=\log \frac{p(x^c)}{q(x^c)}$,缺乏理论支持,笔者认为不太正确,所以在本文记录下个人理解。
超大规模多分类问题Softmax分母的Partition Function难以计算。比如,在推荐系统领域,预测用户下一次点击某个item的概率,需要累加全部item上的exp值,而item数量可能为千万甚至亿级。Sampled Softmax通过概率模型和优化目标的改变,巧妙的解决了这个问题,本文详细介绍Sampled Softmax的核心思想。
超大规模多分类问题Softmax分母的Partition Function难以计算。比如,在推荐系统领域,预测用户下一次点击某个item的概率,需要累加全部item上的exp值,而item数量可能为千万甚至亿级。NCE通过概率模型和优化目标的改变,巧妙的解决了这个问题,本文详细介绍NCE的核心思想。
同步机制在TensorFlow等分布式机器学习框架中非常重要,比如TensorFlow有以下场景需要做同步:1) 当chief worker训练完一轮后,保存模型前需要等所有worker都完成再保存模型。 2) BSP方式的SGD训练,需要每个batch做同步。 如果不做同步可能会出现如下问题: 1) TensorFlow大部分使用方案都是异步SGD,而且使用global_step做停止条件,不能保证所有worker负责的数据训练相同的轮数,速度快的worker所负责的数据将会获得更多step。 2) chief worker结束时会保存模型参数,但还存在其他worker没结束,所以模型没有完全训练完整。
2018年,公司的分布式模型训练普遍向`TensorFlow on Yarn`迁移。在公司的Hadoop集群上,使用TensorFlow通过DataSet读数据方式进行分布式训练时,在每个Epoch的最后一个Batch会卡住,导致任务一直停在那里无法结束。集群节点都是`CentOS, linux kernel 3.10.0`。如果用老的Queue读取数据不会出现这个问题,并且这个问题不是必现,只有在分布式且节点比较多的时候发生的概率比较高。
在离线训练时,为了效率考虑,我们经常把数据转成TFRecord格式,然后直接调用TensorFlow提供的Reader来读入TFRecord数据。这样在生成的`graph.pb`中,Reader会对应多个节点,如果在c++中直接导入这个`graph.pb`我们就不能使用`std::vector<std::pair<std::string, tensorflow::Tensor>>`作为`session.Run(...)`的输入了,本文讲解一下怎样处理这种情况。
之前的一篇文章中[使用TensorFlow C++ API构建线上预测服务 - 第一篇](https://mathmach.com/6d246b32/),详细讲解了怎样用TensorFlow C++ API导入模型做预测,但模型`c = a * b`比较简单,只有模型结构,并没有参数,所以文章中并没讲到怎样导入参数,本文使用一个复杂的模型继续讲解。
目前,TensorFlow官方推荐使用Bazel编译源码和安装,但许多公司常用的构建工具是CMake。TensorFlow官方并没有提供CMake的编译示例,但提供了MakeFile文件,所以可以直接使用make进行编译安装。另一方面,模型训练成功后,官方提供了TensorFlow Servering进行预测的托管,但这个方案过于复杂。对于许多机器学习团队来说,一般都有自己的一套模型托管和预测服务,如果使用TensorFlow Servering对现存业务的侵入性太大,使用TensorFlow C++ API来导入模型并提供预测服务能方便的嵌入大部分已有业务方案,对这些团队来说比较合适。