与Lora的微调LLM:温和的介绍
#python #ai #machinelearning #llm

400万美元。这就是训练GPT-3的成本。幸运的是,一种称为洛拉(Lora)的新培训技术使训练LLM的成本很少。

在本文中,我们将使用商业硬件尝试Lora和微调Llama Alpaca

Llama LLM和羊驼有什么区别?

首先,我们将迅速回顾一些LLM家谱。美洲驼是Meta发布的大型语言模型。这是Meta对OpenAI的GPT4的回应,并且被广泛考虑以超过gpt3.5。

在斯坦福大学的一个研究实验室成功的Llama之后,他发布了一种名为羊驼的新模型,该模型从最初的Llama模型中进行了微调。

羊驼毛的训练便宜,并且与Openai的Text-Davinci-003进行了PAR。最初的羊驼型模型在8 80GB A100上进行了训练,并花了3个小时。

Llama羊驼LLM如何微调?

微调涉及采用现有的预训练模型和培训新数据的一小部分参数。为了微调美洲驼,斯坦福大学的研究人员使用打开AI的Text-Davinci-003来生成52K说明。说明使用拥抱面培训库传递到模型中。

具有数十亿个参数的模型对于微调非常昂贵。今年早些时候,微软推出了一种名为Lora或低级改编的新技术。

Lora使用的训练参数比GPT-3少10,000个,而GPU存储器少3倍,但执行相等或更好的是GPT-3。重要的是,Lora模型每个请求不引入额外的延迟,使其成为生产级用例的竞争者。

lora可以通过冻结模型的权重并在模型中的每个变压器块中添加特定的训练层来使用预训练的模型。

在新数据集上微调模型后,组合了新模型和原始模型之间的矩阵的乘积,这使微型模型可以保持与原始模型相同的大小。

如何将培训脚本设置为微调美洲驼羊驼

在本文中,我将使用以下资源:

我们将在52k行GPT-4生成的52K行中培训遵循指令的LLM。

我正在使用在拥抱面上托管的Instruction Tuning with GPT-4数据集。

高级目标

  1. 在脚本中,在Llama LoRA repo中实现代码,我们可以在本地运行
  2. fine-tuning dataset传递到模型
  3. 设置云GPU以运行微调过程
  4. (可选)部署推理API,以微调模型进行预测

培训脚本

我们要做的第一件事是设置计算环境以运行Llama 2。

我们将从beam.cloud上的Cloud GPU上运行训练过程。培训脚本在24GI A10G GPU上运行:

ð请注意
    为了清楚起见,此示例中的完整培训代码已被缩写。
from math import ceil
from beam import App, Runtime, Image, Volume
from datasets import load_dataset

# Setup compute environment
app = App(
    "fine-tune-llama",
    runtime=Runtime(
        cpu=4,
        memory="32Gi",
        gpu="A10G",
        image=Image(
            python_version="python3.10",
            python_packages="requirements.txt",
        ),
    ),
    # Mount Volumes for fine-tuned models and cached model weights
    volumes=[
        Volume(name="checkpoints", path="./checkpoints"),
        Volume(name="pretrained-models", path="./pretrained-models"),
    ],
)


# Training entry point
@app.run()
def train_model():
    # Trained models will be saved to this path
    beam_volume_path = "./checkpoints"

    # Load vicgalle/alpaca-gpt4 dataset hosted on Huggingface:
    dataset = load_dataset("vicgalle/alpaca-gpt4")

    # Adjust the training loop based on the size of the dataset
    samples = len(dataset["train"])
    val_set_size = ceil(0.1 * samples)

    train(
        base_model=base_model,
        val_set_size=val_set_size,
        data=dataset,
        output_dir=beam_volume_path,
    )

为了在梁上运行此功能,我们使用beam run命令:

beam run app.py:train_model

运行此命令时,训练功能将在Beam的云上运行,我们将看到训练过程的进度流到了我们的终端:

Beam Training

部署推理API

训练模型时,我们可以部署API来对我们的微调模型进行推断。

让我们为推理创建一个新功能。如果您仔细观察,您会注意到我们这次使用了其他装饰器:rest_api而不是run

这将使我们能够将功能部署为REST API。

@app.rest_api()
def run_inference(**inputs):
    # Inputs passed to the API
    input = inputs["input"]

    # Grab the latest checkpoint
    checkpoint = get_newest_checkpoint()

    # Initialize models with latest fine-tuned checkpoint
    models = load_models(checkpoint=checkpoint)

    model = models["model"]
    tokenizer = models["tokenizer"]
    prompter = models["prompter"]

    # Generate text response
    response = call_model(
        input=input, model=model, tokenizer=tokenizer, prompter=prompter
    )
    return response

我们可以通过运行此命令将其部署为REST API:

beam deploy app.py:run_inference

Beam REST API

如果我们导航到外壳印刷的URL,我们将能够复制完整的卷曲请求以调用REST API。

Beam API Call

我用该模型的有效载荷稍微修改了请求:

-d '{"input": "what are the five steps to become a published author?"}'

这是微调模型的响应:

1. Create your manuscript with consistent writing sessions.

  1. Revise and polish your work for clarity and accuracy.
  2. Study your target audience and market trends.
  3. Choose between traditional or self-publishing based on your goals.
  4. Pursue traditional publishing with a compelling proposal.

结论

微调是一种针对开发在您自己的数据集上执行相关推理的LLM的强大技术。随着洛拉的添加,任何获得基本GPU的人都可以产生自己的强大而准确的LLM。

云GPU景观也在不断发展,诸如Beam,Banana和Replicate之类的供应商提供按使用付费的GPU,使其非常负担得起,无法微调您自己的Alpaca版本。

此外,

此帖子仅从模型优化的角度划痕可能的表面。为了在生产中优化您的微调美洲驼模型,可以使用GPTQ和4位量化的技术来实现卓越的推理速度而无需任何性能下降。