mirror of
https://github.com/ollama/ollama.git
synced 2026-07-23 09:10:53 -05:00
Round of post-first-arch cleanup. No behavioral change — text + vision
still pass end-to-end on Ollama gemma3:latest (4B), 1B, and 270m.
Removes:
- apply_tensor_transforms() and the TransformSpec registry. Registered
the +1 RMSNorm shift at one point but empirically Ollama's blobs
already have it baked in. YAGNI until an arch actually needs a
tensor-data transform; the hook can come back data-driven.
- Corresponding llama-model.cpp patch hunk (include + post-load call).
- copy_kv<> template plumbing. Direct copy_u32_kv / copy_f32_kv are
shorter and more readable.
- set_str wrapper (one-liner around gguf_set_val_str).
- find_tensor helper (only used once; inlined as a loop).
- convert_f16_to_f32 helper (one-line inner loop, inlined).
- set_f32_if_missing wrapper (inlined at 3 call sites).
Tightens:
- Clip tensor renames are now a table (kGemma3ClipRenames) iterated by
handle_gemma3_clip. Adding a rename is one row.
- translate_clip_metadata now reuses detect_ollama_gemma3 for its
"is this an Ollama blob?" check instead of a separate ad-hoc check.
Net:
llama-ollama-compat.cpp 488 -> 343 lines (-30%)
llama-ollama-compat.h 83 -> 63 lines (-24%)
upstream-edits.patch 20 -> 16 lines of real edits, 3 -> 2 files
74 lines
3.3 KiB
Diff
74 lines
3.3 KiB
Diff
diff --git a/src/llama-model-loader.cpp b/src/llama-model-loader.cpp
|
|
index 4e65a45a5..75836c683 100644
|
|
--- a/src/llama-model-loader.cpp
|
|
+++ b/src/llama-model-loader.cpp
|
|
@@ -4,6 +4,7 @@
|
|
#include "ggml.h"
|
|
#include "gguf.h"
|
|
#include "llama-hparams.h"
|
|
+#include "llama-ollama-compat.h"
|
|
|
|
#include <algorithm>
|
|
#include <array>
|
|
@@ -549,6 +550,7 @@ llama_model_loader::llama_model_loader(
|
|
}
|
|
|
|
get_key(llm_kv(LLM_KV_GENERAL_ARCHITECTURE), arch_name, false);
|
|
+ llama_ollama_compat::translate_metadata(this, metadata, ctx, arch_name);
|
|
llm_kv = LLM_KV(llm_arch_from_string(arch_name));
|
|
|
|
files.emplace_back(new llama_file(fname.c_str(), "rb", use_direct_io));
|
|
@@ -573,6 +575,9 @@ llama_model_loader::llama_model_loader(
|
|
// so we build a unified tensors index for weights.
|
|
for (ggml_tensor * cur = ggml_get_first_tensor(ctx); cur; cur = ggml_get_next_tensor(ctx, cur)) {
|
|
std::string tensor_name = std::string(cur->name);
|
|
+ if (llama_ollama_compat::should_skip_tensor(this, tensor_name.c_str())) {
|
|
+ continue;
|
|
+ }
|
|
// make sure there is no duplicated tensor names
|
|
if (weights_map.find(tensor_name) != weights_map.end()) {
|
|
throw std::runtime_error(format("invalid model: tensor '%s' is duplicated", ggml_get_name(cur)));
|
|
@@ -683,6 +688,9 @@ llama_model_loader::llama_model_loader(
|
|
// Save tensors data offset info of the main file.
|
|
for (ggml_tensor * cur = ggml_get_first_tensor(ctx); cur; cur = ggml_get_next_tensor(ctx, cur)) {
|
|
std::string tensor_name = std::string(cur->name);
|
|
+ if (llama_ollama_compat::should_skip_tensor(this, tensor_name.c_str())) {
|
|
+ continue;
|
|
+ }
|
|
// make sure there is no duplicated tensor names
|
|
if (weights_map.find(tensor_name) != weights_map.end()) {
|
|
throw std::runtime_error(format("invalid model: tensor '%s' is duplicated", ggml_get_name(cur)));
|
|
diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp
|
|
index f0e8786b6..35defa89d 100644
|
|
--- a/tools/mtmd/clip.cpp
|
|
+++ b/tools/mtmd/clip.cpp
|
|
@@ -10,6 +10,8 @@
|
|
#include "ggml-backend.h"
|
|
#include "gguf.h"
|
|
|
|
+#include "llama-ollama-compat.h"
|
|
+
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#include <cmath>
|
|
@@ -985,6 +987,11 @@ struct clip_model_loader {
|
|
|
|
ctx_meta.reset(meta);
|
|
|
|
+ // If this is an Ollama-format monolithic GGUF (text + embedded
|
|
+ // vision), translate its metadata and tensor names into the
|
|
+ // upstream mmproj shape so the rest of this loader runs unchanged.
|
|
+ llama_ollama_compat::translate_clip_metadata(ctx_gguf.get(), meta);
|
|
+
|
|
const int n_tensors = gguf_get_n_tensors(ctx_gguf.get());
|
|
|
|
// print gguf info
|
|
@@ -2358,6 +2365,7 @@ struct clip_model_loader {
|
|
auto it_off = tensor_offset.find(t->name);
|
|
GGML_ASSERT(it_off != tensor_offset.end() && "no offset for tensor");
|
|
const size_t offset = it_off->second;
|
|
+ if (llama_ollama_compat::maybe_load_tensor(cur, fname.c_str(), offset, buft)) continue;
|
|
fin.seekg(offset, std::ios::beg);
|
|
if (!fin) {
|
|
throw std::runtime_error(string_format("%s: failed to seek for tensor %s\n", __func__, t->name));
|