vishalsoni-sys/blackwell-llm

GitHub: vishalsoni-sys/blackwell-llm

在 RTX 5070 Blackwell 显卡上实现 Llama 3.1 8B 本地 LoRA 微调与 PDF RAG 问答的完整实践项目。

Stars: 0 | Forks: 0

# blackwell-llm 在 RTX 5070 (Blackwell, 8GB VRAM) 上的本地 LLM 实验 — WSL2, Python 3.10。 本仓库包含两个独立部分: | 部分 | 文件 | 模型 | 目的 | |---|---|---|---| | 1. 微调 | `train_unsloth.py` + `app.py` | Llama 3.1 8B **base** | LoRA 微调 + 基础聊天 UI | | 2. RAG 聊天应用 | `llmchat_rag_app.py` | Llama 3.1 8B **Instruct** | 支持 PDF RAG 的生产级聊天应用 | ## 硬件 | 组件 | 规格 | |---|---| | GPU | NVIDIA GeForce RTX 5070 Laptop (Blackwell sm_120) | | VRAM | 8.5 GB | | OS | WSL2 (Ubuntu 24) | | Python | 3.10 | | CUDA | 12.8 | | PyTorch | 2.9.1+cu128 | ## 第一部分 — 微调流程 **模型:** `unsloth/Meta-Llama-3.1-8B-bnb-4bit` (base, 4-bit 量化) **为什么选择 base 模型?** Base 模型能展示出显著的微调前后差异。Instruct 模型已经过对齐 —— 小数据集微调几乎看不出效果。 ### 步骤 ``` # 1. 生成 dataset (105 个示例) python make_dataset.py # 2. 运行基线 eval (微调前) python eval_before.py # 3. 使用 LoRA 微调 python train_unsloth.py # 4. 运行训练后 eval python eval_after.py # 5. 启动基础 chat UI (使用微调后的 adapter) python app.py ``` ### 训练结果 | 指标 | 数值 | |---|---| | 可训练参数 | 83,886,080 (1.03%) | | Epochs | 3 | | Steps | 81 | | 最终 loss | 0.887 | | 运行时间 | RTX 5070 上约 3 分钟 | ### 评估结果 | 任务 | 微调前 | 微调后 | |---|---|---| | JSON 格式 | 1/5 | 5/5 | | 拒绝回答 | 2/4 | 2/4 | Adapter 保存至:`runs/adapter_out/adapter` ## 第二部分 — RAG 聊天应用 **模型:** `unsloth/llama-3.1-8b-instruct-bnb-4bit` **为什么选择 instruct 模型?** Instruct 模型能可靠地遵循 system prompts —— 这对于 RAG 至关重要,因为模型必须严格根据文档内容回答,而不是产生幻觉。 **注意:** 第一部分微调的 LoRA adapter 在此**未**被使用 —— 它是在 base 模型上训练的,与 instruct 模型的权重不兼容。 ### 功能特性 - 流式 token 输出 - 跨轮次对话记忆 - 输出模式:Plain / JSON / XML - PDF RAG —— 上传任意 PDF,模型严格根据文档内容回答 - 通过 Gradio share link 获取公网 URL - 可选 ngrok 隧道用于持久的公网访问 ### 运行 ``` python llmchat_rag_app.py ``` ### PDF RAG 工作原理 1. 在 UI 中上传 PDF 2. PDF 被分割为 800-token 的块,并使用 `all-MiniLM-L6-v2` 进行 embedding 3. 对于每个问题,从 ChromaDB 中检索最相关的前 4 个块 4. 检索到的块被注入到 system prompt 中 5. 模型被指示**仅**根据文档内容回答 6. 清除 PDF 以恢复普通聊天模式 ## 环境设置 ``` # Clone git clone https://github.com/vishalsoni-sys/blackwell-llm.git cd blackwell-llm # 创建 venv python -m venv .venv source .venv/bin/activate # 安装 dependencies pip install -r requirements.txt # 运行 RAG chat app (第 2 部分) python llmchat_rag_app.py # 或运行 fine-tuning pipeline (第 1 部分) python train_unsloth.py python app.py ``` ## 项目结构 ``` blackwell-llm/ ├── train_unsloth.py # Part 1 — LoRA fine-tuning script ├── make_dataset.py # Part 1 — generates 105-example dataset ├── eval_before.py # Part 1 — baseline evaluation ├── eval_after.py # Part 1 — post-training evaluation ├── app.py # Part 1 — basic Gradio chat UI (uses adapter) ├── llmchat_rag_app.py # Part 2 — instruct model chat app with PDF RAG ├── prompts.py # Shared eval prompts ├── requirements.txt ├── runs/ │ └── adapter_out/ # Saved LoRA adapter (not tracked in git) └── README.md ``` ## 已知限制 - 8GB VRAM 无法使用 vLLM —— 加载 8B 模型后 KV cache 没有剩余空间 - WSL2 禁用了 pin memory (UVA) —— 完全阻断了 vLLM 的 CPU offloading - 微调后的 adapter 与 instruct 模型不兼容 —— 需要在 instruct 基础上重新训练 - Blackwell sm_120 需要 PyTorch 2.9+ 和 CUDA 12.8+
标签:4比特量化, Blackwell架构, CUDA, DLL 劫持, Gradio, Llama 3.1, LoRA, PDF解析, Python, PyTorch, RAG, RTX 5070, Unsloth, Vectored Exception Handling, WSL2, 人工智能, 凭据扫描, 大语言模型, 微调, 提示词注入防御, 数据集生成, 无后门, 本地大模型, 检索增强生成, 深度学习, 用户模式Hook绕过, 私有化部署, 结构化输出, 逆向工具, 防御规避