Llama guard的启动部署以及利用llama factory的微调

881 阅读4分钟

概述

本文记录通过vLLM将llama guard在服务器端进行部署并进行模型微调的过程。由于一些文档不完善,本文尽可能提供了一些常见问题解决方案,以及配置方法供大家参考。

link

利用Vllm启动服务并部署

利用conda创建虚拟环境

  • conda create -n <env name> python=<python 版本>
  • conda env list
  • conda activate <env name>
  • pip list

模型下载

  • 3-1 b 模型地址, 7 b 模型地址 (测试后发现3-1b 非常垃圾,不建议使用)
  • huggingface-cli login, 输入token
  • 这里需要在hugging face 上登录认证并签署协议,等待5-10min认证通过即可。
  • 安装lfs工具, git lfs install
  • git clone <hugging face url>

另外一种方法是在代码中直接运行,如果没有的话会自动下载

  • tokenizer = AutoTokenizer.from_pretrained("<model name>",catch_dir=catch_dir,token=''), 这里

启动服务 vLLM

<指定GPU> python -m vllm.entrypoints.openai.api_server --port 5123 --model meta-llama/Llama-Guard-3-1B

指定GPU运行

  • 检查GPU使用情况: nvidia-smi
  • 查看具体某个GPU使用情况: nvidia-smi -q -i 7
  • 指定GPU运行: CUDA_VISIBLE_DEVICES=6,7

发送请求

import requests

url = "http://localhost:5123/v1/chat/completions"
headers = {
    "Content-Type": "application/json"
}
data = {
    "model": "meta-llama/Llama-Guard-3-1B",
    "messages": [
        {"role": "user", "content": "Hello!"}
    ]
}

response = requests.post(url, headers=headers, json=data)

另外一种方法:

from openai import OpenAI
client = OpenAI(
    base_url="http://localhost:5123/v1",
    api_key=" ",
)

completion = client.chat.completions.create(
    model="meta-llama/Llama-Guard-3-8B",
    messages=[
        {"role": "user", "content": content}
    ],
    temperature=0
)

print(completion.choices[0].message.content)

查看模型是成功运行。

查看端口占用情况

  • lsof -i
  • netstat -anp|grep 5123

利用LLaMA-Factory进行微调

image.png

下载并配置llama factory

数据格式

"""<|image|> Task: Check if there is unsafe content in '{role}' messages in conversations according to our safety policy with the below categories.

<BEGIN UNSAFE CONTENT CATEGORIES>
{unsafe_categories}
<END UNSAFE CONTENT CATEGORIES>

<BEGIN CONVERSATION>

{conversation}

<END CONVERSATION>

Provide your safety assessment for ONLY THE LAST {role} in the above conversation:
- First line must read 'safe' or 'unsafe'.
- If unsafe, a second line must include a comma-separated list of violated categories."""

更多可以参考: meta llama-guard-3

  • 一定要注意换行、空格、缩进等
  • 数据格式需要符合llama factory的要求 [ "instruction": "", "input":"", "output":"" ] 其中instruction输入prompt内容, output输入期待输出。 在LLaMA-Factory/data/dataset_info.json中添加你的数据集名称和地址。

yaml 文件配置

更改配置文件lora_sft_ds3.yaml

model_name_or_path

### dataset
dataset <同dataset_info中的地址>
template: llama3
cutoff_len: 4096 <这里需要查model card确认>

### train
per_device_train_batch_size: 1
gradient_accumulation_steps: 2
learning_rate: 1.0e-4
num_train_epochs: 3.0
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true
ddp_timeout: 180000000

### eval
val_size: 0.1
per_device_eval_batch_size: 1
eval_strategy: steps
eval_steps: 5000000

这里我们选用了Lora进行微调。LoRA是一种新型的微调方法,旨在解决预训练模型微调过程中存在的两大问题:模型调整过程中对初始模型过度依赖以及微调过程中存在的过拟合问题。LoRA通过在预训练模型中引入一个额外的线性层,并使用特定任务的训练数据来微调这个线性层。这种方法使模型能够更好地适应特定任务,同时减少了对初始模型的过度依赖。

微调参数

  • learning_rate: 1.0e-5 是Meta官方推荐,不建议更改。
  • gradient_accumulation_steps * per_device_train_batch_size * save_steps = max_samples
  • 批大小batch size
    • effective_batch_size = batch_size * gradient_acc_step

运行程序

注意,因为配置文件中用了相对路径,所以必须在llamafactory根目录下启动程序: CUDA_VISIBLE_DEVICES=6,7 llamafactory-cli train /home/feiyu_jiang/LLaMA-Factory/examples/train_lora/llama_guard_lora_sft_ds3.yaml

启动微调后的模型

因为我们使用lora进行模型微调的,所以模型本身名称没有改变。添加参数 --lora-modules '{"name": "sql-lora", "path": "/path/to/lora", "base_model_name": "meta-llama/..."}启动即可。

eg: python -m vllm.entrypoints.openai.api_server --port 5123 --model meta-llama/Llama-Guard-3-8B --enable-lora --lora-modules sql-lora=<path>

附录:常见报错

undefined symbol: __nvJitLinkAddData_12_1, version libnvJitLink.so.121,2

  • 错误原因:表明您的系统中缺少一个名为 __nvJitLinkAddData_12_1 的符号定义, pyTorch 与 nvidia的动态库没有正确链接3
  • 解决方法
    • 切换conda环境(guard-vllm)

    • 检查torch版本: pip show torch

    • 检查CUDA版本: nvcc -v

    • 检查CUDA环境变量地址: echo $LD_LIBRARY_PATH

    • 添加CUDA路径: export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

    • 搜错动态链接库:find ~/ -name "libnvJitLink.so.12"

      /home/<user_name>miniconda3/envs/guard-vllm/lib/python3.10/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12

    • 添加临时环境变量

      export LD_PRELOAD="/home/<user_name>/miniconda3/envs/guard-vllm/lib/python3.10/site-packages/nvidia/nvjitlink/lib/libnvJitLink.so.12"

    • 如何嫌弃太麻烦,可以直接写在home../.bashrc里面,每次启动终端自动加载

  • 另外,也可以选择降级torch到稳定版本