"AnyGPT:基于离散序列建模的统一多模态大语言模型"论文官方仓库
<a href='https://junzhan2000.github.io/AnyGPT.github.io/'><img src='https://img.shields.io/badge/项目-主页-绿色'>``</a>
<a href='https://arxiv.org/pdf/2402.12226.pdf'><img src='https://img.shields.io/badge/论文-Arxiv-红色'>``</a>
简介
我们推出了AnyGPT,这是一个任意模态间转换的多模态语言模型,它利用离散表示统一处理语音、文本、图像和音乐等各种模态。基础模型对这四种模态进行对齐,实现不同模态与文本之间的相互转换。此外,我们基于各种生成模型构建了AnyInstruct数据集,其中包含任意模态间转换的指令。在该数据集上训练后,我们的对话模型能够进行自由的多模态对话,可以随意插入多模态数据。
AnyGPT提出了一种生成式训练方案,将所有模态数据转换为统一的离散表示,使用下一个标记预测任务在大语言模型(LLM)上进行统一训练。从"压缩即智能"的角度来看:当分词器的质量足够高,且LLM的困惑度(PPL)足够低时,就有可能将互联网上大量的多模态数据压缩到同一个模型中,从而产生纯文本LLM所不具备的能力。 演示示例可在项目主页查看。
示例演示
开源清单
- 基础模型
- 对话模型
- 推理代码
- 指令数据集
推理
安装
git clone https://github.com/OpenMOSS/AnyGPT.git
cd AnyGPT
conda create --name AnyGPT python=3.9
conda activate AnyGPT
pip install -r requirements.txt
模型权重
- 查看AnyGPT-base权重:fnlp/AnyGPT-base
- 查看AnyGPT-chat权重:fnlp/AnyGPT-chat
- 查看SpeechTokenizer和Soundstorm权重:fnlp/AnyGPT-speech-modules
- 查看SEED分词器权重:AILab-CVC/seed-tokenizer-2
SpeechTokenizer用于语音的分词和重构,Soundstorm负责补全副语言信息,SEED-tokenizer用于图像分词。
用于重构图像的unCLIP SD-UNet模型权重和用于音乐分词和重构的Encodec-32k模型权重将自动下载。
基础模型命令行推理
python anygpt/src/infer/cli_infer_base_model.py \
--model-name-or-path "path/to/AnyGPT-7B-base" \
--image-tokenizer-path 'path/to/model' \
--speech-tokenizer-path "path/to/model" \
--speech-tokenizer-config "path/to/config" \
--soundstorm-path "path/to/model" \
--output-dir "infer_output/base"
例如
python anygpt/src/infer/cli_infer_base_model.py \
--model-name-or-path models/anygpt/base \
--image-tokenizer-path models/seed-tokenizer-2/seed_quantizer.pt \
--speech-tokenizer-path models/speechtokenizer/ckpt.dev \
--speech-tokenizer-config models/speechtokenizer/config.json \
--soundstorm-path models/soundstorm/speechtokenizer_soundstorm_mls.pt \
--output-dir "infer_output/base"
交互
基础模型可以执行各种任务,包括文本生成图像、图像描述、自动语音识别(ASR)、零样本文本转语音(TTS)、文本生成音乐和音乐描述。
我们可以按照特定的指令格式进行推理。
- 文本生成图像
text|image|{caption}
- 示例:
text|image|一个繁忙的中世纪集市场景,摊贩在五颜六色的帐篷下售卖奇异商品
- 图像描述
image|text|{caption}
- 示例:
image|text|static/infer/image/cat.jpg
- TTS(随机声音)
text|speech|{speech content}
- 示例:
text|speech|我可以被囚禁在果壳之中,却仍自以为是无限宇宙之王。
- 零样本TTS
text|speech|{speech content}|{voice prompt}
- 示例:
text|speech|我可以被囚禁在果壳之中,却仍自以为是无限宇宙之王。|static/infer/speech/voice_prompt3.wav
- ASR
speech|text|{speech file path}
- 示例:
speech|text|AnyGPT/static/infer/speech/voice_prompt2.wav
- 文本生成音乐
text|music|{caption}
- 示例:
text|music|具有独立摇滚风格,带有独特元素,营造梦幻、舒缓的氛围
- 音乐描述
music|text|{music file path}
- 示例:
music|text|static/infer/music/features an indie rock sound with distinct element.wav
注意事项
对于不同的任务,我们使用了不同的语言模型解码策略。图像、语音和音乐生成的解码配置文件分别位于config/image_generate_config.json
、config/speech_generate_config.json
和config/music_generate_config.json
中。其他模态到文本的解码配置文件位于config/text_generate_config.json
中。你可以直接修改或添加参数来改变解码策略。
由于数据和训练资源的限制,模型的生成可能仍不稳定。你可以多次生成或尝试不同的解码策略。
语音和音乐响应将保存为.wav
文件,图像响应将保存为jpg
文件。文件名将是提示和时间的组合。这些文件的路径将在响应中指明。
对话模型命令行推理
python anygpt/src/infer/cli_infer_chat_model.py
\ --model-name-or-path 'path/to/model'
\ --image-tokenizer-path 'path/to/model'
\ --speech-tokenizer-path 'path/to/model'
\ --speech-tokenizer-config 'path/to/config'
\ --soundstorm-path 'path/to/model'
\ --output-dir "infer_output/chat"
例如
python anygpt/src/infer/cli_infer_chat_model.py
\ --model-name-or-path models/anygpt/chat
\ --image-tokenizer-path models/seed-tokenizer-2/seed_quantizer.pt
\ --speech-tokenizer-path models/speechtokenizer/ckpt.dev
\ --speech-tokenizer-config models/speechtokenizer/config.json
\ --soundstorm-path models/soundstorm/speechtokenizer_soundstorm_mls.pt
\ --output-dir "infer_output/chat"
指令格式
interleaved|{文本指令}|{模态}|{图像路径}|{语音提示}|{语音指令}|{音乐路径}
其中 文本指令
是输入的文本命令,语音指令
是输入的语音命令;只需要指定其中一个。
图像路径
和 音乐路径
分别是输入图像和音乐的路径。语音提示
是指定模型回复的语气;如果不指定,则使用随机语气。
模态
指的是输出模态的类型,可以选择为语音、图像或音乐;否则被视为文本。这只会影响模型使用config目录下的哪个解码配置文件(这是因为模型的训练受限,导致不同模态的解码策略不同)。也可以逐个token解码,在生成模态的起始token时修改解码策略为对应模态。
示例
- interleaved||image|||static/infer/speech/instruction/Can you draw me a picture of a sunny beach.wav
- interleaved||music|||static/infer/speech/instruction/Give me a similar style of music.wav
要清除对话历史,请输入 |clear
预训练和SFT
请参考 scripts/stage1_pretrain.sh
和 scripts/stage2_sft.sh
我们提供了训练数据样本以供参考。训练格式的组织包括data/pretrain中的预训练数据和data/instruction中的指令数据。 对于不同任务的提示,请参考task_prompts,如纯文本对话、语音命令文本回复、文本命令语音回复,以及各种任务的特殊提示。您需要根据任务模板提前将多模态数据处理成多轮对话格式。 我们在命令数据中以语音对话为例,对应使用"Speech-Instruction"和"Speech-Response"中的task_prompts:
[
{
"role": "user",
"message": "<sosp><🗣️1><🗣️1><🗣️1><eosp> 请确认用户的语音输入,创建一个文本回复"
},
{
"role": "assistant",
"message": "<-Ins-> 你好,你好吗\n <-Res-> 我很好,谢谢 <sosp><🗣️2><🗣️2><🗣️2><eosp>"
}
]
致谢
- SpeechGPT,Vicuna:我们构建的代码基础。
- 我们感谢来自SpeechTokenizer、soundstorm-speechtokenizer、SEED-tokenizer的优秀工作。
许可证
引用
如果您在研究或应用中发现AnyGPT和AnyInstruct有用,请kindly引用:
@article{zhan2024anygpt,
title={AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling},
author={Zhan, Jun and Dai, Junqi and Ye, Jiasheng and Zhou, Yunhua and Zhang, Dong and Liu, Zhigeng and Zhang, Xin and Yuan, Ruibin and Zhang, Ge and Li, Linyang and others},
journal={arXiv preprint arXiv:2402.12226},
year={2024}
}