Type something to search...
利用模态微调 LLaMA-3 实现文本到 SQL 的生成:综合指南

利用模态微调 LLaMA-3 实现文本到 SQL 的生成:综合指南

微调大型语言模型(LLMs)传统上是一项复杂的工作,需要大量的基础设施设置和管理。然而,借助Modal的云平台和Axolotl的微调框架,您现在可以直接从本地机器对强大的模型如LLaMA-3进行微调,而无需处理基础设施的复杂性。

在本指南中,我们将通过使用Modal的远程GPU功能和Axolotl的先进训练优化,逐步演示如何对LLaMA-3 8B进行SQL查询生成的微调。

Modal 是一个革命性的云平台,让您可以在无需管理任何基础设施的情况下运行 GPU 密集型工作负载。主要优势包括:

  • 在几秒钟内远程运行代码
  • 通过一行代码访问强大的 GPU
  • 零基础设施配置 — 一切都在代码中定义
  • 无服务器执行,按秒计费
  • 无缝本地开发体验
  • 内置分布式计算原语

最吸引人的特点是 Modal 能够让远程 GPU 资源感觉像本地一样。您可以在笔记本电脑上开发和测试微调管道,然后在强大的云 GPU 上无缝执行,而无需对代码进行任何更改。

为什么选择这个技术栈?

Modal + Axolotl 技术栈提供了高效微调所需的一切:

  • 通过 LoRA 适配器实现的参数高效微调(PEFT),加快收敛速度
  • Flash Attention 优化训练过程中的内存使用
  • 梯度检查点以减少 VRAM 占用
  • 通过 DeepSpeed 实现分布式训练,以获得最佳多 GPU 扩展性

最重要的是,Modal 消除了基础设施的烦恼。无需担心构建镜像、配置 GPU 或管理云存储。如果您的训练脚本在 Modal 上运行,它从第一天起就是生产就绪的。

准备数据集

我们将使用 NL 到 SQL 的数据集来完成此任务,因为这是一个非常常见的用例,我们将使用的数据集是 Huggingface 上的 Bird NL2SQL 数据集。我们需要将该数据集的格式转换为 Alpaca 格式,这也是我个人更喜欢的训练数据格式,您可以使用任何其他格式,只需在模型配置文件中进行一些小改动即可。

以下是用于将数据集转换为 Alpaca 格式的 Python 脚本:

import json
import re
from typing import List, Dict
from datasets import load_dataset

def extract_components(input_text: str) -> tuple:
    """Extract schema and question from input text."""
    schema_match = re.search(r'Here is a database schema:(.*?)Please write', input_text, re.DOTALL)
    schema = schema_match.group(1).strip() if schema_match else ""
  
    question_match = re.search(r'following question: (.*?)\[/INST\]', input_text, re.DOTALL)
    question = question_match.group(1).strip() if question_match else ""
  
    return schema, question

def convert_to_alpaca_format(dataset) -> List[Dict[str, str]]:
    """Convert the dataset to Alpaca format with instruction/input/output fields."""
    alpaca_data = []
  
    for item in dataset:
        schema, question = extract_components(item['input'])
      
        alpaca_entry = {
            "instruction": "Write a SQL query to answer the question based on the given database schema.",
            "input": f"Schema:\n{schema}\n\nQuestion: {question}",
            "output": item['output'].strip()
        }
      
        alpaca_data.append(alpaca_entry)
  
    return alpaca_data

def save_to_jsonl(data: List[Dict[str, str]], output_file: str):
    """Save the data to a JSONL file."""
    with open(output_file, 'w', encoding='utf-8') as f:
        for item in data:
            json_line = json.dumps(item, ensure_ascii=False)
            f.write(json_line + '\n')

## Load your dataset (replace with your actual dataset name/path)
dataset = load_dataset("lamini/bird_text_to_sql")

## Convert to Alpaca format
alpaca_data = convert_to_alpaca_format(dataset['train'])  # or whichever split you're using

## Save to JSONL file
save_to_jsonl(alpaca_data, 'bird_text_to_sql_alpaca-2.jsonl')

以下是最终数据的示例:

