模型简介
模型特点
模型能力
使用案例
语言:
- 多语言 许可证: apache-2.0 库名: transformers 标签:
- 自然语言处理
- 代码
- 视觉
- 化学
- 工程
- 生物学
- 仿生学
- 文本生成推理
- 材料科学 管道标签: 图像文本到文本 推理: 参数: 温度: 0.3 小部件:
- 消息:
- 角色: 用户 内容: <|image_1|>你能描述一下你在图片中看到的内容吗?
模型概述
Cephalo是一系列专注于多模态材料科学的视觉大语言模型(V-LLMs),旨在整合视觉和语言数据,以促进人机交互或多智能体AI框架中的高级理解和交互。
Cephalo开发的一个新颖之处在于创新的数据集生成方法。提取过程采用先进的算法,从复杂的PDF文档中准确检测和分离图像及其对应的文本描述。该方法涉及从PDF中提取图像和标题,创建合理的图像-文本对,并利用大语言模型(LLMs)进行自然语言处理。这些图像-文本对随后通过基于LLM的自然语言处理进行细化和验证,确保训练数据的高质量和上下文相关性。
Cephalo能够解释复杂的视觉场景,并生成上下文准确的语言描述和回答查询。
该模型开发用于处理多样化的输入,包括图像和文本,支持广泛的应用,如图像字幕生成、视觉问答和多模态内容生成。其架构结合了视觉编码器模型和自回归变换器,以处理复杂的自然语言理解。
Cephalo提供了一个强大的多模态交互和理解框架,包括开发复杂的生成管道,以创建材料微观结构的2D和3D渲染,作为增材制造方法的输入。
此版本的Cephalo,lamm-mit/Cephalo-Idefics-2-vision-10b-alpha,基于https://huggingface.co/lamm-mit/Cephalo-Idefics-2-vision-8b-beta和HuggingFaceM4/idefics2-8b-chatty模型的合并扩展。这种方法使我们能够增加模型的深度,并专注于学习网络更深层中更复杂的表示和关联。
模型训练分为几个阶段:
步骤1:通过微调HuggingFaceM4/idefics2-8b-chatty模型训练https://huggingface.co/lamm-mit/Cephalo-Idefics-2-vision-8b-beta。
步骤2:将https://huggingface.co/lamm-mit/Cephalo-Idefics-2-vision-8b-beta的解码器与HuggingFaceM4/idefics2-8b-chatty解码器的最后8层结合。
步骤3:微调合并后的模型,该模型现在有40个解码器层,总计10b参数。
模型在从维基百科和科学论文中提取的科学文本-图像数据组合上进行训练。有关基础模型的更多细节,请参见:https://huggingface.co/HuggingFaceM4/idefics2-8b-chatty。关于模型的技术方面、训练和材料科学问题应用示例的更多细节在论文中提供(见底部参考文献)。
聊天格式
lamm-mit/Cephalo-Idefics-2-vision-10b-alpha模型适用于一个或多个图像输入,使用以下聊天格式的提示:
用户:你仔细研究图像,并准确但简洁地回应。逐步思考。
<image>这张图片展示了什么,对材料设计有何意义?包括对多智能体AI的讨论。<end_of_utterance>
助手:
模型在助手:
后生成文本。对于多轮对话,提示应格式化为:
用户:你仔细研究图像,并准确但简洁地回应。逐步思考。
<image>这张图片展示了什么,对材料设计有何意义?包括对多智能体AI的讨论。<end_of_utterance>
助手:图片描绘了蚂蚁用腿和爪子在垂直表面上攀爬。这种行为在自然界中观察到,可以启发设计模仿这些昆虫协调运动的多智能体AI系统。其意义在于这些系统在机器人和材料科学中的潜在应用,其中高效和适应性强的运动至关重要。<end_of_utterance>
用户:这如何用于设计抗断裂材料?<end_of_utterance>
助手:
如果需要手动设置聊天模板:
IDEFICS2_CHAT_TEMPLATE = "{% for message in messages %}{{message['role'].capitalize()}}{% if message['content'][0]['type'] == 'image' %}{{':'}}{% else %}{{': '}}{% endif %}{% for line in message['content'] %}{% if line['type'] == 'text' %}{{line['text']}}{% elif line['type'] == 'image' %}{{ '<image>' }}{% endif %}{% endfor %}<end_of_utterance>\n{% endfor %}{% if add_generation_prompt %}{{ 'Assistant:' }}{% endif %}"
示例推理代码
以下代码片段展示了如何在GPU上快速开始:
from PIL import Image
import requests
DEVICE='cuda:0'
from transformers import AutoProcessor, Idefics2ForConditionalGeneration
from tqdm.notebook import tqdm
model_id='lamm-mit/Cephalo-Idefics-2-vision-10b-alpha'
model = Idefics2ForConditionalGeneration.from_pretrained( model_id,
torch_dtype=torch.bfloat16, #如果GPU支持
_attn_implementation="flash_attention_2", #确保安装了Flash Attention 2
trust_remote_code=True,
).to (DEVICE)
processor = AutoProcessor.from_pretrained(
f"{model_id}",
do_image_splitting=True
)
参见末尾部分关于模型优化的更多评论,包括量化。
如果需要手动设置聊天模板:
IDEFICS2_CHAT_TEMPLATE = "{% for message in messages %}{{message['role'].capitalize()}}{% if message['content'][0]['type'] == 'image' %}{{':'}}{% else %}{{': '}}{% endif %}{% for line in message['content'] %}{% if line['type'] == 'text' %}{{line['text']}}{% elif line['type'] == 'image' %}{{ '<image>' }}{% endif %}{% endfor %}<end_of_utterance>\n{% endfor %}{% if add_generation_prompt %}{{ 'Assistant:' }}{% endif %}"
tokenizer = AutoTokenizer.from_pretrained(base_model_id, use_fast=True)
tokenizer.chat_template = IDEFICS2_CHAT_TEMPLATE
processor.tokenizer = tokenizer
简单推理示例:
from transformers.image_utils import load_image
image = load_image("https://d2r55xnwy6nx47.cloudfront.net/uploads/2018/02/Ants_Lede1300.jpg")
# 创建输入
messages = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "这张图片展示了什么,对材料设计有何意义?包括对多智能体AI的讨论。"},
]
},
]
prompt = processor.apply_chat_template(messages, add_generation_prompt=True)
# 使用处理器获取输入
inputs = processor(text=prompt, images=[image], return_tensors="pt")
inputs = {k: v.to(DEVICE) for k, v in inputs.items()}
# 生成
generated_ids = model.generate(**inputs, max_new_tokens=500)
generated_texts = processor.batch_decode(generated_ids, skip_special_tokens=True)
print(generated_texts)
接下来,我们提供了一个用于推理的便捷函数。该函数接受模型、处理器、问题、图像以及消息和图像对象,用于与模型进行类似聊天的交互。
def ask_about_image (model, processor, question,
images_input=[],
verbatim=False,
temperature=0.1,
show_image=False,
system="你是一位生物材料科学家,回答准确。",
init_instr = "",
show_conversation=True,
max_new_tokens=256,
messages=[],
images=[],
use_Markdown=False,
):
query = question
images_input=ensure_list(images_input)
if len (images)==0:
if len (images_input)>0:
for image in tqdm (images_input) :
if is_url(image):
image= load_image(image)
images.append (image)
if show_image:
display ( image )
if len (messages)==0:
base_message = {
"role": "user",
"content": [
{"type": "text", "text": system + init_instr},
# 图像消息将动态添加在这里
{"type": "text", "text": query}
]
}
# 确保images_input是一个列表
images_input = ensure_list(images_input)
# 动态添加图像消息
image_messages = [{"type": "image"} for _ in images_input]
base_message["content"][1:1] = image_messages # 在最后一个文本消息之前插入图像消息
# 将构造的消息添加到消息列表
messages.append(base_message)
else:
messages.append (
{
"role": "user",
"content": [
{"type": "text", "text": query
}
]
}
)
if verbatim:
print (messages)
text = processor.apply_chat_template(messages, add_generation_prompt=True)
inputs = processor(text=[text.strip()], images=images, return_tensors="pt", padding=True).to(DEVICE)
generated_ids = model.generate(**inputs, max_new_tokens=max_new_tokens, temperature=temperature, do_sample=True)
generated_texts = processor.batch_decode(generated_ids[:, inputs["input_ids"].size(1):], skip_special_tokens=True)
messages.append (
{
"role": "assistant",
"content": [ {"type": "text", "text": generated_texts[0]}, ]
}
)
formatted_conversation = format_conversation(messages, images)
# 显示格式化的对话,例如在Jupyter Notebook中
if show_conversation:
if use_Markdown:
display(Markdown(formatted_conversation))
else:
display(HTML(formatted_conversation))
return generated_texts, messages, images
question = "这张图片展示了什么,对材料设计有何意义?包括对多智能体AI的讨论。"
url1 = "https://d2r55xnwy6nx47.cloudfront.net/uploads/2018/02/Ants_Lede1300.jpg"
response, messages,images= ask_about_image ( model, processor, question,
images_input=[url1,],
temperature=0.1,
system= '', init_instr='你仔细研究图像并提供详细答案。逐步思考。\n\n',
show_conversation=True,
max_new_tokens=512, messages=[], images=[])
示例输出:
图片由Vaishakh Manohar提供
图片展示了一群蚂蚁在表面上以协调的模式移动。这说明了多智能体AI的概念,涉及研究和模拟涉及多个智能体(这里是蚂蚁)相互之间及其环境交互的复杂系统。 对材料设计的意义在于理解这些自然系统如何表现出自组织等涌现行为,可以启发开发模仿这些自然过程的新材料和系统。通过研究蚂蚁的运动模式,研究人员可以获得如何设计表现出类似涌现特性的材料的见解,从而在各种应用中提高性能。 多智能体AI涉及创建描述个体智能体及其环境之间交互的模型,允许模拟具有多个交互组件的复杂系统。这种方法可以应用于各种领域,包括材料科学,其中理解微观层面的涌现行为可以导致设计具有增强性能的新材料。
数据集生成
下面的示意图展示了为训练视觉模型生成数据集的方法的可视化。提取过程采用先进的算法,从复杂的PDF文档中准确检测和分离图像及其对应的文本描述。该方法涉及从PDF中提取图像和标题,创建合理的图像-文本对,并利用大语言模型(LLMs)进行自然语言处理。这些图像-文本对随后通过基于LLM的自然语言处理进行细化和验证,确保训练数据的高质量和上下文相关性。
下图展示了科学文章(此处为Spivak, Buehler等人,2011年)的两个代表性页面的再现,以及如何利用它们提取视觉科学数据以训练Cephalo模型。
进一步的模型优化
如果GPU支持,可以以半精度(torch.float16
或torch.bfloat16
)加载和运行推理。
model = AutoModelForVision2Seq.from_pretrained(
"lamm-mit/Cephalo-Idefics-2-vision-10b-alpha",
+ torch_dtype=torch.float16,
).to(DEVICE)
视觉编码器效率
由于支持高分辨率,模型的视觉部分可能会根据配置消耗大量内存。如果GPU内存受限,可以:
- 停用图像分割。 为此,在初始化处理器时添加
do_image_splitting=False
(AutoProcessor.from_pretrained
)。模型端无需更改。注意,只有sft模型是使用图像分割训练的。 - 减小最大图像分辨率。 为此,在初始化处理器时添加
size= {"longest_edge": 448, "shortest_edge": 378}
(AutoProcessor.from_pretrained
)。特别是,longest_edge
值可以根据需要进行调整(默认值为980
)。建议使用14的倍数值。模型端无需更改。
do_image_splitting=True
特别适用于需要处理非常大的图像输入的复杂任务。模型在微调时启用了图像分割。对于简单任务,可以安全地将此参数设置为False
。
使用Flash-attention 2加速生成
点击展开。
确保安装了flash-attn
。参考Flash Attention的原始仓库进行包安装。只需将上述代码片段更改为:
model = AutoModelForVision2Seq.from_pretrained(
"lamm-mit/Cephalo-Idefics-2-vision-10b-alpha",
+ torch_dtype=torch.bfloat16,
+ _attn_implementation="flash_attention_2",
).to(DEVICE)
使用bitsandbytes进行4位量化
点击展开。
可以使用`bitsandbytes`以4位加载Cephalo-Idefics-2-vision-10b-alpha。确保已安装`accelerate`和`bitsandbytes`。+ from transformers import BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16
)
model = AutoModelForVision2Seq.from_pretrained(
"lamm-mit/Cephalo-Idefics-2-vision-10b-alpha",
+ torch_dtype=torch.bfloat16,
+ quantization_config=quantization_config,
).to(DEVICE)
引用
请引用为:
@article{Buehler_Cephalo_2024,
title={Cephalo: Multi-Modal Vision-Language Models for Bio-Inspired Materials Analysis and Design},
author={Markus J. Buehler},
journal={arXiv preprint arXiv:2405.19076},
year={2024}
}








