Skip to content

Commit cb88e34

Browse files
committed
altclip export onnx
1 parent f5b51e3 commit cb88e34

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+817
-46
lines changed

.github/workflows/onnx.yml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
name: 'onnx docker'
2+
3+
on:
4+
workflow_dispatch:
5+
push:
6+
branches: ['master']
7+
paths:
8+
- 'onnx/Dockerfile'
9+
- 'onnx/export/**'
10+
- 'onnx/misc/**'
11+
- 'onnx/version.txt'
12+
- '.github/workflow/onnx.yml'
13+
pull_request:
14+
branches: ['master']
15+
paths:
16+
- 'onnx/Dockerfile'
17+
- 'onnx/export/**'
18+
- 'onnx/misc/**'
19+
- 'onnx/version.txt'
20+
- '.github/workflow/onnx.yml'
21+
22+
jobs:
23+
docker:
24+
runs-on: ubuntu-latest
25+
steps:
26+
-
27+
name: Checkout
28+
uses: actions/checkout@v3
29+
-
30+
name: Set Env
31+
run: |
32+
VERSION=$(cat onnx/version.txt)
33+
echo "VERSION=$VERSION" >> $GITHUB_ENV
34+
-
35+
name: Set up QEMU
36+
uses: docker/setup-qemu-action@v2
37+
-
38+
name: Set up Docker Buildx
39+
uses: docker/setup-buildx-action@v2
40+
-
41+
name: Login to Docker Hub
42+
uses: docker/login-action@v2
43+
with:
44+
username: ${{ secrets.DOCKER_USERNAME }}
45+
password: ${{ secrets.DOCKER_PASSWORD }}
46+
-
47+
name: Build and push
48+
uses: docker/build-push-action@v4
49+
with:
50+
context: ./onnx/
51+
platforms: linux/amd64,linux/arm64
52+
push: true
53+
tags: ${{secrets.DOCKER_ORG}}/altclip-onnx:latest, ${{secrets.DOCKER_ORG}}/altclip-onnx:${{env.VERSION}}
54+
cache-from: type=gha
55+
cache-to: type=gha,mode=max
56+
build-args: |
57+
GIT=https://github.com/${{github.repository}}.git

README_zh.md

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@
1717

1818

