LoRAX大模型框架使用

LoRAX大模型框架使用

一、LoRAX

  LoRAX(LoRA eXchange)是一个框架,允许用户在单个GPU上为数千个微调模型提供服务,在不影响吞吐量或延迟的情况下大大降低了服务成本。
在这里插入图片描述
官方文档:https://loraexchange.ai/

二、模型

使用LoRAX提供微调模型包括两个部分:
  - 基础模型(Base Model):所有适配器共享的预训练大型模型。
  - 适配器(Adapter):根据请求动态加载特定任务的适配器权重。

  LoRAX支持许多大型语言模型作为基础模型,包括Llama(包括CodeLlama)、Mistral(包括Zephyr)和Qwen。有关支持的基本模型的完整列表,请参阅支持的体系结构。

  基本模型可以加载到fp16中,也可以用GPT-Q或AWQ.bits和bytes进行量化

  支持的适配器包括使用PEFT和Ludwig库训练的LoRA适配器。模型中的任何线性层都可以通过LoRA进行调整,并加载到LoRAX中。

LoRAX支持的模型:
  Llama, CodeLlama, Mistral, Zephyr, Mixtral, Gemma, Gemma2, Phi-3/Phi-2, Qwen2/Qwen, Command-R, DBRX, GPT2, Solar, Bloom

三、开始

启动LoRAX服务器

本地模型

  若使用的模型是下载在本地的模型,我们将$PWD:/data,传入本地模型时直接使用 /data/你的模型路径

docker run --gpus all --shm-size 1g -p 8080:80 -v $PWD:/data \  
	ghcr.io/predibase/lorax:latest --model-id /data/xxx  

注意:若想只使用某个gpu,将--gpus all改为`–gpus “device=编号”。

  main标签将使用从仓库主分支的HEAD构建的映像。对于最新的稳定映像(由标记版本构建),应该使用latest标签。

huggingface模型

  若使用hf上的模型,可直接使用官网的方法。

model=mistralai/Mistral-7B-Instruct-v0.1
volume=$PWD/data

docker run --gpus all --shm-size 1g -p 8080:80 -v $volume:/data \
	ghcr.io/predibase/lorax:main --model-id $model

LoRAX 启动时的参数

LoRAX Launcher

Usage: lorax-launcher [OPTIONS]

Options:
	--model-id <MODEL_ID>
		要加载的模型名称,可以是在<https://hf.co/models>上的MODEL_ID,例如"gpt2"或"mistralai/Mistral-7B-Instruct-v0.1"。也可以是本地模型目录,其中要有transformers方法中"save_pretrained(...)"保存的必要文件。

		[env: MODEL_ID=]
		[default: ]

	--source <SOURCE>
		要加载的模型的来源。可以是"hub"或“s3”。"hub"将从huggingface hub加载模型,"s3"将从预数据库s3存储桶加载模型。

		[env: SOURCE=]
		[default: hub]

	--adapter-id <ADAPTER_ID>
		要加载的adapter名称,可以是在<https://hf.co/models>上的MODEL_ID。也可以是本地模型目录,其中要有transformers方法中"save_pretrained(...)"保存的必要文件,应与"model_id"中指定的模型兼容。

		[env: ADAPTER_ID=]
		[default: ]

	--adapter-source <ADAPTER_SOURCE>
		要加载的模型的来源。可以是"hub"、"s3"、"pbase"或"local"。"hub"将从huggingface hub加载模型,"s3"将从预数据库s3存储桶加载模型`,"pbase"将加载s3模型,但会解析来自预数据库服务器的元数据,"local"则会加载本地的模型。

		[env: ADAPTER_SOURCE=]
		[default: hub]

	--revision <REVISION>
		如果model在hub上,则该参数是model的实际版本。可以使用id或类似"refs/pr/2"的分支。

		[env: REVISION=]

REST API

base LLM:

curl 127.0.0.1:8080/generate \
    -X POST \
    -d '{"inputs": "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]", "parameters": {"max_new_tokens": 64}}' \
    -H 'Content-Type: application/json'

LoRA适配器:

curl 127.0.0.1:8080/generate \
    -X POST \
    -d '{"inputs": "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]", "parameters":  {"max_new_tokens": 64, "adapter_source":"local", "adapter_id": "/data/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k"}}' \
    -H 'Content-Type: application/json'

此处由于模型文件在本地,所以加入了"adapter_source":"local"参数,如果不是本地模型则需要去掉此部分。

通过Python客户端

安装:

pip install lorax-client

运行:

from lorax import Client

client = Client("http://127.0.0.1:8080")

# Prompt the base LLM
prompt = "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]"
print(client.generate(prompt, max_new_tokens=64).generated_text)

#Prompt a LoRA adapter
adapter_id = "/data/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k"
print(client.generate(prompt, adapter_source="local", max_new_tokens=64, adapter_id=adapter_id).generated_text)

同样,此处由于模型文件在本地,所以加入了adapter_source="local"参数,如果不是本地模型则需要去掉此部分。

四、Adapters

LoRA

低秩自适应 (LoRA) 是一种流行的适配器方法,用于微调响应质量。

LoRAX 支持使用 PEFT 和 Ludwig 等框架训练的 LoRA 适配器.

