大家好!今天我带来了一篇关于如何在本地部署、微调以及使用微调后的微软Phi-3模型进行推理的文章。微软最近推出的小模型Phi-3非常火,我想在这里和大家分享一下如何在本地进行部署和微调,并带大家在高中阅读理解项目上做一个有趣的实验。
一、Phi-3模型的火热与背景
微软最新推出的Phi-3模型因其出色的性能和轻量化的设计,在自然语言处理领域掀起了一股热潮。尽管模型小巧,但它在处理各种语言任务时表现得非常强大。今天我们就来看看如何在本地环境中部署并微调这个模型。
二、实验背景:高中阅读理解项目
为了展示Phi-3模型的能力,我们将以一个高中阅读理解项目为例进行实验。在微调之前,我们用Phi-3模型对30道高中阅读理解题目进行测试,结果模型只能答对10道题目。为了提升模型的表现,我们在1万条阅读理解数据上对模型进行了微调,并再次测试了30道题目,最终正确率有了些许的提升。这确实也不值得骄傲,而且现在微软刚刚发布了Phi-3.5,我突然发现我可以再来一遍。当然我做过的工作可以当做大家参考。接下来,我会教大家如何复现这个实验,并在自己的机器上进行操作。
三、准备工作
在开始之前,确保你的环境已经安装了以下依赖项:
- Python 3.8+
- PyTorch
- Transformers库
- Flask
- 其他必要的Python库
你可以通过以下命令安装这些依赖项:
pip install torch transformers flask datasets pandas
四、微调Phi-3模型
我们首先来看如何微调Phi-3模型。以下是微调过程的详细步骤:
- 加载和处理数据
我们使用pandas
库加载数据并使用datasets
库将其转换为适合微调的数据集。
importpandas
as pd
fromdatasets
import Dataset
df = pd.read_json(`'/phi3/mrc_阅读理解问答_7_29_微调.json'`)
ds = Dataset.from_pandas(df)
我们的数据集应该长成这样:
{
"instruction": "``根据篇章,生成问题的答案,仅输出答案,不要解释你的答案。",
"input": "``篇章:读 史 王安石自古功名亦苦辛,行藏终欲付何人。当时黮闇犹承误,末俗纷纭更乱真。糟粕所传非粹美,丹青难写是精神。区区岂尽高贤意,独守千秋纸上尘。\\n问题:下列对这首诗的理解和赏析,不正确的一项是 ['A.这首诗从大处着眼,并非是针对某个具体的历史事件、历史人物而作。', 'B.历代高人贤士一世奔忙,建功立业,但无法避免身后湮没无闻的可能。', 'C.历史人物在其所处的时代已经难免被误解,在世俗的传言中更会失真。', 'D.颈联的上下两句反复陈说,表明诗人的观点,堪称这首诗的警策之语。']",
"output": "B``.历代高人贤士一世奔忙,建功立业,但无法避免身后湮没无闻的可能。"
}
- 定义数据处理函数
我们定义一个函数来处理数据,使其适合模型输入。
def
process_func(
example):
MAX_LENGTH =
500``
input_ids, attention_mask, labels = [], [], []
instruction = tokenizer(`f"<|user|>\n{example['instruction'] + example['input']}<|end|>\n<|assistant|>\n"`, add_special_tokens=`False`)
response = tokenizer(`f"{example['output']}<|end|>\n"`, add_special_tokens=`False`)
input_ids = instruction[`"input_ids"`] + response[`"input_ids"`] + [tokenizer.pad_token_id]
attention_mask = instruction[`"attention_mask"`] + response[`"attention_mask"`] + [`1`]
labels = [-`100`] * `len`(instruction[`"input_ids"`]) + response[`"input_ids"`] + [tokenizer.pad_token_id]
`if` `len`(input_ids) > MAX_LENGTH:
input_ids = input_ids[:MAX_LENGTH]
attention_mask = attention_mask[:MAX_LENGTH]
labels = labels[:MAX_LENGTH]
`return` {
`"input_ids"`: input_ids,
`"attention_mask"`: attention_mask,
`"labels"`: labels
}
tokenized_id = ds.`map`(process_func, remove_columns=ds.column_names)
- 加载预训练模型和配置
我们加载预训练的Phi-3模型,并设置LoRA(Low-Rank Adaptation)配置以进行微调。
fromtransformers
importAutoTokenizer, AutoModelForCausalLM
frompeft
importLoraConfig, TaskType, get_peft_model
tokenizer = AutoTokenizer.from_pretrained(`'/LLM-Research/Phi-3-mini-4k-instruct'`, use_fast=`False`, trust_remote_code=`True`)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(`'/LLM-Research/Phi-3-mini-4k-instruct'`, device_map=`"auto"`, torch_dtype=torch.bfloat16, trust_remote_code=`True`)
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=[`"q_proj"`, `"k_proj"`, `"v_proj"`, `"o_proj"`, `"gate_proj"`, `"up_proj"`, `"down_proj"`],
inference_mode=`False`,
r=`8`,
lora_alpha=`32`,
lora_dropout=
0.1``
)
model = get_peft_model(model, config)
- 设置训练参数并开始训练
我们设置训练参数并使用Trainer
开始训练。
fromtransformers
importTrainingArguments, Trainer, DataCollatorForSeq2Seq
args = TrainingArguments(
output_dir=`"output/Phi-3"`,
per_device_train_batch_size=`4`,
gradient_accumulation_steps=`4`,
logging_steps=`10`,
num_train_epochs=`3`,
save_steps=`100`,
learning_rate=`1e-4`,
save_on_each_node=`True`,
gradient_checkpointing=
True``
)
trainer = Trainer(
model=model,
args=args,
train_dataset=tokenized_id,
data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer, padding=`True`),
)
trainer.train()
lora_path=
‘./Phi-3_lora_729’``
trainer.model.save_pretrained(lora_path)
tokenizer.save_pretrained(lora_path)
五、部署推理服务
接下来,我们使用Flask部署一个简单的推理服务。以下是推理服务的代码:
- 设置Flask****应用
我们创建一个Flask应用并定义推理端点。
fromflask
importFlask, request, jsonify
app = Flask(__name__)
@app.route(‘/inference_phi3’, methods=[‘post’])def
inference_phi3():
data = request.json
instruction = data.get(`'instruction'`)
prompt = data.get(`'prompt'`)
model_path =
‘/LLM-Research/Phi-3-mini-4k-instruct’``
lora_path =
‘./Phi-3_lora_729’``
tokenizer = AutoTokenizer.from_pretrained(model_path, padding_side=`'left'`)
model = AutoModelForCausalLM.from_pretrained(model_path, device_map=`"auto"`, torch_dtype=torch.bfloat16, trust_remote_code=`True`)
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=[`"q_proj"`, `"k_proj"`, `"v_proj"`, `"o_proj"`, `"gate_proj"`, `"up_proj"`, `"down_proj"`],
inference_mode=`True`,
r=`8`,
lora_alpha=`32`,
lora_dropout=
0.1``
)
model = PeftModel.from_pretrained(model, model_id=lora_path, config=config)
messages = [
{`"role"`: `"system"`, `"content"`: instruction},
{`"role"`: `"user"`, `"content"`: prompt}
]
text = tokenizer.apply_chat_template(messages, tokenize=`False`, add_generation_prompt=`False`)
model_inputs = tokenizer([text], return_tensors=`"pt"`).to(`'cuda'`)
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=`512`,
eos_token_id=tokenizer.encode(`'<|endoftext|>'`)[`0`]
)
outputs = generated_ids.tolist()[`0`][`len`(model_inputs[`0`]):]
response = tokenizer.decode(outputs).split(`'<|end|>'`)[`0`]
`return`jsonify({`"response"`: response})
if__name__ ==
“main”:
app.run(debug=`False`, port=`1980`, host=`'0.0.0.0'`)
- 运行Flask****应用
确保Flask应用文件保存为inference.py
,然后通过以下命令运行:
python inference.py
六、实验结果与结论
经过微调后,Phi-3模型在30道题目的正确率略有提升。这次实验虽然提升有限,但它展示了通过大规模数据微调可以有效提高模型在特定任务上的表现。如果你对进一步优化和调整模型有兴趣,欢迎继续探索和研究。
结语
Phi-3模型的火热并非偶然,微软为我们提供了一个强大的工具,借助适当的微调和部署,我们可以让模型在特定任务中展现出色的表现。希望这篇文章对你有所帮助,也期待看到你在模型应用上的更多探索!如果有任何问题或建议,欢迎在评论区留言。
如何学习大模型
现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。
作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。
我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线
很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。
二、AI大模型视频教程
三、AI大模型各大学习书籍
四、AI大模型各大场景实战案例
五、结束语
学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。
再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。
因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。