发布 Pixtral 12B

Pixtral 12B - 首个多模态 Mistral 模型。Apache 2.0。

研究
2024年9月17日Mistral AI 团队

Pixtral 12B 简述

  • 原生多模态,使用交织图像和文本数据进行训练
  • 在多模态任务上表现强劲,擅长指令遵循
  • 在纯文本基准测试上保持最先进性能
  • 架构
    • 全新的 400M 参数视觉编码器,从头开始训练
    • 基于 Mistral Nemo 的 12B 参数多模态解码器
    • 支持可变图像尺寸和纵横比
    • 在 128k token 的长上下文窗口中支持多张图像
  • 使用

Pixtral 经过训练,能够理解自然图像和文档,在 MMMU 推理基准测试中达到 52.5%,超越了许多更大的模型。该模型在图表理解、文档问答、多模态推理和指令遵循等任务中表现出强大的能力。Pixtral 能够以自然分辨率和纵横比处理图像,使用户可以灵活控制用于处理图像的 token 数量。Pixtral 还能够在 128K token 的长上下文窗口中处理任意数量的图像。与之前的开源模型不同,Pixtral 在多模态任务上表现出色,同时不牺牲纯文本基准性能。

Pixtral Benchmarks

性能

Pixtral 经过训练,旨在成为 Mistral Nemo 12B 的直接替代品。其与现有开源模型的关键区别在于,它在提供 一流的多模态推理能力 的 同时,不牺牲关键的文本能力 ,例如指令遵循、编码和数学。

评估协议

我们通过 相同的 评估框架 重新评估了一系列开放和封闭模型。对于每个数据集,选择提示词以重现领先多模态模型(GPT-4o 和 Claude-3.5-Sonnet)的结果。然后使用相同的提示词评估所有模型。总体而言,Pixtral 在其规模上显著优于所有开放模型,并且在许多情况下优于 Claude 3 Haiku 等封闭模型。在多模态基准测试中,Pixtral 甚至超越或匹配 LLaVa OneVision 72B 等更大模型的性能。所有提示词都将开源。

Pixtral Comparison

Pixtral 与封闭模型和更大多模态模型相比的性能。[所有模型均通过相同的评估框架和相同的提示词进行基准测试。我们验证提示词能够重现 GPT-4o 和 Claude 3.5 Sonnet 的报告性能(提示词将在技术报告中提供)]。

指令遵循

与其他开放多模态模型相比,Pixtral 在多模态和纯文本指令遵循方面表现尤为出色。它在指令遵循方面显著优于 Qwen2-VL 7B、LLaVa-OneVision 7B 和 Phi-3.5 Vision,在纯文本 IF-Eval 和 MT-Bench 上的相对改进比最接近的 OSS 模型高出 20%。为了进一步评估其在多模态用例中的这一能力,我们创建了这些基准测试的多模态版本: MM-IF-Eval 和 MM-MT-Bench。Pixtral 在多模态指令遵循基准测试上也优于开源替代方案。我们将向社区开源 MM-MT-Bench

Pixtral Comparison 2

Pixtral 与开放多模态模型相比的性能。所有模型均通过相同的评估框架和相同的提示词进行基准测试。

架构

可变图像尺寸: Pixtral 旨在同时优化速度和性能。我们训练了一个新的视觉编码器,该编码器原生支持可变图像尺寸。

  • 我们只需以图像的原生分辨率和纵横比通过视觉编码器处理图像,将其转换为图像中每个 16x16 块的图像 token
  • 然后将这些 token 平铺以创建序列,并在行之间和图像末尾添加 [IMG BREAK] 和 [IMG END] token。
  • [IMG BREAK] token 使模型能够区分具有相同 token 数量但不同纵横比的图像。

通过这种方式,Pixtral 可以用于准确理解高分辨率的复杂图表、图形和文档,同时在图标、剪贴画和公式等小型图像上提供快速推理速度。

Pixtral Architecture

Pixtral 使用从头开始训练的新视觉编码器,该编码器原生支持可变图像尺寸。

最终架构: Pixtral 包含两个组件:视觉编码器(用于 token 化图像)和多模态 Transformer 解码器(在给定文本和图像序列的情况下预测下一个文本 token)。该模型经过训练,可以在交织图像和文本数据上预测下一个文本 token。这种架构使得 Pixtral 能够在 128K token 的大上下文窗口中处理任意数量的任意尺寸图像。

Pixtral Model Architecture

定性示例

对复杂图形进行推理

此表结合了两个表的数据,确保所有模型及其在各基准测试中的相应分数都包含在统一且连贯的格式中。

Gdp

提示词

