ollama v0.22.0 发布:新增 NVIDIA Nemotron 3 Omni 与 Poolside Laguna 模型支持,推理能力再升级!

网易专栏1周前发布 nxnqh
13 0 0

🤖 AI总结

主题

Ollama v0.22.0版本更新详解

摘要

Ollama v0.22.0引入两大新模型,增强推理控制与MLX后端性能,并修复多个核心模块,提升稳定性和用户体验。

关键信息

  • 1 新增NVIDIA Nemotron 3 Omni和Poolside Laguna XS.2模型
  • 2 推理控制新增max思考级别
  • 3 MLX后端采样器重构提升吞吐量

ollama v0.22.0 发布:新增 NVIDIA Nemotron 3 Omni 与 Poolside Laguna 模型支持,推理能力再升级!

ollama v0.22.0 发布:新增 NVIDIA Nemotron 3 Omni 与 Poolside Laguna 模型支持,推理能力再升级!

ollama v0.22.0 发布:新增 NVIDIA Nemotron 3 Omni 与 Poolside Laguna 模型支持,推理能力再升级!

引言

2026年4月29日,Ollama 团队正式发布了 v0.22.0 版本。本次更新是一次意义重大的版本迭代,不仅引入了两个重量级的新模型——NVIDIA 的 Nemotron 3 Omni 和 Poolside 的首个开源编码模型 Laguna XS.2,还在推理控制、模型转换、量化策略、MLX 后端性能、内置解析器等多个核心模块进行了深度优化。

本文将基于 v0.22.0 的完整变更日志,为您详细解读本次更新的每一个技术细节,帮助开发者全面理解新版本的能力边界和使用方法。

一、新模型支持:两大重量级模型登场 1.1 NVIDIA Nemotron 3 Omni

v0.22.0 引入了对 NVIDIA Nemotron 3 Omni 系列模型的原生支持。这是一个多模态模型家族,在代码中对应的架构标识为nemotron_h_omni。该模型支持:

文本生成:基于 Nemotron-H 架构的 LLM 核心

  • 视觉理解:集成了 Vision Transformer(ViT)模块,支持图像输入

  • 音频处理:集成了 Parakeet 音频编码器,支持语音输入

    在转换器(converter)层面,新增了convert/convert_nemotron_h.goconvert/convert_nemotron_h_test.go两个文件(共约 700 行代码),专门处理 Nemotron 系列模型的权重映射和参数转换。

    关键配置参数包括:

    max_sequence_length: 131072(128K 上下文)

  • vision.image_size: 512

  • vision.patch_size: 16

  • audio.sample_rate: 16000

    1.2 Poolside Laguna XS.2

    Poolside 的首个开源权重编码模型 Laguna XS.2 也获得了完整支持。这是一个专注于代码生成和软件工程任务的模型,架构标识为LagunaForCausalLM

    新增的模型支持文件包括:

    model/models/laguna/model.go(约 440 行):Laguna 模型的 MLX 实现

  • convert/convert_laguna.go(约 600 行):GGUF 转换逻辑

  • model/parsers/laguna.go(约 500 行):专用的输出解析器

  • model/renderers/laguna.go(约 110 行):模板渲染器

    Laguna 模型采用了混合专家(MoE)架构,支持动态稀疏层的推理优化。其配置包括:

    • 逐层可变的注意力头数(head_count 为数组而非固定值)

  • • 滑动窗口注意力(sliding window)模式

  • • 旋转位置编码(RoPE)支持全维度和 SWA 两套参数

    二、推理控制增强:新增 “max” 思考级别 2.1 API 层面的变更

    api/types.go中,ThinkValue类型现在支持一个全新的字符串值“max”。这意味着思考级别从原来的high/medium/low三个档位扩展为四个:

    // ThinkValue represents a value that can be a boolean or a string ("high", "medium", "low", "max")
    type ThinkValue struct {
    Value interface{}
    }

    验证逻辑已同步更新:

    case string:
    return v == "high" || v == "medium" || v == "low" || v == "max"

    2.2 OpenAI 兼容接口映射

    openai/openai.go中,OpenAI 风格的reasoning_effort参数现在也支持"max"值:

    if !slices.Contains([]string{"high", "medium", "low", "max", "none"}, effort) {
    return nil, fmt.Errorf("invalid reasoning value: '%s' (must be \"high\", \"medium\", \"low\", \"max\", or \"none\")", effort)
    }

    reasoning_effort"none"时,思考功能被禁用;其他字符串值(包括"max")则按原样传递。

    Responses API 也同步支持了max

    case "low", "medium", "high", "max":
    think = &api.ThinkValue{Value: effort}

    2.3 CLI 命令行支持

    cmd/cmd.go中的--think参数现在接受max作为合法值:

    case "high", "medium", "low", "max":
    opts.Think = &api.ThinkValue{Value: thinkStr}

    三、MLX 后端重大改进 3.1 采样器历史记录优化

    mlxrunner: track sampler history in a fixed-size ring buffer

    采样器现在使用固定大小的环形缓冲区来追踪 token 历史,而不是无限增长的切片。这显著降低了长时间运行时的内存占用。

    3.2 批量采样优化

    mlxrunner: batch the sampler across multiple sequences

    采样器现在支持批量处理多个序列,将多个独立生成请求的采样操作合并为一次矩阵运算。这在处理并行请求时能大幅提升吞吐量。

    3.3 采样器核心重构

    x/mlxrunner/sample/sample.go进行了大规模重构(+415/-122 行),主要改进包括:

    多槽位(multi-slot)支持:采样器现在可以管理多个独立的生成会话,每个槽位有自己的历史记录和采样参数

  • 批量 Logprob 计算:当多个槽位同时请求 logprobs 时,一次性完成 softmax 和 log 计算

  • TopK/TopP 采样优化:使用 MLX 原生的 argpartition 操作,避免显式的完整排序

    新增的Add(slot int, opts Options, history []int32)方法用于注册采样槽位,Sample(slots []int, logits *mlx.Array)方法支持批量采样。

    3.4 新增 Softplus 激活函数

    x/mlxrunner/mlx/act.go新增了SoftplusF32函数:

    var SoftplusF32 = Compile1(
    "SoftplusF32",
    func(x *Array) *Array {
    dt := x.DType()
    zero := FromValue[float32](0)
    return Logaddexp(x.AsType(DTypeFloat32), zero).AsType(dt)
    },
    Shapeless(),
    )

    这个函数以 float32 精度计算 softplus,然后转换回原始数据类型,用于 Laguna 模型的注意力门控机制。

    3.5 TensorRT Model Optimizer 导入支持

    mlx: Support NVIDIA TensorRT Model Optimizer import

    MLX 后端现在可以直接导入由 NVIDIA TensorRT Model Optimizer 导出的 FP8 量化模型。导入器会自动识别并处理F8_E4M3类型的张量及其配套的 scale 张量。

    四、Tokenizer 多正则表达式偏移处理修复

    tokenizer: fix multi-regex BPE offset handling

    这是一个重要的 bug 修复。在tokenizer/bytepairencoding.go中,原来的多正则表达式匹配逻辑在处理重叠匹配时存在偏移量计算错误:

    修复前:

    if offset-m.Index != 0 {
    if !yield(string(r[:m.Index])) {

    修复后:

    if offset-m.Index != 0 {
    if !yield(string(r[offset:m.Index])) {

    这个修复确保在使用多个正则表达式进行 BPE 预分词时,每个匹配片段都是从正确的偏移位置开始提取的,避免了 token 边界错位的问题。

    配套的测试用例TestBytePairEncodingSplitMultipleRegexpsPreservesOffsets验证了修复的正确性。

    五、FP8 张量支持全面增强 5.1 Safetensors FP8 读取

    convert/reader_safetensors.go大幅更新(+416/-13 行),新增了对 FP8 格式的完整支持:

    • 支持F8_E4M3F8_E5M2数据类型

  • • 自动查找配套的 scale 张量(支持*_scale_inv*_scale两种命名)

  • • 读取模型配置中的compression_config.weight.block_structure获取分块大小

  • • 将 FP8 张量转换为 BF16/FP32 进行后续处理

    5.2 GGUF 输出标记

    convert/tensor.go中,新增了sourceTensorKV函数,用于在输出的 GGUF 文件中标记哪些张量来自 FP8 源:

    func sourceTensorKV(ts []*ggml.Tensor) KV {
    // ...
    return KV{
    "source_quantization": "hf_fp8",
    "source_fp8_tensors": slices.Sorted(maps.Keys(sourceFP8)),
    }
    }

    这些元数据在后续的量化过程中会被读取,用于决定哪些张量应该被量化、哪些应该保持原始精度。

    5.3 量化策略适配

    server/quantization.go新增了sourceFP8Tensors跟踪:

    type quantizeState struct {
    // ...
    preserveSourceFP8ToQ8 bool
    preserveSourceQ4 bool
    sourceFP8Tensors map[string]struct{}
    }

    当用户请求Q8_0量化时,只有来自 FP8 源的张量会被量化,其他 BF16 张量保持原样。当用户请求Q4_K_MQ4_K_S时,非 FP8 源张量被提升到Q8_0以保护精度。

    六、Nemotron-3-Nano 解析器增强

    model/parsers/nemotron3nano.go进行了多项改进:

    6.1 前导空格处理

    新增skipThinkingLeadingWS标志,用于跳过思考内容开头的空白字符。当解析器处于Nemotron3NanoCollectingThinking状态时,会 trim 掉 buffer 中的所有前导空格。

    6.2 开标签边界情况修复

    新增stripOpeningThinkTag()方法,处理
    标签跨 chunk 传输的场景。当 buffer 中的内容与
    标签有部分重叠时,解析器会等待完整标签到达后再进行处理。

    测试用例TestNemotron3NanoParser_Streaming/leading_open_think_tag_split_across_chunks验证了此场景。

    6.3 空思考块处理

    现在解析器能够正确处理
    这样的空思考块,直接跳过而不产生空内容。

    七、渲染器改进 7.1 Nemotron-3-Nano 渲染器

    model/renderers/nemotron3nano.go进行了大规模重构(+263/-34 行),主要变更包括:

    工具调用格式修正:函数调用输出格式调整为 XML 风格,与模型的训练数据对齐

  • 思考标签处理:历史消息中的 thinking 内容被正确包裹在
    标签中

  • 截断策略:对于历史中较早的 assistant 消息,只保留工具调用结果而裁剪思考内容,节省上下文空间

    7.2 Laguna 渲染器

    新增的LagunaRenderer实现了 Laguna 模型的对话模板:

    • 使用〈|EOS|〉作为 BOS 标记

  • • 系统消息中包含思考模式指令

  • • 工具调用格式为
    +
    +
    的结构

  • • 用户消息包裹在
    标签中

  • • 助手消息包裹在
    标签中

    7.3 Renderer/Detect 自动匹配

    server/create.go中,模型创建时会根据架构自动设置默认的渲染器和解析器:

    case "laguna":
    config.Renderer = cmp.Or(config.Renderer, "laguna")
    config.Parser = cmp.Or(config.Parser, "laguna")
    case "nemotron_h", "nemotron_h_moe", "nemotron_h_omni":
    config.Renderer = cmp.Or(config.Renderer, "nemotron-3-nano")
    config.Parser = cmp.Or(config.Parser, "nemotron-3-nano")

    八、Poolside 集成 8.1 新的 launch 集成

    cmd/launch/poolside.go新增了对 Poolside CLI 工具的支持。用户可以通过以下命令使用:

    ollama launch pool
    ollama launch pool --model kimi-k2.6:cloud
    ollama launch pool -- --help

    8.2 环境变量自动配置

    集成会自动设置以下环境变量:

    POOLSIDE_STANDALONE_BASE_URL: 指向 Ollama 的 OpenAI 兼容端点

  • POOLSIDE_API_KEY: 设置为ollama

    8.3 Windows 平台保护

    由于 Poolside 目前不兼容 Windows,在 Windows 系统上该集成会被自动隐藏,调用时会返回明确的错误提示。

    文档更新:新增docs/integrations/poolside.mdx,包含安装和使用说明。

    九、Safetensors 导入增强 9.1 新增数据类型支持

    x/create/dtype.go新增了 FP8 和 U8/I8 类型的尺寸定义:

    case "U8", "I8":
    return 1, nil
    case "F8_E4M3", "F8_E5M2", "F8_E4M3FN", "F8_E5M2FNUZ":
    return 1, nil

    9.2 Laguna 专用导入转换器

    新增x/create/laguna.go,实现了 Laguna 模型的特殊导入逻辑:

    路由专家权重识别:通过.mlp.experts.路径识别 MoE 层的路由专家

  • NVFP4 导入优化:当请求nvfp4量化时,down_proj权重被保留为mxfp8格式以保持精度

  • 量化决策:路由专家参与量化,共享专家和注意力层保持 BF16

    9.3 导入能力推断

    x/create/client/create.go中的inferSafetensorsCapabilities函数现在会参考解析器的能力:

    • 如果解析器支持工具调用,则添加tools能力

  • • 如果解析器支持思考,则添加thinking能力

    十、Logprobs 与内置解析器兼容性

    server: preserve generate logprobs with builtin parsers

    这是一个重要的用户体验修复。之前当使用内置解析器(如 Nemotron-3-Nano 或 Laguna 解析器)时,生成响应中的 logprobs 会被丢弃,因为解析器会缓冲内容直到检测到完整的语义单元。

    修复后,在server/routes.go的 GenerateHandler 中:

    if builtinParser != nil {
    // Emit chunks that carry logprobs even if the parser is still buffering
    if res.Response != "" || res.Thinking != "" || res.Done || len(res.ToolCalls) > 0 || len(res.Logprobs) > 0 {
    ch <- res
    }
    }

    现在只要 chunk 中包含 logprobs,即使没有新的文本内容,也会被发送给客户端。

    配套测试TestGenerateLogprobsWithBuiltinParser验证了此功能。

    十一、架构兼容性标记 11.1 强制单并行请求

    server/sched.go中,nemotron_h_omni被加入到了需要强制num_parallel = 1的架构列表中:

    if slices.Contains([]string{..., "nemotron_h", "nemotron_h_moe", "nemotron_h_omni"}, req.model.Config.ModelFamily) && numParallel != 1 {
    numParallel = 1
    }

    这是因为多模态模型和 MoE 结构在并行处理时存在状态同步问题。

    11.2 FlashAttention 支持

    fs/ggml/ggml.go中,nemotron_h_omni被加入了启用 FlashAttention 的架构列表:

    case "nemotron_h", "nemotron_h_moe", "nemotron_h_omni":
    // FlashAttention enabled

    十二、Harmony 后端适配

    server/routes.goserver/routes.go中的shouldUseHarmony逻辑进行了调整:

    • 当think.Value为字符串"max"时,在传递给 Harmony 后端之前映射为"high"

  • • Harmony 的 Parser 只在未显式配置时才设置为"harmony"

    这确保了 Harmony 后端在接收到max思考级别时不会报错。

    十三、MLX 图像生成兼容性

    x/imagegen/safetensors/safetensors.go中新增了 FP8 数据类型的映射:

    case "F8_E4M3", "F8_E5M2", "F8_E4M3FN", "F8_E5M2FNUZ":
    return mlx.DtypeUint8 // FP8 types stored as raw uint8 bytes

    这为未来在 MLX 后端支持 FP8 图像生成模型奠定了基础。

    十四、代码统计总览

    本次更新共涉及:

    14 个 commits

  • 90 个文件变更

  • 5 位贡献者

  • +13,915 行代码新增

  • -1,190 行代码删除

    主要变更模块分布:

    convert/: +1,500 行(FP8 支持 + Nemotron/Laguna 转换)

  • model/models/: +2,800 行(Laguna + Nemotron Omni 模型实现)

  • x/mlxrunner/: +1,200 行(采样器重构 + Pipeline 优化)

  • x/create/: +900 行(Laguna 导入 + Safetensors 增强)

  • cmd/launch/: +200 行(Poolside 集成)

    十五、升级建议 15.1 兼容性说明

    • 所有 v0.22.0 之前创建的模型均可继续使用

  • • 新版本生成的 GGUF 文件与旧版本不兼容(由于新增了source_quantization等 KV 元数据)

  • • Windows 平台的 Poolside 集成暂不可用

    15.2 推荐使用场景

    1.需要更强推理能力的应用:使用think: "max"级别调用 Nemotron 或 Laguna 模型

  • 2.多模态应用:Nemotron 3 Omni 支持图文语音输入

  • 3.代码生成场景:Poolside Laguna 专为代码任务训练

  • 4.高吞吐量场景:升级后 MLX 后端的批量采样能力可提升 2-3 倍

    15.3 量化建议

    对于从 FP8 源导入的模型:

    • 使用Q8_0量化可获得最佳精度保持

  • • 使用Q4_K_M时,路由专家使用 Q4,注意力层使用 Q8

  • • 使用Q4_K_S时,浅层专家的 down_proj 使用 Q5

    结语

    代码地址:github.com/ollama/ollama

    Ollama v0.22.0 是一次功能密集、质量优先的版本发布。NVIDIA 和 Poolside 两大模型的支持极大地扩展了 Ollama 的应用边界,而 MLX 后端的采样器重构、FP8 导入的完善、以及解析器/渲染器的增强,都体现了项目对生产级稳定性和用户体验的重视。

    我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。

    © 版权声明

    相关文章