🚀 现在支持LLaMa3 🚀
LLaMa2lang v0.6
这个仓库包含了一些方便的脚本,用于对LLaMa3-8B(或任何其他基础模型)进行微调,使其能够用于聊天的任何语言(非英语)。其背后的理由是LLaMa3主要是基于英语数据进行训练的,尽管它在某种程度上也能处理其他语言,但其性能与英语相比非常差。
结合微调的力量和RAG的力量 - 请查看我们关于RAG的RAG Me Up仓库,该仓库可以用于你使用LLaMa2Lang微调过的模型之上。
TL;DR
pip install -r requirements.txt
# 将OASST1翻译成目标语言
python translate.py m2m target_lang checkpoint_location
# 将检查点文件合成为一个数据集
python combine_checkpoints.py input_folder output_location
# 微调
python finetune.py tuned_model dataset_name instruction_prompt
# 可选地使用DPO(RLHF)进行微调
python finetune_dpo.py tuned_model dataset_name instruction_prompt
# 运行推理
python run_inference.py model_name instruction_prompt input
它的功能
我们用来调整基础模型(如LLaMa3)以适应特定语言的过程如下:
- 加载包含问答/指令对的数据集。
- 将整个数据集翻译成特定的目标语言。
- 加载翻译后的数据集,并通过递归选择仅具有最高排名的提示及其各自的回答,直至后续提示等,提取对话线程。
- 根据给定的模板(可自定义)将对话线程转换为提示。
- 使用QLoRA和PEFT在此数据集上微调基础模型的指令。
- 使用新训练的模型进行推理。
支持的范式
翻译
- OPUS
- M2M
- MADLAD
- mBART
- NLLB
- Seamless(仅大型)
- Tower Instruct(可以纠正拼写错误)
基础数据集
以下已经过测试,但潜在更多会有效:
- OASST1
- OASST2
支持的基础模型
- LLaMa3
- LLaMa2
- Mistral
- (非官方)Mixtral 8x7B
路线图
- [L2L-6] 调查与其他库(Axolotl、llamacpp、unsloth)互操作性
- [L2L-7] 允许在QLoRA旁提供不同的量化(GGUF、GPTQ、AWQ)
- [L2L-10] 支持扩展分词器和词汇
成本和运行时间
上述过程可以完全运行在免费的Google Colab T4 GPU上。然而,最后一步只能在足够短的数据窗口和批量最多为2的情况下成功运行。此外,步骤2的翻译大约需要36小时,因此如果要使用免费的Google Colab GPU,应该分多个步骤运行。
我们在步骤5中的微调模型是使用vast.ai上的A40进行的,每个模型的成本不到一美元,约需1.5小时完成。
用法
-
确保你的环境中已安装并运行pytorch(最好使用CUDA):https://pytorch.org/get-started/locally/
-
克隆仓库并安装所需依赖。
pip install -r requirements.txt
- 将基础数据集翻译成指定的目标语言。
使用方法:translate.py [-h] [--quant8] [--quant4] [--base_dataset BASE_DATASET] [--base_dataset_text_field BASE_DATASET_TEXT_FIELD] [--base_dataset_lang_field BASE_DATASET_LANG_FIELD]
[--checkpoint_n CHECKPOINT_N] [--batch_size BATCH_SIZE] [--max_length MAX_LENGTH] [--cpu] [--source_lang SOURCE_LANG]
{opus,mbart,madlad,m2m,nllb,seamless_m4t_v2,towerinstruct} ... target_lang checkpoint_location
使用各种翻译模型将指令/RLHF数据集翻译成指定的目标语言
位置参数:
{opus,mbart,madlad,m2m,nllb,seamless_m4t_v2,towerinstruct}
用于翻译的模型/架构。
opus 使用HelsinkiNLP OPUS模型翻译数据集。
mbart 使用mBART翻译数据集。
madlad 使用Google的MADLAD模型翻译数据集。
m2m 使用Facebook的M2M模型翻译数据集。
nllb 使用Facebook的NLLB模型翻译数据集。
seamless_m4t_v2 使用Facebook的SeamlessM4T-v2多模态模型翻译数据集。
towerinstruct 使用Unbabel的Tower Instruct翻译数据集。确保你的目标语言在该模型支持的10种语言中。
target_lang 目标语言。确保你使用的语言代码是翻译模型定义的。
checkpoint_location 脚本将写入(JSON化)检查点文件的文件夹。如果不存在,该文件夹将被创建。
选项:
-h, --help 显示此帮助信息并退出
--quant8 可选标志以8位加载翻译模型。减少内存使用,但增加运行时间
--quant4 可选标志以4位加载翻译模型。减少内存使用,但增加运行时间
--base_dataset BASE_DATASET
要翻译的基础数据集,默认为OpenAssistant/oasst1
--base_dataset_text_field BASE_DATASET_TEXT_FIELD
基础数据集中包含要翻译的实际文本的列名。默认为text
--base_dataset_lang_field BASE_DATASET_LANG_FIELD
基础数据集中包含源文本语言的列名。默认为lang
--checkpoint_n CHECKPOINT_N
表示将写出检查点文件的频率的整数。初始值为400是合理的。
--batch_size BATCH_SIZE
单个翻译模型的批量大小。根据你的GPU容量进行调整。默认值为10。
--max_length MAX_LENGTH
最多生成的token数。更多的token可能对较长的输入更准确,但增加了内存耗尽的风险。默认值为无限制。
--cpu 强制使用CPU。默认情况下,如果GPU可用,则使用GPU。
--source_lang SOURCE_LANG
从OASST中基于数据集的lang属性选择源语言
如果你想要更多的翻译模型参数,运行:
python translate.py [MODEL] -h
确保在指定公共参数之前先指定模型特定的参数。如示例调用:
# 使用M2M和4位量化及不同批量大小翻译荷兰语
python translate.py m2m nl ./output_nl --quant4 --batch_size 20
# 使用madlad 7B和8位量化、不同max_length翻译德语
python translate.py madlad --model_size 7b de ./output_de --quant8 --batch_size 5 --max_length 512
# 确保使用翻译模型理解的目标语言代码
python translate.py mbart xh_ZA ./output_xhosa
python translate.py nllb nld_Latn ./output_nl
- 将检查点文件中的JSON数组合成为Huggingface数据集,然后写入磁盘或发布到Huggingface。脚本将尝试默认写到磁盘,如果文件夹在磁盘上不存在,则尝试发布到Huggingface。要发布到Huggingface,请确保根据文档设置了你的
HF_TOKEN
环境变量。
使用方法:combine_checkpoints.py [-h] input_folder output_location
合并翻译中的检查点文件。
位置参数:
input_folder 翻译中使用的检查点文件夹,附带目标语言。
示例:"./output_nl"。
output_location 存储Huggingface数据集的位置。可以是磁盘位置或Huggingface数据集仓库。
选项:
-h, --help 显示此帮助信息并退出
- 将翻译后的消息转换为chat/instruct/prompt线程,并使用LoRA和PEFT微调基础模型的指令。
使用方法:finetune.py [-h] [--base_model BASE_MODEL] [--base_dataset_text_field BASE_DATASET_TEXT_FIELD] [--base_dataset_rank_field BASE_DATASET_RANK_FIELD] [--base_dataset_id_field BASE_DATASET_ID_FIELD] [--base_dataset_parent_field BASE_DATASET_PARENT_FIELD]
[--base_dataset_role_field BASE_DATASET_ROLE_FIELD] [--quant8] [--noquant] [--max_seq_length MAX_SEQ_LENGTH] [--num_train_epochs NUM_TRAIN_EPOCHS] [--batch_size BATCH_SIZE] [--threads_output_name THREADS_OUTPUT_NAME] [--thread_template THREAD_TEMPLATE]
[--padding PADDING]
tuned_model dataset_name instruction_prompt
使用(Q)LoRA和PEFT微调基础指令/聊天模型
位置参数:
tuned_model 结果微调模型的名称。
dataset_name 用于微调的数据集名称。应是combine_checkpoints脚本的输出。
instruction_prompt 添加到每个提示中的指令信息,以便强制聊天机器人使用目标语言回答。例如:"你是一个通用的聊天机器人,始终使用英语回答问题。"
选项:
-h, --help 显示此帮助信息并退出
--base_model BASE_MODEL
基础模型。默认是"NousResearch/Meta-Llama-3-8B-Instruct"。
--base_dataset_text_field BASE_DATASET_TEXT_FIELD
数据集中包含要翻译的实际文本的列名。默认为text
--base_dataset_rank_field BASE_DATASET_RANK_FIELD
数据集中包含回答给定提示的排名的列名。默认为rank
--base_dataset_id_field BASE_DATASET_ID_FIELD
数据集中包含文本ID的列名。默认为message_id
--base_dataset_parent_field BASE_DATASET_PARENT_FIELD
数据集中包含文本父ID的列名。默认为parent_id
--base_dataset_role_field BASE_DATASET_ROLE_FIELD
数据集中包含文本作者角色的列名(如:prompter,assistant)。默认为role
--quant8 以8位微调模型。比默认的4位需要更多内存。
--noquant 不量化微调。比默认的4位和可选的8位需更多内存。
--max_seq_length MAX_SEQ_LENGTH
微调中使用的最大序列长度。应与基础模型的默认最大序列长度一致。默认值为512。
--num_train_epochs NUM_TRAIN_EPOCHS
使用的训练轮数。默认值为2,效果较好。
--batch_size BATCH_SIZE
微调中使用的批量大小。根据你的GPU vRAM进行调整。默认值为4
--threads_output_name THREADS_OUTPUT_NAME
如果指定,此脚本中用于微调的线程也将被保存到磁盘或HuggingFace Hub。
--thread_template THREAD_TEMPLATE
使用的线程模板文件。默认值是threads/template_fefault.txt
--padding PADDING 使用的填充方式,可以是左填充或右填充。
6.1 [可选] 使用DPO进行微调(类似于RLHF)
使用方法:finetune_dpo.py [-h] [--base_model BASE_MODEL] [--base_dataset_text_field BASE_DATASET_TEXT_FIELD] [--base_dataset_rank_field BASE_DATASET_RANK_FIELD] [--base_dataset_id_field BASE_DATASET_ID_FIELD] [--base_dataset_parent_field BASE_DATASET_PARENT_FIELD] [--quant8]
[--noquant] [--max_seq_length MAX_SEQ_LENGTH] [--max_prompt_length MAX_PROMPT_LENGTH] [--num_train_epochs NUM_TRAIN_EPOCHS] [--batch_size BATCH_SIZE] [--threads_output_name THREADS_OUTPUT_NAME] [--thread_template THREAD_TEMPLATE] [--max_steps MAX_STEPS]
[--padding PADDING]
tuned_model dataset_name instruction_prompt
使用(Q)LoRA和PEFT并使用DPO(RLHF)微调基础指令/聊天模型
位置参数:
tuned_model 结果微调模型的名称。
dataset_name 用于微调的数据集名称。应是combine_checkpoints脚本的输出。
instruction_prompt 添加到每个提示中的指令信息,以便强制聊天机器人使用目标语言回答。例如:"你是一个通用的聊天机器人,始终使用英语回答问题。"
选项:
-h, --help 显示此帮助信息并退出
--base_model BASE_MODEL
基础模型。默认是"NousResearch/Meta-Llama-3-8B-Instruct"。
--base_dataset_text_field BASE_DATASET_TEXT_FIELD
数据集中包含要翻译的实际文本的列名。默认为text
--base_dataset_rank_field BASE_DATASET_RANK_FIELD
数据集中包含回答给定提示的排名的列名。默认为rank
--base_dataset_id_field BASE_DATASET_ID_FIELD
数据集中包含文本ID的列名。默认为message_id
--base_dataset_parent_field BASE_DATASET_PARENT_FIELD
数据集中包含文本父ID的列名。默认为parent_id
--quant8 以8位微调模型。比默认的4位需要更多内存。
--noquant 不量化微调。比默认的4位和可选的8位需更多内存。
--max_seq_length MAX_SEQ_LENGTH
微调中使用的最大序列长度。应与基础模型的默认最大序列长度一致。默认值为512。
--max_prompt_length MAX_PROMPT_LENGTH
使用的提示最大长度。默认值为512。
--num_train_epochs NUM_TRAIN_EPOCHS
使用的训练轮数。默认值为2,效果较好。
--batch_size BATCH_SIZE
微调中使用的批量大小。根据你的GPU vRAM进行调整。默认值为4
--threads_output_name THREADS_OUTPUT_NAME
如果指定,此脚本中用于微调的线程也将被保存到磁盘或HuggingFace Hub。
--thread_template THREAD_TEMPLATE
使用的线程模板文件。默认值是threads/template_fefault.txt
--max_steps MAX_STEPS
运行DPO的最大步数。默认值为-1,这将根据数据的完整性运行多个epoch,但这将非常耗时。
--padding PADDING 使用的填充方式,可以是左填充或右填充。
6.1 [可选] 使用ORPO微调(类似于RLHF)
用法:finetune_orpo.py [-h] [--base_model BASE_MODEL] [--base_dataset_text_field BASE_DATASET_TEXT_FIELD] [--base_dataset_rank_field BASE_DATASET_RANK_FIELD] [--base_dataset_id_field BASE_DATASET_ID_FIELD] [--base_dataset_parent_field BASE_DATASET_PARENT_FIELD] [--quant8]
[--noquant] [--max_seq_length MAX_SEQ_LENGTH] [--max_prompt_length MAX_PROMPT_LENGTH] [--num_train_epochs NUM_TRAIN_EPOCHS] [--batch_size BATCH_SIZE] [--threads_output_name THREADS_OUTPUT_NAME] [--thread_template THREAD_TEMPLATE] [--max_steps MAX_STEPS]
[--padding PADDING]
tuned_model dataset_name instruction_prompt
使用(Q)LoRA和PEFT通过ORPO(RLHF)微调基础指令/聊天模型
位置参数:
tuned_model 生成的微调模型的名称。
dataset_name 用于微调的数据集的名称。此数据集应是combine_checkpoints脚本的输出。
instruction_prompt 添加到聊天机器人提供的每个提示中的指令消息,强制其以目标语言回答。示例:"你是一个通用的聊天机器人,总是用英语回答。"
选项:
-h, --help 显示此帮助消息并退出
--base_model BASE_MODEL
基础模型。默认是"NousResearch/Meta-Llama-3-8B-Instruct"。
--base_dataset_text_field BASE_DATASET_TEXT_FIELD
数据集中包含实际翻译文本的列名。默认值为text。
--base_dataset_rank_field BASE_DATASET_RANK_FIELD
数据集中包含对提示答案的排名的列名。默认值为rank。
--base_dataset_id_field BASE_DATASET_ID_FIELD
数据集中包含文本ID的列名。默认值为message_id。
--base_dataset_parent_field BASE_DATASET_PARENT_FIELD
数据集中包含文本父ID的列名。默认值为parent_id。
--quant8 以8位微调模型。需要比默认的4位更多的内存。
--noquant 不对微调进行量化。需要比默认的4位和可选的8位更多的内存。
--max_seq_length MAX_SEQ_LENGTH
微调时使用的最大序列长度。应与基础模型的默认max_seq_length一致。默认值为512。
--max_prompt_length MAX_PROMPT_LENGTH
使用的提示的最大长度。默认值为512。
--num_train_epochs NUM_TRAIN_EPOCHS
使用的训练轮数。默认值为2,且表现良好。
--batch_size BATCH_SIZE
微调时使用的批处理大小。调整以适应你的GPU显存。默认值为4。
--threads_output_name THREADS_OUTPUT_NAME
如果指定,则此脚本创建的微调线程也会保存到磁盘或HuggingFace Hub。
--thread_template THREAD_TEMPLATE
包含要使用的线程模板的文件。默认是threads/template_fefault.txt。
--max_steps MAX_STEPS
运行ORPO的最大步骤数。默认值为-1,这将针对轮数完整运行数据,但非常耗时。
--padding PADDING 使用哪种填充,可以是左填充或右填充。
- 使用新创建的QLoRA模型运行推理。
用法:run_inference.py [-h] model_name instruction_prompt input
在微调模型上运行推理的脚本。
位置参数:
model_name 你在上一步中推送到Huggingface的微调模型的名称。
instruction_prompt 添加到聊天机器人提供的每个提示中的指令消息,强制其以目标语言回答。
input 实际的聊天输入提示。此脚本仅用于测试目的,在回答后退出。
选项:
-h, --help 显示此帮助消息并退出
选择合适的翻译模型
我怎么知道应为目标语言选择哪个翻译模型?
我们为你准备了我们的benchmark.py
脚本,它有助于做出一个较好的猜测(我们使用的数据集与OPUS模型的训练数据集相同,因此结果总是对OPUS有利)。有关用法,请见此脚本的帮助。模型以4位量化加载,并在OPUS图书子集的小样本上运行。
请确保使用基础数据集中最常见的语言作为source_language,并将目标翻译语言设为target_language。例如,对于OASST1,至少运行en
和es
作为源语言。
用法:benchmark.py [-h] [--cpu] [--start START] [--n N] [--max_length MAX_LENGTH] source_language target_language included_models
针对特定源语言和目标语言基准测试所有不同的翻译模型,以找出哪个表现最佳。此过程使用4位量化以限制GPU使用。注意:结果具有指示性 - 你不能假设BLEU和CHRF得分的正确性,但可以相对比较模型。
位置参数:
source_language 你想测试的源语言。检查你的数据集以查看哪些出现最多,或者先用英语作为一个好的起点。
target_language 你想测试的目标语言。这应该是你要应用翻译脚本的语言。注意:在基准测试中,我们使用2字符的语言代码,而在translate.py中,你需要指定你的模型期望的任意语言代码。
included_models 逗号分隔的模型列表。允许的值有:opus, m2m_418m, m2m_1.2b, madlad_3b, madlad_7b, madlad_10b, madlad_7bbt, mbart, nllb_distilled600m, nllb_1.3b, nllb_distilled1.3b, nllb_3.3b, seamless
选项:
-h, --help 显示此帮助消息并退出
--cpu 强制使用CPU。默认情况下,如果可用,将使用GPU。
--start START 从OPUS图书数据集中包括句子的起始偏移量。默认值为0。
--n N 基准测试的句子数量。默认值为100。
--max_length MAX_LENGTH
生成的最大标记数。更多标记可能对较长输入更准确,但会增加内存不足的风险。默认值为512。
数据集和模型
我们已经创建并将继续创建许多数据集和模型。**想帮助普及LLMs吗?**克隆此仓库并为其他语言创建数据集和模型,然后创建PR。
翻译的OASST1数据集
特定语言的❗LLaMa3-8B❗聊天模型适配器
确保你可以访问Meta的LLaMa3-8B模型并在使用这些模型之前设置你的HF_TOKEN。
翻译的LLaMa2线程聊天提示数据集
特定语言的LLaMa2-7B聊天模型适配器
特定语言的Mistral聊天模型适配器
UnderstandLing/Mistral-7B-Instruct-v0.2-nl 荷兰语 | UnderstandLing/Mistral-7B-Instruct-v0.2-es 西班牙语 | UnderstandLing/Mistral-7B-Instruct-v0.2-de 德语 |
特定语言的LLaMa2-13B聊天模型适配器
UnderstandLing/llama-2-13b-chat-nl 荷兰语 | UnderstandLing/llama-2-13b-chat-es 西班牙语 | UnderstandLing/llama-2-13b-chat-fr 法语 |
特定语言的Mixtral-8x7B聊天模型适配器
实证表现
荷兰语
<s>[INST] <<SYS>> 你是一个通用的聊天机器人,总是用荷兰语回答。<</SYS>> 荷兰的首都是哪里? [/INST] 阿姆斯特丹</s>
<s>[INST] <<SYS>> 你是一个通用的聊天机器人,总是用荷兰语回答。<</SYS>> 荷兰的首都是哪里? [/INST] 阿姆斯特丹</s><s>[INST] 那个城市有多少人口? [/INST] 85万 (2023)</s>
<s>[INST] <<SYS>> 你是一个通用的聊天机器人,总是用荷兰语回答。<</SYS>> 荷兰的首都是哪里? [/INST] 阿姆斯特丹</s><s>[INST] 那个城市有多少人口? [/INST] 85万 (2023)</s><s>[INST] 那个城市在哪个省? [/INST] 在北荷兰省</s>
<s>[INST] <<SYS>> 你是一个通用的聊天机器人,总是用荷兰语回答。<</SYS>> 荷兰的首相是谁? [/INST] 马克·吕特自2010年以来一直是荷兰的首相。他已经多次连任。</s>
常见问题
-
问:为什么要先翻译完整的OASST1/2数据集?只翻译排名最高的对话不是更快吗?
-
答:虽然你可以通过先创建对话然后再翻译来大大提高处理时间,但我们提供完整的OASST1/2翻译给社区,因为我们认为它们本身就有用。
-
问:微调后的表现与原版LLaMa3相比如何?
-
答:虽然我们没有正式的基准测试,但让LLaMa3一开始就能够稳定地说另一种语言(非英语)是非常具有挑战性甚至是不可能的。它产生的非英语语言通常在语法上是破碎的。我们的微调不会出现这种情况。
-
问:我可以使用其他框架进行微调吗?
-
答:是的可以,我们使用Axolotl在多GPU环境中进行训练。
-
问:我可以混合使用不同的翻译模型吗?
-
答:当然可以,我们认为使用多种模型进行翻译甚至可以提高性能。你可以通过提前停止翻译并从检查点继续来实现这一点,通过使用不同的翻译模型重新运行翻译脚本。
资金
我们正在积极寻找资金,以民主化AI并推进其应用。如果你想投资,请联系info@commandos.ai。