列出欧洲 GDP 最高的 5 个国家

回应

根据图片显示,欧洲 GDP 最高的 5 个国家是:

  1. 德国
    • GDP:3.99 万亿美元
    • 百分比:4.65%
  2. 英国
    • GDP:2.82 万亿美元
    • 百分比:3.29%
  3. 法国
    • GDP:2.78 万亿美元
    • 百分比:3.24%
  4. 意大利
    • GDP:2.07 万亿美元
    • 百分比:2.42%
  5. 西班牙
    • GDP:1.43 万亿美元
    • 百分比:1.66%

这些国家在图表中以绿色突出显示。

图表理解与分析

图片

Loss Curve

提示词

暗黑巨龙是什么时候开始出现问题的?

回应

图片是一个标题为“train/loss”的折线图,显示了四个不同模型(dark-dragon-50、dainty-sunset-49、different-haze-34 和 morning-field-33)在训练步骤中的损失。x 轴表示步骤,范围从 0 到 60k,y 轴表示对数尺度的损失,范围从 1e-5 到 1e+5。

要确定 dark-dragon-50 模型何时开始出现问题,我们需要查看代表该模型的红线。最初,损失降低,表明模型正在有效学习。然而,在大约 10k 步标记附近,损失开始显著飙升。这一飙升表明模型的性能正在恶化。损失持续飙升和波动,达到非常高的值,这表明模型没有有效学习,很可能出现过拟合或其他问题。

因此,dark-dragon-50 模型开始出现问题的关键点大约在 10k 步标记附近。

多图指令遵循

图片

Multi Images

提示词

将两个表的信息合并到一个 markdown 表中

回应

要将两个表的信息合并到一个表中,我们需要对齐模型及其在每个基准测试中的相应分数。这是合并后的表

| Model                  | MMMU (CoT) | Mathvista (CoT) | ChartQA (CoT) | DocVQA (ANLS) | VQAv2 (VQA Match) |
|------------------------|------------|-----------------|---------------|---------------|-------------------|
| Pixtral 12B            | 52.5       | 58.0            | 81.8          | 90.7          | 78.6              |
| Claude-3 Haiku         | 50.4       | 44.8            | 69.6          | 74.6          | 68.4              |
| Gemini-1.5 Flash 8B (0827) | 50.7       | 56.9            | 78.0          | 79.5          | 65.5              |
| LLaVA-OV 72B           | 54.4       | 57.2            | 66.9          | 91.6          | 83.8              |
| GPT-4o                 | 68.6       | 64.6            | 85.1          | 88.9          | 77.8              |
| Claude-3.5 Sonnet      | 68.0       | 64.4            | 87.6          | 90.3          | 70.7              |
| Qwen2-VL 7B            | 47.6       | 54.4            | 38.6          | 94.5          | 75.9              |
| LLaVA-OV 7B            | 45.1       | 36.1            | 67.1          | 90.5          | 78.3              |
| Phi-3 Vision           | 40.3       | 36.4            | 72.0          | 84.9          | 42.4              |
| Phi-3.5 Vision         | 38.3       | 39.3            | 67.7          | 74.4          | 56.1              |

此表结合了两个表的数据,确保所有模型及其在各基准测试中的相应分数都包含在统一且连贯的格式中。

图片转代码

图片

Image to Code

提示词

编写 HTML 代码创建一个这样的网站

回应

