链载Ai

标题: 训练大型 AI 模型,尤其是像 LLM 这种巨无霸,没有分布式训练就像老牛拉破车,效率低得让人心碎。好消息是,Ludwig 与 Ray 强强联手,完美解决了这个问题,让你的模型 [打印本页]

作者: 链载Ai    时间: 2 小时前
标题: 训练大型 AI 模型,尤其是像 LLM 这种巨无霸,没有分布式训练就像老牛拉破车,效率低得让人心碎。好消息是,Ludwig 与 Ray 强强联手,完美解决了这个问题,让你的模型

一、Ludwig 介绍


自然语言处理 (NLP) 和人工智能 (AI) 的飞速发展催生了许多强大的模型,它们能够理解和生成如同人类般的文本,为聊天机器人、文档摘要等应用领域带来了革命性的改变。然而,释放这些模型的全部潜力需要针对特定用例进行微调。Ludwig,一个由 Linux 基金会人工智能与数据部门主办的低代码框架,应运而生。并迅速获得了开源社区的广泛关注,在 Github 上已收获 10.9k 颗星。它致力于帮助用户轻松构建定制化的人工智能模型,例如大语言模型 (LLMs) 和其他深度神经网络。

Ludwig 最初由 Piero Molino 于 2019 年在 Uber AI 团队成员 Yaroslav Dudin 和 Sai Sumanth Miryala 的帮助下创建。如今,Ludwig 已经发展成为一个由 Linux 基金会支持的开源项目,并托管在 Github 上,拥有一个活跃的社区。Ludwig 的开发和维护由 Predibase 的员工和社区贡献者共同完成。

ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">1.1、Ludwig 的主要优势

ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">

Ludwig 特别容易上手,即使你不是代码高手,也能用它轻松构建各种机器学习和深度学习模型。你只需要一个简单的 YAML 配置文件,就可以训练出最先进的 LLM 模型,还能玩转多任务和多模态学习,超级方便!从模型训练、微调、参数优化,到最终的可视化和部署,Ludwig 都能帮你轻松搞定。

ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">1.2、Ludwig 的主要功能

ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">

Ludwig 的整体设计理念是简化 AI 模型的构建和部署流程,无论是 AI 领域的新手还是专家,都可以轻松上手,快速构建出适用于各种场景的定制化 AI 模型。

二、Ludwig 原理


ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">2.1、ECD 技术架构

ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">


Ludwig 的核心建模架构被称为 ECD (编码器-组合器-解码器) 架构。它就像一个高效的信息处理工厂,首先将多个输入特征进行编码,然后将它们送入“组合器”模型进行整合。组合器模型处理完这些编码后的信息后,会将结果传递给针对每个输出特征的解码器,最后输出预测结果并进行后处理。您可以进一步了解 Ludwig 的各种组合器模型,例如 TabNet、Transformer 和 Concat (Wide and Deep learning) 等。
ECD 架构的示意图就像一只翩翩起舞的蝴蝶,因此也被称为“蝴蝶架构”。

ECD 架构可以灵活处理各种不同类型的输入和输出数据,因此适用于许多不同的应用场景。

ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">2.2、分布式训练

ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">

训练大型 AI 模型,尤其是像 LLM 这种巨无霸,没有分布式训练就像老牛拉破车,效率低得让人心碎。好消息是,Ludwig 与 Ray 强强联手,完美解决了这个问题,让你的模型训练效率瞬间起飞!

无论你是在轻便的笔记本电脑上,还是在强大的云端 GPU 集群上,甚至是动用成百上千台机器进行史诗级训练,Ludwig 都能轻松应对,而且你不用修改任何代码,就能享受分布式训练带来的速度与激情!

Ludwig 之所以如此优秀,主要归功于与 Ray 的深度整合:

三、Ludwig 微调



ingFang SC";font-weight: bold;color: rgb(255, 255, 255);line-height: 22px;letter-spacing: 1px;">3.1、微调准备工作

ingFang SC";font-weight: bold;color: rgb(24, 61, 111);line-height: 22px;letter-spacing: 1px;">

在开始微调之前,让我们先来熟悉一下 Ludwig 及其生态系统。如前所述,Ludwig 是一个用于构建自定义 AI 模型的低代码框架,你可以把它想象成一个 AI 模型的“乐高积木”,它能帮助你构建各种自定义模型,例如大语言模型和其他深度神经网络。从技术角度来看,Ludwig 能够训练和微调任何神经网络,并支持广泛的机器学习和深度学习用例。此外,Ludwig 还提供了可视化、超参数调整、可解释的人工智能、模型基准测试以及模型服务等功能。

