微信扫码
与创始人交个朋友
我要投稿
一、Ludwig 介绍
自然语言处理 (NLP) 和人工智能 (AI) 的飞速发展催生了许多强大的模型,它们能够理解和生成如同人类般的文本,为聊天机器人、文档摘要等应用领域带来了革命性的改变。然而,释放这些模型的全部潜力需要针对特定用例进行微调。Ludwig,一个由 Linux 基金会人工智能与数据部门主办的低代码框架,应运而生。并迅速获得了开源社区的广泛关注,在 Github 上已收获 10.9k 颗星。它致力于帮助用户轻松构建定制化的人工智能模型,例如大语言模型 (LLMs) 和其他深度神经网络。
1.1、Ludwig 的主要优势
Ludwig 特别容易上手,即使你不是代码高手,也能用它轻松构建各种机器学习和深度学习模型。你只需要一个简单的 YAML 配置文件,就可以训练出最先进的 LLM 模型,还能玩转多任务和多模态学习,超级方便!从模型训练、微调、参数优化,到最终的可视化和部署,Ludwig 都能帮你轻松搞定。
1.2、Ludwig 的主要功能
Ludwig 的整体设计理念是简化 AI 模型的构建和部署流程,无论是 AI 领域的新手还是专家,都可以轻松上手,快速构建出适用于各种场景的定制化 AI 模型。
二、Ludwig 原理
2.1、ECD 技术架构
ECD 架构可以灵活处理各种不同类型的输入和输出数据,因此适用于许多不同的应用场景。
2.2、分布式训练
训练大型 AI 模型,尤其是像 LLM 这种巨无霸,没有分布式训练就像老牛拉破车,效率低得让人心碎。好消息是,Ludwig 与 Ray 强强联手,完美解决了这个问题,让你的模型训练效率瞬间起飞!
无论你是在轻便的笔记本电脑上,还是在强大的云端 GPU 集群上,甚至是动用成百上千台机器进行史诗级训练,Ludwig 都能轻松应对,而且你不用修改任何代码,就能享受分布式训练带来的速度与激情!
三、Ludwig 微调
3.1、微调准备工作
在开始微调之前,让我们先来熟悉一下 Ludwig 及其生态系统。如前所述,Ludwig 是一个用于构建自定义 AI 模型的低代码框架,你可以把它想象成一个 AI 模型的“乐高积木”,它能帮助你构建各种自定义模型,例如大语言模型和其他深度神经网络。从技术角度来看,Ludwig 能够训练和微调任何神经网络,并支持广泛的机器学习和深度学习用例。此外,Ludwig 还提供了可视化、超参数调整、可解释的人工智能、模型基准测试以及模型服务等功能。
Ludwig 使用 YAML 文件来指定所有配置,例如模型名称、要执行的任务类型、微调时的 Epoch 数量、训练和微调的超参数、量化配置等。Ludwig 支持各种以 LLM 为中心的任务,例如零样本批量推理、检索增强生成 (RAG)、基于适配器的文本生成微调、指令微调等。接下来,我们将以 Mistral 7B 模型为例,带你一步步体验如何用 Ludwig 对其进行微调,Ludwig 使用 YAML 文件来配置模型参数,就像写一个简单的清单一样。我们会在后面的例子中详细介绍如何配置。
3.2、Ludwig 微调 LLM 详细步骤
%pip install ludwig==0.10.0 ludwig[llm]
%pip install torch==2.1.2
%pip install PyYAML==6.0
%pip install datasets==2.18.0
%pip install pandas==2.1.4
%pip install transformers==4.30.2
import yaml
import logging
import torch
import datasets
import pandas as pd
from ludwig.api import LudwigModel
3.2.3、数据准备和预处理
这里我们使用斯坦福大学的 Alpaca 数据集来进行微调。这份数据集就像是专门为基于指令的 LLM 微调而设计,它是由 OpenAI 的 text-davinci-003 引擎生成的,包含了 52,000 多个指令、每个条目包含指令、对应的任务以及 LLM 的输出。
data = datasets.load_dataset("tatsu-lab/alpaca")
df = pd.DataFrame(data["train"])
df = df[["instruction", "input", "output"]]
df.head()
我们需要创建一个名为 model.yaml
的 YAML 配置文件,就像一份“训练秘籍”,告诉 Ludwig 如何训练我们的模型。这份秘籍包括以下内容:
llm
。mistralai/Mistral-7B-Instruct-v0.1
模型作为基础,你也可以选择其他预训练模型或者自己训练的模型。instruction
和 output
,代表文本类型,用于处理数据集的输入和模型的输出。temperature
参数控制文本的随机性,max_new_tokens
参数控制生成文本的最大长度。global_max_sequence_length
参数设置为 512,将所有输入文本的长度标准化,并将数据集随机划分为训练集和验证集。paged_adam
优化器。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:
- name: output
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
import os
import logging
from ludwig.api import LudwigModel
# 在此处设置您的Hugging Face认证令牌
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:
- name: output
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, you want to set this to 3 epochs for instruction fine-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
"""
)
model.train()
, 就可以启动训练过程啦!%pip install transformers==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 来加速微调过程,您也可以选择使用它来提升微调的速度和性能!
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]
for input_with_prediction in zip(
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"Generated Output: {input_with_prediction[2][0]}")
print("\n\n")
四、模型部署
现在,我们可以将微调后的模型部署到 Hugging Face 平台。请按照以下步骤操作:
4.1、在 Hugging Face 上创建模型仓库
访问 Hugging Face 网站并登录您的账号。
点击您的个人资料图标,选择 "New Model"。
填写必要的信息,并为您的模型指定一个名称。
4.2、生成 Hugging Face API 密钥
4.3、使用 Hugging Face CLI 进行身份验证
<API_KEY>
替换为您生成的 API 密钥:huggingface-cli login --token <API_KEY>
4.4、将您的模型上传到 Hugging Face
<repo-id>
替换为您的模型仓库 ID,将 <model-path>
替换为本地保存模型的路径:ludwig upload hf_hub --repo_id <repo-id> --model_path <model-path>
五、模型微调扩展
现在,你已经掌握了用 Ludwig 微调 LLM 的基本招式。但是,江湖路漫漫,想要训练出独步天下的 AI 模型,还需要不断修炼,拓展训练思路。
# Huggingface datasets and tokenizers
from datasets import load_dataset
from tokenizers import Tokenizer
from tokenizers.models import WordLevel
from tokenizers.trainers import WordLevelTrainer
from tokenizers.pre_tokenizers import Whitespace
任务:挑战自我,突破瓶颈: 不要局限于指令微调,尝试用 Ludwig 完成更复杂的 NLP 任务,例如文本分类、问答系统等等,不断挑战自我,突破模型的极限。
六、总结
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-03-30
2024-04-26
2024-05-10
2024-04-12
2024-05-28
2024-05-14
2024-04-25
2024-07-18
2024-04-26
2024-05-06
2024-12-22
2024-12-21
2024-12-21
2024-12-21
2024-12-21
2024-12-20
2024-12-20
2024-12-19