在训练 LoRA 适配器时, 您可以指定希望针对这些层中的哪一层 (或 “模块”) 进行适应.通常 这些是注意力块中的投影层(有时对于类似 LLaMA 的模型也是如此),但可以 通常是任何线性层。

Medusa

  Medusa是一种推测性解码方法,它训练新的投影层(类似于LoRA层),用于预测未来的令牌并加快文本生成过程。
  Medusa的目标是加速文本生成。与LoRA不同,Medusa的目的不是提高响应质量,事实上启用Medusa对模型输出本身没有任何影响。相反,Medusa通过添加额外的预测(称为“Medusa head”)来工作,即LLM的最后一个隐藏状态是通过预测下一个N个令牌(而不仅仅是下一个1个令牌)来传递的。

为了在LoRAX中使用Medusa推测解码,您必须使用有效的Medusa适配器作为“默认”适配器初始化LoRAX服务器。这意味着,默认情况下,除非被请求参数覆盖,否则每个请求都将使用默认的Medusa适配器。

docker run --gpus all --shm-szie 1g -p 8080:80 -v $PWD:/data \
	ghcr.io/predibase/lorax:main \
	--model-id /data/mistral-7b-instruct-v0.1
	--adapter-id /data/Mistral-7B-Instruct-v0.2-magicoder-medusa 
	--adapter-source 'local'

当使用v2 Medusa适配器作为默认值时,您还可以根据请求应用Medusa适配卡(也必须是v2),以专门针对特定任务进行推测解码。
例如,您可能有一个通用的Medusa适配器作为默认适配器,可以将大多数提示的吞吐量提高约50%。但是,如果你知道你的传入请求是用于代码生成的,你可能想应用一个仅在代码生成示例上训练过的特定任务的Medusa适配器,以实现约100%的加速:
python:

from lorax import Client

client = Client("http://127.0.0.1:8080")
prompt = "[INST] Write a Python function that takes a list of strings as input and returns a new list containing only the strings that are palindromes. [/INST]"

resp = client.generate(
	prompt,
	adapter_source="local",
	adapter_id="/data/Mistral-7B-Instruct-v0.2-magicoder-medusa",
)
print(resp.generated_text)

REST:

curl 127.0.0.1:8080/generate \
	-X POST \
	-d '{
	    "inputs": "[INST] Write a Python function that takes a list of strings as input and returns a new list containing only the strings that are palindromes. [/INST]",
    	"parameters": {
		"adapter_source":"local",
        "adapter_id": "/data/Mistral-7B-Instruct-v0.2-magicoder-medusa"
    	}
	}' \
	-H 'Content-Type: application/json'

使用每个请求的 Medusa 适配器的一个注意事项是,每个请求加载的适配器必须具有相同数量的 美杜莎头作为默认的美杜莎适配器。这是因为目前每个生成的投机代币数量 step 是在初始化期间定义的常量。

与LoRA结合:

当 LoRAX 已使用默认 Medusa 初始化时,您可以继续像往常一样将其与动态 LoRA 加载一起使用:
python:

from lorax import Client

client = Client("http://127.0.0.1:8080")
prompt = "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]"

resp = client.generate(
	prompt,
	adapter="local",
	adapter_id="vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k",
)
print(resp.generated_text)

REST:

curl 127.0.0.1:8080/generate \
	-X POST \
	-d '{
    	"inputs": "[INST] Natalia sold clips to 48 of her friends in April, and then she sold half as many clips in May. How many clips did Natalia sell altogether in April and May? [/INST]",
    	"parameters": {
			"adapter_source":"local",
        	"adapter_id": "vineetsharma/qlora-adapter-Mistral-7B-Instruct-v0.1-gsm8k"
    	}
	}' \
	-H 'Content-Type: application/json'
以下是Lorax ks文件的教程: 1. 创建一个新的Kickstart文件 您可以使用任何文本编辑器创建一个新的Kickstart文件。您可以将文件保存为`.ks`或者`.cfg`格式。 2. 编写Kickstart配置 在Kickstart文件中,您可以定义安装过程中的各种配置,例如分区设置、软件包安装、用户设置等。以下是一个基本的Kickstart文件示例: ``` #platform=x86, AMD64, 或 Intel EM64T #version=DEVEL # 安装前清理磁盘 clearpart --all --drives=sda # 创建分区 part / --fstype="ext4" --size=4096 --grow part swap --size=2048 # 安装软件包 %packages @base @core vim-enhanced wget %end # 设置根密码 rootpw --plaintext yourpassword # 添加用户 user --name=user1 --password=user1password # 配置网络 network --bootproto=dhcp --device=eth0 # 配置时区 timezone --utc Asia/Shanghai # 配置引导加载程序 bootloader --location=mbr ``` 上述示例展示了一些常见的Kickstart配置。您可以根据自己的需求进行修改和扩展。 3. 保存和使用Kickstart文件 将您的Kickstart文件保存在一个合适的位置,例如`/root/my-ks.cfg`。之后,您可以使用Lorax命令来构建容器映像,指定Kickstart文件的路径。示例如下: ``` sudo lorax --ks /root/my-ks.cfg --format docker --output /var/lib/docker/images/my-image.tar ``` 上述命令将使用`my-ks.cfg`文件构建Docker格式的容器映像,并将其输出到`/var/lib/docker/images/my-image.tar`文件中。 这是Lorax ks文件的基本教程,您可以根据自己的需求和具体情况进行更详细的配置和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值