![]()
![]()
![]()
引言
2026年4月29日,Ollama 團(tuán)隊(duì)正式發(fā)布了 v0.22.0 版本。本次更新是一次意義重大的版本迭代,不僅引入了兩個(gè)重量級(jí)的新模型——NVIDIA 的 Nemotron 3 Omni 和 Poolside 的首個(gè)開源編碼模型 Laguna XS.2,還在推理控制、模型轉(zhuǎn)換、量化策略、MLX 后端性能、內(nèi)置解析器等多個(gè)核心模塊進(jìn)行了深度優(yōu)化。
本文將基于 v0.22.0 的完整變更日志,為您詳細(xì)解讀本次更新的每一個(gè)技術(shù)細(xì)節(jié),幫助開發(fā)者全面理解新版本的能力邊界和使用方法。
一、新模型支持:兩大重量級(jí)模型登場(chǎng) 1.1 NVIDIA Nemotron 3 Omni
v0.22.0 引入了對(duì) NVIDIA Nemotron 3 Omni 系列模型的原生支持。這是一個(gè)多模態(tài)模型家族,在代碼中對(duì)應(yīng)的架構(gòu)標(biāo)識(shí)為nemotron_h_omni。該模型支持:
?文本生成:基于 Nemotron-H 架構(gòu)的 LLM 核心
?視覺理解:集成了 Vision Transformer(ViT)模塊,支持圖像輸入
?音頻處理:集成了 Parakeet 音頻編碼器,支持語音輸入
在轉(zhuǎn)換器(converter)層面,新增了convert/convert_nemotron_h.go和convert/convert_nemotron_h_test.go兩個(gè)文件(共約 700 行代碼),專門處理 Nemotron 系列模型的權(quán)重映射和參數(shù)轉(zhuǎn)換。
關(guān)鍵配置參數(shù)包括:
?
max_sequence_length: 131072(128K 上下文)?
vision.image_size: 512?
vision.patch_size: 16?
audio.sample_rate: 16000
Poolside 的首個(gè)開源權(quán)重編碼模型 Laguna XS.2 也獲得了完整支持。這是一個(gè)專注于代碼生成和軟件工程任務(wù)的模型,架構(gòu)標(biāo)識(shí)為LagunaForCausalLM。
新增的模型支持文件包括:
?
model/models/laguna/model.go(約 440 行):Laguna 模型的 MLX 實(shí)現(xiàn)?
convert/convert_laguna.go(約 600 行):GGUF 轉(zhuǎn)換邏輯?
model/parsers/laguna.go(約 500 行):專用的輸出解析器?
model/renderers/laguna.go(約 110 行):模板渲染器
Laguna 模型采用了混合專家(MoE)架構(gòu),支持動(dòng)態(tài)稀疏層的推理優(yōu)化。其配置包括:
? 逐層可變的注意力頭數(shù)(head_count 為數(shù)組而非固定值)
? 滑動(dòng)窗口注意力(sliding window)模式
? 旋轉(zhuǎn)位置編碼(RoPE)支持全維度和 SWA 兩套參數(shù)
在api/types.go中,ThinkValue類型現(xiàn)在支持一個(gè)全新的字符串值"max"。這意味著思考級(jí)別從原來的high/medium/low三個(gè)檔位擴(kuò)展為四個(gè):
// ThinkValue represents a value that can be a boolean or a string ("high", "medium", "low", "max")
type ThinkValue struct {
Value interface{}
}驗(yàn)證邏輯已同步更新:
case string:
return v == "high" || v == "medium" || v == "low" || v == "max"2.2 OpenAI 兼容接口映射在openai/openai.go中,OpenAI 風(fēng)格的reasoning_effort參數(shù)現(xiàn)在也支持"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)
}當(dāng)reasoning_effort為"none"時(shí),思考功能被禁用;其他字符串值(包括"max")則按原樣傳遞。
Responses API 也同步支持了max:
case "low", "medium", "high", "max":
think = &api.ThinkValue{Value: effort}2.3 CLI 命令行支持cmd/cmd.go中的--think參數(shù)現(xiàn)在接受max作為合法值:
case "high", "medium", "low", "max":
opts.Think = &api.ThinkValue{Value: thinkStr}三、MLX 后端重大改進(jìn) 3.1 采樣器歷史記錄優(yōu)化mlxrunner: track sampler history in a fixed-size ring buffer
采樣器現(xiàn)在使用固定大小的環(huán)形緩沖區(qū)來追蹤 token 歷史,而不是無限增長的切片。這顯著降低了長時(shí)間運(yùn)行時(shí)的內(nèi)存占用。
3.2 批量采樣優(yōu)化
mlxrunner: batch the sampler across multiple sequences
采樣器現(xiàn)在支持批量處理多個(gè)序列,將多個(gè)獨(dú)立生成請(qǐng)求的采樣操作合并為一次矩陣運(yùn)算。這在處理并行請(qǐng)求時(shí)能大幅提升吞吐量。
3.3 采樣器核心重構(gòu)
x/mlxrunner/sample/sample.go進(jìn)行了大規(guī)模重構(gòu)(+415/-122 行),主要改進(jìn)包括:
?多槽位(multi-slot)支持:采樣器現(xiàn)在可以管理多個(gè)獨(dú)立的生成會(huì)話,每個(gè)槽位有自己的歷史記錄和采樣參數(shù)
?批量 Logprob 計(jì)算:當(dāng)多個(gè)槽位同時(shí)請(qǐng)求 logprobs 時(shí),一次性完成 softmax 和 log 計(jì)算
?TopK/TopP 采樣優(yōu)化:使用 MLX 原生的 argpartition 操作,避免顯式的完整排序
新增的Add(slot int, opts Options, history []int32)方法用于注冊(cè)采樣槽位,Sample(slots []int, logits *mlx.Array)方法支持批量采樣。
3.4 新增 Softplus 激活函數(shù)
x/mlxrunner/mlx/act.go新增了SoftplusF32函數(shù):
var SoftplusF32 = Compile1(
"SoftplusF32",
func(x *Array) *Array {
dt := x.DType()
zero := FromValue[float32](0)
return Logaddexp(x.AsType(DTypeFloat32), zero).AsType(dt)
},
Shapeless(),
)這個(gè)函數(shù)以 float32 精度計(jì)算 softplus,然后轉(zhuǎn)換回原始數(shù)據(jù)類型,用于 Laguna 模型的注意力門控機(jī)制。
3.5 TensorRT Model Optimizer 導(dǎo)入支持
mlx: Support NVIDIA TensorRT Model Optimizer import
MLX 后端現(xiàn)在可以直接導(dǎo)入由 NVIDIA TensorRT Model Optimizer 導(dǎo)出的 FP8 量化模型。導(dǎo)入器會(huì)自動(dòng)識(shí)別并處理F8_E4M3類型的張量及其配套的 scale 張量。
四、Tokenizer 多正則表達(dá)式偏移處理修復(fù)
tokenizer: fix multi-regex BPE offset handling
這是一個(gè)重要的 bug 修復(fù)。在tokenizer/bytepairencoding.go中,原來的多正則表達(dá)式匹配邏輯在處理重疊匹配時(shí)存在偏移量計(jì)算錯(cuò)誤:
修復(fù)前:
if offset-m.Index != 0 {
if !yield(string(r[:m.Index])) {修復(fù)后:
if offset-m.Index != 0 {
if !yield(string(r[offset:m.Index])) {這個(gè)修復(fù)確保在使用多個(gè)正則表達(dá)式進(jìn)行 BPE 預(yù)分詞時(shí),每個(gè)匹配片段都是從正確的偏移位置開始提取的,避免了 token 邊界錯(cuò)位的問題。
配套的測(cè)試用例TestBytePairEncodingSplitMultipleRegexpsPreservesOffsets驗(yàn)證了修復(fù)的正確性。
五、FP8 張量支持全面增強(qiáng) 5.1 Safetensors FP8 讀取
convert/reader_safetensors.go大幅更新(+416/-13 行),新增了對(duì) FP8 格式的完整支持:
? 支持
F8_E4M3和F8_E5M2數(shù)據(jù)類型? 自動(dòng)查找配套的 scale 張量(支持
*_scale_inv和*_scale兩種命名)? 讀取模型配置中的
compression_config.weight.block_structure獲取分塊大小? 將 FP8 張量轉(zhuǎn)換為 BF16/FP32 進(jìn)行后續(xù)處理
在convert/tensor.go中,新增了sourceTensorKV函數(shù),用于在輸出的 GGUF 文件中標(biāo)記哪些張量來自 FP8 源:
func sourceTensorKV(ts []*ggml.Tensor) KV {
// ...
return KV{
"source_quantization": "hf_fp8",
"source_fp8_tensors": slices.Sorted(maps.Keys(sourceFP8)),
}
}這些元數(shù)據(jù)在后續(xù)的量化過程中會(huì)被讀取,用于決定哪些張量應(yīng)該被量化、哪些應(yīng)該保持原始精度。
5.3 量化策略適配
server/quantization.go新增了sourceFP8Tensors跟蹤:
type quantizeState struct {
// ...
preserveSourceFP8ToQ8 bool
preserveSourceQ4 bool
sourceFP8Tensors map[string]struct{}
}當(dāng)用戶請(qǐng)求Q8_0量化時(shí),只有來自 FP8 源的張量會(huì)被量化,其他 BF16 張量保持原樣。當(dāng)用戶請(qǐng)求Q4_K_M或Q4_K_S時(shí),非 FP8 源張量被提升到Q8_0以保護(hù)精度。
六、Nemotron-3-Nano 解析器增強(qiáng)
model/parsers/nemotron3nano.go進(jìn)行了多項(xiàng)改進(jìn):
6.1 前導(dǎo)空格處理
新增skipThinkingLeadingWS標(biāo)志,用于跳過思考內(nèi)容開頭的空白字符。當(dāng)解析器處于Nemotron3NanoCollectingThinking狀態(tài)時(shí),會(huì) trim 掉 buffer 中的所有前導(dǎo)空格。
6.2 開標(biāo)簽邊界情況修復(fù)
新增stripOpeningThinkTag()方法,處理
標(biāo)簽跨 chunk 傳輸?shù)膱?chǎng)景。當(dāng) buffer 中的內(nèi)容與
標(biāo)簽有部分重疊時(shí),解析器會(huì)等待完整標(biāo)簽到達(dá)后再進(jìn)行處理。
測(cè)試用例TestNemotron3NanoParser_Streaming/leading_open_think_tag_split_across_chunks驗(yàn)證了此場(chǎng)景。
6.3 空思考?jí)K處理
現(xiàn)在解析器能夠正確處理
這樣的空思考?jí)K,直接跳過而不產(chǎn)生空內(nèi)容。
七、渲染器改進(jìn) 7.1 Nemotron-3-Nano 渲染器
model/renderers/nemotron3nano.go進(jìn)行了大規(guī)模重構(gòu)(+263/-34 行),主要變更包括:
?工具調(diào)用格式修正:函數(shù)調(diào)用輸出格式調(diào)整為 XML 風(fēng)格,與模型的訓(xùn)練數(shù)據(jù)對(duì)齊
?思考標(biāo)簽處理:歷史消息中的 thinking 內(nèi)容被正確包裹在
標(biāo)簽中?截?cái)嗖呗?/strong>:對(duì)于歷史中較早的 assistant 消息,只保留工具調(diào)用結(jié)果而裁剪思考內(nèi)容,節(jié)省上下文空間
新增的LagunaRenderer實(shí)現(xiàn)了 Laguna 模型的對(duì)話模板:
? 使用
〈|EOS|〉作為 BOS 標(biāo)記? 系統(tǒng)消息中包含思考模式指令
? 工具調(diào)用格式為
++的結(jié)構(gòu)? 用戶消息包裹在
標(biāo)簽中? 助手消息包裹在
標(biāo)簽中
在server/create.go中,模型創(chuàng)建時(shí)會(huì)根據(jù)架構(gòu)自動(dòng)設(shè)置默認(rèn)的渲染器和解析器:
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新增了對(duì) Poolside CLI 工具的支持。用戶可以通過以下命令使用:
ollama launch pool
ollama launch pool --model kimi-k2.6:cloud
ollama launch pool -- --help8.2 環(huán)境變量自動(dòng)配置集成會(huì)自動(dòng)設(shè)置以下環(huán)境變量:
?
POOLSIDE_STANDALONE_BASE_URL: 指向 Ollama 的 OpenAI 兼容端點(diǎn)?
POOLSIDE_API_KEY: 設(shè)置為ollama
由于 Poolside 目前不兼容 Windows,在 Windows 系統(tǒng)上該集成會(huì)被自動(dòng)隱藏,調(diào)用時(shí)會(huì)返回明確的錯(cuò)誤提示。
文檔更新:新增docs/integrations/poolside.mdx,包含安裝和使用說明。
九、Safetensors 導(dǎo)入增強(qiáng) 9.1 新增數(shù)據(jù)類型支持
x/create/dtype.go新增了 FP8 和 U8/I8 類型的尺寸定義:
case "U8", "I8":
return 1, nil
case "F8_E4M3", "F8_E5M2", "F8_E4M3FN", "F8_E5M2FNUZ":
return 1, nil9.2 Laguna 專用導(dǎo)入轉(zhuǎn)換器新增x/create/laguna.go,實(shí)現(xiàn)了 Laguna 模型的特殊導(dǎo)入邏輯:
?路由專家權(quán)重識(shí)別:通過
.mlp.experts.路徑識(shí)別 MoE 層的路由專家?NVFP4 導(dǎo)入優(yōu)化:當(dāng)請(qǐng)求
nvfp4量化時(shí),down_proj權(quán)重被保留為mxfp8格式以保持精度?量化決策:路由專家參與量化,共享專家和注意力層保持 BF16
x/create/client/create.go中的inferSafetensorsCapabilities函數(shù)現(xiàn)在會(huì)參考解析器的能力:
? 如果解析器支持工具調(diào)用,則添加
tools能力? 如果解析器支持思考,則添加
thinking能力
server: preserve generate logprobs with builtin parsers
這是一個(gè)重要的用戶體驗(yàn)修復(fù)。之前當(dāng)使用內(nèi)置解析器(如 Nemotron-3-Nano 或 Laguna 解析器)時(shí),生成響應(yīng)中的 logprobs 會(huì)被丟棄,因?yàn)榻馕銎鲿?huì)緩沖內(nèi)容直到檢測(cè)到完整的語義單元。
修復(fù)后,在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
}
}現(xiàn)在只要 chunk 中包含 logprobs,即使沒有新的文本內(nèi)容,也會(huì)被發(fā)送給客戶端。
配套測(cè)試TestGenerateLogprobsWithBuiltinParser驗(yàn)證了此功能。
十一、架構(gòu)兼容性標(biāo)記 11.1 強(qiáng)制單并行請(qǐng)求
在server/sched.go中,nemotron_h_omni被加入到了需要強(qiáng)制num_parallel = 1的架構(gòu)列表中:
if slices.Contains([]string{..., "nemotron_h", "nemotron_h_moe", "nemotron_h_omni"}, req.model.Config.ModelFamily) && numParallel != 1 {
numParallel = 1
}這是因?yàn)槎嗄B(tài)模型和 MoE 結(jié)構(gòu)在并行處理時(shí)存在狀態(tài)同步問題。
11.2 FlashAttention 支持
fs/ggml/ggml.go中,nemotron_h_omni被加入了啟用 FlashAttention 的架構(gòu)列表:
case "nemotron_h", "nemotron_h_moe", "nemotron_h_omni":
// FlashAttention enabled十二、Harmony 后端適配server/routes.go和server/routes.go中的shouldUseHarmony邏輯進(jìn)行了調(diào)整:
? 當(dāng)
think.Value為字符串"max"時(shí),在傳遞給 Harmony 后端之前映射為"high"? Harmony 的 Parser 只在未顯式配置時(shí)才設(shè)置為
"harmony"
這確保了 Harmony 后端在接收到max思考級(jí)別時(shí)不會(huì)報(bào)錯(cuò)。
十三、MLX 圖像生成兼容性
x/imagegen/safetensors/safetensors.go中新增了 FP8 數(shù)據(jù)類型的映射:
case "F8_E4M3", "F8_E5M2", "F8_E4M3FN", "F8_E5M2FNUZ":
return mlx.DtypeUint8 // FP8 types stored as raw uint8 bytes這為未來在 MLX 后端支持 FP8 圖像生成模型奠定了基礎(chǔ)。
十四、代碼統(tǒng)計(jì)總覽
本次更新共涉及:
?14 個(gè) commits
?90 個(gè)文件變更
?5 位貢獻(xiàn)者
?+13,915 行代碼新增
?-1,190 行代碼刪除
主要變更模塊分布:
?
convert/: +1,500 行(FP8 支持 + Nemotron/Laguna 轉(zhuǎn)換)?
model/models/: +2,800 行(Laguna + Nemotron Omni 模型實(shí)現(xiàn))?
x/mlxrunner/: +1,200 行(采樣器重構(gòu) + Pipeline 優(yōu)化)?
x/create/: +900 行(Laguna 導(dǎo)入 + Safetensors 增強(qiáng))?
cmd/launch/: +200 行(Poolside 集成)
? 所有 v0.22.0 之前創(chuàng)建的模型均可繼續(xù)使用
? 新版本生成的 GGUF 文件與舊版本不兼容(由于新增了
source_quantization等 KV 元數(shù)據(jù))? Windows 平臺(tái)的 Poolside 集成暫不可用
1.需要更強(qiáng)推理能力的應(yīng)用:使用
think: "max"級(jí)別調(diào)用 Nemotron 或 Laguna 模型2.多模態(tài)應(yīng)用:Nemotron 3 Omni 支持圖文語音輸入
3.代碼生成場(chǎng)景:Poolside Laguna 專為代碼任務(wù)訓(xùn)練
4.高吞吐量場(chǎng)景:升級(jí)后 MLX 后端的批量采樣能力可提升 2-3 倍
對(duì)于從 FP8 源導(dǎo)入的模型:
? 使用
Q8_0量化可獲得最佳精度保持? 使用
Q4_K_M時(shí),路由專家使用 Q4,注意力層使用 Q8? 使用
Q4_K_S時(shí),淺層專家的 down_proj 使用 Q5
代碼地址:github.com/ollama/ollama
Ollama v0.22.0 是一次功能密集、質(zhì)量優(yōu)先的版本發(fā)布。NVIDIA 和 Poolside 兩大模型的支持極大地?cái)U(kuò)展了 Ollama 的應(yīng)用邊界,而 MLX 后端的采樣器重構(gòu)、FP8 導(dǎo)入的完善、以及解析器/渲染器的增強(qiáng),都體現(xiàn)了項(xiàng)目對(duì)生產(chǎn)級(jí)穩(wěn)定性和用戶體驗(yàn)的重視。
我們相信人工智能為普通人提供了一種“增強(qiáng)工具”,并致力于分享全方位的AI知識(shí)。在這里,您可以找到最新的AI科普文章、工具評(píng)測(cè)、提升效率的秘籍以及行業(yè)洞察。 歡迎關(guān)注“福大大架構(gòu)師每日一題”,發(fā)消息可獲得面試資料,讓AI助力您的未來發(fā)展。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.