Hugging Face 推出 Thinking Machines 的 Inkling 项目
新项目发布,具体功能和用途需查阅原文了解。
完整中文译文
Inkling 是由 Thinking Machines 推出的大规模(1T 参数!)开源模型,能原生接收图像、文本和音频输入。
要点总结: Inkling 由 Thinking Machines 推出,现已在 Hugging Face 上线。Inkling 是一个巨型多模态 LLM,能理解所有模态(图像、音频、文本),具有 AI 智能体能力,并支持 1M 上下文。它提供完整的 BF16 版本和经过精心校准的 NVFP4 变体,并包含推测性 MTP 层以实现更快的推理。Transformers、SGLang、vLLM 和 llama.cpp 提供了第 0 天的支持。Thinking Machine Labs 还发布了 Inkling-Small,总参数数 276B,活跃参数 12B,并支持 MXFP8 和 NVFP4 权重,架构与 Inkling 相同。
Inkling 有什么特别之处?
Inkling 是第一个拥有约 1T 参数和 1M 上下文窗口的大型开源模型,能原生接收图像、文本和音频输入,训练数据包含 45 万亿个文本、图像、音频和视频 token。它专注于跨音频、图像和文本等模态的推理,旨在通过微调实现领域适配。我们已经尝试用这个模型构建了一些演示并探索了其架构,我们认为它非常适合构建新一代多模态推理应用。
整体能力与架构
Inkling 是一个仅解码器多模态混合专家模型,总参数 975B,活跃参数 41B。这里面有很多东西,让我们逐一分解:
仅解码器: 这意味着架构支持因果自回归生成,就像大多数最先进的 LLM 一样。
多模态: 该模型可以接收文本、音频和图像。
混合专家 (MoE): 每层内的前馈网络是稀疏的,因为任何时刻只有 41B 参数是活跃的,因此实现了更快的推理。该模型有 256 个专家,我们稍后会看到。
以下是架构的快速概览。
相对注意力: Inkling 使用相对注意力编码位置信息,而不是 RoPE(这是在 Transformer 模型中注入位置信息的常见方法)。每个注意力层直接在注意力 logits 中学习位置。除了 key-query-values 外,还有第四个投影产生每个 token、每个头的相对特征 R。然后用距离信息(key 向量和 query 向量之间的距离)调整这个投影张量,并将其传入注意力模块。
混合注意力: 解码器层在全局注意力(一次性关注完整上下文长度)和滑动窗口注意力(以滑动方式关注固定上下文窗口)之间交替。该架构采用 5:1 的滑动窗口与全局注意力层的模式。这种混合注意力方案提供了计算效率。最后一层使用全局注意力来帮助构建特征丰富的表示。
短卷积: 该模型在隐藏状态上使用独特的短 1D 卷积(SConv)。SConv 读取当前 token 和前 W-1 个隐藏状态,其中 W 是滑动窗口大小。这里的直觉是,SConv 有助于局部注意力,同时让注意力和 MoE 模块不用处理局部表示。
带共享专家汇聚的 MoE: 在 Inkling 中,路由器对路由专家和共享专家都进行评分。Top-k 选择在 6 个专家上执行,加上 2 个始终活跃的共享专家。
视觉理解: 该模型包含一个简单的分层 MLP patchifier,由多个线性层组成。每层逐步合并像素,直到最后一层为每个 patch 生成一个嵌入。
音频理解: 该架构采用离散化的梅尔频谱图,其中每个音频块(100 毫秒)被转换为梅尔标度,然后分类为精确的梅尔频谱图 bin。
多模态塔是相对简单的模块,与那些对每种模态采用单独编码器的其他模型不同。每个图像 patch 通过图像嵌入塔,每个音频块通过音频嵌入塔以获得两个媒体嵌入。图像输入还包括用于视频处理的额外时间维度。我们预期这种能力对下游微调很有用,但我们还没有评估开箱即用的视频性能。塔折叠 patch 网格,将相邻 token 的小局部块堆叠到通道维度中并通过 hMLP。音频波形被转换为梅尔标度,然后分类为离散梅尔 bin。这些梅尔 bin 值在音频嵌入塔中被嵌入,然后求和以构建最终的音频输入。
Inkling 提供了第 0 天的 Transformers 支持,并在 SGLang 和 vLLM 等主要推理引擎中得到支持。
这个模型非常大。bf16 检查点需要 2 TB VRAM,而 nvfp4 版本需要 600 GB VRAM。你可以通过 Inference Providers 等无服务器推理路由器尝试该模型,或使用 ggml 量化版本通过 llama.cpp 进行本地部署。
直接使用 Transformers 推理的最简单方法是使用 any-to-any pipeline。你可以在 Hopper 或更新的 GPU 上使用 16 位的 "thinkingmachines/Inkling",或在 Blackwell Nvidia GPU 上使用量化的 NVFP4 检查点 "thinkingmachines/Inkling-NVFP4"。确保你有最新版本的 Transformers(5.14.0 今天发布)(pip install -U transformers)。
from transformers import pipeline
model_id = "thinkingmachines/Inkling"
# model_id = "thinkingmachines/Inkling-NVFP4"
pipe = pipeline("any-to-any", model=model_id)
初始化管道后,你可以如下传入提示:
image_url = (
"https://huggingface.co/datasets/merve/vl-test-suite/"
"resolve/main/pills.jpg"
)
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": image_url,
},
{
"type": "text",
"text": "Do components in this supplement interact with each other?",
},
],
},
]
output = pipe(
messages,
max_new_tokens=2000,
return_full_text=False,
reasoning_effort="medium",
)
output[0]["generated_text"]
往下一层,你可以使用 Auto 类。对于推理,你可以使用 AutoModelForMultimodalLM 类用于模型,AutoProcessor 类用于处理器。对于不同的推理任务,tokenizer 接受 reasoning_effort 参数。现有的推理力度选项有 "none"、"minimal"、"low"、"medium"、"high"、"xhigh" 和 "max"。
from transformers import AutoModelForMultimodalLM, AutoProcessor
model_id = "thinkingmachines/Inkling"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForMultimodalLM.from_pretrained(
model_id,
dtype="auto",
device_map="auto",
)
messages = [
{"role": "system", "content": "You should only answer with a number."},
{"role": "user", "content": "What is 17 * 23?"},
]
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt",
reasoning_effort="high",
).to(model.device)
output = model.generate(**inputs, max_new_tokens=2000)
generated_tokens = output[0][inputs["input_ids"].shape[1] :]
print(processor.decode(generated_tokens, skip_special_tokens=False))
对于多模态推理,你可以使用相同的类。我们在模型卡中为每种不同的模态提供了示例片段。
from transformers import AutoModelForMultimodalLM, AutoProcessor
model_id = "thinkingmachines/Inkling"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForMultimodalLM.from_pretrained(
model_id,
dtype="auto",
device_map="auto",
)
image_url = (
"https://huggingface.co/datasets/merve/vl-test-suite/"
"resolve/main/pills.jpg"
)
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": image_url,
},
{
"type": "text",
"text": "Do any of the components in this supplement interact?",
},
],
},
]
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
reasoning_effort="medium",
return_dict=True,
return_tensors="pt",
).to(model.device)
input_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs, max_new_tokens=2000)
response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)
processor.parse_response(response)
Inkling 也接受音频输入。以下是一个示例推理片段,仍然使用相同的 AutoModelForMultimodalLM 类。
from transformers import AutoModelForMultimodalLM, AutoProcessor
model_id = "thinkingmachines/Inkling"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForMultimodalLM.from_pretrained(
model_id,
dtype="auto",
device_map="auto",
)
audio_url = ( "https://huggingface.co/datasets/merve/vl-test-suite/" "resolve/main/example_audio.mp3" ) messages = [ { "role": "user", "content": [ {"type": "text", "text": "Transcribe the following speech to text."}, { "type": "audio", "audio": audio_url, }, ], }, ]
inputs = processor.apply_chat_template( messages, tokenize=True, return_dict=True, return_tensors="pt", add_generation_prompt=True, ).to(model.device) input_len = inputs["input_ids"].shape[-1]
outputs = model.generate(**inputs, max_new_tokens=512) response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)
processor.parse_response(response)
如需在由多个节点组成的集群中进行更贴近实际场景的并行部署,请参阅下文的 Slurm 部分。
在发布时,SGLang 是部署 Inkling 速度最快的框架之一,因为它包含自定义模型实现。下面的启动命令会将模型分片到 8 块 GPU 上,并在 30000 端口提供兼容 OpenAI 的 API。
```shell
pip install sglang
python3 -m sglang.launch_server \
--model-path thinkingmachine/Inkling \
--tp-size 8 \
--served-model-name inkling \
--host 0.0.0.0 \
--port 30000
请让 --tp-size 与 GPU 数量保持一致。如果需要为 KV 缓存预留更多空间,可添加 --mem-fraction-static(例如 0.85)。
vLLM 非常适合生产环境部署。一条 vllm serve 命令即可从 Hub 下载权重,通过张量并行将模型分片到多块 GPU 上,并在 8000 端口启动兼容 OpenAI 的服务器。你可以在此查看该模型的 vLLM Recipe,并根据自己的硬件进行定制。
# Requires nightly or vllm>=0.26 (once released)
uv pip install -U vllm --pre \
--extra-index-url https://wheels.vllm.ai/nightly/cu130 \
--extra-index-url https://download.pytorch.org/whl/cu130 \
--index-strategy unsafe-best-match
vllm serve thinkingmachines/Inkling-NVFP4 \
--trust-remote-code \
--tokenizer-mode inkling \
--tensor-parallel-size 8 \
--enable-auto-tool-choice \
--tool-call-parser inkling \
--reasoning-parser inkling \
--served-model-name inkling
在实践中,你可能需要多个节点以及 SLURM 之类的分布式工具(见下文)。关键参数包括:将 --tensor-parallel-size 设置为节点上的 GPU 数量;如果遇到 KV 缓存内存限制,则使用 --max-model-len 限制上下文窗口。
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "inkling",
"messages": [{"role": "user", "content": "Hello!"}]
}'
使用 Hugging Face Inference Providers 进行远程推理
你可以通过 Hugging Face 的多个推理提供商使用该模型进行推理。你可以在此查看所有调用代码片段。下面展示了如何通过 OpenAI 客户端使用它。
import os
from openai import OpenAI
client = OpenAI(
base_url="https://router.huggingface.co/v1",
api_key=os.environ["HF_TOKEN"],
)
completion = client.chat.completions.create(
model="thinkingmachines/Inkling:auto",
messages=[
{
"role": "user",
"content": "What is the capital of France?",
},
],
)
print(completion.choices[0].message)
使用“:auto”后缀会将请求路由到你在设置中首选的提供商;你也可以使用“cheapest”或“:fastest”。在本次发布期间,我们会为所有人承担 2 小时的推理费用。
注意:Inference Providers 的音频支持仍在开发中,很快就会加入。
使用 llama.cpp 和 Unsloth 进行本地推理
你可以使用 llama.cpp,在硬件资源有限的环境中运行该模型的量化版本。Unsloth 已将该模型量化至 1 位精度,与原始模型相比可减少 95% 的显存占用。
llama serve -hf unsloth/inkling-GGUF:UD-IQ1_S
这会启动一个运行在 http://localhost:8080/v1 的 OpenAI 兼容服务器,你可以通过自己偏好的工具或客户端连接它。打开该地址后,你就可以开始与模型对话,还可以为其配置自己常用的 MCP,方便地传入图像或文件,等等!
Llama cpp 还内置了一个支持工具、MCP 和智能体工作负载的 UI。来看看以 1 位精度运行在 llama 应用中的 Inkling:
Inkling GGUF 也可以在 Unsloth Studio 中运行,其中的动态 1 位 GGUF 在体积缩小 86% 的同时,仍能保留约 74.2% 的 top-1% 准确率。
使用 Pi 进行智能体式编程
Pi 是一个极简的编程智能体框架,可以搭配不同的语言模型使用。安装完成后,将以下内容添加到 ~/.pi/agent/models.json,即可让 Pi 使用 llama.cpp 等推理引擎的服务器端点,或使用 Hugging Face 上的 Inference Providers。
{
"providers": {
"inference-providers": {
"baseUrl": "https://router.huggingface.co/v1",
"api": "openai-completions",
"apiKey": "hf_...",
"models": [
{
"id": "thinkingmachines/Inkling"
}
]
}
}
}
然后在项目目录中调用 pi 即可启动 Pi,一切就绪!在这个演示中,我们给模型出了一道高难度数学推理题,它会使用 Pi 中的工具来求解。
Inkling 专注于广泛的多模态推理和较低的 token 消耗,因此可以尝试将其用于文档处理或音频任务。
多 Token 预测起草器
MTP 会为模型添加额外的层,使其能够一次预测多个 token,而不只是预测下一个 token。在推理期间,这些额外层会充当推测解码的“起草器”,在不影响性能的情况下加快生成速度。使用 MTP 后,生成的输出完全相同,只需付出少量显存成本(用于部署起草器),即可获得数倍的生成速度提升。Thinking Machines 也随此次发布提供了一个 MTP 起草器。
import torch
from transformers import AutoModelForMultimodalLM, AutoProcessor
processor = AutoProcessor.from_pretrained("thinkingmachines/Inkling")
model = AutoModelForMultimodalLM.from_pretrained(
"thinkingmachines/Inkling",
dtype=torch.bfloat16,
device_map="auto",
)
# Preprocess the inputs.
...
generated = model.generate(
**inputs,
max_new_tokens=1000,
do_sample=False,
use_mtp=True,
)
print(processor.decode(generated[0], skip_special_tokens=True))
我们从专家级资料和大学入学考试中整理了一小套推理题。为了增加模型面临的挑战,我们拍摄了带有屏幕水印的照片。模型在 high 推理强度下答对了所有题目,在 highest 和 medium 推理强度下各有一道题失败。因此,我们提供了模型答案的链接,供你了解模型的回答风格,同时也列出了模型解决每道题所消耗的 token 数量。请注意,在这些凭感觉评测中,我们没有提供任何系统提示词,而这类推理题通常应该搭配优质的系统提示词运行。凭感觉评测的图像和结果位于此处。
模型不会直接回答信息图中的问题,而是先将图像中的文字转换为文本,以此建立理解基础。
提示方式对减少推理过程中的 token 消耗影响很大。例如,面对一张药片背面的图像,如果提出“这里有哪些成分会发生相互作用?”这种含糊的问题,模型首先需要弄清楚我们所说的“相互作用”究竟指什么。
多项选择题的答案选项非常有助于模型组织自己的推理。与多项选择题相比,模型在开放式问题上的表现更为吃力,不过这也是许多模型普遍存在的问题。通常的思维链是:OCR → 描述特征 → 评估各个选项 → 作答。
0.7 的推理强度(medium)似乎能提供良好的权衡。
我们使用 BigBenchAudio 中的一些音频推理示例,以及 GlobeAudio 中的少量多语言音频示例(俄语和中文的多项选择题,要求回答转录文本中的最后一个词),对模型进行了凭感觉评测。我们测试的 BigBenchAudio 示例由逻辑陈述和问题组成,这些问题要求判断形式谬误(即某个论点是否能从音频所给的上下文中通过逻辑推导得出),或进行物体计数(在音频中陈述多个不同物体,并询问其中某类物体的总数)。虽然该基准最初是为语音到语音推理设计的,但我们只是想看看这个模型的音频推理能力。GlobeAudio 的问题相对直接,因此我们使用了 0.1 的推理强度。我们运行了 GlobeAudio 中每种语言的第一个示例。除第二个形式谬误示例在最低推理强度下失败外,所有测试在各种问题和推理强度下均通过,因此我们只提供每道题在不同推理强度下消耗的 token 数量。凭感觉评测的结果和音频文件位于此处。
关于实际体验的一些说明:
与视觉任务类似,模型会先转录语音,然后再回答问题。
它能够抵御干扰项:在俄语测试中,即使音频中出现了其他答案,该模型仍然选出了正确答案。
与视觉任务类似,通常的思维链是:转录 → 描述特征 → 逐一评估每个选项 → 作答。
额外的推理投入有助于推理,而不是听觉识别。音频问答的成本远低于图像问答。
如果你想使用 Inkling 进行后训练,Thinking Machines 构建了 tinker,这是一款用于对开放权重模型进行后训练的托管工具。其 cookbook 中包含微调、蒸馏和强化学习的示例。
我们使用 tinker 和 OpenEnv 对 Inkling 进行了后训练。OpenEnv 是一个面向 AI 智能体的强化学习环境工具。我们采用了 ECHO 算法,它训练模型在不使用验证器的情况下预测环境:对环境生成的 token 应用下一 token 交叉熵损失,同时对 AI 智能体的动作进行常规策略学习。这使策略能够学习隐式世界模型,而无需单独的模型、教师模型或额外的 rollout。请查看该示例。
git clone https://github.com/huggingface/OpenEnv.git
cd OpenEnv
# Add TINKER_API_KEY=... to .env, then run:
uv run --env-file .env \
examples/echo_world_model/backends/tinker_echo_demo.py
如果你正在使用 Transformers Reinforcement Learning,我们建议在知识蒸馏设置中将 Inkling 用作教师模型。例如,可以利用 Inkling 的文档理解能力来提升较小型(端侧)模型的性能。在这个示例中,我们使用 transformer reinforcement learning 库和 GOLD 算法进行知识蒸馏。GOLD 在这里非常实用,因为它可以在使用不同 tokenizer 的模型之间匹配 token logits,因此你可以将知识蒸馏到 Hub 上的任意模型。
部署 Inkling 和 Inkling-Small
下面列出了 Inkling 的各个检查点及其 VRAM 要求。
在集群上部署 Inkling
为了在集群上部署 Inkling,我们提供了通过 transformers API 提供服务的 SLURM 脚本,以及使用不同模态查询端点的方法。你可以通过更新命令,将这些脚本适配到 vLLM 或 SGlang。这些脚本可在此处获取。
Python 生成脚本
在 Inference Endpoints 上部署 Inkling-Small
你可以使用 Inference Endpoints 部署 Inkling-Small 的 NVFP4 检查点。我们提供了一套经过预先测试的配置,可将其部署到 8 张 RTX PRO 6000 上,总 VRAM 为 768 GB,为 KV cache 提供了充足空间;每小时运行成本为 22 美元(不使用时可缩容至零)。要进行部署,请使用 Hugging Face CLI 运行 hf endpoints catalog deploy --repo thinkingmachines/Inkling-Small-NVFP4,或者前往 https://endpoints.huggingface.co/new/thinkingmachines/Inkling-Small-NVFP4。使用此配置,你可以获得 140 TPS(单用户推理,并通过连续批处理支持多用户场景)。
端点启动后,可以按如下方式进行查询。
curl "YOUR_ENDPOINT_HERE" \
-X POST \
-H "Authorization: Bearer $HF_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"model": "huggingface/Inkling-Small-NVFP4",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://endpoints.hf.co/media-examples/img1.png"
}
},
{
"type": "text",
"text": "Describe this image in one sentence."
}
]
}
],
"stream": true,
"max_tokens": 100
}'
本文提及的模型 1
本文提及的数据集 2
本文提及的 Spaces 1
本文提及的合集 1
博客中的更多文章
使用 Sentence Transformers 训练和微调多模态嵌入与重排序模型
使用 Sentence Transformers 的多模态嵌入与重排序模型
· 注册或登录后发表评论
本文提及的模型 1
本文提及的数据集 2
本文提及的 Spaces 1
本文提及的合集 1