alpaca-lora - 在消费类硬件上指导调整 LLaMA

Created at: 2023-03-14 05:52:36
Language: Jupyter Notebook
License: Apache-2.0

🦙🌲🤏 羊驼-LoRA:低秩LLaMA指令调整

  • 🤗 在这里尝试预训练模型,由Huggingface的GPU资助提供!
  • 在此处共享自定义 LoRA 适配器,包括较大型号的适配器
  • 用户已在此处创建了一个 Discord 服务器以供讨论和支持
  • alpaca-lora-30b
    可以像ChatGPT一样使用;看这里

此存储库包含使用低秩自适应 (LoRA) 重现斯坦福羊驼结果的代码。我们提供了一个质量与可以在 Raspberry Pi 上运行的 Instruct 模型(用于研究)类似的模型,并且代码很容易扩展到 、 和 模型。

text-davinci-003
13b
30b
65b

除了在单个RTX 4090上在五小时内运行的训练代码之外,我们还发布了一个脚本,用于下载和推理基础模型和LoRA,以及生成的LoRA权重本身。为了廉价而高效地进行微调,我们使用Hugging Face的PEFT以及Tim Dettmers的bitsandbytes

在没有超参数调整的情况下, LoRA 模型产生的输出可与斯坦福羊驼模型相媲美.(请参阅下面包含的输出。进一步调整可能能够实现更好的性能;我邀请感兴趣的用户尝试一下并报告他们的结果。

设置

  1. 安装依赖项
pip install -r requirements.txt
  1. 如果 bitsandbytes 不起作用,请从源代码安装它。Windows 用户可以按照这些说明进行操作。

推理 (
generate.py
)

此文件从拥抱脸模型集线器读取基础模型,并从 中读取 LoRA 权重,并运行 Gradio 接口以对指定的输入进行推理。用户应将其视为使用模型的示例代码,并根据需要对其进行修改。

tloen/alpaca-lora-7b

培训 (
finetune.py
)

该文件包含PEFT对LLaMA模型的直接应用,以及与提示构造和标记化相关的一些代码。此文件顶部附近是一组硬编码的超参数,你可以随意修改这些超参数。始终欢迎调整此代码以支持更大模型的 PR。

检查点导出 (
export_*_checkpoint.py
)

这些文件包含将LoRA权重合并回基本模型以导出为拥抱面格式和PyTorch的脚本。他们应该帮助想要在美洲驼.cpp羊驼.cpp等项目中运行推理的用户。

state_dicts

数据

除了包含原始斯坦福羊驼数据集的 ,我们还包括 ,在 @gururise 的帮助下,它已被剥离了各种标记化工件。此文件现在默认在训练脚本中使用。

alpaca_data.json
alpaca_data_cleaned.json

@AndriyMulyar还提供了原始数据集指令和输出的交互式、基于嵌入的可视化,以及坏示例的集群

笔记

  • 如果我们有一个更好的数据集,我们可能会显着提高我们的模型性能。考虑支持LAION Open Assistant的工作,以生成高质量的数据集,以进行监督微调(或窃听他们发布数据)。
  • 我们不断修复错误并进行训练运行,拥抱面部集线器上的权重也会相应地更新。特别是,那些面临响应长度问题的人应该确保他们拥有最新版本的权重和代码。

示例输出

说明:跟我说说羊驼吧。

羊驼-LoRA:羊驼是 Camel 科的成员,原产于南美洲的安第斯山脉。他们以其柔软、奢华的羊毛而闻名,用于制作衣服、毯子和其他物品。羊驼是食草动物,以草和其他植物为食。它们是群居动物,生活在多达 20 只的群体中。

斯坦福羊驼:羊驼是与 Camel 和美洲驼有关的小而蓬松的动物。它们原产于秘鲁和玻利维亚,大约在5000年前首次被驯化。它们主要因其细腻柔软的羊毛而饲养,用于制作针织品和其他服装。羊驼是群居动物,生活在由年长雄性领导的小家庭中。它们是高度社会化的动物,可以与主人形成牢固的联系。

text-davinci-003:羊驼是南美 Camel 科的驯化物种,类似于美洲驼。它们原产于南美洲的安第斯山脉,因其柔软、奢华的羊毛而被饲养为牲畜。羊驼是群居动物,生活在多达 20 只的群体中。它们通常饲养在两到五只动物的小群中,相对容易照顾。羊驼是食草动物,以草、干草和其他植被为食。它们还以其温柔友好的天性而闻名,使它们作为宠物很受欢迎。


说明:告诉我2019年墨西哥总统的情况。

羊驼-LoRA:2019年墨西哥总统是安德烈斯·曼努埃尔·洛佩斯·奥夫拉多尔,他于2018年12月1日就职。他是民族复兴运动(MORENA)政党的成员,是自1946年以来墨西哥第一位左翼总统。他以反腐败和反新自由主义政策以及致力于改善墨西哥人民的生活条件而闻名。

斯坦福羊驼:2019年,安德烈斯·曼努埃尔·洛佩兹·奥夫拉多尔宣誓就任墨西哥总统。他是该国第58任总统,也是左翼莫雷纳党的第一位总统。他于2018年当选,承诺打击腐败和减少贫困,并因处理经济,犯罪和国家与美国的关系而受到批评。他还以其雄心勃勃的社会福利计划而闻名,并因提高最低工资和向低收入家庭提供援助而受到称赞。他被视为墨西哥民主和人权的捍卫者。

text-davinci-003:2019年的墨西哥总统是安德烈斯·曼努埃尔·洛佩斯·奥夫拉多尔,俗称AMLO。他是墨西哥政治家,自2018年12月1日起担任墨西哥总统。他是国家复兴运动(MORENA)党的成员,曾在2000年至2005年期间担任墨西哥城政府首脑。他是一名左翼民粹主义者,并承诺减少墨西哥的腐败和不平等。他还承诺增加社会项目和基础设施项目的公共支出。


说明:告诉我2019年的法国国王。

羊驼-LoRA:2019年的法国国王是伊曼纽尔·马克龙,他于2017年5月当选。他是第五共和国历史上最年轻的总统,也是二战后出生的第一位总统。他也是第一位从未担任过民选公职的总统。

斯坦福羊驼:2019年,法国国王是伊曼纽尔·马克龙。他于2017年5月14日宣誓就任法国总统,此后一直领导法国。他是中间派“共和国前进党”的成员!党。他以改革主义议程而闻名,并面临来自政治光谱中左右翼的一系列抗议活动。他是法国历史上最年轻的总统。

text-davinci-003:法国国王在很大程度上是一个象征性的角色,因为法国是一个共和国。法国现任总统是伊曼纽尔·马克龙,他于2017年当选。


说明:按字母顺序列出加拿大所有省份。

羊驼毛:艾伯塔省、不列颠哥伦比亚省、曼尼托巴省、新不伦瑞克省、纽芬兰和拉布拉多省、新斯科舍省、安大略省、爱德华王子岛省、魁北克省、萨斯喀彻温省

斯坦福羊驼:艾伯塔省、不列颠哥伦比亚省、曼尼托巴省、新不伦瑞克省、纽芬兰和拉布拉多省、新斯科舍省、安大略省、爱德华王子岛、魁北克省、萨斯喀彻温省、西北地区、努纳武特地区、育空地区。

文本-达芬奇-003

  1. 艾伯塔省
  2. 不列颠哥伦比亚省
  3. 马尼托巴省
  4. 新不伦瑞克省
  5. 纽芬兰和拉布拉多
  6. 西北地区
  7. 新斯科舍省
  8. 努纳武特
  9. 安大略省
  10. 爱德华王子岛
  11. 魁北克
  12. 萨斯喀彻温省
  13. 育 空

说明:编写一个打印前 10 个斐波那契数的 Python 程序。

羊驼毛:

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))

