File size: 10,583 Bytes
aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf 4f1e38f aa60bbf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# VisCPM
简体中文 | [English](README_en.md)
<p align="center">
<p align="left">
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202-dfd.svg"></a>
<a href=""><img src="https://img.shields.io/badge/python-3.8+-aff.svg"></a>
</p>
`VisCPM` is a family of open-source large multimodal models, which support multimodal conversational capabilities (`VisCPM-Chat` model) and text-to-image generation capabilities (`VisCPM-Paint` model) in both Chinese and English, achieving state-of-the-art peformance among Chinese open-source multimodal models. `VisCPM` is trained based on the large language model [CPM-Bee](https://github.com/OpenBMB/CPM-Bee) with 10B parameters, fusing visual encoder (Q-Former) and visual decoder (Diffusion-UNet) to support visual inputs and outputs. Thanks to the good bilingual capability of CPM-Bee, `VisCPM` can be pre-trained with English multimodal data only and well generalize to achieve promising Chinese multimodal capabilities.
`VisCPM`是一个开源的多模态大模型系列,支持中英双语的多模态对话能力(`VisCPM-Chat`模型)和文到图生成能力(`VisCPM-Paint`模型),在中文多模态开源模型中达到最佳水平。`VisCPM`基于百亿参数量语言大模型[CPM-Bee](https://github.com/OpenBMB/CPM-Bee)(10B)训练,融合视觉编码器(`Q-Former`)和视觉解码器(`Diffusion-UNet`)以支持视觉信号的输入和输出。得益于`CPM-Bee`底座优秀的双语能力,`VisCPM`可以仅通过英文多模态数据预训练,泛化实现优秀的中文多模态能力。
## VisCPM-Chat
`VisCPM-Chat`支持面向图像进行中英双语多模态对话。该模型使用`Q-Former`作为视觉编码器,使用CPM-Bee(10B)作为语言交互基底模型,并通过语言建模训练目标融合视觉和语言模型。模型训练包括预训练和指令精调两阶段:
* 预训练:我们使用约100M高质量英文图文对数据对`VisCPM-Chat`进行了预训练,数据包括CC3M、CC12M、COCO、Visual Genome、Laion等。在预训练阶段,语言模型参数保持固定,仅更新`Q-Former`部分参数,以支持大规模视觉-语言表示的高效对齐。
* 指令精调:我们采用[LLaVA-150K](https://llava-vl.github.io/)英文指令精调数据,并混合相应翻译后的中文数据对模型进行指令精调,以对齐模型多模态基础能力和用户使用意图。在指令精调阶段,我们更新全部模型参数,以提升指令精调数据的利用效率。有趣的是,我们发现即使仅采用英文指令数据进行指令精调,模型也可以理解中文问题,但仅能用英文回答。这表明模型的多语言多模态能力已经得到良好的泛化。在指令精调阶段进一步加入少量中文翻译数据,可以将模型回复语言和用户问题语言对齐。
我们在LLaVA英文测试集和翻译的中文测试集对模型进行了评测,该评测基准考察模型在开放域对话、图像细节描述、复杂推理方面的表现,并使用GPT-4进行打分。可以观察到,`VisCPM-Chat`在中文多模态能力方面取得了最佳的平均性能,在通用域对话和复杂推理表现出色,同时也表现出了不错的英文多模态能力。
<table>
<tr>
<td align="center" rowspan="2" colspan="2">模型</td>
<td align="center" colspan="4">英文</td>
<td align="center" colspan="4">中文</td>
</tr>
<tr>
<td align="center">多模态对话</td>
<td align="center">细节描述</td>
<td align="center">复杂推理</td>
<td align="center">平均</td>
<td align="center">多模态对话</td>
<td align="center">细节描述</td>
<td align="center">复杂推理</td>
<td align="center">平均</td>
</tr>
<tr>
<td align="center" rowspan="3">英文模型</td>
<td align="center">MiniGPT4</td>
<td align="center">65</td>
<td align="center">67.3</td>
<td align="center">76.6</td>
<td align="center">69.7</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">InstructBLIP</td>
<td align="center">81.9</td>
<td align="center">68</td>
<td align="center">91.2</td>
<td align="center">80.5</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">LLaVA</td>
<td align="center">89.5</td>
<td align="center">70.4</td>
<td align="center">96.2</td>
<td align="center">85.6</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center" rowspan="4">中英双语</td>
<td align="center">mPLUG-Owl </td>
<td align="center">64.6</td>
<td align="center">47.7</td>
<td align="center">80.1</td>
<td align="center">64.2</td>
<td align="center">76.3</td>
<td align="center">61.2</td>
<td align="center">77.8</td>
<td align="center">72</td>
</tr>
<tr>
<td align="center">VisualGLM</td>
<td align="center">62.4</td>
<td align="center">63</td>
<td align="center">80.6</td>
<td align="center">68.7</td>
<td align="center">76.6</td>
<td align="center">87.8</td>
<td align="center">83.6</td>
<td align="center">82.7</td>
</tr>
<tr>
<td align="center">Ziya (LLaMA 13B)</td>
<td align="center">82.7</td>
<td align="center">69.9</td>
<td align="center">92.1</td>
<td align="center">81.7</td>
<td align="center">85</td>
<td align="center">74.7</td>
<td align="center">82.4</td>
<td align="center">80.8</td>
</tr>
<tr>
<td align="center">VisCPM-Chat</td>
<td align="center">83.3</td>
<td align="center">68.9</td>
<td align="center">90.5</td>
<td align="center">81.1</td>
<td align="center">92.7</td>
<td align="center">76.1</td>
<td align="center">89.2</td>
<td align="center">86.3</td>
</tr>
</table>
## VisCPM-Paint
`VisCPM-Paint`支持中英双语的文到图生成。该模型使用CPM-Bee(10B)作为文本编码器,使用`UNet`作为图像解码器,并通过扩散模型训练目标融合语言和视觉模型。在训练过程中,语言模型参数始终保持固定。我们使用[Stable Diffusion 2.1](https://github.com/Stability-AI/stablediffusion)的UNet参数初始化视觉解码器,并通过逐步解冻其中关键的桥接参数将其与语言模型融合:首先训练文本表示映射到视觉模型的线性层,然后进一步解冻`UNet`的交叉注意力层。该模型在[LAION 2B](https://laion.ai/)英文图文对数据上进行了训练。
与`VisCPM-Chat`类似,我们发现得益于CPM-Bee的双语能力,`VisCPM-Paint`可以仅通过英文图文对训练,泛化实现良好的中文文到图生成能力,达到中文开源模型的最佳效果。通过进一步加入20M清洗后的原生中文图文对数据,以及120M翻译到中文的图文对数据,模型的中文文到图生成能力可以获得进一步提升。我们在MSCOCO上采样了3万张图片,计算了FID(Fréchet Inception Distance)和Clip Score,前者用于评估生成图片的质量,后面用于评估生成的图片与输入的匹配程度。
<table>
<tr>
<td align="center" rowspan="2">模型</td>
<td align="center" colspan="2">英文</td>
<td align="center" colspan="2">中文</td>
</tr>
<tr>
<td align="center">FID↓</td>
<td align="center">CLIP Score↑</td>
<td align="center">FID↓</td>
<td align="center">CLIP Score↑</td>
</tr>
<tr>
<td align="center">AltDiffusion</td>
<td align="center">17.16</td>
<td align="center">25.24</td>
<td align="center">16.09</td>
<td align="center">24.05</td>
</tr>
<tr>
<td align="center">TaiyiDiffusion</td>
<td align="center">-</td>
<td align="center">-</td>
<td align="center">15.58</td>
<td align="center">22.69</td>
</tr>
<tr>
<td align="center">Stable Diffusion</td>
<td align="center">9.08</td>
<td align="center">26.22</td>
<td align="center">-</td>
<td align="center">-</td>
</tr>
<tr>
<td align="center">VisCPM-Paint-en</td>
<td align="center">9.51</td>
<td align="center">25.35</td>
<td align="center">10.86</td>
<td align="center">23.38</td>
</tr>
<tr>
<td align="center">VisCPM-Paint-zh</td>
<td align="center">9.98</td>
<td align="center">25.04</td>
<td align="center">9.65</td>
<td align="center">24.17</td>
</tr>
</table>
# 安装
```Shell
conda create -n viscpm python=3.10 -y
conda activate viscpm
pip install setuptools
pip install diffusers jieba matplotlib numpy opencv_python
pip install pandas Pillow psutil pydantic scipy
pip install torch==1.13.1 torchscale==0.2.0 torchvision==0.14.1 timm
pip install transformers==4.28.0
pip install tqdm typing_extensions
pip install git+https://github.com/thunlp/OpenDelta.git
pip install git+https://github.com/OpenBMB/CPM-Bee.git#egg=cpm-live&subdirectory=src
```
VisCPM需要单卡40GB以上的GPU运行,我们会在尽快更新更加节省显存的推理方式。
## 使用
```python
>>> from transformers import AutoModel, AutoTokenizer, AutoImageProcessor
>>> from PIL import Image
>>> tokenizer = AutoTokenizer.from_pretrained('viscpm', trust_remote_code=True)
>>> processor = AutoImageProcessor.from_pretrained('viscpm', trust_remote_code=True)
>>> model = AutoModel.from_pretrained('viscpm', trust_remote_code=True).to('cuda')
>>> data = [{
>>> 'context': '',
>>> 'question': 'describe this image in detail.',
>>> 'image': tokenizer.unk_token * model.query_num,
>>> '<ans>': ''
>>> }]
>>> image = Image.open('case.jpg')
>>> result = model.generate(data, tokenizer, processor, image)
>>> print(result[0]['<ans>'])
这幅图片显示了一群热气球在天空中飞行。这些热气球漂浮在不同的地方,包括山脉、城市和乡村地区。
``` |