这是一个面向LLM入门新手的起步项目,涵盖了从模型加载、优化、微调到部署的完整流程。
本项目基于 Qwen2.5-0.5B-Instruct 模型,通过一系列任务帮助初学者掌握大语言模型的基本操作:
- 模型加载与推理:了解如何加载预训练模型并进行基础推理
- 模型量化优化:学习使用动态量化和4bit量化减少模型体积
- LoRA微调:使用参数高效微调方法在特定数据集上训练模型
- Web应用部署:通过Streamlit和FastAPI部署模型服务
llm_begin/
├── task1_model_intro.py # 任务1:模型介绍与基础使用
├── test_model.py # 模型测试工具(带进度显示)
├── task2_model_optimization.py # 任务2:动态量化优化
├── task2_better_quantization.py # 任务2扩展:4bit量化
├── task3.py # 任务3:LoRA微调
├── app_task4.py # 任务4:Streamlit Web应用
├── task5.py # 任务5:FastAPI服务
├── requirements.txt # 项目依赖
└── README.md # 项目说明文档
# 使用conda创建环境
conda create -n llm python=3.10
conda activate llm
# 或使用venv
python -m venv llm_env
# Windows
llm_env\Scripts\activate
# Linux/Mac
source llm_env/bin/activatepip install -r requirements.txt- torch==2.8.0 - PyTorch深度学习框架
- transformers==4.57.3 - Hugging Face模型库
- accelerate==1.10.1 - 模型加速库
- datasets==4.4.2 - 数据集加载工具
- peft==0.17.1 - 参数高效微调库
- streamlit==1.50.0 - Web应用框架
- fastapi==0.128.0 - API服务框架
- uvicorn==0.39.0 - ASGI服务器
文件:task1_model_intro.py
功能:
- 加载 Qwen2.5-0.5B-Instruct 预训练模型
- 打印模型架构,了解模型内部结构(Decoder层、RMSNorm、RotaryEmbedding等)
- 进行简单的对话推理测试
运行方法:
python task1_model_intro.py预期输出:
- 模型架构详细信息
- 对"用一句话解释什么是大模型"的回答
文件:test_model.py
功能:
- 提供交互式命令行界面
- 实时显示token生成进度
- 支持自定义输入问题进行测试
运行方法:
python test_model.py使用说明:
- 运行后会提示输入问题
- 程序会显示生成进度(百分比)
- 最后输出完整回答和token统计信息
文件:task2_model_optimization.py
功能:
- 对模型进行Int8动态量化
- 对比量化前后的模型大小
- 测试量化对推理速度和质量的影响
- 保存量化后的模型为
qwen_0.5b_int8.pt
运行方法:
python task2_model_optimization.py预期效果:
- 模型体积减少约75%
- 推理速度提升(CPU环境下尤其明显)
- 精度略有下降但仍可接受
实际效果:
- 模型回答质量大大下降。
文件:task2_better_quantization.py
功能:
- 使用 bitsandbytes 库进行4bit量化
- 采用NF4(Normal Float 4)量化类型
- 双重量化进一步压缩模型
运行方法:
python task2_better_quantization.py注意事项:
- 需要GPU支持(CUDA)
- 4bit量化比Int8量化压缩率更高
- 适合显存受限的场景
文件:task3.py
功能:
- 使用 Glaive Function Calling 数据集进行微调
- 采用LoRA(Low-Rank Adaptation)参数高效微调方法
- 仅训练少量参数(约1%),大幅降低计算成本
- 微调后合并权重并进行Int8量化
- 保存最终模型到
./output/qwen0.5B_glaive.pt
运行方法:
python task3.py训练配置:
- 数据集:Glaive Function Calling V2(前200条)
- LoRA参数:r=16, alpha=32
- 训练步数:30 steps
- Batch size:2(梯度累积4步)
- 设备:CPU(适合入门学习)
预期时间:
- CPU环境下约需10-30分钟(取决于硬件性能)
输出文件:
./output/qwen0.5B_glaive.pt- 微调并量化后的模型
文件:app_task4.py
功能:
- 提供友好的Web聊天界面
- 加载任务3微调后的量化模型
- 支持多轮对话,保持上下文
- 实时显示生成状态
运行方法:
streamlit run app_task4.py访问方式:
- 运行后自动打开浏览器
- 默认地址:
http://localhost:8501
使用说明:
- 在输入框中输入问题
- 模型会根据微调后的能力进行回答
- 支持连续对话,历史记录会保留在页面上
注意事项:
- 确保
qwen_glaive_quantized.pt文件存在于项目根目录 - 首次加载模型需要几秒钟时间
文件:task5.py
功能:
- 提供RESTful API接口
- 支持通过HTTP POST请求调用模型
- 返回JSON格式的响应
- 适合集成到其他应用中
运行方法:
uvicorn task5:app --reloadAPI文档:
- 运行后访问
http://localhost:8000/docs查看自动生成的API文档
接口说明:
POST /chat
- 请求体:
{
"text": "你的问题"
}- 响应:
{
"response": "模型的回答",
"model_type": "Glaive-Finetuned-Quantized"
}测试示例:
# 使用curl测试
curl -X POST "http://localhost:8000/chat" \
-H "Content-Type: application/json" \
-d '{"text": "什么是大语言模型?"}'
# 使用Python requests测试
import requests
response = requests.post(
"http://localhost:8000/chat",
json={"text": "什么是大语言模型?"}
)
print(response.json())# 1. 安装依赖
pip install -r requirements.txt
# 2. 了解模型基础
python task1_model_intro.py
# 3. 测试模型量化
python task2_model_optimization.py
# 4. 进行LoRA微调(耗时较长)
python task3.py
# 5. 启动Web应用
streamlit run app_task4.py
# 6. 或启动API服务
uvicorn task5:app --reload- 第一步:运行
task1_model_intro.py,理解模型加载和基础推理 - 第二步:运行
task2_model_optimization.py,学习模型量化技术 - 第三步:运行
task3.py,掌握LoRA微调方法 - 第四步:运行
app_task4.py,体验Web应用部署 - 第五步:运行
task5.py,了解API服务开发
- 原因:网络问题或Hugging Face访问受限
- 解决:使用镜像源或手动下载模型到本地
- 原因:模型加载需要约2GB内存
- 解决:关闭其他程序或使用量化版本
- 原因:CPU训练速度较慢
- 解决:减少训练步数(修改
max_steps参数)或使用GPU
- 原因:端口被占用
- 解决:更改端口号
# Streamlit
streamlit run app_task4.py --server.port 8502
# FastAPI
uvicorn task5:app --port 8001- ✅ 零基础友好:从最基础的模型加载开始
- ✅ CPU可运行:所有任务都可在CPU上完成
- ✅ 模块化设计:每个任务独立,便于学习
- ✅ 实战导向:涵盖从训练到部署的完整流程
- ✅ 中文注释:代码注释详细,易于理解
本项目仅供学习使用。
祝你学习愉快!🎉