Cephalo Idefics 2 Vision 8b Alpha
模型简介
模型特点
模型能力
使用案例
language:
- 多语言 license: apache-2.0 library_name: transformers tags:
- 自然语言处理
- 代码
- 视觉
- 化学
- 工程学
- 生物学
- 仿生学
- 文本生成推理
- 材料科学 pipeline_tag: 图像文本到文本 inference: parameters: temperature: 0.3 widget:
- messages:
- role: 用户 content: <|image_1|>你能描述一下你在图像中看到的内容吗?
模型概述
Cephalo是一系列专注于多模态材料科学的视觉大语言模型(V-LLMs),旨在整合视觉和语言数据,以促进人机交互或多智能体AI框架中的高级理解和互动。
Cephalo开发的一个新颖之处在于创新的数据集生成方法。提取过程采用先进算法,从复杂的PDF文档中准确检测和分离图像及其对应的文本描述。该方法涉及从PDF中提取图像和标题,创建合理的图像-文本对,并利用大语言模型(LLMs)进行自然语言处理。这些图像-文本对随后通过基于LLM的自然语言处理进行细化和验证,确保训练数据的高质量和上下文相关性。
Cephalo能够解释复杂的视觉场景,并生成上下文准确的语言描述和回答查询。
该模型开发用于处理多样化的输入,包括图像和文本,支持广泛的应用,如图像字幕生成、视觉问答和多模态内容生成。其架构结合了视觉编码器模型和自回归变换器,以处理复杂的自然语言理解任务。
Cephalo为多模态交互和理解提供了强大的框架,包括开发复杂的生成管道,以创建材料微观结构的2D和3D渲染,作为增材制造方法的输入。
此版本的Cephalo,lamm-mit/Cephalo-Idefics-2-vision-8b-alpha,基于HuggingFaceM4/idefics2-8b-chatty模型。该模型在从维基百科和科学论文中提取的科学文本-图像数据组合上进行了训练。有关基础模型的更多详情,请参见:https://huggingface.co/HuggingFaceM4/idefics2-8b-chatty。关于模型的技术细节、训练及材料科学问题示例应用的更多信息,请参阅论文(底部参考文献)。
聊天格式
lamm-mit/Cephalo-Idefics-2-vision-8b-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-8b-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在开发具有改进性能的新材料中的潜在应用,通过多个智能体的协作实现。
数据集生成
下图展示了为训练视觉模型生成数据集的方法的可视化。提取过程采用先进算法,从复杂的PDF文档中准确检测和分离图像及其对应的文本描述。该方法涉及从PDF中提取图像和标题,创建合理的图像-文本对,并利用大语言模型(LLMs)进行自然语言处理。这些图像-文本对随后通过基于LLM的自然语言处理进行细化和验证,确保训练数据的高质量和上下文相关性。
下图展示了科学文章(此处为Spivak, Buehler等人,2011年)的两个代表性页面的复制,以及如何利用它们提取视觉科学数据以训练Cephalo模型。
进一步的模型优化
如果GPU支持,可以以半精度(torch.float16
或torch.bfloat16
)加载和运行推理。
model = AutoModelForVision2Seq.from_pretrained(
"lamm-mit/Cephalo-Idefics-2-vision-8b-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
。参考