当然!下面是一个 HTML 代码示例,用于创建一个简单的网页,允许用户选择冰淇淋口味。此示例包括一个用于选择口味的下拉菜单和一个“下一步”按钮。

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Pick an Ice Cream Flavor</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-color: #f0f0f0;
        }
        .container {
            background: white;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
        }
        select {
            width: 100%;
            padding: 10px;
            margin-top: 10px;
            margin-bottom: 20px;
        }
        button {
            width: 100%;
            padding: 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        button:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>Pick An Ice Cream Flavor</h1>
        <select id="flavorSelect">
            <option value="vanilla">Vanilla</option>
            <option value="chocolate">Chocolate</option>
            <option value="strawberry">Strawberry</option>
            <option value="cookie_dough">Cookie Dough</option>
            <option value="mint_chocolate">Mint Chocolate</option>
        </select>
        <button onclick="next()">Next</button>
    </div>
    <footer style="position: fixed; bottom: 0; width: 100%; text-align: center; font-size: 12px;">
        &copy; copyright MistralAI
    </footer>
    <script>
        function next() {
            const selectedFlavor = document.getElementById('flavorSelect').value;
            alert('You selected: ' + selectedFlavor);
        }
    </script>
</body>
</html>

解释

  • HTML 结构: 网页包含一个容器 div,其中包含标题、下拉菜单和按钮。

  • CSS 样式: 应用基本样式来居中内容并设置元素样式。

  • JavaScript 函数: 当单击“下一步”按钮时,会调用 `next` 函数。它从下拉菜单中检索选定的口味,并显示一个包含所选口味的警告框。

您可以将此代码复制并粘贴到 HTML 文件中,然后在网络浏览器中打开以查看结果。

生成的网站

Screenshot of the generated website

自然场景理解

Pisa Tower

提示词: 这个人是真的很大,还是这个建筑真的很小?

回应

这张照片显示一个人把拇指放在比萨斜塔前面,使得拇指看起来比塔大得多。这造成了视觉错觉,使塔看起来比实际小。实际上,比萨斜塔是一个巨大且标志性的建筑,而这个人的拇指远没有照片中看起来那么大。这张照片的目的是通过与熟悉的物体(如拇指)进行比较来展示塔令人印象深刻的高度和尺寸。

如何运行 Pixtral?

Le Chat

您可以通过我们友好的会话聊天界面 Le Chat 轻松免费试用 Pixtral。您可以在模型列表中选择 Pixtral,上传图片,然后开始提问关于图片的问题。

La Plateforme

Pixtral 也可在 La Plateforme 上使用。您可以通过 API 调用利用 Pixtral 的能力,实现与各种应用程序和工作流程的无缝集成。下面是一个简单示例。更多详细信息请参阅我们的 文档

curl https://api.mistral.ai/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $MISTRAL_API_KEY" \
  -d '{
    "model": "pixtral-12b-2409",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": "What’s in this image?"
          },
          {
            "type": "image_url",
            "image_url": "https://tripfixers.com/wp-content/uploads/2019/11/eiffel-tower-with-snow.jpeg"
          }
        ]
      }
    ],
    "max_tokens": 300
  }'

mistral-inference

在本地运行 Pixtral 最简单的方法是使用 mistral-inference。安装 mistral_inference 后,您可以使用下面的代码下载模型、加载模型并运行模型。有关详细信息,请参阅 此处

# download the model 
from huggingface_hub import snapshot_download
from pathlib import Path

mistral_models_path = Path.home().joinpath('mistral_models', 'Pixtral')
mistral_models_path.mkdir(parents=True, exist_ok=True)

snapshot_download(repo_id="mistralai/Pixtral-12B-2409", allow_patterns=["params.json", "consolidated.safetensors", "tekken.json"], local_dir=mistral_models_path)

# load the model 
from mistral_inference.transformer import Transformer
from mistral_inference.generate import generate

from mistral_common.tokens.tokenizers.mistral import MistralTokenizer
from mistral_common.protocol.instruct.messages import UserMessage, TextChunk, ImageURLChunk
from mistral_common.protocol.instruct.request import ChatCompletionRequest

tokenizer = MistralTokenizer.from_file(f"{mistral_models_path}/tekken.json")
model = Transformer.from_folder(mistral_models_path)

# Run the model 
url = "https://hugging-face.cn/datasets/patrickvonplaten/random_img/resolve/main/yosemite.png"
prompt = "Describe the image."

completion_request = ChatCompletionRequest(messages=[UserMessage(content=[ImageURLChunk(image_url=url), TextChunk(text=prompt)])])

encoded = tokenizer.encode_chat_completion(completion_request)

images = encoded.images
tokens = encoded.tokens

out_tokens, _ = generate([tokens], model, images=[images], max_tokens=256, temperature=0.35, eos_id=tokenizer.instruct_tokenizer.tokenizer.eos_id)
result = tokenizer.decode(out_tokens[0])

print(result)

vLLM

如果您选择在本地部署 Pixtral,我们也推荐使用 vLLM 库 来搭配 Pixtral,这是一个实现更高服务吞吐量的绝佳选择。我们感谢 vLLM 团队对快速集成 Pixtral 的支持。下面是一个简单的使用示例。更多信息请参阅 此处

from vllm import LLM
from vllm.sampling_params import SamplingParams

model_name = "mistralai/Pixtral-12B-2409"

sampling_params = SamplingParams(max_tokens=8192)

llm = LLM(model=model_name, tokenizer_mode="mistral")

prompt = "Describe this image in one sentence."
image_url = "https://picsum.photos/id/237/200/300"

messages = [
    {
        "role": "user",
        "content": [{"type": "text", "text": prompt}, {"type": "image_url", "image_url": {"url": image_url}}]
    },
]

outputs = vllm_model.model.chat(messages, sampling_params=sampling_params)

print(outputs[0].outputs[0].text)