Ludwig 使用 YAML 文件来指定所有配置,例如模型名称、要执行的任务类型、微调时的 Epoch 数量、训练和微调的超参数、量化配置等。Ludwig 支持各种以 LLM 为中心的任务,例如零样本批量推理、检索增强生成 (RAG)、基于适配器的文本生成微调、指令微调等。接下来,我们将以 Mistral 7B 模型为例,带你一步步体验如何用 Ludwig 对其进行微调,Ludwig 使用 YAML 文件来配置模型参数,就像写一个简单的清单一样。我们会在后面的例子中详细介绍如何配置。

在开始微调你的 AI 模型之前,需要做一些准备工作,一般包括以下几个方面:

3.2、Ludwig 微调 LLM 详细步骤


请注意,本文中的代码示例将在 VSCode 环境中运行,但您也可以在 Kaggle Notebook、Jupyter 服务器以及 Google Colab 等其他环境中运行这些代码。

3.2.1、安装必要的软件包

如果遇到 Transformers 版本的运行时错误,请执行以下操作。
%pipinstallludwig==0.10.0ludwig[llm]
%pipinstalltorch==2.1.2
%pipinstallPyYAML==6.0
%pipinstalldatasets==2.18.0
%pipinstallpandas==2.1.4
%pipinstalltransformers==4.30.2

3.2.2、导入必要的库和依赖项

importyaml
importlogging
importtorch
importdatasets
importpandasaspd
fromludwig.apiimportLudwigModel
3.2.3、数据准备和预处理

这里我们使用斯坦福大学的 Alpaca 数据集来进行微调。这份数据集就像是专门为基于指令的 LLM 微调而设计,它是由 OpenAI 的 text-davinci-003 引擎生成的,包含了 52,000 多个指令、每个条目包含指令、对应的任务以及 LLM 的输出。

为了有效地管理计算资源,我们将重点关注前 5,000 行数据。我们将使用 Hugging Face 的数据集库来访问和加载数据集到 Pandas DataFrame 中。
data=datasets.load_dataset("tatsu-lab/alpaca")
df=pd.DataFrame(data["train"])
df=df[["instruction","input","output"]]
df.head()

3.2.4、创建 YAML 配置文件

我们需要创建一个名为 model.yaml 的 YAML 配置文件,就像一份“训练秘籍”,告诉 Ludwig 如何训练我们的模型。这份秘籍包括以下内容:


model_type:llm
base_model:meta-llama/Llama-2-7b-hf

quantization:
bits:4

adapter:
type:lora

prompt:
template:|
###Instruction:
{instruction}

###Input:
{input}

###Response:

input_features:
-name:prompt
type:text

output_features:
-nameutput
type:text

trainer:
type:finetune
learning_rate:0.0001
batch_size:1
gradient_accumulation_steps:16
epochs:3
learning_rate_scheduler:
warmup_fraction:0.01

preprocessing:
sample_ratio:0.1
这份 YAML 配置文件涵盖了模型训练和微调所需的所有必要参数。如果你想深入了解更详细的自定义选项,可以参考 Ludwig 的官方文档。
3.2.4.1、在 YAML 文件中“写秘籍”
还记得我们之前提到的“训练秘籍”——YAML 配置文件吗?我们可以直接在里面定义模型的各种设置,就像这样:
importos
importlogging
fromludwig.apiimportLudwigModel

#在此处设置您的HuggingFace认证令牌
hugging_face_token=<your_huggingface_api_token>
os.environ["HUGGING_FACE_HUB_TOKEN"]=hugging_face_token

qlora_fine_tuning_config=yaml.safe_load(
"""
model_type:llm
base_model:mistralai/Mistral-7B-Instruct-v0.2

input_features:
-name:instruction
type:text

output_features:
-nameutput
type:text

prompt:
template:>-
下面是描述任务的指令,与输入配对提供更多背景信息。适当地写一个回复完成请求。

###Instruction:{instruction}

###Input:{input}

###Response:

generation:
temperature:0.1
max_new_tokens:64

adapter:
type:lora

quantization:
bits:4

preprocessing:
global_max_sequence_length:512
split:
type:random
probabilities:
-0.95
-0
-0.05

trainer:
type:finetune
epochs:1#Typically,youwanttosetthisto3epochsforinstructionfine-tuning
batch_size:1
eval_batch_size:2
optimizer:
type:paged_adam
gradient_accumulation_steps:16
learning_rate:0.0004
learning_rate_scheduler:
decay:cosine
warmup_fraction:0.03
"""
)

3.2.5、使用 LoRA 微调 LLM

万事俱备,只欠东风!现在,我们只需要召唤出 Ludwig 的力量,就可以开始训练模型了。
首先,我们需要实例化一个 Ludwig 模型对象,把我们精心准备的 YAML 配置文件作为参数传递给它,同时,别忘了带上记录器,以便随时跟踪训练进度。接下来,只需一行简单的代码 model.train(), 就可以启动训练过程啦!
如果遇到错误,请安装以下 Transformers 运行时:
%pipinstalltransformers==4.30.2
model=LudwigModel(
config=qlora_fine_tuning_config,
logging_level=logging.INFO
)

