Llama 3.1模型部署与微调详细实战
1. 环境准备
- 硬件选择:选择一台至少配备NVIDIA 4090 GPU的服务器,显存至少24GB。
- 操作系统安装:安装Ubuntu 22.04 LTS版本。
- 基础软件配置:安装Python 3.12、CUDA 12.1和cuDNN。
2. 安装依赖
1)Python环境配置
创建Python虚拟环境,并激活。
python -m venv llama_env
source llama_env/bin/activate
2)依赖库安装
使用pip安装所需的库,并通过清华大学TUNA镜像站加速下载。
pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip install fastapi uvicorn modelscope transformers accelerate
3. 模型下载
使用modelscope下载
编写脚本d.py
使用modelscope
库下载Llama 3.1模型。
import torch
from modelscope import snapshot_download, AutoModel, AutoTokenizer
import os
model_dir = snapshot_download(
'LLM-Research/Meta-Llama-3.1-8B-Instruct',
cache_dir='/root/autodl-tmp',
revision='master'
)
运行脚本:
python /root/autodl-tmp/d.py
4. 模型推理
1)加载模型
使用transformers
库加载分词器和模型。
from transformers import AutoTokenizer, AutoModelForCausalLM
model_name_or_path = '/root/autodl-tmp/LLM-Research/Meta-Llama-3___1-8B-Instruct'
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto", torch_dtype=torch.bfloat16)
2)推理测试
编写推理测试代码,生成模型回复。
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who are you?"}
]
input_ids = tokenizer.apply_chat_template(messages)
model_inputs = tokenizer([input_ids], return_tensors="pt").to('cuda')
generated_ids = model.generate(model_inputs.input_ids, max_new_tokens=512)
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)
5. 模型微调
1)数据集准备
准备包含指令和问答对的数据集。
2)导入依赖包
导入数据处理和模型训练所需的库。
from datasets import Dataset
import pandas as pd
from transformers import AutoTokenizer, AutoModelForCausalLM, DataCollatorForSeq2Seq, TrainingArguments, Trainer
3)读取和处理数据集
将数据集转换为模型可接受的格式。
df = pd.read_json('huanhuan.json')
ds = Dataset.from_pandas(df)
定义数据处理函数,将数据集映射到该函数。
def process_func(example):
MAX_LENGTH = 384
# 数据处理逻辑...
return {
"input_ids": input_ids,
"attention_mask": attention_mask,
"labels": labels
}
4)定义模型
加载预训练模型,并开启梯度检查点。
model = AutoModelForCausalLM.from_pretrained(model_dir)
model.enable_input_require_grads()
5)Lora配置
使用Lora技术配置微调参数。
from peft import LoraConfig
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
r=8,
lora_alpha=32,
lora_dropout=0.1
)
6)配置训练参数
设置训练超参数。
from transformers import TrainingArguments
args = TrainingArguments(
output_dir="./output/llama3_1_instruct_lora",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
logging_steps=10,
num_train_epochs=3,
save_steps=100,
learning_rate=1e-4,
gradient_checkpointing=True
)
7)开始训练
使用Trainer
类开始模型训练。
trainer = Trainer(
model=model,
args=args,
train_dataset=tokenized_id,
# 其他参数...
)
trainer.train()
8)合并模型
将微调后的权重合并回基础模型。
from peft import PeftModel
model = AutoModelForCausalLM.from_pretrained(model_dir)
model = PeftModel.from_pretrained(model, model_id=lora_path)
6. API部署调用
1)编写FastAPI应用代码
创建fastapi-test.py
文件,编写API服务代码。
from fastapi import FastAPI
from transformers import AutoTokenizer, AutoModelForCausalLM
import uvicorn
app = FastAPI()
@app.post("/")
async def create_item(request):
# API逻辑...
return answer
if __name__ == '__main__':
model_name_or_path = '/root/autodl-tmp/LLM-Research/Meta-Llama-3___1-8B-Instruct'
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path)
model = AutoModelForCausalLM.from_pretrained(model_name_or_path)
uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)
2)启动API服务
在终端运行以下命令启动API服务:
python fastapi-test.py
3)调用API
使用curl
或Python的requests
库调用API。
curl -X POST "http://127.0.0.1:6006/" \
-H 'Content-Type: application/json' \
-d '{"prompt": "What is AI?"}'
7.常见问题与解决方案
- CUDA OOM(内存不足):如果遇到内存不足问题,尝试降低
per_device_train_batch_size
和gradient_accumulation_steps
的值,或使用梯度检查点技术。 - 模型下载慢:由于模型文件较大,下载可能需要较长时间。建议在网络环境较好的情况下进行下载。
- 模型加载失败:确保CUDA和cuDNN与PyTorch版本兼容,且GPU驱动是最新的。
Llama 3.1模型的强大能力,为自然语言处理领域带来了新的机遇。本文详细介绍了从环境配置到模型部署、微调,再到API服务的整个流程。希望这份指南能够帮助您顺利实现Llama 3.1模型的本地部署和应用开发。