# huge_model_application **Repository Path**: yueyulinyu/huge_model_application ## Basic Information - **Project Name**: huge_model_application - **Description**: 提议对待大模型,大家应该采取的态度和方法。 - **Primary Language**: Python - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2023-02-05 - **Last Updated**: 2023-08-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 如何利用ChatGPT/Stable Diffusion等大型生成式模型,低成本实现Domain Application模型的开发 ## 背景 随着生成式的大型模型的发展,在文字、图像、语音以及多模态等领域都取得了很大的进展。通过输入文字提示,大型语言模型或者图片生成模型,都能生成相应的文字或图片。但是目前大型的生成式模型的应用存在以下几个问题,导致无法在更多的行业实现。 - 用于提示模型生成的文本模板,完全基于经验。个人使用的时候还可以多次尝试,给个人提供灵感。而行业使用,则由于难以得到稳定输出,显得不太合适。 - 类似的ChatGPT/Stable Diffusion等模型,即使训练数据、训练代码都已经开源,但是需要巨量的人力和计算资源和时间进行训练,导致无法大批量生成复现同样架构的预训练模型。 - 即使获得HuggingFace提供的开源模型,由于现在可用的预训练模型体积巨大,绝大多数中小型行业开发者都缺少足够的分布式GPU计算集群训练。而模型调优、训练、部署都需要大量资源和时间,大多数需要AI模型提高效率的行业,都无法忍受这样的成本。 - 以上就形成了一个悖论,有计算资源、开发人员和时间领先的大公司,花费巨大开发出来的文本/图片生成模型,在这些公司内部其实缺少足够的应用场景大规模应用这些模型。而更多有应用场景的公司,却无力负担大规模训练和调优的成本。导致目前大型生成式模型的应用,仍然停留在个人娱乐阶段。 ## 超大模型在行业应用的方式 目前,对超大模型的应用,主要有两种方式: - Model Tuning,即使用行业特定数据,对开源的预训练模型进行微调,得到行业特定的模型。但是超大模型的调优,需要极大的计算资源和时间,光是搭建GPU计算集群对绝大多数中小型公司来说,都是一件非常困难的事情。因此Model Tuning只能在大公司内部少数关键部门和应用场景中使用。 - Prompt Tuning,即不改变超大模型的架构和参数,通过设计模型输入的提示,来控制模型的输出。这种方式的优点是,不需要大量的计算资源和时间,只需要设计好提示,然后把提示输入到模型中,就能得到预期的输出。这种方式能极大减少计算资源,因为超大规模模型可以通过开放接口,按需使用。中小公司只需要设计好提示,在需要使用的时候将提示发送给接口,获得输出。最近ChatGPT/Stable Diffusion的应用,其实都属于Prompt Tuning,网上甚至已经出现了专门针对ChatGPT/Stable Diffusion的Prompt Enginnering的教程。这也应该是超大规模模型更广泛应用的主流模式。 下面主要针对Prompt Tuning的方式,描述如何开发、测试和部署基于大模型的应用,以及大公司和中小公司在应用上的定位和分工。 ## Prompt Tuning的几种模式 在Prompt Tuning范式中,如下图所示,主要有以下几种模式: ![](prompting.png) 1. 通过人工设计文本模板,激发大模型特定的输出。目前主流的娱乐性质的ChatGPT/StableDiffusion的应用,均为该方式。 2. 放弃在离散空间的文本模板设计,通过在连续的向量空间,设计Embedding Prefix和Embedding Suffix模板,包裹住文本Embeddings,以Embeddings输入到生成式模型中,激发特定输出。该方式相较于纯人工的模板设计,可自动化地在向量空间搜寻向量模板,一方面可定性地评估模板质量好坏,另外由于向量空间相对于离散空间容量更大,往往能得到比文本模板更稳定可靠地输出。该方式还能很好地利用现有地行业数据进行训练和测试。 3. 通过一个Soft Embeddings Model,对每一个输入,都生成其独特地Prompt Embeddings,然后将Prompt Embeddings,激发特定输出。该方式相较于前两种方式,更加灵活,且可以利用更加丰富地输入信息。比如,可以输入行业用知识图谱,通过深度图模型,来生成特定的Prompt Embeddings;也可以输入语音信号,通过对音频编码,然后用LSTM/Transformer等模型把音频信号转化成Prompt Embeddings,通过把生成地Prompt Embeddings输入模型,而激发特定的输出。 ## 架构的设计和搭建 参考论文:https://aclanthology.org/2021.emnlp-main.243.pdf ,我们可以看到,当大型模型参数足够大的时候,Prompt Tuning的模型的效果,和Model Tuning效果几乎一样。在论文中测试,当模型达到1B地规模地时候,Prompt Tuning效果几乎和Model Tuning效果一样。 ![](ModelParameters.png) 而实际需要训练和保存地参数,则非常地少。 ![](ModelTuningVSPromptTuning.png) 不过即使该论文给出了一个自微分的方法,来计算Prompt Embeddings,但是该方法仍然需要大量的计算资源,因此,我们可以考虑,将该方法放到云端,来实现Prompt Tuning。 那么基于该论文结论,我们可以设计如下的架构: ![](CloudAIApplication.png) 在该架构中,应用开发商拥有自己的特定应用数据,但是数据量不足以大到来调优已有的大模型。同时普通应用开发商也没有财力人力维护超大模型的训练和维护。因此,大模型服务提供商,可以通过RPC接口,提供给应用开发商训练自己Prompt Embeddings模型的能力。应用开发商用自己的数据,训练好自己的Embeddings模型,大模型提供商本地的模型完全不需要改动。在应用开发商自己的应用中,仅需要把自己的请求数据结合自己本地的Embeddigns模型,把Embeddings通过RPC接口发送给大模型服务提供商,然后大模型服务提供商,把Embeddings作为参数输入大模型,把结果返回给应用开发商即可。 以上模式,有以下显著的优点: 1. 对大模型服务提供商: 1. 大模型训练完成之后,只需要维护大模型服务和网关服务的稳定性,无需自行开发调优行业应用。 2. 通过训练和调优接口大开放,一个模型,可以同时服务于多个应用开发商,大大提高了模型的利用率。 3. 可集中精力在模型的训练和优化上,在屏蔽了大模型对应用的适配需求之后,大模型本身可更关注如何泛化,这也是通用AI模型的发展方向。 2. 对应用开发商: 1. 无需花费大量的人力物力,自行搭建大模型训练、维护、调优的基础设施,极大降低了应用开发成本。 2. 训练数据、调优模型完全是本地保存和训练,无需提供给大模型服务提供商,保证了数据安全性。 3. 训练成本非常低,在普通PC硬件就能完成一天多次训练调优,开发效率极大提高。 4. 可根据自己业务场景设计自己的Embeddings模型。如用GNN,LSTM把输入数据转化成Embeddings等。 5. 当训练和预测接口成为行业标准之后,可以在多家大模型服务提供商之间自由切换,降低了供应商锁定风险。同时促进了大模型服务提供商之间的竞争,提高了服务质量。 基于以上架构,我们实现了一个基于PyTorch RPC的实现作为参考。 ## 实现细节 ### 数据描述 本地拥有的数据集是一个菜谱的数据集。数据来自网友根据模板上传的菜谱。数据包括: 1. 菜谱名称,如:酸辣土豆丝。 2. 菜谱的主料,如:土豆,辣椒,蒜。 3. 菜谱的辅料,如:盐,酱油,白糖。 4. 菜谱的调料,如:花椒,花椒油。 5. 菜谱的制作流程,如:切土豆丝,炒土豆丝,加入调料,加入辅料,加入主料,翻炒,出锅。 ## 训练目标 通过训练,我们希望得到一个模型,输入菜谱名称、主料、辅料、调料,输出菜谱的制作流程。 ## 具体实现 - 提供一个服务接口,在本地Trainer和服务器上的Parameter Server共享接口,在初始化语言模型的时候,就直接把所有参数freeze,语言模型的任何参数都不参与反向传导。lm_service和ps目录. - 在菜谱应用上,实现简单的数据加载、创建Embeddings、训练和预测功能,训练数据仅在本地加载Prefixed Embeddings,然后和训练文本通过RPC发送给Parameter Server,获得loss之后,再调用本地Optimizer更新Embeddings列表。recipe_bot目录。 - 对自己数据回归达到效果之后,即可停止训练。而预测代码,则仅仅需要为每个输入固定添加embedding前缀即可。大模型不必要分发。 在示例代码中,用了huggingface的17亿参数的“bigscience/bloomz-1b7”。这不是一个对中文很友好的模型,但是这是我本机24G显存能跑起来的最小的大于11亿参数的模型了。如果你有更大的显存,可以尝试更大的模型。 ## 总结 我希望,对超大规模的生成式模型的应用,不要停留在娱乐大众之上。其实这是一个非常有价值且可高度创新的领域。大公司可专注提高模型的通用性,服务稳定性,而小公司则专注领域内应用和创新。这远比ChatGPT仅可用于Office,Bing等微软内部应用更有意义。 大公司放弃垄断所有应用,小公司无需担心大公司的垄断,这样才能真正实现AI的价值。