1919
1. **可通过 API 快速下载模型**
20-
20+
2121
提供 API 方便你快速下载模型,并在给定(中/英文)文本上使用这些预训练模型,在从[SuperGLUE](https://super.gluebenchmark.com/)[CLUE](https://github.com/CLUEbenchmark/CLUE) benchmarks收集的广泛使用的数据集上对它们进行微调。
22-
22+
2323
FlagAI 现已支持 30+ 主流模型,包括多模态模型 [**AltCLIP**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/AltCLIP) 、文生图模型 [**AltDiffusion**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/AltDiffusion) [![Huggingface space](https://img.shields.io/badge/🤗-Huggingface%20Space-cyan.svg)](https://huggingface.co/spaces/BAAI/bilingual_stable_diffusion)、最高百亿参数的 **[悟道GLM](/doc_zh/GLM.md)**[**EVA-CLIP**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/EVA_CLIP)**[Galactica](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/galactica)****OPT****BERT****RoBERTa****GPT2****T5****ALM****Huggingface Transformers** 等。
24-
24+
2525
2. **仅用十行代码即可进行并行训练**
2626

2727
飞智由四个最流行的数据/模型并行库([PyTorch](https://pytorch.org/)/[Deepspeed](https://www.deepspeed.ai/)/[Megatron-LM](https://github.com/NVIDIA/Megatron-LM)/[BMTrain](https://github.com/OpenBMB/BMTrain))提供支持,它们之间实现了无缝集成。 你可以用不到十行代码来并行你的训练/测试过程。
28-
28+
2929
3. **提供提示学习工具包**
3030

3131
FlagAI 提供了提示学习([prompt-learning](https://github.com/FlagAI-Open/FlagAI/blob/master/docs/TUTORIAL_7_PROMPT_LEARNING.md))的工具包,用于少样本学习(few-shot learning)任务。
32-
32+
3333
4. **尤其擅长中文任务**
3434

3535
FlagAI 目前支持的模型可以应用于文本分类、信息提取、问答、摘要、文本生成等任务,尤其擅长中文任务。
@@ -51,40 +51,40 @@
5151

5252
### 模型
5353

54-
| 模型名称 | 任务 | 训练 | 微调 | 推理 | 样例 |
54+
| 模型名称 | 任务 | 训练 | 微调 | 推理 | 样例 |
5555
| :---------------- | :------- | :-- |:-- | :-- | :--------------------------------------------- |
56-
| ALM | 阿拉伯语文本生成 |||| [README.md](/examples/ALM/README.md) |
57-
| AltCLIP | 文图匹配 |||| [README.md](/examples/AltCLIP/README.md) |
58-
| AltCLIP-m18 | 文图匹配 |||| [README.md](examples/AltCLIP-m18/README.md) |
56+
| ALM | 阿拉伯语文本生成 |||| [README.md](/examples/ALM/README.md) |
57+
| AltCLIP | 文图匹配 |||| [README.md](/examples/AltCLIP/README.md) |
58+
| AltCLIP-m18 | 文图匹配 |||| [README.md](examples/AltCLIP-m18/README.md) |
5959
| AltDiffusion | 文生图 |||| [README.md](/examples/AltDiffusion/README.md) |
6060
| AltDiffusion-m18 | 文生图,支持 18 种语言 |||| [README.md](/examples/AltDiffusion-m18/README.md) |
6161
| BERT-title-generation-english | 英文标题生成 |||| [README.md](/examples/bert_title_generation_english/README.md) |
62-
| CLIP | 图文匹配 |||| —— |
63-
| CPM3-finetune | 文本续写 |||| —— |
64-
| CPM3-generate | 文本续写 |||| —— |
62+
| CLIP | 图文匹配 |||| —— |
63+
| CPM3-finetune | 文本续写 |||| —— |
64+
| CPM3-generate | 文本续写 |||| —— |
6565
| CPM3_pretrain | 文本续写 |||| —— |
6666
| CPM_1 | 文本续写 |||| [README.md](/examples/cpm_1/README.md) |
6767
| EVA-CLIP | 图文匹配 |||| [README.md](/examples/EVA_CLIP/README.md) |
68-
| Galactica | 文本续写 |||| —— |
68+
| Galactica | 文本续写 |||| —— |
6969
| GLM-large-ch-blank-filling | 完形填空问答 |||| [TUTORIAL](/doc_zh/TUTORIAL_11_GLM_BLANK_FILLING_QA.md) |
7070
| GLM-large-ch-poetry-generation | 诗歌生成 |||| [TUTORIAL](/doc_zh/TUTORIAL_13_GLM_EXAMPLE_PEOTRY_GENERATION.md) |
7171
| GLM-large-ch-title-generation | 标题生成 |||| [TUTORIAL](/doc_zh/TUTORIAL_12_GLM_EXAMPLE_TITLE_GENERATION.md) |
72-
| GLM-pretrain | 预训练 |||| —— |
73-
| GLM-seq2seq | 生成任务 |||| —— |
74-
| GLM-superglue | 判别任务 |||| —— |
72+
| GLM-pretrain | 预训练 |||| —— |
73+
| GLM-seq2seq | 生成任务 |||| —— |
74+
| GLM-superglue | 判别任务 |||| —— |
7575
| GPT-2-text-writting | 文本续写 |||| [TUTORIAL](/doc_zh/TUTORIAL_18_GPT2_WRITING.md) |
76-
| GPT2-text-writting | 文本续写 |||| —— |
77-
| GPT2-title-generation | 标题生成 |||| —— |
78-
| OPT | 文本续写 |||| [README.md](/examples/opt/README.md) |
76+
| GPT2-text-writting | 文本续写 |||| —— |
77+
| GPT2-title-generation | 标题生成 |||| —— |
78+
| OPT | 文本续写 |||| [README.md](/examples/opt/README.md) |
7979
| RoBERTa-base-ch-ner | 命名实体识别 |||| [TUTORIAL](/doc_zh/TUTORIAL_17_BERT_EXAMPLE_NER.md) |
8080
| RoBERTa-base-ch-semantic-matching | 语义相似度匹配 |||| [TUTORIAL](/doc_zh/TUTORIAL_16_BERT_EXAMPLE_SEMANTIC_MATCHING.md) |
8181
| RoBERTa-base-ch-title-generation | 标题生成 |||| [TUTORIAL](/doc_zh/TUTORIAL_15_BERT_EXAMPLE_TITLE_GENERATION.md) |
82-
| RoBERTa-faq | 问答 |||| [README.md](/examples/roberta_faq/README.md) |
83-
| Swinv1 | 图片分类 |||| —— |
84-
| Swinv2 | 图片分类 |||| —— |
82+
| RoBERTa-faq | 问答 |||| [README.md](/examples/roberta_faq/README.md) |
83+
| Swinv1 | 图片分类 |||| —— |
84+
| Swinv2 | 图片分类 |||| —— |
8585
| T5-huggingface-11b | 训练 |||| [TUTORIAL](/doc_zh/TUTORIAL_14_HUGGINGFACE_T5.md) |
8686
| T5-title-generation | 标题生成 |||| [TUTORIAL](/doc_zh/TUTORIAL_19_T5_EXAMPLE_TITLE_GENERATION.md) |
87-
| T5-flagai-11b | 预训练 |||| —— |
87+
| T5-flagai-11b | 预训练 |||| —— |
8888
| ViT-cifar100 | 预训练 |||| —— |
8989

9090

@@ -144,7 +144,7 @@ ds_report # 检查deepspeed的状态
144144
```
145145
git clone https://github.com/OpenBMB/BMTrain
146146
cd BMTrain
147-
python setup.py install
147+
python setup.py install
148148
```
149149
- [可选] 镜像构建,请参照 [Dockerfile](https://github.com/FlagAI-Open/FlagAI/blob/master/Dockerfile)
150150
- [提示] 单节点docker环境下,运行多卡数据并行需要设置host。 例如,docker节点 [email protected],其端口 7110。
@@ -167,7 +167,7 @@ Host 127.0.0.1
167167
from flagai.auto_model.auto_loader import AutoLoader
168168
auto_loader = AutoLoader(
169169
task_name="title-generation",
170-
model_name="RoBERTa-base-ch"
170+
model_name="RoBERTa-base-ch"
171171
)
172172
model = auto_loader.get_model()
173173
tokenizer = auto_loader.get_tokenizer()
@@ -261,20 +261,23 @@ for text_pair in test_data:
261261

262262
```
263263

264+
### 模型部署
265+
266+
* AltCLIP 部署见 [AltCLIP 的 ONNX 模型导出](./onnx/README.md)
264267

265268
## 动态
266-
- [31 Mar 2023] 支持v1.6.3版本, 增加AltCLIP-m18模型 [#303](https://github.com/FlagAI-Open/FlagAI/pull/303) 以及 AltDiffusion-m18模型 [#302](https://github.com/FlagAI-Open/FlagAI/pull/302);
267-
- [17 Mar 2023] 支持v1.6.2版本, 可以使用新的优化器 [#266](https://github.com/FlagAI-Open/FlagAI/pull/266), 并增加了英文gpt模型GPT2-base-en;
269+
- [31 Mar 2023] 支持v1.6.3版本, 增加AltCLIP-m18模型 [#303](https://github.com/FlagAI-Open/FlagAI/pull/303) 以及 AltDiffusion-m18模型 [#302](https://github.com/FlagAI-Open/FlagAI/pull/302);
270+
- [17 Mar 2023] 支持v1.6.2版本, 可以使用新的优化器 [#266](https://github.com/FlagAI-Open/FlagAI/pull/266), 并增加了英文gpt模型GPT2-base-en;
268271
- [2 Mar 2023] 支持v1.6.1版本, 增加Galactica模型 [#234](https://github.com/FlagAI-Open/FlagAI/pull/234), 大模型推理的低资源工具包BMInf [#238](https://github.com/FlagAI-Open/FlagAI/pull/238), 以及P-tuning样例 [#227](https://github.com/FlagAI-Open/FlagAI/pull/238)
269-
- [12 Jan 2023] 发布v1.6.0版本, 新增支持并行训练库 [**BMTrain**](https://github.com/OpenBMB/BMTrain) 以及集成 [**Flash Attention**](https://github.com/HazyResearch/flash-attention) 到 Bert 和 Vit 模型提速端到端训练, 示例见 [FlashAttentionBERT](https://github.com/FlagAI-Open/FlagAI/blob/master/examples/bert_title_generation_english/train_flash_atten.py)[FlashAttentionViT](https://github.com/FlagAI-Open/FlagAI/blob/master/examples/vit_cifar100/train_single_gpu_flash_atten.py). 同时增加了基于对比搜索的文本生成方法 [**SimCTG**](https://github.com/yxuansu/SimCTG) 以及基于 AltDiffusion 进行 DreamBooth 个性化微调, 示例见 [AltDiffusionNaruto](https://github.com/FlagAI-Open/FlagAI/blob/master/examples/AltDiffusion/dreambooth.py).
272+
- [12 Jan 2023] 发布v1.6.0版本, 新增支持并行训练库 [**BMTrain**](https://github.com/OpenBMB/BMTrain) 以及集成 [**Flash Attention**](https://github.com/HazyResearch/flash-attention) 到 Bert 和 Vit 模型提速端到端训练, 示例见 [FlashAttentionBERT](https://github.com/FlagAI-Open/FlagAI/blob/master/examples/bert_title_generation_english/train_flash_atten.py)[FlashAttentionViT](https://github.com/FlagAI-Open/FlagAI/blob/master/examples/vit_cifar100/train_single_gpu_flash_atten.py). 同时增加了基于对比搜索的文本生成方法 [**SimCTG**](https://github.com/yxuansu/SimCTG) 以及基于 AltDiffusion 进行 DreamBooth 个性化微调, 示例见 [AltDiffusionNaruto](https://github.com/FlagAI-Open/FlagAI/blob/master/examples/AltDiffusion/dreambooth.py).
270273
- [28 Nov 2022] 发布v1.5.0版本, 支持1.1B参数的 [**EVA-CLIP**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/EVA_CLIP) 以及[ALM: 基于GLM的阿拉伯语大模型], 示例见[**ALM**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/ALM)
271274
- [10 Nov 2022] 发布v1.4.0版本, 支持[AltCLIP: 更改CLIP中的语言编码器以扩展语言功能](https://arxiv.org/abs/2211.06679v1), 示例见[**AltCLIP**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/AltCLIP)以及[**AltDiffusion**](https://github.com/FlagAI-Open/FlagAI/tree/master/examples/AltDiffusion)
272275
- [29 Aug 2022] 支持v1.3.0版本, 增加CLIP模块以及重新设计了tokenizer的API: [#81](https://github.com/FlagAI-Open/FlagAI/pull/81)
273276
- [21 Jul 2022] 支持v1.2.0版本, 支持ViT系列模型: [#71](https://github.com/FlagAI-Open/FlagAI/pull/71)
274277
- [29 Jun 2022] 支持v1.1.0版本, 支持OPT的加载,微调和推理[#63](https://github.com/FlagAI-Open/FlagAI/pull/63)
275278
- [17 May 2022] 做出了我们的第一份贡献[#1](https://github.com/FlagAI-Open/FlagAI/pull/1)
276279

277-
## 许可 LICENSE
280+
## 许可 LICENSE
278281

279282

280283
FlagAI飞智大部分项目基于 [Apache 2.0 license](LICENSE),但是请注意部分项目代码基于其他协议:
@@ -299,4 +302,4 @@ FlagAI飞智大部分项目基于 [Apache 2.0 license](LICENSE),但是请注
299302

300303
![Star History Chart](https://api.star-history.com/svg?repos=FlagAI-Open/FlagAI&type=Date)]
301304

302-
</div>
305+
</div>

onnx/.envrc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
export PYTHONPATH=`pwd`:$PYTHONPATH
2+
3+
if [ -f ".env" ]; then
4+
set -o allexport
5+
source .env
6+
set +o allexport
7+
fi
8+

onnx/.gitignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.env
2+
.DS_Store
3+
__pycache__/
4+
5+
/onnx/*
6+
!onnx/.keep
7+
8+
dist/
9+
model/

onnx/.tool-versions

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
python 3.10.11

onnx/Dockerfile

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
FROM ubuntu:23.10
2+
3+
WORKDIR app
4+
5+
ADD ./version.txt version
6+
7+
# sed -i s/ports.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list &&\
8+
# sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list &&\
9+
# sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list &&\
10+
# pip install -i https://mirrors.aliyun.com/pypi/simple/ \
11+
12+
RUN \
13+
apt-get update && \
14+
apt-get install -y git pkg-config bash \
15+
python3-full python3-pip python3-aiohttp &&\
16+
update-alternatives --install /usr/bin/python python /usr/bin/python3 1 &&\
17+
pip install --break-system-packages \
18+
setuptools==66.0.0 \
19+
urllib3==1.26.16 \
20+
scipy transformers huggingface_hub packaging \
21+
tqdm requests cython \
22+
torch onnx && apt-get clean -y
23+
24+
ARG GIT
25+
ENV GIT=$GIT
26+
27+
RUN git clone --depth=1 $GIT
28+
29+
ADD os/ /
30+
31+
RUN cd FlagAI &&\
32+
rm setup.cfg &&\
33+
python setup.py install
34+
35+
RUN pip uninstall -y google-auth
36+
37+
ENV PYTHONPATH /app
38+

onnx/README.md

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# AltCLIP 的 ONNX 模型导出
2+
3+
## ONNX 是什么?
4+
5+
ONNX(Open Neural Network Exchange),开放神经网络交换,用于在各种深度学习训练和推理框架转换的一个中间表示格式。
6+
7+
在实际业务中,可以使用 Pytorch 或者 TensorFlow 训练模型,导出成 ONNX 格式,然后用 ONNX Runtime 直接运行 ONNX。
8+
9+
使用 ONNX 可以减少模型的依赖,降低部署成本。
10+
11+
也可以进一步借助 ONNX 转换成目标设备上运行时支撑的模型格式,比如 [TensorRT Engine](https://developer.nvidia.com/tensorrt)[NCNN](https://github.com/Tencent/ncnn)[MNN](https://github.com/alibaba/MNN) 等格式, 优化性能。
12+
13+
## 下载 AltCLIP 的 ONNX
14+
15+
可以从[xxai/AltCLIP](https://huggingface.co/xxai/AltCLIP/tree/main)下载打包好的 onnx,并解压到 `FlagAI/onnx/onnx/` 下。
16+
17+
如此就可以直接运行 onnx 的测试,而无需下载原始模型运行导出。
18+
19+
## 文件说明
20+
21+
因为 flagai 的依赖复杂,所以构建容器便于导出。
22+
23+
### 脚本
24+
25+
* `./build.sh` 在本地构建容器
26+
27+
可设置环境变量 `ORG=xxai` 使用 [hub.docker.com 上的已构建的镜像](https://hub.docker.com/repository/docker/xxai/altclip-onnx)
28+
29+
比如,运行 `ORG=xxai ./bash.sh`
30+
31+
* `./bash.sh` 在本地进入容器的 bash,方便调试
32+
33+
* `./export.sh` 运行容器,导出 onnx
34+
35+
设置环境变量 MODEL ,可以配置导出、测试脚本运行的模型 。
36+
37+
默认导出的模型是 AltCLIP-XLMR-L-m18 ,还支持以下模型:
38+
39+
* AltCLIP-XLMR-L
40+
* AltCLIP-XLMR-L-m9
41+
42+
* `./dist.sh` 运行容器,导出以上 3 个模型的 onnx,并打包放到 dist 目录下。
43+
44+
### 目录
45+
46+
* model/ 存放下载的模型
47+
* onnx/ 存放导出的 onnx,下载的 onnx 也请解压到这里
48+
49+
### 测试
50+
51+
#### onnx 模型的依赖安装
52+
53+
test/onnx 下面的依赖很简单,只有 transformers 和 onnxruntime,不依赖于 flagai。
54+
55+
onnxruntime 有很多版本可以选择,见[onnxruntime](https://onnxruntime.ai/)
56+
57+
对于 python 而言,常见的运行时推荐如下:
58+
59+
* 显卡 `pip install onnxruntime-gpu`
60+
* ARM 架构的 MAC `pip install onnxruntime-silicon` (目前还不支持 python3.11)
61+
* INTEL 的 CPU `pip install onnxruntime-openvino`
62+
* 其他 CPU `pip install onnxruntime`
63+
64+
运行 [./test/onnx/setup.sh](./test/onnx/setup.sh) 会自动判断环境,选择安装合适的 onnxruntime 版本和 transformers。
65+
66+
#### onnx 模型的测试脚本
67+
68+
请先安装 [direnv](https://github.com/direnv/direnv/blob/master/README.md) 并在本目录下 `direnv allow` 或者手工 `source .envrc` 来设置 PYTHONPATH 环境变量。
69+
70+
* [./test/onnx/onnx_img.py](./test/onnx/onnx_img.py) 生成图片向量
71+
* [./test/onnx/onnx_txt.py](./test/onnx/onnx_txt.py) 生成文本向量
72+
* [./test/onnx/onnx_test.py](./test/onnx/onnx_test.py) 匹配图片向量和文本向量,进行零样本分类
73+
74+
如果想把生成的文本向量和图片向量存入数据库,进行相似性搜索,请先对特征进行归一化。
75+
76+
```python
77+
image_features /= image_features.norm(dim=-1, keepdim=True)
78+
text_features /= text_features.norm(dim=-1, keepdim=True)
79+
```
80+
81+
可借助向量数据库,提升零样本分类的准确性,参见[ECCV 2022 | 无需下游训练,Tip-Adapter 大幅提升 CLIP 图像分类准确率](https://cloud.tencent.com/developer/article/2126102)
82+
83+
#### pytorch 模型
84+
85+
用于对比 onnx 模型的向量输出,查看是否一致。
86+
87+
因为用到了 flagai,请如下图所示运行 [./bash.sh ](./bash.sh) 进入容器运行调试。
88+
89+
![](https://pub-b8db533c86124200a9d799bf3ba88099.r2.dev/2023/06/ei64CNo.webp)
90+
91+
* [./test/clip/clip_img.py](./test/clip/clip_img.py) 生成图片向量
92+
* [./test/clip/clip_txt.py](./test/clip/clip_txt.py) 生成文本向量
93+
* [./test/clip/clip_test.py](./test/clip/clip_test.py) 匹配图片向量和文本向量,进行零样本分类

0 commit comments

Comments
 (0)