{
  "instruction": "Write a SQL query to answer the question based on the given database schema.",
  "input": "Schema:\n[database schema]\n\nQuestion: [question]",
  "output": "[SQL query]"
}

设置 Modal

在开始之前,请确保您已:

  • 设置 Modal 账户:
pip install modal
python -m modal setup
  • 在您的 Modal 工作区中创建了 HuggingFace 密钥(从 HuggingFace 设置 > API 令牌中获取您的 HF_TOKEN)
  • 克隆仓库:
git clone https://github.com/modal-labs/llm-finetuning.git
cd llm-finetuning

项目结构

该仓库提供了训练和推理所需的一切:

  • 基于云的微调训练脚本
  • 用于测试结果的推理引擎
  • 不同模型和任务的配置文件
  • 示例数据集和数据处理工具

Modal 的内置存储系统帮助管理跨功能的数据:

  • /pretrained 卷:存储预训练模型(加载一次)
  • /runs 卷:存储每次训练运行的配置、数据集和结果

LLaMA-3 的配置

您可以在此存储库中找到许多 LLM 的配置文件,如 Mistral、CodeLlama、Mixtral 等,但我们将以 Llama-3 为例。在对现有的 llama-3-config.yml 进行一些调整后,这是我们的配置文件:

###
## Model Configuration: LLaMA-3 8B
###

base_model: NousResearch/Meta-Llama-3-8B
sequence_len: 4096

## base model weight quantization
load_in_8bit: false
load_in_4bit: true
quantization_config:
  load_in_4bit: true
  bnb_4bit_compute_dtype: "bfloat16"
  bnb_4bit_use_double_quant: true
  bnb_4bit_quant_type: "nf4"
## attention implementation
flash_attention: true

## finetuned adapter config
adapter: lora
lora_model_dir:
lora_r: 16
lora_alpha: 32
lora_dropout: 0.05
lora_target_linear: true
lora_fan_in_fan_out:
lora_modules_to_save: # required when adding new tokens to LLaMA/Mistral
  - embed_tokens
  - lm_head
## for details, see https://github.com/huggingface/peft/issues/334#issuecomment-1561727994

###
## Dataset Configuration: sqlqa
###

datasets:
  # This will be the path used for the data when it is saved to the Volume in the cloud.
  - path: bird_text_to_sql_alpaca.jsonl
    ds_type: json
    type: alpaca
  
## dataset formatting config
tokens: # add new control tokens from the dataset to the model
  - "[INST]"
  - " [/INST]"
  - "[SQL]"
  - " [/SQL]"

special_tokens:
  pad_token: <|end_of_text|>

val_set_size: 0.05

###
## Training Configuration
###

## random seed for better reproducibility
seed: 117

## optimizer config
optimizer: adamw_bnb_8bit
learning_rate: 0.0001
lr_scheduler: cosine
num_epochs: 4
micro_batch_size: 2
gradient_accumulation_steps: 16
warmup_steps: 10

## axolotl saving config
dataset_prepared_path: last_run_prepared
output_dir: ./lora-out

## logging and eval config
logging_steps: 1
eval_steps: 0.05

## training performance optimization config
bf16: true
fp16: false
tf32: false
train_on_inputs: false
group_by_length: false
gradient_checkpointing: true
deepspeed: "/workspace/axolotl/deepspeed_configs/zero3.json"

###
## Miscellaneous Configuration
###

## when true, prevents over-writing the config from the CLI
strict: false

## Memory optimizations
gradient_checkpointing: true
use_gradient_checkpointing: true 

## "Don't mess with this, it's here for accelerate and torchrun" -- axolotl docs
local_rank:

训练过程

Modal 的训练脚本有三个关键功能:

  1. launch: 准备一个新的运行文件夹,包含配置和数据
  2. train: 执行训练任务
  3. merge: 将训练好的适配器与基础模型合并

要开始训练:

modal run --detach src.train --config=llama-3-config.yml --data=bird_text_to_sql_alpaca.jsonl

--detach 标志允许训练在本地连接中断时继续。训练运行文件夹的名称将在命令输出中显示(例如 axo-2024-01-04-09-19-02-92bb)。您可以使用 modal volume ls 检查您的微调模型是否正确存储在此文件夹中。

