seemore
从零实现GPT-4V架构,纯PyTorch手写多模态模型的学习项目
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
从零实现GPT-4V架构,纯PyTorch手写多模态模型的学习项目
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2023年,GPT-4V横空出世,引发了行业震动。彼时大多数开发者对"视觉+语言"多模态模型的认知,还停留在调用API的层面。Avi Soori——一位当时正在 Databricks 从事机器学习研究的研究者——决定自己动手,把 GPT-4V 的核心架构从零实现一遍。
这个项目的名字叫 Seemore,取自 Andrej Karpathy 的经典 NLP 项目 makemore("make more characters")的呼应:看更多(see more)——不是简单调用 API,而是真正理解一张图片进入模型后,是如何被编码、投影、解码,最终生成文字描述的。
这个项目在 GitHub 上迅速获得了关注,star 数稳步增长,目前已达 260+。作者还专门写了配套博客,并将其发布在 Hugging Face 上,供更多读者参考。
Seemore 的设计非常清晰,整个模型由三个相互配合的核心模块组成:
视觉编码器的作用,是把一张图片转化成模型能理解的"数字表示"——也就是向量。Seemore 采用的是从头实现的 Vision Transformer(ViT),这是 CLIP 等主流多模态模型的核心组件。
其工作原理是:将输入图片划分为固定大小的 patch(如 16×16 像素),每个 patch 通过一个卷积层(Conv2d)映射为一个嵌入向量,再加上位置编码(Positional Embedding)和一个可学习的 [CLS] token,最后送入多层 Transformer Block 进行处理。代码完全手写,包括 nn.MultiHeadAttention 的 Q/K/V 计算和 Scaled Dot-Product Attention,不依赖任何预训练权重。
这是整个 VLM 架构中最关键的设计之一:图片的 embedding 维度和文本的 embedding 维度通常并不相同。以 CLIP 的 ViT 为例,其输出可能是 768 维,而 LLaMA 等语言模型的 embedding 维度可能是 4096 维。
投影器的作用,就是用一个小型的 MLP(多层感知机)把图片 token 的维度"翻译"成与文本 token 一致的维度,使得两者可以在同一个向量空间中进行融合。这一步虽然简单,但在 LLaVA、Qwen-VL 等真实生产模型中扮演着同样的角色。
解码器负责根据融合后的多模态 token 序列,自回归地生成文本描述。Seemore 实现的是一个字符级(character-level)的 GPT 风格解码器,同样从零构建,不依赖预训练语言模型。
具体来说,解码器使用了标准的 Transformer Decoder 架构,包含:带 causal mask(因果掩码)的多头自注意力(确保生成时只能看到前面的 token)、前馈神经网络(MLP)、残差连接和 LayerNorm。训练数据来自 TinyShakespeare 语料库,配合 base64 编码的图片描述对(存储在 images/inputs.csv)。
在标准版之外,项目还提供了一个 稀疏混合专家(Sparse Mixture of Experts, MoE) 版本 seeMoE.py。在 MoE 架构中,每次前向传播只激活部分"专家"(MLP 模块),通过门控网络(Router)动态选择,从而在参数量大幅增加的同时,保持计算量相对可控。这与 Grok-1.5V 等前沿多模态模型的设计思路一脉相承。
| 维度 | 评价 |
|---|---|
| 核心框架 | 纯 PyTorch,无任何高层框架封装 |
| 代码风格 | 模块化清晰,.py 单文件 + modules/ 子目录 |
| 可读性 | 极高(作者明确强调"readability over performance") |
| 文档 | 完整 README + 配套博客 + Jupyter Notebook |
| 测试 | 无自动化测试(研究导向) |
| 许可 | MIT |
代码结构如下:
seemore.py / seeMoE.py ← 完整单文件实现
modules/
├── vision_transformer.py ← ViT 编码器
├── vision_language_model.py ← 多模态主体
├── multimodal_projector.py ← 投影 MLP
├── attention.py ← 注意力机制
├── block.py ← Transformer Block
├── decoder_language_model.py← 语言解码器
└── mlp.py ← 前馈网络
依赖项非常轻量:torch、PIL、pandas、torchvision,可选 mlflow 用于训练过程可视化。在 Databricks 环境中开发(可使用单卡 A100),本地运行推荐 4GB+ RAM 的 GPU 环境。
适用场景:
局限性:
Seemore 项目的核心价值,不在于它是一个生产可用的多模态模型,而在于它提供了一条从理论到代码的完整路径。
近年来,视觉语言模型的发展日新月异——从 GPT-4V 到 Gemini,从 LLaVA 到 Qwen-VL,模型越来越大,能力越来越强。但越是如此,越需要有人把底层原理讲清楚、代码写明白。
Avi Soori 做到了这一点。他不仅开源了代码,还写了详尽的博客,配合 Jupyter Notebook,让任何有一定 PyTorch 基础的人,都能一步步理解:一张图片如何变成 token、维度如何对齐、多模态信息如何融合、文本如何自回归生成。
这种"白盒"精神,正是开源社区最珍贵的品质。
项目基本信息
| 属性 | 值 |
|---|---|
| Stars | 260+ |
| 语言 | Jupyter Notebook / Python |
| 许可 | MIT |
| 主分支 | main |
| 开发环境 | Databricks (A100) |
| 核心依赖 | PyTorch, PIL, torchvision, pandas, mlflow |