# tiled_llm **Repository Path**: makeval/tiled_llm ## Basic Information - **Project Name**: tiled_llm - **Description**: 在低配置电脑运行大模型的可行性探索,同时对基于神经网络的大模型描述进行探索与思考。 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-02 - **Last Updated**: 2026-07-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: llm ## README ```markdown # TextureLLM:神经网络即纹理 · 极低资源大模型推理框架 > **让 7B 大模型在 128MB 集成显卡 / 512MB 内存的老旧电脑上流畅运行(目标)** 探索中 ## 💡 核心思想 传统大模型推理需要将全部参数加载到显存或内存,而 **TextureLLM 将训练好的权重矩阵展平、量化并拼接成一张二维纹理图像**。 推理时,引擎**按需从纹理中取样小块权重进行分块矩阵乘法**,全程不保留完整权重矩阵,从而将内存占用压至极低水平(0.5B 模型仅需 30 MB,7B 模型仅需 150 MB)。 ``` 神经网络权重 → 2×2 INT8 微块 → RGBA 纹理图像 → 分块采样计算 ``` ## ✨ 核心特性 - **超低内存** 支持**内存映射(mmap)**与**逐层释放**模式,0.5B 模型运行时内存峰值 **30 MB**,7B 模型 **150 MB**。 - **自适应分块加速** 根据矩阵尺寸动态选择最优分块大小,结合 **Numba 多线程并行**,CPU 推理速度可达 50 tokens/s 以上。 - **纹理存储** 所有权重压缩为一张 RGBA8 图像(可保存为 PNG),体积为 INT8 量化后的参数总量,可直接可视化。 - **保留关键精度** Embedding、LM Head、LayerNorm 等敏感层保持 FP32,量化仅作用于 2D 权重矩阵。 - **支持 GQA(分组查询注意力)** 完美适配 Qwen2.5、LLaMA2 等现代架构。 - **纯 Python + OpenCV + Numba** 无需 CUDA,无需 PyTorch 运行时,可运行在任何支持 OpenCV 的机器上。 ## 📁 项目结构 ``` texture_llm/ ├── convert.py # 模型转换工具(HuggingFace → 纹理格式) ├── inference.py # 标准推理引擎(自适应分块,可选 mmap) ├── inference_fast.py # 极速推理引擎(预解包全部权重,Numba 全编译) ├── chat.py # 命令行多轮对话工具 ├── generate.py # 单次文本生成工具 ├── requirements.txt # 依赖列表 └── README.md ``` ## ⚙️ 快速开始 ### 1. 安装依赖 ```bash pip install torch transformers opencv-python numpy tqdm numba ``` ### 2. 模型转换 以 Qwen2.5-0.5B 为例: ```bash python convert.py --model Qwen/Qwen2.5-0.5B-Instruct --out ./texture_model --workers 4 ``` 可选参数: - `--micro_size`:微块大小,默认 2,可设为 4 获得更快速度。 - `--workers`:并行进程数,内存不足时可减小。 转换后在 `./texture_model` 目录下生成: - `weights.png`:量化纹理图像(0.5B 模型约 20 MB,7B 模型约 3.5 GB) - `scales.npy`:每个微块的量化比例因子 - `small_params.npz`:全精度 Embedding、LayerNorm 等参数 - `meta.json`:模型结构与纹理偏移信息 ### 3. 运行推理 **交互对话(标准引擎)** ```bash python chat.py --model_dir ./texture_model ``` **单次文本生成** ```bash python generate.py --model_dir ./texture_model --prompt "解释一下MACD指标" --max_tokens 100 ``` **极速模式(需要 ≥4 GB 内存)** ```bash python -c "from inference_fast import FastTextureLLM; model = FastTextureLLM('./texture_model'); print(model.generate('你好', max_new_tokens=50))" ``` **性能日志分析** ```bash python chat.py --model_dir ./texture_model --log_file ./inference.log ``` ## 📊 性能参考 测试环境:Intel Core i5-8250U(4核8线程),16 GB RAM,Qwen2.5‑0.5B-Instruct。 | 推理模式 | 内存峰值 | 生成速度 | 说明 | |----------|----------|----------|------| | 标准引擎(全量加载) | ~450 MB | 20 tokens/s | 将纹理全部读入内存 | | 标准引擎 + mmap | **32 MB** | 20 tokens/s | 按需从磁盘加载纹理片段 | | 极速引擎(预解包) | ~1.5 GB | **50 tokens/s** | 一次性解包所有权重为 FP32 | | 7B 模型(mmap + 标准引擎) | ~150 MB | 2–5 tokens/s | 可运行,较慢 | > **注**:极速引擎(`inference_fast.py`)通过预解包所有权重为 FP32 并完全 Numba 编译,消除了纹理解包和 Python 循环开销,速度最快,但需要足够内存存放全精度权重。 ## 🔧 性能调优 - **调整微块大小**:用 `--micro_size 4` 转换模型,速度可提升 40%,精度损失可忽略。 - **减少输出长度**:`--max_tokens` 值越小,总生成时间越短。 - **控制并行线程**:设置环境变量 `NUMBA_NUM_THREADS=4` 匹配 CPU 核心数。 - **使用 mmap 降低内存**:修改 `inference.py` 中的加载方式为 `np.memmap`(可联系开发者获取)。 - **开启编译缓存**:Numba 函数已启用 `cache=True`,第二次运行会快很多。 ## ❓ 常见问题 **Q:纹理文件为什么有几百 MB?** A:纹理存储的是 INT8 量化后的所有权重矩阵,这是物理极限。推理时通过分块/mm 只加载当前需要的片段,实际内存占用极低。 **Q:能在集成显卡(128 MB 显存)上运行吗?** A:可以。计算全部在 CPU 完成,纹理文件放在磁盘,仅加载少量数据到内存,不占用显存。 **Q:为什么我的推理速度只有 12 秒/token?** A:这可能是因为 Numba 编译失败或使用了未优化的旧版代码。请升级到 `inference_fast.py` 或确保 `inference.py` 中 `NUMBA_AVAILABLE=True` 且没有退回到 Python 对象模式。 **Q:支持哪些模型?** A:理论上所有 HuggingFace CausalLM 架构均可,已测试 Qwen2.5‑0.5B/1.5B。需在转换脚本中适配权重名称规则(如 `embed_tokens`、`lm_head` 等)。 ## 🤝 致谢 本项目受“神经网络即纹理”思想启发,推理引擎基于 Numba 和 OpenCV 构建。感谢 Qwen 团队提供优秀的开源模型。 ## 📜 许可证 MIT License ``` 这个 README 全面反映了 TextureLLM 项目的当前状态,包括极速引擎和性能数据,并给出了从入门到调优的清晰指引。