这将触发一个训练任务,您将获得一个链接来跟踪 Modal 仪表板上的训练过程,或者您可以访问您的 Modal 仪表板并检查相关的应用日志。

测试您的微调模型

一旦训练完成,使用 Modal 的推理引擎测试您的模型:

modal run -q src.inference --run-name axo-2025-01-04-09-19-02-92bb

推理引擎使用 vLLM,相比标准实现可实现高达 24 倍的生成速度。

高级功能

多GPU训练

对于更大的模型或数据集,通过添加 DeepSpeed 配置来启用多GPU训练:

  • llama-3-config.yml
deepspeed: "/workspace/axolotl/deepspeed_configs/zero3.json"
  • 在你的训练脚本中:
N_GPUS = int(os.environ.get("N_GPUS", 2))
GPU_CONFIG = modal.gpu.A100(count=N_GPUS, size="80GB")

Weights & Biases 集成

为了跟踪训练指标:

  • 在您的 Modal 控制面板中创建一个 W&B 密钥
  • 添加到您的应用配置:
app = modal.App(
    "example-axolotl",
    secrets=[
        modal.Secret.from_name("huggingface"),
        modal.Secret.from_name("my-wandb-secret"),
    ],
)
  • 更新 llama-3-config.yml
wandb_project: llama3-sql
wandb_watch: gradients

结论

Modal 和 Axolotl 使得微调 LLaMA-3 变得异常简单。您将获得:

  • 开箱即用的最先进训练优化
  • 零基础设施管理
  • 无服务器扩展和按需付费定价
  • 简单的部署选项

整个过程通过简单的 Python 代码运行——无需 YAML 配置,无需基础设施设置,仅仅是纯粹的功能。一旦训练完成,您可以使用 Modal 的网络端点功能轻松部署您的模型以供生产使用。

Related Posts

使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
10 个强大的 Perplexity AI 提示,让您的营销任务自动化

10 个强大的 Perplexity AI 提示,让您的营销任务自动化

在当今快速变化的数字世界中,营销人员总是在寻找更智能的方法来简化他们的工作。想象一下,有一个个人助理可以为您创建受众档案,建议营销策略,甚至为您撰写广告文案。这听起来像是一个梦想? 多亏了像 Perplexity 这样的 AI 工具,这个梦想现在成为现实。通过正确的提示,您可以将 AI 转变为您的 个人营销助理。在本文中,我将分享 10 个强大的提示,帮助您自动

阅读更多
10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

人工智能技术,如机器学习、自然语言处理和数据分析,正在重新定义传统设计方法。从自动化重复任务到实现个性化用户体验,人工智能使设计师能够更加专注于战略思维和创造力。随着这一趋势的不断增长,UI/UX 设计师越来越多地采用 AI 驱动的工具来促进他们的工作。利用人工智能不仅能提供基于数据的洞察,还为满足多样化用户需求的创新设计解决方案开辟了机会。 1. 用户角色开发 目的

阅读更多
在几分钟内完成数月工作的 100 种人工智能工具

在几分钟内完成数月工作的 100 种人工智能工具

人工智能(AI)的快速发展改变了企业的运作方式,使人们能够在短短几分钟内完成曾经需要几周或几个月的任务。从内容创作到网站设计,AI工具帮助专业人士节省时间,提高生产力,专注于创造力。以下是按功能分类的100个AI工具的全面列表,以及它们在现实世界中的使用实例。 1. 研究工具 研究可能耗时,但人工智能工具使查找、分析和组织数据变得更加容易。**ChatGPT, Cop

阅读更多
你从未知道的 17 个令人惊叹的 GitHub 仓库

你从未知道的 17 个令人惊叹的 GitHub 仓库

Github 隐藏的宝石!! 立即收藏的代码库 学习编程相对简单,但掌握编写更好代码的艺术要困难得多。GitHub 是开发者的宝藏,那里“金子”是其他人分享的精心编写的代码。通过探索 GitHub,您可以发现如何编写更清晰的代码,理解高质量代码的样子,并学习成为更熟练开发者的基本步骤。 1. notwaldorf/emoji-translate *谁需

阅读更多