关于机器学习:代码生成优化微调Falcon40b

42次阅读

共计 3618 个字符,预计需要花费 10 分钟才能阅读完成。

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 transformers

tokenizer = 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,摸索人工智能能为您做些什么。

正文完
 0