近年来,NPU的广泛使用为LLM,特别是MLLM提供了更多的训练和使用资源。 但目前NPU的使用还存在或多或少的适配问题。 因此,我们提供了一个框架,可以灵活地选择不同的视觉编码器、适配器、LLM和相应的生成组件,组成MLLM进行训练、推理和图像生成。
例如,我们给出了一个基于该框架的高性能MLLM(即SEED-X)的实现。当然,您也可以选择该框架中的不同模块来构建您自己的MLLM。
-
MLLM:用于多模式理解的标准多模式大型语言模型。
-
SEED-X: 一个统一的、通用的基础模型,通过统一的多粒度理解和生成,能够响应各种用户需求。
-
模块化设计: 该项目非常灵活,可以轻松地通过配置更改大型语言模型或视觉编码器。
-
训练秘诀 该项目提供了在(Ascend)NPU 上对多模态大型语言模型进行预训练或监督微调的完整代码。
- 2024-07-08 🔥 我们发布基于NPU的多模态推理和预训练代码,以及使用SEED-X的多种方式。
该项目正在积极开发中,敬请期待☕️!
- NPU上的模型库。
- 多模态评测。
-
依赖项和环境
-
python >= 3.8 (推荐使用Anaconda)
-
- CANN版本
> cat /usr/local/Ascend/ascend-toolkit/latest/x86_64-linux/ascend_toolkit_install.info package_name=Ascend-cann-toolkit version=8.0.T6 innerversion=V100R001C17B214 compatible_version=[V100R001C15,V100R001C18],[V100R001C30],[V100R001C13],[V100R003C11],[V100R001C29],[V100R001C10] arch=x86_64 os=linux path=/usr/local/Ascend/ascend-toolkit/8.0.T6/x86_64-linux
-
-
安装
- 克隆仓库并安装依赖包
git clone https://github.com/TencentARC/mllm-npu.git cd mllm-npu pip install -r requirements.txt
为了快速试用这个框架,您可以执行以下脚本。
# 图像理解
python ./demo/img2txt_inference.py
# 图像生成
python ./demo/txt2img_generation.py
要在本地启动 Gradio 演示,请逐个运行以下命令。如果您计划启动多个模型工作器来比较不同的检查点,则只需启动控制器和 Web 服务器一次。
-
启动 contoller
python mllm_npu/serve/controller.py --host 0.0.0.0 --port 10000
-
启动一个 model worker
python mllm_npu/serve/worker.py --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000
-
启动一个 gradio 页面应用
python mllm_npu/serve/gradio_app.py
-
您也可以通过API使用该服务,格式请参见 demo
{ "input_text": "put your input text here", "image": "put your input image (base64)", "image_gen": False or True }
我们主要采用 mllm.py 中的 GeneraliazedMultimodalModels
作为多模态大型语言模型的通用架构,例如 LLaVA,它包含三个基本模块:
- (1) 一个大语言模型, e.g., LLaMA-2;
- (2) 一个映射层将图像投影到输入表征;
- (3) 一个视觉编码器, e.g., ViT。
MLLM 是根据使用 hydra.utils.instantiate
的模型配置构建的,你可以在 models 中找到一些示例。
具体来说,我们现在支持两种主流的架构:
-
标准多模态模型(
GeneraliazedMultimodalModels
):旨在实现多模态理解,包含视觉编码器、视觉语言投影仪和大型语言模型。 -
SEED-X (
SEED
):用于理解和生成的多功能多模态模型,通过输出投影仪扩展标准多模态模型,以生成具有稳定扩散的图像。架构 任意分辨率 理解 生成 MLLM ✔️ ✔️ ✖️ SEED-X ✔️ ✔️ ✔️
你可以准备自己的数据来预训练或微调你的模型。具体来说,我们提供了四种不同的任务和相应的格式(请参考 examples)。为了更有效地使用数据,我们使用 webdataset 来组织数据。此外,数据的索引请参考 data.yaml。你可以通过在此文件中设置来调整数据采样率和其他设置。
更多数据信息请参考数据集。
对于多模态理解,我们需要向标记器添加特殊标记,例如 <img>
或 <patch>
,您可以在 scripts/tools/add_special_tokens_to_tokenizer.py 中指定标记器的路径,然后直接运行此脚本以获取更新的标记器。
你需要在训练脚本中指定模型配置和数据配置,例如scripts/mllm_llama3_8b_siglip_vit_pretrain.sh
。
bash scripts/mllm_llama3_8b_siglip_vit_pretrain.sh
对于有监督微调,您可以保持大多数设置不变,然后:
- 通过模型配置文件中的“pretrained_model_name_path”指定 SFT 的初始权重。
- 调整 SFT 数据及其指令格式。
- 其余操作按照预训练脚本进行。
coming soon
如果您发现该作品有帮助,请考虑引用:
-
mllm-npu
@misc{mllm_npu title={mllm-npu}, author={Li, Chen and Cheng, Tianheng and Ge, Yuying and Wang, Teng and Ge, Yixiao}, howpublished={\url{https://github.com/TencentARC/mllm-npu}}, year={2024}, }
-
SEED-X
@article{ge2024seed, title={SEED-X: Multimodal Models with Unified Multi-granularity Comprehension and Generation}, author={Ge, Yuying and Zhao, Sijie and Zhu, Jinguo and Ge, Yixiao and Yi, Kun and Song, Lin and Li, Chen and Ding, Xiaohan and Shan, Ying}, journal={arXiv preprint arXiv:2404.14396}, year={2024} }
该项目遵循 Apache-2.0 许可证。对于使用 LLaMA 或 Qwen 模型构建的模型,也请遵守其许可证!
本项目是基于 SEED-X 源代码开发的。