斯坦福羊驼

numbers = [0, 1]

for i in range(2, 11):
    numbers.append(numbers[i-2] + numbers[i-1])

print(numbers)
# Output: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

文本-达芬奇-003

# Fibonacci numbers are the numbers in the following integer sequence, called the Fibonacci sequence, and characterized by the fact that every number after the first two is the sum of the two preceding ones.

# Fibonacci sequence: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

# Program:

# Initialize the first two numbers of the Fibonacci sequence
a = 0
b = 1

# Print the first 10 numbers of the Fibonacci sequence
print(a)
print(b)

for i in range(2,10):
    c = a + b
    a = b
    b = c
    print(c)

说明:编写一个程序,打印从 1 到 100 的数字。但是对于三个的倍数打印“Fizz”而不是数字,对于五个的倍数打印“Buzz”。对于三和五的倍数,请打印“FizzBuzz”。

羊驼毛:

for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print("FizzBuzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

斯坦福羊驼

for i in range(1, 101):
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)

文本-达芬奇-003

for (let i = 1; i <= 100; i++) {
  if (i % 3 === 0 && i % 5 === 0) {
    console.log("FizzBuzz");
  } else if (i % 3 === 0) {
    console.log("Fizz");
  } else if (i % 5 === 0) {
    console.log("Buzz");
  } else {
    console.log(i);
  }
}

说明:告诉我五个与“震惊”押韵的词。

驼毛-LoRA:羊群、锁、岩石、股票和袜子。

斯坦福羊驼:五个与震惊押韵的词是:摇滚、流行、震惊、烹饪和斯诺克。

文本-达芬奇-003

  1. 码头
  2. 时钟
  3. 岩石

说明:将句子“我没有嘴,但我必须尖叫”翻译成西班牙语。

羊驼-LoRA: No tengo boca pero tengo que gritar.

斯坦福羊驼:没有tengo boca,pero debo gritar。

文本-达芬奇-003:没有tengo boca pero debo gritar。