一、前语

因为 chatgpt 和 gp4 鼓起。怎样让人人都用上这种大模型,是目前 AI 范畴最活跃的工作。当下开源的 LLM(Large language model) 十分多,可谓是百模大战。面对诸多开源本地模型,依据自己的需求,挑选适合自己的基座模型和参数量很重要。挑选完后,需求对练习数据进行处理,往往这一步就难住许多同学,无从下手。然后再对模型进行 finetuning 来更好满意自己的下流任务。那么关于假如要练习一个专家模型,那么预练习也是必不可缺。不管是预练习仍是 finetuning(微调),不管选用何种计划,都避免不了练习中产生的灾难性忘记问题,那么怎样削减和避免这种状况的产生,也是本文想讲的一个要点。关于推理,再 GPU 资源不殷实的状况,怎样最小化的运用内存,提升推理功率,也是能够讨论一下的。

二、模型挑选

先看一下最好的模型有哪些,以下数据是最新 LLM 排行,来自 UC伯克利

LLM - finetuning - 踩坑经验之谈
当然这儿前3名都闭源模型,后面开源模型,大多数也都是英文的模型。 假如 GPU 资源充足(至少A100*8),这儿也能够依据开源模型做中文的预练习,最终再 finetuning 。 但咱们没有 GPU 资源, 咱们能够挑选开源的中文模型直接做微调。

详细有哪些中文模型能够挑选,能够参阅这两个地址 中文言语理解测评基准(CLUE) 和SuperCLUE琅琊榜 。 开源范畴 ChatGLM, LLAMA, RWKV 首要便是这3种模型, 中文好一点便是 ChatGLM , 潜力最好的便是LLAMA ,RNN架构决定RWKV有很好的 Length Extrapolation (关于长度外推性,能够参阅苏神的文章 )。 当然 MPT-7B-StoryWriter-65k+ 模型也有较长的外推才干,首要在于,留意力这块运用了 ALIBI 。 要拥有什么样的长度,取决你的需求。关于对话模型,往往不需求那么长的外推才干。但关于想做知识库范畴相关的应用, 需求模型能够看更多的内容,是有这个需求的。

这儿不做引荐,一切来自你的详细需求和 GPU资源,不知道怎样样挑选,能够将您的需求和资源状况留言,我给你做一个挑选。

三、模型巨细挑选

当然关于模型参数的挑选,往往是参数越大作用越好。 假如资源充足,当然是引荐 30B 以上的模型。 不管是 6B, 7B 和 13B 相同的练习数据,相同练习参数,模型参数量大作用则优于低参数的模型。 那么依据模型参数,怎样预估咱们的练习所需的内存开支,这儿有一个简略的方法 比方 6B 模型,60亿规划参数,依据以下公式计算:

模型参数 + 梯度参数 + 优化器参数 = 6B * 1bytes + 6GB + 2*6GB = 24GB

以上是全量预练习,当然假如选用 lora 这种方法,则会有更低内存占用。 当然咱们还能够对模型进行量化,来进步内存功率。

留意:参数多量化低的模型要优于参数低量化高的模型,举例 :33B-fb4 模型要优于 13b-fb16 模型.

四、数据处理

关于 LLM 练习,数据质量很重要。预练习时,咱们能够将数据先进行预处理,比方对数据进行一定规矩的挑选,数据去重,去除一些低质量的数据。一起,咱们或许面对各种类型的数据,PDF,Word,HTML,代码文件等等,关于这种不同类型的数据咱们需求都处理成文本,一起还过滤掉一些干扰项或乱码的数据。当然,咱们也能够运用一些东西去处理,比方 justext, trafilatura,来提取文档首要内容,削减数据的噪音。关于空的文档或文档长度低于100进行过滤,进一步削减噪音。

关于一些机器生成的文本或OCR识别过错的文本,质量不高,由没有什么逻辑性,虽然比较难以检测,但是仍是会有一些东西能做这样的工作,比方ctrl-detector。 当然关于一些有毒的或带有偏见的数据,能够选用 PerspectiveAPI 或垃圾邮件检测的方法来过滤。 咱们还不得不考虑数据的一些隐私风险,也需求考虑,比方身份证号,银行卡等信息,比方 presidio 和 pii-codex 等东西提供了检测、分析和处理文本数据中的个人身份信息的才干。

指令微调数据,咱们能够运用 PromptSource 来创立微调数据。 当然假如咱们还能够让 GPT4 给咱们标示一些数据。 这儿我分享一个我运用的 Prompt 工程:

