Falcon40b是以后最大的开源大语言模型之一,且采纳商业敌对的Apache 2.0许可证。这使得对于心愿将NLP产品推向市场的开发者来说,它具备相当大的吸引力。

Falcon-40b-Instruct模型基于Falcon40b模型进行微调,用于指令接管和对话工作,在Hugging Face的LLM基准测试中名落孙山,仅次于基于Meta的非开源Llama系列的模型。Falcon40b的性能远优于其余开源模型。

作为最新一波开源大语言模型,Falcon系列模型受到Llama系列启发,核心思想是应用更多数据(在本例中超过一万亿代币)更长时间(更多期间)训练较小的模型。LLM相干的教训文献表明,模型规模、训练计算和训练数据集规模应该同步减少,但该模型系列应用的计算和训练数据远远超出预期。

应用CodeAlpaca进行微调

Falcon40b是一个预训练模型,但并未针对任何特定工作进行训练。它的零样本性能并不杰出,须要通过训练能力用作聊天机器人或依照指令执行工作。
当咱们心愿它依照指令执行工作时,咱们应用如Alpaca数据集的指令-响应对进行训练。
上面是来自Alpaca的一对指令-响应示例:

以下是一个形容工作的指令。请提供一个响应正确实现该申请。  ### 指令:创立一个蕴含1到10之间所有偶数的长度为5的数组。  ### 响应:arr = [2, 4, 6, 8, 10]  

Falcon-40b-Instruct模型曾经被训练成一个通用的指令跟踪模型,因而咱们决定不安分守己。
最近,对训练大型语言模型来编写代码的趣味越来越浓,这个畛域有许多开源我的项目,特地是Starcoder、Replit3b、CodeGen和CodeGen2。因而,咱们决定尝试应用CodeAlpaca数据集对Falcon40b进行微调,使其可能依据自然语言提醒编写代码。

CodeAlpaca是一组蕴含20,000个指令-输出-代码三元组的数据集,与Alpaca数据集一样,它们是由闭源语言模型生成的。示例如下:

以下是一个形容工作的指令,与提供了更多上下文的输出配对。请提供一个响应,正确实现申请。  ### 指令:生成一段代码片段,提取给定字符串中的所有URL。  ### 输出:该字符串蕴含一些网址,如<https://www.google.com>和<https://www.facebook.com>。  ### 响应:import re  string = "该字符串蕴含一些网址,如<https://www.google.com>和<https://www.facebook.com>。"urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\\\\(\\\\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', string)print(urls)  

与通用指令跟踪工作相比,专用于代码构建训练Falcon40b在这些工作上体现更好。

微调超参数

咱们应用LoRA进行微调,采纳8位量化,应用了四个NVIDIA A100 Tensor Core GPU,每个GPU有80GB的VRAM。微调破费了约4小时,在runpod.io上破费了约25欧元。
咱们应用了以下超参数:

  • Epochs:2
  • 增加LoRA的层:全留神层(QKV)
  • LoRA等级:8
  • 学习率:3.0e-4
  • Batch size:128

    咱们留神到将epochs减少到2有助于模型“学习”何时进行。否则,它将反复指令模板,永不进行。  

    后果

    咱们抉择了45条编码指令,用于评估模型遵循指令的能力。通过微调,模型可能依据自然语言指令生成代码,答复对于代码段的问题,以及答复个别的计算机编程问题。
    例如:
    通用编程问题

    问题:解释Python中迭代器和生成器的区别并举例。  
    响应:迭代器是一种可用于遍历序列项(如列表或字符串)的对象。它提供了一种一一拜访序列中每个项的办法。生成器是一种可用于生成序列项(如列表或字符串)的函数。它提供了一种一一生成序列中每个项的办法。迭代器和生成器的次要区别在于,迭代器是一种可用于遍历序列的对象,而生成器是一种可用于生成序列的函数。

依据自然语言提醒生成代码

问题:编写一个Python函数:承受一个单词列表,并返回一个字典,其中键是列表中的单词,值是列表中单词的频率。在解决方案中应用for循环、if条件和字典。
响应:def word_frequency(words):    frequencies = {}        for word in words:                if word in frequencies:                        frequencies[word] += 1                else:                        frequencies[word] = 1        return frequencies  

答复对于特定代码段的问题

问题:解释以下Python脚本,该脚本应用FastAPI创立一个根本的'Hello World' API。  from fastapi import FastAPI  app = FastAPI()  @app.get("/")def read_root():        return {"Hello": "World"}  
响应:  这个Python脚本应用FastAPI创立一个根本的'Hello World' API。FastAPI是一个可能轻松在Python中创立API的Web框架。@app.get("/")装璜器定义了API的路由,当拜访该路由时将调用read_root()函数。该函数返回一个蕴含键"Hello"和值"World"的字典。 

编写解决AI模型的代码

问题:编写一个应用transformers库对输出文本进行标记化并生成模型输入的Python脚本。  
响应:import transformerstokenizer = transformers.AutoTokenizer.from_pretrained("bert-base-uncased")model = transformers.AutoModel.from_pretrained("bert-base-uncased")  input_text = "This is an example text."  tokenized_text = tokenizer.tokenize(input_text)model_output = model.generate(input_text)  print(tokenized_text)print(model_output)  

定量来看,应用了这个代码库进行评分,HumanEval基准测试的第一轮得分为22%。只管这是一个不错的后果,但远没有达到专门用于编写代码的AI模型的最佳记录性能。

Falcon-40b-Instruct在雷同工作上得分为18%。咱们认为这是因为在更大数据集上的训练使其更好地遵循指令,即便它不善于编写代码或解决编程问题。它的大部分常识仿佛是在预训练阶段取得的。

简而言之

咱们通过HuggingFace公布了两个模型:残缺权重模型和咱们微调的Falcon40b的LoRA适配器权重。
只管Falcon40b并非专门用于编码,但它在编码问题上表现出色。通过应用咱们微调的LoRA掩码,您只需将大量额定的数据加载到内存中即可将任何Falcon40b装置转变为编码助手。

下载咱们的代码并复现后果

您能够通过从GitHub查看咱们的代码库并复现。代码蕴含对HuggingFace的transformers模块的通明封装。
首先,从GitHub获取咱们的代码:

git clone <https://github.com/jina-ai/jerboa.git> 

而后,进入git库的根目录,并运行以下命令:

cd jerboa  finetune.py --base-model tiiuae/falcon-40b --lora-target-modules query_key_value --data-path sahil2801/CodeAlpaca-20k --output-dir ./lora-alpaca-code --batch-size 128 --micro-batch-size 4 --eval-limit 45 --eval-file code_eval.jsonl --wandb-project jerboa --wandb-log-model --wandb-watch gradients --num-epochs 2

如果遇到问题,您能够复原到咱们在本文中应用版本的checkpoint:

git checkout abe1a23a4e9f5e141e19be0336ca8a4c888dd024  

您还能够尝试应用LLM Foundry或其余优化低训练老本的工具来缩小计算和训练工夫。

参加其中

拜访Jina AI官网、GitHub库和Discord,摸索人工智能能为您做些什么。