results=model.train(dataset=df[:5000])

仅需两行代码,我们就可以初始化 LLM 微调过程。为了加快训练速度,节省时间和计算资源,我们暂时只用了前 5000 行数据进行训练。这里我使用了 Kaggle 的 P100 GPU 来加速微调过程,您也可以选择使用它来提升微调的速度和性能!

3.2.6、评估模型性能

test_examples=pd.DataFrame([
{
"instruction":"列举三种不同类型的云.",
"input":"",
},
{
"instruction":"给以下菜谱提出三个改进建议",
"input":"鸡肉蔬菜汤:将鸡肉、胡萝卜、芹菜和土豆放入水中煮沸,然后小火慢炖一小时。",
},
{
"instruction":"解释一下什么是量子计算。",
"input":"",
},
{
"instruction":"用不超过20个字描述这张图片",
"input":"一只金毛猎犬在沙滩上奔跑,背景是夕阳。",
},
{
"instruction":"比较并对比巴洛克和古典音乐的特点。",
"input":"",
},
])

predictions=model.predict(test_examples,generation_config={
"max_new_tokens":64,
"temperature":0.1})[0]

forinput_with_predictioninzip(
test_examples['instruction'],
test_examples['input'],
predictions['output_response']
):

print(f"Instruction:{input_with_prediction[0]}")
print(f"Input:{input_with_prediction[1]}")
print(f"GeneratedOutput:{input_with_prediction[2][0]}")
print("\n\n")

四、模型部署


现在,我们可以将微调后的模型部署到 Hugging Face 平台。请按照以下步骤操作:


4.1、在 Hugging Face 上创建模型仓库


  1. 访问 Hugging Face 网站并登录您的账号。

  2. 点击您的个人资料图标,选择 "New Model"。

  3. 填写必要的信息,并为您的模型指定一个名称。


4.2、生成 Hugging Face API 密钥


  1. 在 Hugging Face 网站上,点击您的个人资料图标,然后选择 "Settings"。
  2. 选择 "Access Tokens" 并点击 "New Token"。
  3. 在生成 Token 时,选择 "Write" 权限。


4.3、使用 Hugging Face CLI 进行身份验证


1. 打开命令行终端。
2. 使用以下命令登录 Hugging Face,将 <API_KEY> 替换为您生成的 API 密钥:
huggingface-clilogin--token<API_KEY>


4.4、将您的模型上传到 Hugging Face

使用以下命令将您的模型上传到 Hugging Face,将 <repo-id> 替换为您的模型仓库 ID,将 <model-path> 替换为本地保存模型的路径:

ludwiguploadhf_hub--repo_id<repo-id>--model_path<model-path>

五、模型微调扩展



现在,你已经掌握了用 Ludwig 微调 LLM 的基本招式。但是,江湖路漫漫,想要训练出独步天下的 AI 模型,还需要不断修炼,拓展训练思路。

好在 Ludwig 非常灵活,就像可塑性极强的武学奇才,可以根据你的需求进行各种调整和扩展。以下是一些修改建议:
#Huggingfacedatasetsandtokenizers
fromdatasetsimportload_dataset
fromtokenizersimportTokenizer
fromtokenizers.modelsimportWordLevel
fromtokenizers.trainersimportWordLevelTrainer
fromtokenizers.pre_tokenizersimportWhitespace

六、总结


Ludwig 就像一位武功高强的引路人,为你打开了 AI 世界的大门。它简单易用,功能强大,即使是初学者也能轻松上手。Ludwig 的低代码框架为将大语言模型 (LLM) 微调至特定任务提供了一种高效便捷的途径,它在易用性和强大的自定义能力之间取得了良好的平衡。通过利用 Ludwig 全面的模型开发、训练和评估功能,开发人员可以构建出针对特定用例量身定制的强大且高性能的 AI 模型,以满足各种现实世界应用场景的需求。
以下是 Ludwig 的核心优势:
无论你是想要构建聊天机器人、开发文档摘要工具,还是探索其他 AI 应用,Ludwig 都能助你一臂之力。踏上这段激动人心的 AI 旅程,让 Ludwig 与你并肩作战,共同创造无限可能!
参考资料
[1]. Hugging Face Repo:https://huggingface.co/nitinaggarwal12/ludwig-llm-fine-tuning
[2]. Ludwig Git Repo:https://github.com/nitinaggarwaldbx/ludwig-llm-fine-tuning
[3]. Ludwig AI Framework Documentation:https://ludwig.ai/latest/
[4]. Hugging Face Base Model:https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2
[5]. Stanford Alpaca Dataset:https://huggingface.co/datasets/tatsu-lab/alpaca








欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5