first_prompt = """
作为一位专业的xxxx,您的任务是从给定的上下文回答问题。
给定的上下文:
"""
last_prompt = """
请综合上述信息,你给出的回复需求包含以下三个字段:
1.questions: 依据上下文内容,提出与这个内容相关的问题,至少两个以上。
2.answers: 然后依据问题,别离给出每个问题的答案,请用 markdown 格局。
3.instruction: 给出上下文内容的总结,尽量精简,用 markdown 格局。
请按照以下JSON格局来回答:
前括号
      "questions": [
          "<内容相关问题1>",
          "<内容相关问题2>"
      ],
      "answers": [
           "<内容相关问题1的答案>",
           "<内容相关问题2的答案>"
      ],
      instruction: "<总结性的内容>"
后括号
留意:假如碰到上下文内容信息不行,无法回答问题的状况,answers和questions能够返回空。
最终着重一下:你的回复将直接用于javascript的JSON.parse解析,所以留意一定要以规范的JSON格局做回答,不要包含任何其他非JSON内容,否则你将被扣分!!!
"""

五、微调计划

目前关于 LLM 微调计划有许多,我将常用的一些计划和相关材料做一个列举。

  • Prefix-Tuning (P-Tuning v2)
  • Prompt Tuning
  • Lora
  • QLora

依据实际经验,这儿引荐选用 Lora 或 QLora。简略介绍一下 QLoRA ,要点改进是将模型选用4bit量化后加载,练习时把数值反量化到 bf16 后进行练习,运用 LoRA 能够确定原模型参数不参与练习,只练习少量 LoRA 参数的特性使得练习所需的显存大大削减。例如33B的 LLaMA 模型经过这种方法能够在 24GB 的显卡上练习,也便是说消费级单卡都能够完成,大大下降了微调的门槛。

英文模型需求做词表扩大吗?

关于像LLaMA模型的词表巨细是32K,其首要针对英语进行练习(详细详见LLaMA论文),对多语种支持不是特别理想(能够比照一下多言语经典模型XLM-R的词表巨细为250K)。经过初步统计发现,LLaMA词表中仅包含很少的中文字符,所以在切词时会把中文切地更碎,需求多个byte token才干拼成一个完好的汉字,从而导致信息密度下降。比方,在扩展词表后的模型中,单个汉字倾向于被切成1个token,而在LLaMA中或许就需求2-3个才干组合成一个汉字,显著下降模型的推理功率。

怎样避免灾难忘记

一般咱们有以下方法,能够削减或避免灾难性忘记问题

  • 将重要的权重冻结 – 像 Lora 便是选用的这种计划,只学习部分网络权重。 但这儿 Lora 的配置其实是要留意一下,假如你是用 Lora 做预练习, lora 练习模块能够配上q_proj,v_proj,k_proj,o_proj 假如是微调则只需求练习 q_proj,v_proj lora_rank 的设置也有考究,初始设 lora_ran 为 8 ,练习存在忘记时,能够将 lora_rank改为64.
  • 温习 – 跟人一样,在预练习或微调时,回看之前练习的数据。还能够专门把特征图存起来,量化今后放在一个类似于回忆库的地方,之后在新任务上练习的时分从这个回忆库里重构出回忆和新数据一起练习。感兴趣能够看这篇论文。
  • MoE – 稀疏门操控的专家混合层,最近爆出 GPT4 是由8个220B 的模型组合。 关于 Moe 相关材料我们自行了解。

五、推理加快

关于推理,一般咱们选用量化计划,这儿有两个方法。第一个则是选用 ggml东西,比方 llama.cpp 针对 llama 模型,将模型量化运行在 cpu 或 gpu 上,也能够 cpu和gpu 一起跑,内存则大大削减,推理速度有极大的进步。

LLM - finetuning - 踩坑经验之谈
这儿假如将llama.cpp 运行在 gpu 上, 编译时一定要加 LLAMA_CUBLAS=1,一起推理的时分,指定 --gpu-layers|-ngl 来分配运行在 gpu 上的层数,当然越大,占用 gpu 的内存会越多。

另一个,选用 LLM Accelerator,LLM 存在大量的相似性推理,依据此,能够做一些优化加快推理,详细请看论文。 最终选用架构上的调整,faster transformer 要优于传统的 transformer 架构。

六、总结

最终总结几条原则:

  • 参数多量化低的模型要优于参数低量化高的模型
  • 模型质量与练习数据质量是存在相关性的
  • 扩大中文词表有助于进步推理功率
  • 微调引荐选用 Lora QLora 计划
  • 模型加快必定需求对模型进行量化